ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGJjNmNkYTMuLmNmZjg2M2IgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMzQzLDYgKzM0Myw3IEBACiAgICAgICAgICAgICAiaGFyZHdhcmUvaW50ZXJmYWNlcy9iaW9tZXRyaWNzL2ZpbmdlcnByaW50L2FpZGwiLAogICAgICAgICAgICAgImhhcmR3YXJlL2ludGVyZmFjZXMvZ3JhcGhpY3MvY29tbW9uL2FpZGwiLAogICAgICAgICAgICAgImhhcmR3YXJlL2ludGVyZmFjZXMva2V5bWFzdGVyL2FpZGwiLAorICAgICAgICAgICAgInN5c3RlbS9oYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2FpZGwiLAogICAgICAgICBdLAogICAgIH0sCiAgICAgZHhmbGFnczogWwpAQCAtNjMyLDYgKzYzMyw3IEBACiAgICAgICAgICAgICAiaGFyZHdhcmUvaW50ZXJmYWNlcy9iaW9tZXRyaWNzL2ZpbmdlcnByaW50L2FpZGwiLAogICAgICAgICAgICAgImhhcmR3YXJlL2ludGVyZmFjZXMvZ3JhcGhpY3MvY29tbW9uL2FpZGwiLAogICAgICAgICAgICAgImhhcmR3YXJlL2ludGVyZmFjZXMva2V5bWFzdGVyL2FpZGwiLAorICAgICAgICAgICAgInN5c3RlbS9oYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2FpZGwiLAogICAgICAgICBdLAogICAgIH0sCiAgICAgLy8gVGhlc2UgYXJlIGxpYnMgZnJvbSBmcmFtZXdvcmstaW50ZXJuYWwtdXRpbHMgdGhhdCBhcmUgcmVxdWlyZWQgKGkuZS4gYmVpbmcgcmVmZXJlbmNlZCkKZGlmZiAtLWdpdCBhL0FwaURvY3MuYnAgYi9BcGlEb2NzLmJwCmluZGV4IDkwYjY2MDMuLmE0NmVjY2UgMTAwNjQ0Ci0tLSBhL0FwaURvY3MuYnAKKysrIGIvQXBpRG9jcy5icApAQCAtNDIyLDI3ICs0MjIsMjYgQEAKICAgICAgICAgIiQobG9jYXRpb24gbWVyZ2VfemlwcykgJChvdXQpICQobG9jYXRpb24gOmRzLWRvY3MtamF2YXsuZG9jcy56aXB9KSAkKGdlbkRpcikvZHMtZG9jcy1rdC1tb3ZlZC56aXAiLAogfQogCi0vLyBEaXNhYmxlIGRvYyBnZW5lcmF0aW9uIHVudGlsIERvY2xhdmEgaXMgbWlncmF0ZWQgdG8gSkRLIDE3IChiLzI0MDQyMTU1NSkuCi0vLyBqYXZhX2dlbnJ1bGUgewotLy8gICAgIG5hbWU6ICJkcy1kb2NzLXN3aXRjaGVkIiwKLS8vICAgICB0b29sczogWwotLy8gICAgICAgICAic3dpdGNoZXI0IiwKLS8vICAgICAgICAgInNvb25nX3ppcCIsCi0vLyAgICAgXSwKLS8vICAgICBzcmNzOiBbCi0vLyAgICAgICAgICI6ZHMtZG9jcy1qYXZhey5kb2NzLnppcH0iLAotLy8gICAgICAgICAiOmRzLWRvY3Mta3R7LmRvY3MuemlwfSIsCi0vLyAgICAgXSwKLS8vICAgICBvdXQ6IFsiZHMtZG9jcy1zd2l0Y2hlZC56aXAiXSwKLS8vICAgICBkaXN0OiB7Ci0vLyAgICAgICAgIHRhcmdldHM6IFsiZG9jcyJdLAotLy8gICAgIH0sCi0vLyAgICAgY21kOiAidW56aXAgLXEgJChsb2NhdGlvbiA6ZHMtZG9jcy1qYXZhey5kb2NzLnppcH0pIC1kICQoZ2VuRGlyKSAmJiAiICsKLS8vICAgICAgICAgInVuemlwIC1xICQobG9jYXRpb24gOmRzLWRvY3Mta3R7LmRvY3MuemlwfSkgLWQgJChnZW5EaXIpL2VuL3JlZmVyZW5jZS9rb3RsaW4gJiYgIiArCi0vLyAgICAgICAgICJTV0lUQ0hFUj0kJChjZCAkJChkaXJuYW1lICQobG9jYXRpb24gc3dpdGNoZXI0KSkgJiYgcHdkKS8kJChiYXNlbmFtZSAkKGxvY2F0aW9uIHN3aXRjaGVyNCkpICYmICIgKwotLy8gICAgICAgICAiKGNkICQoZ2VuRGlyKS9lbi9yZWZlcmVuY2UgJiYgJCRTV0lUQ0hFUiAtLXdvcmsgcGxhdGZvcm0pID4gL2Rldi9udWxsICYmICIgKwotLy8gICAgICAgICAiJChsb2NhdGlvbiBzb29uZ196aXApIC1vICQob3V0KSAtQyAkKGdlbkRpcikgLUQgJChnZW5EaXIpIiwKLS8vIH0KK2phdmFfZ2VucnVsZSB7CisgICAgbmFtZTogImRzLWRvY3Mtc3dpdGNoZWQiLAorICAgIHRvb2xzOiBbCisgICAgICAgICJzd2l0Y2hlcjQiLAorICAgICAgICAic29vbmdfemlwIiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjpkcy1kb2NzLWphdmF7LmRvY3MuemlwfSIsCisgICAgICAgICI6ZHMtZG9jcy1rdHsuZG9jcy56aXB9IiwKKyAgICBdLAorICAgIG91dDogWyJkcy1kb2NzLXN3aXRjaGVkLnppcCJdLAorICAgIGRpc3Q6IHsKKyAgICAgICAgdGFyZ2V0czogWyJkb2NzIl0sCisgICAgfSwKKyAgICBjbWQ6ICJ1bnppcCAtcSAkKGxvY2F0aW9uIDpkcy1kb2NzLWphdmF7LmRvY3MuemlwfSkgLWQgJChnZW5EaXIpICYmICIgKworICAgICAgICAidW56aXAgLXEgJChsb2NhdGlvbiA6ZHMtZG9jcy1rdHsuZG9jcy56aXB9KSAtZCAkKGdlbkRpcikvZW4vcmVmZXJlbmNlL2tvdGxpbiAmJiAiICsKKyAgICAgICAgIlNXSVRDSEVSPSQkKGNkICQkKGRpcm5hbWUgJChsb2NhdGlvbiBzd2l0Y2hlcjQpKSAmJiBwd2QpLyQkKGJhc2VuYW1lICQobG9jYXRpb24gc3dpdGNoZXI0KSkgJiYgIiArCisgICAgICAgICIoY2QgJChnZW5EaXIpL2VuL3JlZmVyZW5jZSAmJiAkJFNXSVRDSEVSIC0td29yayBwbGF0Zm9ybSkgPiAvZGV2L251bGwgJiYgIiArCisgICAgICAgICIkKGxvY2F0aW9uIHNvb25nX3ppcCkgLW8gJChvdXQpIC1DICQoZ2VuRGlyKSAtRCAkKGdlbkRpcikiLAorfQogCiBkcm9pZGRvYyB7CiAgICAgbmFtZTogImRzLXN0YXRpYy1kb2NzIiwKZGlmZiAtLWdpdCBhL1RFU1RfTUFQUElORyBiL1RFU1RfTUFQUElORwppbmRleCA5NjEwZjJjLi44MWEzNDc5IDEwMDY0NAotLS0gYS9URVNUX01BUFBJTkcKKysrIGIvVEVTVF9NQVBQSU5HCkBAIC02NSw2ICs2NSwxNSBAQAogICAgICAgXQogICAgIH0sCiAgICAgeworICAgICAgIm5hbWUiOiAiRnJhbWV3b3Jrc0lucHV0TWV0aG9kU3lzdGVtU2VydmVyVGVzdHMiLAorICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgIHsiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmFuZHJvaWQuc2VydmVyLmlucHV0bWV0aG9kIn0sCisgICAgICAgIHsiZXhjbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5GbGFreVRlc3QifSwKKyAgICAgICAgeyJleGNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZHgudGVzdC5maWx0ZXJzLkZsYWt5VGVzdCJ9LAorICAgICAgICB7ImV4Y2x1ZGUtYW5ub3RhdGlvbiI6ICJvcmcuanVuaXQuSWdub3JlIn0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKICAgICAgICJuYW1lIjogIkV4dFNlcnZpY2VzVW5pdFRlc3RzIiwKICAgICAgICJvcHRpb25zIjogWwogICAgICAgICB7CmRpZmYgLS1naXQgYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZUlkbGVDb250cm9sbGVyLmphdmEgYi9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZUlkbGVDb250cm9sbGVyLmphdmEKaW5kZXggMWQ5M2ViMy4uMDY1MGNlMyAxMDA2NDQKLS0tIGEvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VJZGxlQ29udHJvbGxlci5qYXZhCisrKyBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlSWRsZUNvbnRyb2xsZXIuamF2YQpAQCAtMTk3MCw3ICsxOTcwLDcgQEAKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JFU0VUX1BSRV9JRExFX1RJTUVPVVRfRkFDVE9SOiB7CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByZUlkbGVGYWN0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgbWF5YmVEb0ltbWVkaWF0ZU1haW50ZW5hbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1heWJlRG9JbW1lZGlhdGVNYWludGVuYW5jZSgiaWRsZSBmYWN0b3IiKTsKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JFUE9SVF9TVEFUSU9OQVJZX1NUQVRVUzogewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXZpY2VJZGxlSW50ZXJuYWwuU3RhdGlvbmFyeUxpc3RlbmVyIG5ld0xpc3RlbmVyID0KQEAgLTI2MjUsNyArMjYyNSw3IEBACiAKICAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgbW9zdFJlY2VudERlbGl2ZXJ5T3B0aW9ucyA9IEJyb2FkY2FzdE9wdGlvbnMubWFrZUJhc2ljKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREZWxpdmVyeUdyb3VwUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVMSVZFUllfR1JPVVBfUE9MSUNZX01PU1RfUkVDRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldERlZmVyVW50aWxBY3RpdmUodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREZWZlcnJhbFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUpCiAgICAgICAgICAgICAgICAgICAgICAgICAudG9CdW5kbGUoKTsKIAogICAgICAgICAgICAgICAgIG1JZGxlSW50ZW50ID0gbmV3IEludGVudChQb3dlck1hbmFnZXIuQUNUSU9OX0RFVklDRV9JRExFX01PREVfQ0hBTkdFRCk7CkBAIC0zNTE3LDExICszNTE3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGRvemUgYWxhcm0gdG8gYWZ0ZXIgdGhlIHVwY29taW5nIEFsYXJtQ2xvY2sgYWxhcm0uCiAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5nZXROZXh0V2FrZUZyb21JZGxlVGltZSgpIC0gbUluamVjdG9yLmdldEVsYXBzZWRSZWFsdGltZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VULCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGEgc21hbGwgYW1vdW50IG9mIHRpbWUgaW4gY2FzZSBzb21ldGhpbmcgKGVnOiBiYWNrZ3JvdW5kIHNlcnZpY2UgZnJvbQogICAgICAgICAgICAgICAgICAgICAvLyByZWNlbnRseSBjbG9zZWQgYXBwKSBuZWVkcyB0byBmaW5pc2ggcnVubmluZy4KLSAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChtQ29uc3RhbnRzLlFVSUNLX0RPWkVfREVMQVlfVElNRU9VVCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZUFsYXJtTG9ja2VkKG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgICAgICAgICBtb3ZlVG9TdGF0ZUxvY2tlZChTVEFURV9JTkFDVElWRSwgIm5vIGFjdGl2aXR5Iik7CkBAIC0zNTM2LDkgKzM1MzYsOSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBhbGFybSB0byBhZnRlciB0aGUgdXBjb21pbmcgQWxhcm1DbG9jayBhbGFybS4KICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWxhcm1NYW5hZ2VyLmdldE5leHRXYWtlRnJvbUlkbGVUaW1lKCkgLSBtSW5qZWN0b3IuZ2V0RWxhcHNlZFJlYWx0aW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVsYXksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVsYXkpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQoZGVsYXksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChkZWxheSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNzUzLDcgKzM3NTMsNyBAQAogICAgICAgICAgICAgICAgIGlmIChzaG91bGRVc2VJZGxlVGltZW91dEZhY3RvckxvY2tlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGF5ID0gKGxvbmcpIChtUHJlSWRsZUZhY3RvciAqIGRlbGF5KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChkZWxheSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQoZGVsYXkpOwogICAgICAgICAgICAgICAgIG1vdmVUb1N0YXRlTG9ja2VkKFNUQVRFX0lETEVfUEVORElORywgcmVhc29uKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRV9QRU5ESU5HOgpAQCAtMzc3OSw3ICszNzc5LDcgQEAKICAgICAgICAgICAgIGNhc2UgU1RBVEVfU0VOU0lORzoKICAgICAgICAgICAgICAgICBjYW5jZWxTZW5zaW5nVGltZW91dEFsYXJtTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGVMb2NrZWQoU1RBVEVfTE9DQVRJTkcsIHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChtQ29uc3RhbnRzLkxPQ0FUSU5HX1RJTUVPVVQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZUFsYXJtTG9ja2VkKG1Db25zdGFudHMuTE9DQVRJTkdfVElNRU9VVCk7CiAgICAgICAgICAgICAgICAgTG9jYXRpb25NYW5hZ2VyIGxvY2F0aW9uTWFuYWdlciA9IG1JbmplY3Rvci5nZXRMb2NhdGlvbk1hbmFnZXIoKTsKICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb25NYW5hZ2VyICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxvY2F0aW9uTWFuYWdlci5nZXRQcm92aWRlcihMb2NhdGlvbk1hbmFnZXIuTkVUV09SS19QUk9WSURFUikgIT0gbnVsbCkgewpAQCAtMzgxOSw3ICszODE5LDcgQEAKICAgICAgICAgICAgICAgICAvLyBFdmVyeXRoaW5nIGlzIGluIHBsYWNlIHRvIGdvIGludG8gSURMRSBzdGF0ZS4KICAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRV9NQUlOVEVOQU5DRToKICAgICAgICAgICAgICAgICBtb3ZlVG9TdGF0ZUxvY2tlZChTVEFURV9JRExFLCByZWFzb24pOwotICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQobU5leHRJZGxlRGVsYXksIHRydWUpOworICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQobU5leHRJZGxlRGVsYXkpOwogICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIk1vdmVkIHRvIFNUQVRFX0lETEUuIE5leHQgYWxhcm0gaW4gIiArIG1OZXh0SWRsZURlbGF5ICsKICAgICAgICAgICAgICAgICAgICAgICAgICIgbXMuIik7CiAgICAgICAgICAgICAgICAgbU5leHRJZGxlRGVsYXkgPSAobG9uZykobU5leHRJZGxlRGVsYXkgKiBtQ29uc3RhbnRzLklETEVfRkFDVE9SKTsKQEAgLTM4NDIsNyArMzg0Miw3IEBACiAgICAgICAgICAgICAgICAgbUFjdGl2ZUlkbGVPcENvdW50ID0gMTsKICAgICAgICAgICAgICAgICBtQWN0aXZlSWRsZVdha2VMb2NrLmFjcXVpcmUoKTsKICAgICAgICAgICAgICAgICBtb3ZlVG9TdGF0ZUxvY2tlZChTVEFURV9JRExFX01BSU5URU5BTkNFLCByZWFzb24pOwotICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQobU5leHRJZGxlUGVuZGluZ0RlbGF5LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybUxvY2tlZChtTmV4dElkbGVQZW5kaW5nRGVsYXkpOwogICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIk1vdmVkIGZyb20gU1RBVEVfSURMRSB0byBTVEFURV9JRExFX01BSU5URU5BTkNFLiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICJOZXh0IGFsYXJtIGluICIgKyBtTmV4dElkbGVQZW5kaW5nRGVsYXkgKyAiIG1zLiIpOwogICAgICAgICAgICAgICAgIG1NYWludGVuYW5jZVN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwpAQCAtNDAxMywxOSArNDAxMywxOCBAQAogICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhkZWxheSAtIG5ld0RlbGF5KSA8IE1JTl9TVEFURV9TVEVQX0FMQVJNX0NIQU5HRSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQobmV3RGVsYXksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZUFsYXJtTG9ja2VkKG5ld0RlbGF5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBtYXliZURvSW1tZWRpYXRlTWFpbnRlbmFuY2UoKSB7CisgICAgcHJpdmF0ZSB2b2lkIG1heWJlRG9JbW1lZGlhdGVNYWludGVuYW5jZShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9JRExFKSB7CiAgICAgICAgICAgICAgICAgbG9uZyBkdXJhdGlvbiA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gbUlkbGVTdGFydFRpbWU7Ci0gICAgICAgICAgICAgICAgLyogTGV0J3MgdHJnZ2VyIGEgaW1tZWRpYXRlIG1haW50ZW5hbmNlLAotICAgICAgICAgICAgICAgICAqIGlmIGl0IGhhcyBiZWVuIGlkbGUgZm9yIGEgbG9uZyB0aW1lICovCisgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhbiBpbW1lZGlhdGUgbWFpbnRlbmFuY2Ugd2luZG93IGlmIGl0IGhhcyBiZWVuIElETEUgZm9yIGxvbmcgZW5vdWdoLgogICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IG1Db25zdGFudHMuSURMRV9USU1FT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlQWxhcm1Mb2NrZWQoMCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBzdGVwSWRsZVN0YXRlTG9ja2VkKHJlYXNvbik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00MDQ1LDcgKzQwNDQsNyBAQAogICAgIHZvaWQgc2V0SWRsZVN0YXJ0VGltZUZvclRlc3QobG9uZyBpZGxlU3RhcnRUaW1lKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbUlkbGVTdGFydFRpbWUgPSBpZGxlU3RhcnRUaW1lOwotICAgICAgICAgICAgbWF5YmVEb0ltbWVkaWF0ZU1haW50ZW5hbmNlKCk7CisgICAgICAgICAgICBtYXliZURvSW1tZWRpYXRlTWFpbnRlbmFuY2UoInRlc3RpbmciKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDIyNCw4ICs0MjIzLDkgQEAKICAgICB9CiAKICAgICBAR3VhcmRlZEJ5KCJ0aGlzIikKLSAgICB2b2lkIHNjaGVkdWxlQWxhcm1Mb2NrZWQobG9uZyBkZWxheSwgYm9vbGVhbiBpZGxlVW50aWwpIHsKLSAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAic2NoZWR1bGVBbGFybUxvY2tlZCgiICsgZGVsYXkgKyAiLCAiICsgaWRsZVVudGlsICsgIikiKTsKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICB2b2lkIHNjaGVkdWxlQWxhcm1Mb2NrZWQobG9uZyBkZWxheSkgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJzY2hlZHVsZUFsYXJtTG9ja2VkKCIgKyBkZWxheSArICIsICIgKyBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkgKyAiKSIpOwogCiAgICAgICAgIGlmIChtVXNlTW90aW9uU2Vuc29yICYmIG1Nb3Rpb25TZW5zb3IgPT0gbnVsbAogICAgICAgICAgICAgICAgICYmIG1TdGF0ZSAhPSBTVEFURV9RVUlDS19ET1pFX0RFTEFZCkBAIC00MjQxLDcgKzQyNDEsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIG1OZXh0QWxhcm1UaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgKyBkZWxheTsKLSAgICAgICAgaWYgKGlkbGVVbnRpbCkgeworICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0lETEUpIHsKICAgICAgICAgICAgIG1BbGFybU1hbmFnZXIuc2V0SWRsZVVudGlsKEFsYXJtTWFuYWdlci5FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwKICAgICAgICAgICAgICAgICAgICAgbU5leHRBbGFybVRpbWUsICJEZXZpY2VJZGxlQ29udHJvbGxlci5kZWVwIiwgbURlZXBBbGFybUxpc3RlbmVyLCBtSGFuZGxlcik7CiAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX0xPQ0FUSU5HKSB7CmRpZmYgLS1naXQgYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FsYXJtL0FsYXJtTWFuYWdlclNlcnZpY2UuamF2YSBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYWxhcm0vQWxhcm1NYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDExNTFiYjcuLjI2YzBlZWYgMTAwNjQ0Ci0tLSBhL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYWxhcm0vQWxhcm1NYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYWxhcm0vQWxhcm1NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0zMCw2ICszMCw5IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlci5JTlRFUlZBTF9IT1VSOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXIuUlRDOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXIuUlRDX1dBS0VVUDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LlBlcm1pc3Npb25DaGVja2VyLlBFUk1JU1NJT05fR1JBTlRFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LlBlcm1pc3Npb25DaGVja2VyLlBJRF9VTktOT1dOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yUHJlZmxpZ2h0OwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTUFUQ0hfU1lTVEVNX09OTFk7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuUG93ZXJFeGVtcHRpb25NYW5hZ2VyLlJFQVNPTl9BTEFSTV9NQU5BR0VSX0FMQVJNX0NMT0NLOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLlBvd2VyRXhlbXB0aW9uTWFuYWdlci5SRUFTT05fREVOSUVEOwpAQCAtODcsMTEgKzkwLDkgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlBlcm1pc3Npb25DaGVja2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXJJbnRlcm5hbDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uVXNlclBhY2thZ2U7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQmF0dGVyeU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CYXR0ZXJ5U3RhdHNJbnRlcm5hbDsKQEAgLTE4Miw3ICsxODMsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CkBAIC0yNjksNyArMjY5LDggQEAKIAogICAgIC8qKgogICAgICAqIEEgbWFwIGZyb20gdWlkIHRvIHRoZSBsYXN0IG9wLW1vZGUgd2UgaGF2ZSBzZWVuIGZvcgotICAgICAqIHtAbGluayBBcHBPcHNNYW5hZ2VyI09QX1NDSEVEVUxFX0VYQUNUX0FMQVJNfQorICAgICAqIHtAbGluayBBcHBPcHNNYW5hZ2VyI09QX1NDSEVEVUxFX0VYQUNUX0FMQVJNfS4gVXNlZCBmb3IgZXZhbHVhdGluZyBwZXJtaXNzaW9uIHN0YXRlIGNoYW5nZQorICAgICAqIHdoZW4gdGhlIGRlbnlsaXN0IGNoYW5nZXMuCiAgICAgICovCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgQEd1YXJkZWRCeSgibUxvY2siKQpAQCAtMTk0OCw3ICsxOTQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1ZJU0lCTEVfVE9fSU5TVEFOVF9BUFBTKTsKICAgICAgICAgICAgIG1UaW1lVGlja09wdGlvbnMgPSBCcm9hZGNhc3RPcHRpb25zLm1ha2VCYXNpYygpCiAgICAgICAgICAgICAgICAgICAgIC5zZXREZWxpdmVyeUdyb3VwUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVMSVZFUllfR1JPVVBfUE9MSUNZX01PU1RfUkVDRU5UKQotICAgICAgICAgICAgICAgICAgICAuc2V0RGVmZXJVbnRpbEFjdGl2ZSh0cnVlKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGVmZXJyYWxQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfVU5USUxfQUNUSVZFKQogICAgICAgICAgICAgICAgICAgICAudG9CdW5kbGUoKTsKICAgICAgICAgICAgIG1UaW1lVGlja1RyaWdnZXIgPSBuZXcgSUFsYXJtTGlzdGVuZXIuU3R1YigpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTIwOTcsMjAgKzIwOTgsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZE1vZGUgPT0gbmV3TW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxsb3dlZEJ5RGVmYXVsdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTY2hlZHVsZUV4YWN0QWxhcm1BbGxvd2VkQnlEZWZhdWx0KHBhY2thZ2VOYW1lLCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGRlbmllZEJ5RGVmYXVsdCA9IGlzU2NoZWR1bGVFeGFjdEFsYXJtRGVuaWVkQnlEZWZhdWx0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBVc2VySGFuZGxlLmdldFVzZXJJZCh1aWQpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhZFBlcm1pc3Npb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRNb2RlICE9IEFwcE9wc01hbmFnZXIuTU9ERV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWRQZXJtaXNzaW9uID0gKG9sZE1vZGUgPT0gQXBwT3BzTWFuYWdlci5NT0RFX0FMTE9XRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFkUGVybWlzc2lvbiA9IGFsbG93ZWRCeURlZmF1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNQZXJtaXNzaW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3TW9kZSAhPSBBcHBPcHNNYW5hZ2VyLk1PREVfREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IChuZXdNb2RlID09IEFwcE9wc01hbmFnZXIuTU9ERV9BTExPV0VEKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVuaWVkQnlEZWZhdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHBlcm1pc3Npb25TdGF0ZSA9IGdldENvbnRleHQoKS5jaGVja1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uU0NIRURVTEVfRVhBQ1RfQUxBUk0sIFBJRF9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpID09IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhZFBlcm1pc3Npb24gPSAob2xkTW9kZSA9PSBBcHBPcHNNYW5hZ2VyLk1PREVfREVGQVVMVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwZXJtaXNzaW9uU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAob2xkTW9kZSA9PSBBcHBPcHNNYW5hZ2VyLk1PREVfQUxMT1dFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gKG5ld01vZGUgPT0gQXBwT3BzTWFuYWdlci5NT0RFX0RFRkFVTFQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGVybWlzc2lvblN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKG5ld01vZGUgPT0gQXBwT3BzTWFuYWdlci5NT0RFX0FMTE9XRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IGFsbG93ZWRCeURlZmF1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFsbG93ZWRCeURlZmF1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbUNvbnN0YW50cy5FWEFDVF9BTEFSTV9ERU5ZX0xJU1QuY29udGFpbnMocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFkUGVybWlzc2lvbiA9IChvbGRNb2RlID09IEFwcE9wc01hbmFnZXIuTU9ERV9ERUZBVUxUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFsbG93ZWRCeURlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAob2xkTW9kZSA9PSBBcHBPcHNNYW5hZ2VyLk1PREVfQUxMT1dFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gKG5ld01vZGUgPT0gQXBwT3BzTWFuYWdlci5NT0RFX0RFRkFVTFQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWxsb3dlZEJ5RGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChuZXdNb2RlID09IEFwcE9wc01hbmFnZXIuTU9ERV9BTExPV0VEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYWRQZXJtaXNzaW9uICYmICFoYXNQZXJtaXNzaW9uKSB7CkBAIC0yNzU0LDQxICsyNzY2LDEzIEBACiAKICAgICBib29sZWFuIGhhc1VzZUV4YWN0QWxhcm1JbnRlcm5hbChTdHJpbmcgcGFja2FnZU5hbWUsIGludCB1aWQpIHsKICAgICAgICAgcmV0dXJuIGlzVXNlRXhhY3RBbGFybUVuYWJsZWQocGFja2FnZU5hbWUsIFVzZXJIYW5kbGUuZ2V0VXNlcklkKHVpZCkpCi0gICAgICAgICAgICAgICAgJiYgKFBlcm1pc3Npb25DaGVja2VyLmNoZWNrUGVybWlzc2lvbkZvclByZWZsaWdodChnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgTWFuaWZlc3QucGVybWlzc2lvbi5VU0VfRVhBQ1RfQUxBUk0sIFBlcm1pc3Npb25DaGVja2VyLlBJRF9VTktOT1dOLCB1aWQsCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUpID09IFBlcm1pc3Npb25DaGVja2VyLlBFUk1JU1NJT05fR1JBTlRFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIFNDSEVEVUxFX0VYQUNUX0FMQVJNIGlzIGFsbG93ZWQgYnkgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzU2NoZWR1bGVFeGFjdEFsYXJtQWxsb3dlZEJ5RGVmYXVsdChTdHJpbmcgcGFja2FnZU5hbWUsIGludCB1aWQpIHsKLSAgICAgICAgaWYgKGlzU2NoZWR1bGVFeGFjdEFsYXJtRGVuaWVkQnlEZWZhdWx0KHBhY2thZ2VOYW1lLCBVc2VySGFuZGxlLmdldFVzZXJJZCh1aWQpKSkgewotCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGVzc2VudGlhbGx5IGxpa2UgY2hhbmdpbmcgdGhlIHByb3RlY3Rpb24gbGV2ZWwgb2YgdGhlIHBlcm1pc3Npb24gdG8KLSAgICAgICAgICAgIC8vIChwcml2aWxlZ2VkfHNpZ25hdHVyZXxyb2xlfGFwcG9wKSwgYnV0IGhhdmUgdG8gaW1wbGVtZW50IHRoaXMgbG9naWMgdG8gbWFpbnRhaW4KLSAgICAgICAgICAgIC8vIGNvbXBhdGliaWxpdHkgZm9yIG9sZGVyIGFwcHMuCi0gICAgICAgICAgICBpZiAobVBhY2thZ2VNYW5hZ2VySW50ZXJuYWwuaXNQbGF0Zm9ybVNpZ25lZChwYWNrYWdlTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgbVBhY2thZ2VNYW5hZ2VySW50ZXJuYWwuaXNVaWRQcml2aWxlZ2VkKHVpZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGxvbmcgdG9rZW4gPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHdlbGxiZWluZ0hvbGRlcnMgPSAobVJvbGVNYW5hZ2VyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG1Sb2xlTWFuYWdlci5nZXRSb2xlSG9sZGVycyhSb2xlTWFuYWdlci5ST0xFX1NZU1RFTV9XRUxMQkVJTkcpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB3ZWxsYmVpbmdIb2xkZXJzLmNvbnRhaW5zKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAhbUNvbnN0YW50cy5FWEFDVF9BTEFSTV9ERU5ZX0xJU1QuY29udGFpbnMocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICYmIChjaGVja1Blcm1pc3Npb25Gb3JQcmVmbGlnaHQoZ2V0Q29udGV4dCgpLCBNYW5pZmVzdC5wZXJtaXNzaW9uLlVTRV9FWEFDVF9BTEFSTSwKKyAgICAgICAgICAgICAgICBQSURfVU5LTk9XTiwgdWlkLCBwYWNrYWdlTmFtZSkgPT0gUEVSTUlTU0lPTl9HUkFOVEVEKTsKICAgICB9CiAKICAgICBib29sZWFuIGhhc1NjaGVkdWxlRXhhY3RBbGFybUludGVybmFsKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHVpZCkgewogICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gbVN0YXRMb2dnZXIuZ2V0VGltZSgpOwogCi0gICAgICAgIC8vIE5vdCB1c2luZyBnZXRTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSBhcyB0aGlzIGNhbiBhdm9pZCBzb21lIGNhbGxzIHRvIEFwcE9wc1NlcnZpY2UuCiAgICAgICAgIC8vIE5vdCB1c2luZyAjbUxhc3RPcFNjaGVkdWxlRXhhY3RBbGFybSBhcyBpdCBtYXkgY29udGFpbiBzdGFsZSB2YWx1ZXMuCiAgICAgICAgIC8vIE5vIGxvY2tpbmcgbmVlZGVkIGFzIGFsbCBpbnRlcm5hbCBjb250YWluZXJzIGJlaW5nIHF1ZXJpZWQgYXJlIGltbXV0YWJsZS4KICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNQZXJtaXNzaW9uOwpAQCAtMjc5NiwxMSArMjc4MCwxNiBAQAogICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgaWYgKCFpc0V4YWN0QWxhcm1DaGFuZ2VFbmFibGVkKHBhY2thZ2VOYW1lLCBVc2VySGFuZGxlLmdldFVzZXJJZCh1aWQpKSkgewogICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGlzU2NoZWR1bGVFeGFjdEFsYXJtRGVuaWVkQnlEZWZhdWx0KHBhY2thZ2VOYW1lLCBVc2VySGFuZGxlLmdldFVzZXJJZCh1aWQpKSkgeworICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IChjaGVja1Blcm1pc3Npb25Gb3JQcmVmbGlnaHQoZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdC5wZXJtaXNzaW9uLlNDSEVEVUxFX0VYQUNUX0FMQVJNLCBQSURfVU5LTk9XTiwgdWlkLCBwYWNrYWdlTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgPT0gUEVSTUlTU0lPTl9HUkFOVEVEKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENvbXBhdGliaWxpdHkgcGVybWlzc2lvbiBjaGVjayBmb3Igb2xkZXIgYXBwcy4KICAgICAgICAgICAgIGZpbmFsIGludCBtb2RlID0gbUFwcE9wcy5jaGVja09wTm9UaHJvdyhBcHBPcHNNYW5hZ2VyLk9QX1NDSEVEVUxFX0VYQUNUX0FMQVJNLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgIGlmIChtb2RlID09IEFwcE9wc01hbmFnZXIuTU9ERV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IGlzU2NoZWR1bGVFeGFjdEFsYXJtQWxsb3dlZEJ5RGVmYXVsdChwYWNrYWdlTmFtZSwgdWlkKTsKKyAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gIW1Db25zdGFudHMuRVhBQ1RfQUxBUk1fREVOWV9MSVNULmNvbnRhaW5zKHBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IChtb2RlID09IEFwcE9wc01hbmFnZXIuTU9ERV9BTExPV0VEKTsKICAgICAgICAgICAgIH0KQEAgLTQ2ODUsMTAgKzQ2NzQsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UubmV3IENsb2NrUmVjZWl2ZXIoKTsKICAgICAgICAgfQogCi0gICAgICAgIHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoQ29udGVudE9ic2VydmVyIGNvbnRlbnRPYnNlcnZlciwgVXJpIHVyaSkgewotICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIodXJpLCBmYWxzZSwgY29udGVudE9ic2VydmVyKTsKLSAgICAgICAgfQotCiAgICAgICAgIHZvaWQgcmVnaXN0ZXJEZXZpY2VDb25maWdMaXN0ZW5lcihEZXZpY2VDb25maWcuT25Qcm9wZXJ0aWVzQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgICAgICBEZXZpY2VDb25maWcuYWRkT25Qcm9wZXJ0aWVzQ2hhbmdlZExpc3RlbmVyKERldmljZUNvbmZpZy5OQU1FU1BBQ0VfQUxBUk1fTUFOQUdFUiwKICAgICAgICAgICAgICAgICAgICAgQXBwU2NoZWR1bGluZ01vZHVsZVRocmVhZC5nZXRFeGVjdXRvcigpLCBsaXN0ZW5lcik7CmRpZmYgLS1naXQgYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9Kb2JTY2hlZHVsZXJTZXJ2aWNlLmphdmEgYi9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9Kb2JTY2hlZHVsZXJTZXJ2aWNlLmphdmEKaW5kZXggM2NjNjdlNy4uMDU2YjZiOSAxMDA2NDQKLS0tIGEvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9qb2IvSm9iU2NoZWR1bGVyU2VydmljZS5qYXZhCisrKyBiL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL0pvYlNjaGVkdWxlclNlcnZpY2UuamF2YQpAQCAtNDI5LDYgKzQyOSw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvcGVydGllc0NoYW5nZWQoRGV2aWNlQ29uZmlnLlByb3BlcnRpZXMgcHJvcGVydGllcykgewogICAgICAgICAgICAgYm9vbGVhbiBhcGlRdW90YVNjaGVkdWxlVXBkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbGVhbiBjb25jdXJyZW5jeVVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gcGVyc2lzdGVuY2VVcGRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICBib29sZWFuIHJ1bnRpbWVVcGRhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKGludCBjb250cm9sbGVyID0gMDsgY29udHJvbGxlciA8IG1Db250cm9sbGVycy5zaXplKCk7IGNvbnRyb2xsZXIrKykgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0YXRlQ29udHJvbGxlciBzYyA9IG1Db250cm9sbGVycy5nZXQoY29udHJvbGxlcik7CkBAIC00NzgsMTkgKzQ3OSwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1JVTlRJTUVfRlJFRV9RVU9UQV9NQVhfTElNSVRfTVM6CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfUlVOVElNRV9NSU5fR1VBUkFOVEVFX01TOgogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1JVTlRJTUVfTUlOX0VKX0dVQVJBTlRFRV9NUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLktFWV9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9HVUFSQU5URUVfTVM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9MSU1JVF9NUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLktFWV9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1JVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLktFWV9SVU5USU1FX01JTl9VSV9HVUFSQU5URUVfTVM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5LRVlfUlVOVElNRV9VSV9MSU1JVF9NUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLktFWV9SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1JVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bnRpbWVVcGRhdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25zdGFudHMudXBkYXRlUnVudGltZUNvbnN0YW50c0xvY2tlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lVXBkYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX01BWF9OVU1fUEVSU0lTVEVEX0pPQl9XT1JLX0lURU1TOgogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuS0VZX1BFUlNJU1RfSU5fU1BMSVRfRklMRVM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnN0YW50cy51cGRhdGVQZXJzaXN0aW5nQ29uc3RhbnRzTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUpvYnMuc2V0VXNlU3BsaXRGaWxlcyhtQ29uc3RhbnRzLlBFUlNJU1RfSU5fU1BMSVRfRklMRVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGVyc2lzdGVuY2VVcGRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25zdGFudHMudXBkYXRlUGVyc2lzdGluZ0NvbnN0YW50c0xvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSm9icy5zZXRVc2VTcGxpdEZpbGVzKG1Db25zdGFudHMuUEVSU0lTVF9JTl9TUExJVF9GSUxFUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlVXBkYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKEpvYkNvbmN1cnJlbmN5TWFuYWdlci5DT05GSUdfS0VZX1BSRUZJWF9DT05DVVJSRU5DWSkKQEAgLTU3MiwyMCArNTc3LDIwIEBACiAgICAgICAgICAgICAgICAgInJ1bnRpbWVfZnJlZV9xdW90YV9tYXhfbGltaXRfbXMiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JVTlRJTUVfTUlOX0dVQVJBTlRFRV9NUyA9ICJydW50aW1lX21pbl9ndWFyYW50ZWVfbXMiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JVTlRJTUVfTUlOX0VKX0dVQVJBTlRFRV9NUyA9ICJydW50aW1lX21pbl9lal9ndWFyYW50ZWVfbXMiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0dVQVJBTlRFRV9NUyA9Ci0gICAgICAgICAgICAgICAgInJ1bnRpbWVfbWluX3VzZXJfaW5pdGlhdGVkX2d1YXJhbnRlZV9tcyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9MSU1JVF9NUyA9Ci0gICAgICAgICAgICAgICAgInJ1bnRpbWVfdXNlcl9pbml0aWF0ZWRfbGltaXRfbXMiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcKLSAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiA9Ci0gICAgICAgICAgICAgICAgInJ1bnRpbWVfbWluX3VzZXJfaW5pdGlhdGVkX2RhdGFfdHJhbnNmZXJfZ3VhcmFudGVlX2J1ZmZlcl9mYWN0b3IiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TID0KLSAgICAgICAgICAgICAgICAicnVudGltZV9taW5fdXNlcl9pbml0aWF0ZWRfZGF0YV90cmFuc2Zlcl9ndWFyYW50ZWVfbXMiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUyA9Ci0gICAgICAgICAgICAgICAgInJ1bnRpbWVfdXNlcl9pbml0aWF0ZWRfZGF0YV90cmFuc2Zlcl9saW1pdF9tcyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUlVOVElNRV9NSU5fVUlfR1VBUkFOVEVFX01TID0gInJ1bnRpbWVfbWluX3VpX2d1YXJhbnRlZV9tcyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUlVOVElNRV9VSV9MSU1JVF9NUyA9ICJydW50aW1lX3VpX2xpbWl0X21zIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SID0KKyAgICAgICAgICAgICAgICAicnVudGltZV9taW5fdWlfZGF0YV90cmFuc2Zlcl9ndWFyYW50ZWVfYnVmZmVyX2ZhY3RvciI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgPQorICAgICAgICAgICAgICAgICJydW50aW1lX21pbl91aV9kYXRhX3RyYW5zZmVyX2d1YXJhbnRlZV9tcyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TID0KKyAgICAgICAgICAgICAgICAicnVudGltZV91aV9kYXRhX3RyYW5zZmVyX2xpbWl0X21zIjsKIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BFUlNJU1RfSU5fU1BMSVRfRklMRVMgPSAicGVyc2lzdF9pbl9zcGxpdF9maWxlcyI7CiAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfTlVNX1BFUlNJU1RFRF9KT0JfV09SS19JVEVNUyA9CisgICAgICAgICAgICAgICAgIm1heF9udW1fcGVyc2lzdGVkX2pvYl93b3JrX2l0ZW1zIjsKKwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NSU5fUkVBRFlfTk9OX0FDVElWRV9KT0JTX0NPVU5UID0gNTsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX01BWF9OT05fQUNUSVZFX0pPQl9CQVRDSF9ERUxBWV9NUyA9IDMxICogTUlOVVRFX0lOX01JTExJUzsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9IRUFWWV9VU0VfRkFDVE9SID0gLjlmOwpAQCAtNjEwLDE3ICs2MTUsMTggQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfUlVOVElNRV9NSU5fR1VBUkFOVEVFX01TID0gMTAgKiBNSU5VVEVfSU5fTUlMTElTOwogICAgICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfUlVOVElNRV9NSU5fRUpfR1VBUkFOVEVFX01TID0gMyAqIE1JTlVURV9JTl9NSUxMSVM7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0dVQVJBTlRFRV9NUyA9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1JVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUyA9CiAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMTAgKiBNSU5VVEVfSU5fTUlMTElTLCBERUZBVUxUX1JVTlRJTUVfTUlOX0dVQVJBTlRFRV9NUyk7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1JVTlRJTUVfVVNFUl9JTklUSUFURURfTElNSVRfTVMgPQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9SVU5USU1FX1VJX0xJTUlUX01TID0KICAgICAgICAgICAgICAgICBNYXRoLm1heCg2MCAqIE1JTlVURV9JTl9NSUxMSVMsIERFRkFVTFRfUlVOVElNRV9GUkVFX1FVT1RBX01BWF9MSU1JVF9NUyk7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQKLSAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IgPSAxLjM1ZjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMgPQotICAgICAgICAgICAgICAgIE1hdGgubWF4KDEwICogTUlOVVRFX0lOX01JTExJUywgREVGQVVMVF9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9HVUFSQU5URUVfTVMpOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9SVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgPQotICAgICAgICAgICAgICAgIE1hdGgubWluKExvbmcuTUFYX1ZBTFVFLCBERUZBVUxUX1JVTlRJTUVfVVNFUl9JTklUSUFURURfTElNSVRfTVMpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiA9CisgICAgICAgICAgICAgICAgMS4zNWY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TID0KKyAgICAgICAgICAgICAgICBNYXRoLm1heCgxMCAqIE1JTlVURV9JTl9NSUxMSVMsIERFRkFVTFRfUlVOVElNRV9NSU5fVUlfR1VBUkFOVEVFX01TKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TID0KKyAgICAgICAgICAgICAgICBNYXRoLm1pbihMb25nLk1BWF9WQUxVRSwgREVGQVVMVF9SVU5USU1FX1VJX0xJTUlUX01TKTsKICAgICAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9QRVJTSVNUX0lOX1NQTElUX0ZJTEVTID0gdHJ1ZTsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9OVU1fUEVSU0lTVEVEX0pPQl9XT1JLX0lURU1TID0gMTAwXzAwMDsKIAogICAgICAgICAvKioKICAgICAgICAgICogTWluaW11bSAjIG9mIG5vbi1BQ1RJVkUgam9icyBmb3Igd2hpY2ggdGhlIEpNUyB3aWxsIGJlIGhhcHB5IHJ1bm5pbmcgc29tZSB3b3JrIGVhcmx5LgpAQCAtNzMxLDMzICs3MzcsMzEgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIHdlIHRyeSB0byBndWFyYW50ZWUgbm9ybWFsIHVzZXItaW5pdGlhdGVkIGpvYnMgd2lsbCBydW4gZm9yLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGxvbmcgUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfR1VBUkFOVEVFX01TID0KLSAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0dVQVJBTlRFRV9NUzsKKyAgICAgICAgcHVibGljIGxvbmcgUlVOVElNRV9NSU5fVUlfR1VBUkFOVEVFX01TID0gREVGQVVMVF9SVU5USU1FX01JTl9VSV9HVUFSQU5URUVfTVM7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHdlIHdpbGwgbGV0IGEgdXNlci1pbml0aWF0ZWQgam9iIHJ1biBmb3IuIFRoaXMgd2lsbCBvbmx5CiAgICAgICAgICAqIGFwcGx5IGlmIHRoZXJlIGFyZSBubyBvdGhlciBsaW1pdHMgdGhhdCBhcHBseSB0byB0aGUgc3BlY2lmaWMgdXNlci1pbml0aWF0ZWQgam9iLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGxvbmcgUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9MSU1JVF9NUyA9IERFRkFVTFRfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9MSU1JVF9NUzsKKyAgICAgICAgcHVibGljIGxvbmcgUlVOVElNRV9VSV9MSU1JVF9NUyA9IERFRkFVTFRfUlVOVElNRV9VSV9MSU1JVF9NUzsKIAogICAgICAgICAvKioKICAgICAgICAgICogQSBmYWN0b3IgdG8gYXBwbHkgdG8gZXN0aW1hdGVkIHRyYW5zZmVyIGR1cmF0aW9ucyBmb3IgdXNlci1pbml0aWF0ZWQgZGF0YSB0cmFuc2ZlciBqb2JzCiAgICAgICAgICAqIHNvIHRoYXQgd2UgZ2l2ZSBzb21lIGV4dHJhIHRpbWUgZm9yIHVuZXhwZWN0ZWQgc2l0dWF0aW9ucy4gVGhpcyB3aWxsIGJlIGF0IGxlYXN0IDEgYW5kCiAgICAgICAgICAqIHNvIGNhbiBqdXN0IGJlIG11bHRpcGxpZWQgd2l0aCB0aGUgb3JpZ2luYWwgdmFsdWUgdG8gZ2V0IHRoZSBmaW5hbCB2YWx1ZS4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBmbG9hdCBSVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SID0KLSAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1I7CisgICAgICAgIHB1YmxpYyBmbG9hdCBSVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SID0KKyAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1I7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIHdlIHRyeSB0byBndWFyYW50ZWUgdXNlci1pbml0aWF0ZWQgZGF0YSB0cmFuc2ZlciBqb2JzCiAgICAgICAgICAqIHdpbGwgcnVuIGZvci4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBsb25nIFJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TID0KLSAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TOworICAgICAgICBwdWJsaWMgbG9uZyBSVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUyA9CisgICAgICAgICAgICAgICAgREVGQVVMVF9SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUzsKIAogICAgICAgICAvKiogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgd2Ugd2lsbCBsZXQgYSB1c2VyLWluaXRpYXRlZCBkYXRhIHRyYW5zZmVyIGpvYiBydW4gZm9yLiAqLwotICAgICAgICBwdWJsaWMgbG9uZyBSVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgPQotICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0xJTUlUX01TOworICAgICAgICBwdWJsaWMgbG9uZyBSVU5USU1FX1VJX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgPSBERUZBVUxUX1JVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUzsKIAogICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0byBwZXJzaXN0IGpvYnMgaW4gc3BsaXQgZmlsZXMgKGJ5IFVJRCkuIElmIGZhbHNlLCBhbGwgcGVyc2lzdGVkIGpvYnMgd2lsbCBiZQpAQCAtNzY2LDYgKzc3MCwxMSBAQAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBQRVJTSVNUX0lOX1NQTElUX0ZJTEVTID0gREVGQVVMVF9QRVJTSVNUX0lOX1NQTElUX0ZJTEVTOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Yge0BsaW5rIEpvYldvcmtJdGVtIEpvYldvcmtJdGVtc30gdGhhdCBjYW4gYmUgcGVyc2lzdGVkIHBlciBqb2IuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IE1BWF9OVU1fUEVSU0lTVEVEX0pPQl9XT1JLX0lURU1TID0gREVGQVVMVF9NQVhfTlVNX1BFUlNJU1RFRF9KT0JfV09SS19JVEVNUzsKKworICAgICAgICAvKioKICAgICAgICAgICogSWYgdHJ1ZSwgdXNlIFRBUkUgcG9saWN5IGZvciBqb2IgbGltaXRpbmcuIElmIGZhbHNlLCB1c2UgcXVvdGFzLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gVVNFX1RBUkVfUE9MSUNZID0gRWNvbm9teU1hbmFnZXIuREVGQVVMVF9FTkFCTEVfUE9MSUNZX0pPQl9TQ0hFRFVMRVIKQEAgLTgyNyw2ICs4MzYsMTAgQEAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBlcnNpc3RpbmdDb25zdGFudHNMb2NrZWQoKSB7CiAgICAgICAgICAgICBQRVJTSVNUX0lOX1NQTElUX0ZJTEVTID0gRGV2aWNlQ29uZmlnLmdldEJvb2xlYW4oRGV2aWNlQ29uZmlnLk5BTUVTUEFDRV9KT0JfU0NIRURVTEVSLAogICAgICAgICAgICAgICAgICAgICBLRVlfUEVSU0lTVF9JTl9TUExJVF9GSUxFUywgREVGQVVMVF9QRVJTSVNUX0lOX1NQTElUX0ZJTEVTKTsKKyAgICAgICAgICAgIE1BWF9OVU1fUEVSU0lTVEVEX0pPQl9XT1JLX0lURU1TID0gRGV2aWNlQ29uZmlnLmdldEludCgKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQ29uZmlnLk5BTUVTUEFDRV9KT0JfU0NIRURVTEVSLAorICAgICAgICAgICAgICAgICAgICBLRVlfTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMsCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByZWZldGNoQ29uc3RhbnRzTG9ja2VkKCkgewpAQCAtODYyLDExICs4NzUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgRGV2aWNlQ29uZmlnLk5BTUVTUEFDRV9KT0JfU0NIRURVTEVSLAogICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9GUkVFX1FVT1RBX01BWF9MSU1JVF9NUywKICAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfTUlOX0dVQVJBTlRFRV9NUywgS0VZX1JVTlRJTUVfTUlOX0VKX0dVQVJBTlRFRV9NUywKLSAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IsCi0gICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9HVUFSQU5URUVfTVMsCi0gICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX1VTRVJfSU5JVElBVEVEX0xJTUlUX01TLAotICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCi0gICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMpOworICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiwKKyAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUywKKyAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfVUlfTElNSVRfTVMsCisgICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUywKKyAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUyk7CiAKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBtaW4gcnVudGltZSBmb3IgcmVndWxhciBqb2JzIGlzIGF0IGxlYXN0IDEwIG1pbnV0ZXMuCiAgICAgICAgICAgICBSVU5USU1FX01JTl9HVUFSQU5URUVfTVMgPSBNYXRoLm1heCgxMCAqIE1JTlVURV9JTl9NSUxMSVMsCkBAIC04ODAsMzcgKzg5MywzNSBAQAogICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldExvbmcoS0VZX1JVTlRJTUVfRlJFRV9RVU9UQV9NQVhfTElNSVRfTVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9SVU5USU1FX0ZSRUVfUVVPVEFfTUFYX0xJTUlUX01TKSk7CiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbWluIHJ1bnRpbWUgaXMgYXQgbGVhc3QgYXMgbG9uZyBhcyByZWd1bGFyIGpvYnMuCi0gICAgICAgICAgICBSVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9HVUFSQU5URUVfTVMgPSBNYXRoLm1heChSVU5USU1FX01JTl9HVUFSQU5URUVfTVMsCisgICAgICAgICAgICBSVU5USU1FX01JTl9VSV9HVUFSQU5URUVfTVMgPSBNYXRoLm1heChSVU5USU1FX01JTl9HVUFSQU5URUVfTVMsCiAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0TG9uZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfR1VBUkFOVEVFX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfR1VBUkFOVEVFX01TKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUywgREVGQVVMVF9SVU5USU1FX01JTl9VSV9HVUFSQU5URUVfTVMpKTsKICAgICAgICAgICAgIC8vIE1heCBsaW1pdCBzaG91bGQgYmUgYXQgbGVhc3QgdGhlIG1pbiBndWFyYW50ZWUgQU5EIHRoZSBmcmVlIHF1b3RhLgotICAgICAgICAgICAgUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9MSU1JVF9NUyA9IE1hdGgubWF4KFJVTlRJTUVfRlJFRV9RVU9UQV9NQVhfTElNSVRfTVMsCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KFJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0dVQVJBTlRFRV9NUywKKyAgICAgICAgICAgIFJVTlRJTUVfVUlfTElNSVRfTVMgPSBNYXRoLm1heChSVU5USU1FX0ZSRUVfUVVPVEFfTUFYX0xJTUlUX01TLAorICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChSVU5USU1FX01JTl9VSV9HVUFSQU5URUVfTVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRMb25nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfVVNFUl9JTklUSUFURURfTElNSVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfVVNFUl9JTklUSUFURURfTElNSVRfTVMpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUlVOVElNRV9VSV9MSU1JVF9NUywgREVGQVVMVF9SVU5USU1FX1VJX0xJTUlUX01TKSkpOwogICAgICAgICAgICAgLy8gVGhlIGJ1ZmZlciBmYWN0b3Igc2hvdWxkIGJlIGF0IGxlYXN0IDEgKHNvIHdlIGRvbid0IGRlY3JlYXNlIHRoZSB0aW1lKS4KLSAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IgPSBNYXRoLm1heCgxLAorICAgICAgICAgICAgUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiA9IE1hdGgubWF4KDEsCiAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0RmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SCiAgICAgICAgICAgICAgICAgICAgICkpOwogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG1pbiBydW50aW1lIGlzIGF0IGxlYXN0IGFzIGxvbmcgYXMgb3RoZXIgdXNlci1pbml0aWF0ZWQgam9icy4KLSAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TID0gTWF0aC5tYXgoCi0gICAgICAgICAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0dVQVJBTlRFRV9NUywKKyAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TID0gTWF0aC5tYXgoCisgICAgICAgICAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUywKICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRMb25nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMpKTsKICAgICAgICAgICAgIC8vIFVzZXItaW5pdGlhdGVkIHJlcXVpcmVzIFJVTl9VU0VSX0lOSVRJQVRFRF9KT0JTIHBlcm1pc3Npb24sIHNvIHRoZSB1cHBlciBsaW1pdCB3aWxsCiAgICAgICAgICAgICAvLyBiZSBoaWdoZXIgdGhhbiBvdGhlciBqb2JzLgogICAgICAgICAgICAgLy8gTWF4IGxpbWl0IHNob3VsZCBiZSB0aGUgbWluIGd1YXJhbnRlZSBhbmQgdGhlIG1heCBvZiBvdGhlciB1c2VyLWluaXRpYXRlZCBqb2JzLgotICAgICAgICAgICAgUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0xJTUlUX01TID0gTWF0aC5tYXgoCi0gICAgICAgICAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAotICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChSVU5USU1FX1VTRVJfSU5JVElBVEVEX0xJTUlUX01TLAorICAgICAgICAgICAgUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TID0gTWF0aC5tYXgoCisgICAgICAgICAgICAgICAgICAgIFJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAorICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChSVU5USU1FX1VJX0xJTUlUX01TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0TG9uZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9SVU5USU1FX1VJX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUykpKTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVUYXJlU2V0dGluZ3NMb2NrZWQoQEVjb25vbXlNYW5hZ2VyLkVuYWJsZWRNb2RlIGludCBlbmFibGVkTW9kZSkgewpAQCAtOTU4LDE4ICs5NjksMTggQEAKICAgICAgICAgICAgIHB3LnByaW50KEtFWV9SVU5USU1FX01JTl9FSl9HVUFSQU5URUVfTVMsIFJVTlRJTUVfTUlOX0VKX0dVQVJBTlRFRV9NUykucHJpbnRsbigpOwogICAgICAgICAgICAgcHcucHJpbnQoS0VZX1JVTlRJTUVfRlJFRV9RVU9UQV9NQVhfTElNSVRfTVMsIFJVTlRJTUVfRlJFRV9RVU9UQV9NQVhfTElNSVRfTVMpCiAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCk7Ci0gICAgICAgICAgICBwdy5wcmludChLRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfR1VBUkFOVEVFX01TLAotICAgICAgICAgICAgICAgICAgICBSVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9HVUFSQU5URUVfTVMpLnByaW50bG4oKTsKLSAgICAgICAgICAgIHB3LnByaW50KEtFWV9SVU5USU1FX1VTRVJfSU5JVElBVEVEX0xJTUlUX01TLAotICAgICAgICAgICAgICAgICAgICBSVU5USU1FX1VTRVJfSU5JVElBVEVEX0xJTUlUX01TKS5wcmludGxuKCk7Ci0gICAgICAgICAgICBwdy5wcmludChLRVlfUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiwKLSAgICAgICAgICAgICAgICAgICAgUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUikucHJpbnRsbigpOwotICAgICAgICAgICAgcHcucHJpbnQoS0VZX1JVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAotICAgICAgICAgICAgICAgICAgICBSVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUykucHJpbnRsbigpOwotICAgICAgICAgICAgcHcucHJpbnQoS0VZX1JVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUywKLSAgICAgICAgICAgICAgICAgICAgUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0xJTUlUX01TKS5wcmludGxuKCk7CisgICAgICAgICAgICBwdy5wcmludChLRVlfUlVOVElNRV9NSU5fVUlfR1VBUkFOVEVFX01TLCBSVU5USU1FX01JTl9VSV9HVUFSQU5URUVfTVMpLnByaW50bG4oKTsKKyAgICAgICAgICAgIHB3LnByaW50KEtFWV9SVU5USU1FX1VJX0xJTUlUX01TLCBSVU5USU1FX1VJX0xJTUlUX01TKS5wcmludGxuKCk7CisgICAgICAgICAgICBwdy5wcmludChLRVlfUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUiwKKyAgICAgICAgICAgICAgICAgICAgUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfQlVGRkVSX0ZBQ1RPUikucHJpbnRsbigpOworICAgICAgICAgICAgcHcucHJpbnQoS0VZX1JVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAorICAgICAgICAgICAgICAgICAgICBSVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUykucHJpbnRsbigpOworICAgICAgICAgICAgcHcucHJpbnQoS0VZX1JVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUywKKyAgICAgICAgICAgICAgICAgICAgUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TKS5wcmludGxuKCk7CiAKICAgICAgICAgICAgIHB3LnByaW50KEtFWV9QRVJTSVNUX0lOX1NQTElUX0ZJTEVTLCBQRVJTSVNUX0lOX1NQTElUX0ZJTEVTKS5wcmludGxuKCk7CisgICAgICAgICAgICBwdy5wcmludChLRVlfTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMsIE1BWF9OVU1fUEVSU0lTVEVEX0pPQl9XT1JLX0lURU1TKQorICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigpOwogCiAgICAgICAgICAgICBwdy5wcmludChTZXR0aW5ncy5HbG9iYWwuRU5BQkxFX1RBUkUsIFVTRV9UQVJFX1BPTElDWSkucHJpbnRsbigpOwogCkBAIC0xMzUzLDYgKzEzNjQsMjUgQEAKICAgICAgICAgICAgICAgICAvLyBGYXN0IHBhdGg6IHdlIGFyZSBhZGRpbmcgd29yayB0byBhbiBleGlzdGluZyBqb2IsIGFuZCB0aGUgSm9iSW5mbyBpcyBub3QKICAgICAgICAgICAgICAgICAvLyBjaGFuZ2luZy4gIFdlIGNhbiBqdXN0IGRpcmVjdGx5IGVucXVldWUgdGhpcyB3b3JrIGluIHRvIHRoZSBqb2IuCiAgICAgICAgICAgICAgICAgaWYgKHRvQ2FuY2VsLmdldEpvYigpLmVxdWFscyhqb2IpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9uIFQgYW5kIGJlbG93LCBKb2JXb3JrSXRlbSBjb3VudCB3YXMgdW5saW1pdGVkIGJ1dCB0aGV5IGNvdWxkIG5vdCBiZQorICAgICAgICAgICAgICAgICAgICAvLyBwZXJzaXN0ZWQuIE5vdyBpbiBVIGFuZCBhYm92ZSwgd2UgYWxsb3cgcGVyc2lzdGluZyB0aGVtLiBJbiBib3RoIGNhc2VzLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIGRhbmdlciBvZiBhcHBzIGFkZGluZyB0b28gbWFueSBKb2JXb3JrSXRlbXMgYW5kIGNhdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHN5c3RlbSB0byBPT00gc2luY2Ugd2Uga2VlcCBldmVyeXRoaW5nIGluIG1lbW9yeS4gVGhlIHBlcnNpc3RpbmcgZGFuZ2VyCisgICAgICAgICAgICAgICAgICAgIC8vIGlzIGdyZWF0ZXIgYmVjYXVzZSBpdCBjb3VsZCB0ZWNobmljYWxseSBsZWFkIHRvIGEgYm9vdCBsb29wIGlmIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdHJ5aW5nIHRvIGxvYWQgYWxsIHRoZSBKb2JXb3JrSXRlbXMgdGhhdCBsZWQgdG8gdGhlIGluaXRpYWwgT09NLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUsIGZvciBub3cgKHBhcnRseSBmb3IgYXBwIGNvbXBhdGliaWxpdHkpLCB3ZSB0YWNrbGUgdGhlIGxhdHRlcgorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGltaXQgdGhlIG51bWJlciBvZiBKb2JXb3JrSXRlbXMgdGhhdCBjYW4gYmUgcGVyc2lzdGVkLgorICAgICAgICAgICAgICAgICAgICAvLyBNb3ZpbmcgZm9yd2FyZCwgd2Ugc2hvdWxkIGxvb2sgaW50byB0d28gdGhpbmdzOgorICAgICAgICAgICAgICAgICAgICAvLyAgIDEuIExpbWl0aW5nIHRoZSBudW1iZXIgb2YgdW5wZXJzaXN0ZWQgSm9iV29ya0l0ZW1zCisgICAgICAgICAgICAgICAgICAgIC8vICAgMi4gT2ZmbG9hZGluZyBzb21lIHN0YXRlIHRvIGRpc2sgc28gd2UgZG9uJ3Qga2VlcCBldmVyeXRoaW5nIGluIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKDI3Mzc1ODI3NCk6IGltcHJvdmUgSm9iU2NoZWR1bGVyJ3MgcmVzaWxpZW5jZSBhbmQgbWVtb3J5IG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvQ2FuY2VsLmdldFdvcmtDb3VudCgpID49IG1Db25zdGFudHMuTUFYX05VTV9QRVJTSVNURURfSk9CX1dPUktfSVRFTVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0b0NhbmNlbC5pc1BlcnNpc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVG9vIG1hbnkgSldJcyBmb3IgdWlkICIgKyB1SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXBwcyBtYXkgbm90IHBlcnNpc3QgbW9yZSB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ29uc3RhbnRzLk1BWF9OVU1fUEVSU0lTVEVEX0pPQl9XT1JLX0lURU1TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBKb2JXb3JrSXRlbXMgcGVyIGpvYiIpOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgdG9DYW5jZWwuZW5xdWV1ZVdvcmtMb2NrZWQod29yayk7CiAgICAgICAgICAgICAgICAgICAgIG1Kb2JzLnRvdWNoSm9iKHRvQ2FuY2VsKTsKQEAgLTEzOTcsNiArMTQyNywyNiBAQAogICAgICAgICAgICAgam9iU3RhdHVzLnByZXBhcmVMb2NrZWQoKTsKIAogICAgICAgICAgICAgaWYgKHRvQ2FuY2VsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBPbiBUIGFuZCBiZWxvdywgSm9iV29ya0l0ZW0gY291bnQgd2FzIHVubGltaXRlZCBidXQgdGhleSBjb3VsZCBub3QgYmUKKyAgICAgICAgICAgICAgICAvLyBwZXJzaXN0ZWQuIE5vdyBpbiBVIGFuZCBhYm92ZSwgd2UgYWxsb3cgcGVyc2lzdGluZyB0aGVtLiBJbiBib3RoIGNhc2VzLAorICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgZGFuZ2VyIG9mIGFwcHMgYWRkaW5nIHRvbyBtYW55IEpvYldvcmtJdGVtcyBhbmQgY2F1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gdG8gT09NIHNpbmNlIHdlIGtlZXAgZXZlcnl0aGluZyBpbiBtZW1vcnkuIFRoZSBwZXJzaXN0aW5nIGRhbmdlcgorICAgICAgICAgICAgICAgIC8vIGlzIGdyZWF0ZXIgYmVjYXVzZSBpdCBjb3VsZCB0ZWNobmljYWxseSBsZWFkIHRvIGEgYm9vdCBsb29wIGlmIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgICAgICAvLyBrZWVwcyB0cnlpbmcgdG8gbG9hZCBhbGwgdGhlIEpvYldvcmtJdGVtcyB0aGF0IGxlZCB0byB0aGUgaW5pdGlhbCBPT00uCisgICAgICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCBmb3Igbm93IChwYXJ0bHkgZm9yIGFwcCBjb21wYXRpYmlsaXR5KSwgd2UgdGFja2xlIHRoZSBsYXR0ZXIKKyAgICAgICAgICAgICAgICAvLyBhbmQgbGltaXQgdGhlIG51bWJlciBvZiBKb2JXb3JrSXRlbXMgdGhhdCBjYW4gYmUgcGVyc2lzdGVkLgorICAgICAgICAgICAgICAgIC8vIE1vdmluZyBmb3J3YXJkLCB3ZSBzaG91bGQgbG9vayBpbnRvIHR3byB0aGluZ3M6CisgICAgICAgICAgICAgICAgLy8gICAxLiBMaW1pdGluZyB0aGUgbnVtYmVyIG9mIHVucGVyc2lzdGVkIEpvYldvcmtJdGVtcworICAgICAgICAgICAgICAgIC8vICAgMi4gT2ZmbG9hZGluZyBzb21lIHN0YXRlIHRvIGRpc2sgc28gd2UgZG9uJ3Qga2VlcCBldmVyeXRoaW5nIGluIG1lbW9yeQorICAgICAgICAgICAgICAgIC8vIFRPRE8oMjczNzU4Mjc0KTogaW1wcm92ZSBKb2JTY2hlZHVsZXIncyByZXNpbGllbmNlIGFuZCBtZW1vcnkgbWFuYWdlbWVudAorICAgICAgICAgICAgICAgIGlmICh3b3JrICE9IG51bGwgJiYgdG9DYW5jZWwuaXNQZXJzaXN0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdG9DYW5jZWwuZ2V0V29ya0NvdW50KCkgPj0gbUNvbnN0YW50cy5NQVhfTlVNX1BFUlNJU1RFRF9KT0JfV09SS19JVEVNUykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVG9vIG1hbnkgSldJcyBmb3IgdWlkICIgKyB1SWQpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBcHBzIG1heSBub3QgcGVyc2lzdCBtb3JlIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnN0YW50cy5NQVhfTlVNX1BFUlNJU1RFRF9KT0JfV09SS19JVEVNUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBKb2JXb3JrSXRlbXMgcGVyIGpvYiIpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIEltcGxpY2l0bHkgcmVwbGFjZXMgdGhlIGV4aXN0aW5nIGpvYiByZWNvcmQgd2l0aCB0aGUgbmV3IGluc3RhbmNlCiAgICAgICAgICAgICAgICAgY2FuY2VsSm9iSW1wbExvY2tlZCh0b0NhbmNlbCwgam9iU3RhdHVzLCBKb2JQYXJhbWV0ZXJzLlNUT1BfUkVBU09OX0NBTkNFTExFRF9CWV9BUFAsCiAgICAgICAgICAgICAgICAgICAgICAgICBKb2JQYXJhbWV0ZXJzLklOVEVSTkFMX1NUT1BfUkVBU09OX0NBTkNFTEVELCAiam9iIHJlc2NoZWR1bGVkIGJ5IGFwcCIpOwpAQCAtMTQzOCw3ICsxNDg4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgLyogaXNEZXZpY2VJZGxlICovIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAvKiBoYXNDb25uZWN0aXZpdHlDb25zdHJhaW50U2F0aXNmaWVkICovIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAvKiBoYXNDb250ZW50VHJpZ2dlckNvbnN0cmFpbnRTYXRpc2ZpZWQgKi8gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICBqb2JTdGF0dXMuZ2V0Sm9iKCkuaXNVc2VySW5pdGlhdGVkKCksCisgICAgICAgICAgICAgICAgICAgIC8qIGlzUnVubmluZ0FzVXNlckluaXRpYXRlZEpvYiAqLyBmYWxzZSk7CiAKICAgICAgICAgICAgIC8vIElmIHRoZSBqb2IgaXMgaW1tZWRpYXRlbHkgcmVhZHkgdG8gcnVuLCB0aGVuIHdlIGNhbiBqdXN0IGltbWVkaWF0ZWx5CiAgICAgICAgICAgICAvLyBwdXQgaXQgaW4gdGhlIHBlbmRpbmcgbGlzdCBhbmQgdHJ5IHRvIHNjaGVkdWxlIGl0LiAgVGhpcyBpcyBlc3BlY2lhbGx5CkBAIC0xODU3LDcgKzE5MDksOSBAQAogICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQuaXNDb25zdHJhaW50U2F0aXNmaWVkKEpvYkluZm8uQ09OU1RSQUlOVF9GTEFHX0RFVklDRV9JRExFKSwKICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGVkLmlzQ29uc3RyYWludFNhdGlzZmllZChKb2JTdGF0dXMuQ09OU1RSQUlOVF9DT05ORUNUSVZJVFkpLAogICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQuaXNDb25zdHJhaW50U2F0aXNmaWVkKEpvYlN0YXR1cy5DT05TVFJBSU5UX0NPTlRFTlRfVFJJR0dFUiksCi0gICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQuZ2V0Sm9iKCkuaXNVc2VySW5pdGlhdGVkKCksCisgICAgICAgICAgICAgICAgICAgIC8qIGlzUnVubmluZ0FzVXNlckluaXRpYXRlZEpvYiAqLyBmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHJlcGxhY2VtZW50LCBicmluZyBpbiB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGpvYgogICAgICAgICBpZiAoaW5jb21pbmdKb2IgIT0gbnVsbCkgewpAQCAtMzI1NiwxOSArMzMxMCwxOCBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVzdGltYXRlZFRyYW5zZmVyVGltZU1zID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5Q29udHJvbGxlci5nZXRFc3RpbWF0ZWRUcmFuc2ZlclRpbWVNcyhqb2IpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXN0aW1hdGVkVHJhbnNmZXJUaW1lTXMgPT0gQ29ubmVjdGl2aXR5Q29udHJvbGxlci5VTktOT1dOX1RJTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMuUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVM7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGdpdmUgdGhlIGpvYiBhdCBsZWFzdCBhcyBtdWNoIHRpbWUgYXMgd2UgdGhpbmsgdGhlIHRyYW5zZmVyIHdpbGwgdGFrZSwKICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGNhcCBpdCBhdCB0aGUgbWF4aW11bSBsaW1pdAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGZhY3RvcmVkVHJhbnNmZXJUaW1lTXMgPSAobG9uZykgKGVzdGltYXRlZFRyYW5zZmVyVGltZU1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtQ29uc3RhbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obUNvbnN0YW50cy5SVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obUNvbnN0YW50cy5SVU5USU1FX1VJX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZmFjdG9yZWRUcmFuc2ZlclRpbWVNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25zdGFudHMuUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25zdGFudHMuUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMuUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfR1VBUkFOVEVFX01TOworICAgICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VJX0dVQVJBTlRFRV9NUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoam9iLnNob3VsZFRyZWF0QXNFeHBlZGl0ZWRKb2IoKSkgewogICAgICAgICAgICAgICAgIC8vIERvbid0IGd1YXJhbnRlZSBSRVNUUklDVEVEIGpvYnMgbW9yZSB0aGFuIDUgbWludXRlcy4KICAgICAgICAgICAgICAgICByZXR1cm4gam9iLmdldEVmZmVjdGl2ZVN0YW5kYnlCdWNrZXQoKSAhPSBSRVNUUklDVEVEX0lOREVYCkBAIC0zMjg3LDEwICszMzQwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICYmIGNoZWNrUnVuVXNlckluaXRpYXRlZEpvYnNQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYi5nZXRTb3VyY2VVaWQoKSwgam9iLmdldFNvdXJjZVBhY2thZ2VOYW1lKCkpOwogICAgICAgICAgICAgaWYgKGpvYi5nZXRKb2IoKS5nZXRSZXF1aXJlZE5ldHdvcmsoKSAhPSBudWxsICYmIGFsbG93TG9uZ2VySm9iKSB7IC8vIFVJK0RUCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMuUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0xJTUlUX01TOworICAgICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLlJVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhbGxvd0xvbmdlckpvYikgeyAvLyBVSSB3aXRoIExSSiBwZXJtaXNzaW9uCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMuUlVOVElNRV9VU0VSX0lOSVRJQVRFRF9MSU1JVF9NUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50cy5SVU5USU1FX1VJX0xJTUlUX01TOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGpvYi5zaG91bGRUcmVhdEFzVXNlckluaXRpYXRlZEpvYigpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMuUlVOVElNRV9GUkVFX1FVT1RBX01BWF9MSU1JVF9NUzsKZGlmZiAtLWdpdCBhL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL0pvYlNlcnZpY2VDb250ZXh0LmphdmEgYi9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9Kb2JTZXJ2aWNlQ29udGV4dC5qYXZhCmluZGV4IGU2MGVkNGEuLjRjMzM5YWMgMTAwNjQ0Ci0tLSBhL2FwZXgvam9ic2NoZWR1bGVyL3NlcnZpY2UvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL0pvYlNlcnZpY2VDb250ZXh0LmphdmEKKysrIGIvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9qb2IvSm9iU2VydmljZUNvbnRleHQuamF2YQpAQCAtNDYyLDcgKzQ2Miw5IEBACiAgICAgICAgICAgICAgICAgICAgIGpvYi5pc0NvbnN0cmFpbnRTYXRpc2ZpZWQoSm9iSW5mby5DT05TVFJBSU5UX0ZMQUdfREVWSUNFX0lETEUpLAogICAgICAgICAgICAgICAgICAgICBqb2IuaXNDb25zdHJhaW50U2F0aXNmaWVkKEpvYlN0YXR1cy5DT05TVFJBSU5UX0NPTk5FQ1RJVklUWSksCiAgICAgICAgICAgICAgICAgICAgIGpvYi5pc0NvbnN0cmFpbnRTYXRpc2ZpZWQoSm9iU3RhdHVzLkNPTlNUUkFJTlRfQ09OVEVOVF9UUklHR0VSKSwKLSAgICAgICAgICAgICAgICAgICAgbUV4ZWN1dGlvblN0YXJ0VGltZUVsYXBzZWQgLSBqb2IuZW5xdWV1ZVRpbWUpOworICAgICAgICAgICAgICAgICAgICBtRXhlY3V0aW9uU3RhcnRUaW1lRWxhcHNlZCAtIGpvYi5lbnF1ZXVlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgam9iLmdldEpvYigpLmlzVXNlckluaXRpYXRlZCgpLAorICAgICAgICAgICAgICAgICAgICBqb2Iuc2hvdWxkVHJlYXRBc1VzZXJJbml0aWF0ZWRKb2IoKSk7CiAgICAgICAgICAgICBpZiAoVHJhY2UuaXNUYWdFbmFibGVkKFRyYWNlLlRSQUNFX1RBR19TWVNURU1fU0VSVkVSKSkgewogICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgY29udGV4dCdzIElEIHRvIGRpc3Rpbmd1aXNoIHRyYWNlcyBzaW5jZSB0aGVyZSdsbCBvbmx5IGJlIG9uZSBqb2IKICAgICAgICAgICAgICAgICAvLyBydW5uaW5nIHBlciBjb250ZXh0LgpAQCAtMTM2MSw3ICsxMzYzLDkgQEAKICAgICAgICAgICAgICAgICBjb21wbGV0ZWRKb2IuaXNDb25zdHJhaW50U2F0aXNmaWVkKEpvYkluZm8uQ09OU1RSQUlOVF9GTEFHX0RFVklDRV9JRExFKSwKICAgICAgICAgICAgICAgICBjb21wbGV0ZWRKb2IuaXNDb25zdHJhaW50U2F0aXNmaWVkKEpvYlN0YXR1cy5DT05TVFJBSU5UX0NPTk5FQ1RJVklUWSksCiAgICAgICAgICAgICAgICAgY29tcGxldGVkSm9iLmlzQ29uc3RyYWludFNhdGlzZmllZChKb2JTdGF0dXMuQ09OU1RSQUlOVF9DT05URU5UX1RSSUdHRVIpLAotICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgY29tcGxldGVkSm9iLmdldEpvYigpLmlzVXNlckluaXRpYXRlZCgpLAorICAgICAgICAgICAgICAgIGNvbXBsZXRlZEpvYi5zdGFydGVkQXNVc2VySW5pdGlhdGVkSm9iKTsKICAgICAgICAgaWYgKFRyYWNlLmlzVGFnRW5hYmxlZChUcmFjZS5UUkFDRV9UQUdfU1lTVEVNX1NFUlZFUikpIHsKICAgICAgICAgICAgIFRyYWNlLmFzeW5jVHJhY2VGb3JUcmFja0VuZChUcmFjZS5UUkFDRV9UQUdfU1lTVEVNX1NFUlZFUiwgIkpvYlNjaGVkdWxlciIsCiAgICAgICAgICAgICAgICAgICAgIGdldElkKCkpOwpkaWZmIC0tZ2l0IGEvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9qb2IvY29udHJvbGxlcnMvSm9iU3RhdHVzLmphdmEgYi9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9jb250cm9sbGVycy9Kb2JTdGF0dXMuamF2YQppbmRleCA1MzdhNjcwLi4wY2M3NzU4IDEwMDY0NAotLS0gYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9jb250cm9sbGVycy9Kb2JTdGF0dXMuamF2YQorKysgYi9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9jb250cm9sbGVycy9Kb2JTdGF0dXMuamF2YQpAQCAtODE0LDYgKzgxNCwxMyBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHtAbGluayBKb2JXb3JrSXRlbSBKb2JXb3JrSXRlbXN9IGF0dGFjaGVkIHRvIHRoaXMgam9iLiAqLworICAgIHB1YmxpYyBpbnQgZ2V0V29ya0NvdW50KCkgeworICAgICAgICBmaW5hbCBpbnQgcGVuZGluZ0NvdW50ID0gcGVuZGluZ1dvcmsgPT0gbnVsbCA/IDAgOiBwZW5kaW5nV29yay5zaXplKCk7CisgICAgICAgIGZpbmFsIGludCBleGVjdXRpbmdDb3VudCA9IGV4ZWN1dGluZ1dvcmsgPT0gbnVsbCA/IDAgOiBleGVjdXRpbmdXb3JrLnNpemUoKTsKKyAgICAgICAgcmV0dXJuIHBlbmRpbmdDb3VudCArIGV4ZWN1dGluZ0NvdW50OworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGhhc1dvcmtMb2NrZWQoKSB7CiAgICAgICAgIHJldHVybiAocGVuZGluZ1dvcmsgIT0gbnVsbCAmJiBwZW5kaW5nV29yay5zaXplKCkgPiAwKSB8fCBoYXNFeGVjdXRpbmdXb3JrTG9ja2VkKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci90YXJlL0luc3RhbGxlZFBhY2thZ2VJbmZvLmphdmEgYi9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvSW5zdGFsbGVkUGFja2FnZUluZm8uamF2YQppbmRleCAxZmYzODlkLi5kZmZlZDBmIDEwMDY0NAotLS0gYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvSW5zdGFsbGVkUGFja2FnZUluZm8uamF2YQorKysgYi9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvSW5zdGFsbGVkUGFja2FnZUluZm8uamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Vc2VySWRJbnQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQXBwR2xvYmFsczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuUGVybWlzc2lvbkNoZWNrZXI7CkBAIC00MSw3ICs0Miw4IEBACiAgICAgQE51bGxhYmxlCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBpbnN0YWxsZXJQYWNrYWdlTmFtZTsKIAotICAgIEluc3RhbGxlZFBhY2thZ2VJbmZvKEBOb25OdWxsIENvbnRleHQgY29udGV4dCwgQE5vbk51bGwgUGFja2FnZUluZm8gcGFja2FnZUluZm8pIHsKKyAgICBJbnN0YWxsZWRQYWNrYWdlSW5mbyhATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBVc2VySWRJbnQgaW50IHVzZXJJZCwKKyAgICAgICAgICAgIEBOb25OdWxsIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvKSB7CiAgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSW5mbyBhcHBsaWNhdGlvbkluZm8gPSBwYWNrYWdlSW5mby5hcHBsaWNhdGlvbkluZm87CiAgICAgICAgIHVpZCA9IGFwcGxpY2F0aW9uSW5mbyA9PSBudWxsID8gTk9fVUlEIDogYXBwbGljYXRpb25JbmZvLnVpZDsKICAgICAgICAgcGFja2FnZU5hbWUgPSBwYWNrYWdlSW5mby5wYWNrYWdlTmFtZTsKQEAgLTU1LDcgKzU3LDggQEAKICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkluZm8udWlkLCBwYWNrYWdlTmFtZSk7CiAgICAgICAgIEluc3RhbGxTb3VyY2VJbmZvIGluc3RhbGxTb3VyY2VJbmZvID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluc3RhbGxTb3VyY2VJbmZvID0gQXBwR2xvYmFscy5nZXRQYWNrYWdlTWFuYWdlcigpLmdldEluc3RhbGxTb3VyY2VJbmZvKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGluc3RhbGxTb3VyY2VJbmZvID0gQXBwR2xvYmFscy5nZXRQYWNrYWdlTWFuYWdlcigpLmdldEluc3RhbGxTb3VyY2VJbmZvKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICB1c2VySWQpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gU2hvdWxkbid0IGhhcHBlbi4KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvYXBleC9qb2JzY2hlZHVsZXIvc2VydmljZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci90YXJlL0ludGVybmFsUmVzb3VyY2VTZXJ2aWNlLmphdmEgYi9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvSW50ZXJuYWxSZXNvdXJjZVNlcnZpY2UuamF2YQppbmRleCBjYWY3MmU4Li5mZmIyYzAzIDEwMDY0NAotLS0gYS9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvSW50ZXJuYWxSZXNvdXJjZVNlcnZpY2UuamF2YQorKysgYi9hcGV4L2pvYnNjaGVkdWxlci9zZXJ2aWNlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvSW50ZXJuYWxSZXNvdXJjZVNlcnZpY2UuamF2YQpAQCAtNjI1LDcgKzYyNSw4IEBACiAgICAgICAgICAgICBtUGFja2FnZVRvVWlkQ2FjaGUuYWRkKHVzZXJJZCwgcGtnTmFtZSwgdWlkKTsKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnN0YWxsZWRQYWNrYWdlSW5mbyBpcG8gPSBuZXcgSW5zdGFsbGVkUGFja2FnZUluZm8oZ2V0Q29udGV4dCgpLCBwYWNrYWdlSW5mbyk7CisgICAgICAgICAgICBmaW5hbCBJbnN0YWxsZWRQYWNrYWdlSW5mbyBpcG8gPSBuZXcgSW5zdGFsbGVkUGFja2FnZUluZm8oZ2V0Q29udGV4dCgpLCB1c2VySWQsCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VJbmZvKTsKICAgICAgICAgICAgIGZpbmFsIEluc3RhbGxlZFBhY2thZ2VJbmZvIG9sZElwbyA9IG1Qa2dDYWNoZS5hZGQodXNlcklkLCBwa2dOYW1lLCBpcG8pOwogICAgICAgICAgICAgbWF5YmVVcGRhdGVJbnN0YWxsZXJTdGF0dXNMb2NrZWQob2xkSXBvLCBpcG8pOwogICAgICAgICAgICAgbVVpZFRvUGFja2FnZUNhY2hlLmFkZCh1aWQsIHBrZ05hbWUpOwpAQCAtNjgzLDcgKzY4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlTWFuYWdlci5nZXRJbnN0YWxsZWRQYWNrYWdlc0FzVXNlcihQQUNLQUdFX1FVRVJZX0ZMQUdTLCB1c2VySWQpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBrZ3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBJbnN0YWxsZWRQYWNrYWdlSW5mbyBpcG8gPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluc3RhbGxlZFBhY2thZ2VJbmZvKGdldENvbnRleHQoKSwgcGtncy5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluc3RhbGxlZFBhY2thZ2VJbmZvKGdldENvbnRleHQoKSwgdXNlcklkLCBwa2dzLmdldChpKSk7CiAgICAgICAgICAgICAgICAgZmluYWwgSW5zdGFsbGVkUGFja2FnZUluZm8gb2xkSXBvID0gbVBrZ0NhY2hlLmFkZCh1c2VySWQsIGlwby5wYWNrYWdlTmFtZSwgaXBvKTsKICAgICAgICAgICAgICAgICBtYXliZVVwZGF0ZUluc3RhbGxlclN0YXR1c0xvY2tlZChvbGRJcG8sIGlwbyk7CiAgICAgICAgICAgICB9CkBAIC05NjMsNyArOTY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLmdldEluc3RhbGxlZFBhY2thZ2VzQXNVc2VyKFBBQ0tBR0VfUVVFUllfRkxBR1MsIHVzZXJJZCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gcGtncy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgICAgICAgIGZpbmFsIEluc3RhbGxlZFBhY2thZ2VJbmZvIGlwbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5zdGFsbGVkUGFja2FnZUluZm8oZ2V0Q29udGV4dCgpLCBwa2dzLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5zdGFsbGVkUGFja2FnZUluZm8oZ2V0Q29udGV4dCgpLCB1c2VySWQsIHBrZ3MuZ2V0KGkpKTsKICAgICAgICAgICAgICAgICBmaW5hbCBJbnN0YWxsZWRQYWNrYWdlSW5mbyBvbGRJcG8gPSBtUGtnQ2FjaGUuYWRkKHVzZXJJZCwgaXBvLnBhY2thZ2VOYW1lLCBpcG8pOwogICAgICAgICAgICAgICAgIG1heWJlVXBkYXRlSW5zdGFsbGVyU3RhdHVzTG9ja2VkKG9sZElwbywgaXBvKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2FwaS9hcGkuZ28gYi9hcGkvYXBpLmdvCmluZGV4IDI1ZDk3MjguLjk4NzZhYmIgMTAwNjQ0Ci0tLSBhL2FwaS9hcGkuZ28KKysrIGIvYXBpL2FwaS5nbwpAQCAtNDE4LDcgKzQxOCw2IEBACiAvLyBjb21iaW5lZF9hcGlzIGJwMmJ1aWxkIGNvbnZlcnRlcgogZnVuYyAoYSAqQ29tYmluZWRBcGlzKSBDb252ZXJ0V2l0aEJwMmJ1aWxkKGN0eCBhbmRyb2lkLlRvcERvd25NdXRhdG9yQ29udGV4dCkgewogCWJhc2VQcmVmaXggOj0gIm5vbi11cGRhdGFibGUiCi0Jc2NvcGVOYW1lcyA6PSBbXXN0cmluZ3sicHVibGljIiwgInN5c3RlbSIsICJtb2R1bGUtbGliIiwgInN5c3RlbS1zZXJ2ZXIifQogCXNjb3BlVG9TdWZmaXggOj0gbWFwW3N0cmluZ11zdHJpbmd7CiAJCSJwdWJsaWMiOiAgICAgICAgIi1jdXJyZW50LnR4dCIsCiAJCSJzeXN0ZW0iOiAgICAgICAgIi1zeXN0ZW0tY3VycmVudC50eHQiLApAQCAtNDI2LDggKzQyNSw3IEBACiAJCSJzeXN0ZW0tc2VydmVyIjogIi1zeXN0ZW0tc2VydmVyLWN1cnJlbnQudHh0IiwKIAl9CiAKLQlmb3IgXywgc2NvcGVOYW1lIDo9IHJhbmdlIHNjb3BlTmFtZXN7Ci0JCXN1ZmZpeCA6PSBzY29wZVRvU3VmZml4W3Njb3BlTmFtZV0KKwlmb3Igc2NvcGVOYW1lLCBzdWZmaXggOj0gcmFuZ2Ugc2NvcGVUb1N1ZmZpeHsKIAkJbmFtZSA6PSBhLk5hbWUoKSArIHN1ZmZpeAogCiAJCXZhciBzY29wZSBiYXplbC5TdHJpbmdBdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL2NvbmZpZy9wcmVsb2FkZWQtY2xhc3NlcyBiL2NvbmZpZy9wcmVsb2FkZWQtY2xhc3NlcwppbmRleCA5NTA3MGJkLi4wOWVjMjIwIDEwMDY0NAotLS0gYS9jb25maWcvcHJlbG9hZGVkLWNsYXNzZXMKKysrIGIvY29uZmlnL3ByZWxvYWRlZC1jbGFzc2VzCkBAIC0xNDc5OSw3ICsxNDc5OSw2IEBACiBqYXZhLnV0aWwuSW1tdXRhYmxlQ29sbGVjdGlvbnMkU2V0MTIKIGphdmEudXRpbC5JbW11dGFibGVDb2xsZWN0aW9ucyRTZXROCiBqYXZhLnV0aWwuSW1tdXRhYmxlQ29sbGVjdGlvbnMkU3ViTGlzdAotamF2YS51dGlsLkltbXV0YWJsZUNvbGxlY3Rpb25zCiBqYXZhLnV0aWwuSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbgogamF2YS51dGlsLkl0ZXJhdG9yCiBqYXZhLnV0aWwuSnVtYm9FbnVtU2V0JEVudW1TZXRJdGVyYXRvcgpkaWZmIC0tZ2l0IGEvY29uZmlnL3ByZWxvYWRlZC1jbGFzc2VzLWRlbnlsaXN0IGIvY29uZmlnL3ByZWxvYWRlZC1jbGFzc2VzLWRlbnlsaXN0CmluZGV4IDUwMmQ4YzYuLmE0MTNiYmQgMTAwNjQ0Ci0tLSBhL2NvbmZpZy9wcmVsb2FkZWQtY2xhc3Nlcy1kZW55bGlzdAorKysgYi9jb25maWcvcHJlbG9hZGVkLWNsYXNzZXMtZGVueWxpc3QKQEAgLTksNCArOSw1IEBACiBhbmRyb2lkLm5ldC5ydHAuQXVkaW9TdHJlYW0KIGFuZHJvaWQubmV0LnJ0cC5SdHBTdHJlYW0KIGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZExvY2FsUmFuZG9tCitqYXZhLnV0aWwuSW1tdXRhYmxlQ29sbGVjdGlvbnMKIGNvbS5hbmRyb2lkLmludGVybmFsLmphbmsuSW50ZXJhY3Rpb25KYW5rTW9uaXRvciRJbnN0YW5jZUhvbGRlcgpkaWZmIC0tZ2l0IGEvY29yZS9hcGkvY3VycmVudC50eHQgYi9jb3JlL2FwaS9jdXJyZW50LnR4dAppbmRleCA2MDc4NzEyZi4uNzcxZDU2YyAxMDA2NDQKLS0tIGEvY29yZS9hcGkvY3VycmVudC50eHQKKysrIGIvY29yZS9hcGkvY3VycmVudC50eHQKQEAgLTIyNCw2ICsyMjQsNyBAQAogICAgIGZpZWxkIEBEZXByZWNhdGVkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfQUNUSVZJVFkgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBFUlNJU1RFTlRfQUNUSVZJVFkiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RfTk9USUZJQ0FUSU9OUyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUE9TVF9OT1RJRklDQVRJT05TIjsKICAgICBmaWVsZCBARGVwcmVjYXRlZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX09VVEdPSU5HX0NBTExTID0gImFuZHJvaWQucGVybWlzc2lvbi5QUk9DRVNTX09VVEdPSU5HX0NBTExTIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFX1JFTU9URV9DUkVERU5USUFMUyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUFJPVklERV9SRU1PVEVfQ1JFREVOVElBTFMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0FMTF9QQUNLQUdFUyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUVVFUllfQUxMX1BBQ0tBR0VTIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0FTU0lTVEFOVF9BUFBfU0VBUkNIX0RBVEEgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfQVNTSVNUQU5UX0FQUF9TRUFSQ0hfREFUQSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9CQVNJQ19QSE9ORV9TVEFURSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9CQVNJQ19QSE9ORV9TVEFURSI7CkBAIC02NjIyLDYgKzY2MjMsNyBAQAogICAgIGN0b3IgcHVibGljIE5vdGlmaWNhdGlvbi5NZWRpYVN0eWxlKCk7CiAgICAgY3RvciBARGVwcmVjYXRlZCBwdWJsaWMgTm90aWZpY2F0aW9uLk1lZGlhU3R5bGUoYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uLkJ1aWxkZXIpOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uLk1lZGlhU3R5bGUgc2V0TWVkaWFTZXNzaW9uKGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb24uVG9rZW4pOworICAgIG1ldGhvZCBATm9uTnVsbCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NRURJQV9DT05URU5UX0NPTlRST0wpIHB1YmxpYyBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24uTWVkaWFTdHlsZSBzZXRSZW1vdGVQbGF5YmFja0luZm8oQE5vbk51bGwgQ2hhclNlcXVlbmNlLCBARHJhd2FibGVSZXMgaW50LCBATnVsbGFibGUgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24uTWVkaWFTdHlsZSBzZXRTaG93QWN0aW9uc0luQ29tcGFjdFZpZXcoaW50Li4uKTsKICAgfQogCkBAIC04MDQ4LDYgKzgwNTAsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BUFBMSUNBVElPTl9ERUxFR0FUSU9OX1NDT1BFU19DSEFOR0VEID0gImFuZHJvaWQuYXBwLmFjdGlvbi5BUFBMSUNBVElPTl9ERUxFR0FUSU9OX1NDT1BFU19DSEFOR0VEIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ0hFQ0tfUE9MSUNZX0NPTVBMSUFOQ0UgPSAiYW5kcm9pZC5hcHAuYWN0aW9uLkNIRUNLX1BPTElDWV9DT01QTElBTkNFIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVWSUNFX0FETUlOX1NFUlZJQ0UgPSAiYW5kcm9pZC5hcHAuYWN0aW9uLkRFVklDRV9BRE1JTl9TRVJWSUNFIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVWSUNFX0ZJTkFOQ0lOR19TVEFURV9DSEFOR0VEID0gImFuZHJvaWQuYXBwLmFkbWluLmFjdGlvbi5ERVZJQ0VfRklOQU5DSU5HX1NUQVRFX0NIQU5HRUQiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9ERVZJQ0VfT1dORVJfQ0hBTkdFRCA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uREVWSUNFX09XTkVSX0NIQU5HRUQiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9ERVZJQ0VfUE9MSUNZX1JFU09VUkNFX1VQREFURUQgPSAiYW5kcm9pZC5hcHAuYWN0aW9uLkRFVklDRV9QT0xJQ1lfUkVTT1VSQ0VfVVBEQVRFRCI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dFVF9QUk9WSVNJT05JTkdfTU9ERSA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uR0VUX1BST1ZJU0lPTklOR19NT0RFIjsKQEAgLTgzMzIsNyArODMzNSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZBSUxVUkVfU1RPUkFHRV9MSU1JVF9SRUFDSEVEID0gMzsgLy8gMHgzCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZBSUxVUkVfVU5LTk9XTiA9IC0xOyAvLyAweGZmZmZmZmZmCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX1BPTElDWV9DTEVBUkVEID0gMjsgLy8gMHgyCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX1NVQ0NFU1MgPSAwOyAvLyAweDAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfUE9MSUNZX1NFVCA9IDA7IC8vIDB4MAogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIFByZWZlcmVudGlhbE5ldHdvcmtTZXJ2aWNlQ29uZmlnIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKQEAgLTk2NzgsNiArOTY4MSw3IEBACiAgICAgbWV0aG9kIEBOdWxsYWJsZSBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0aW9uVGFnKCk7CiAgICAgbWV0aG9kIEBOdWxsYWJsZSBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlIGdldE5leHQoKTsKICAgICBtZXRob2QgQE51bGxhYmxlIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRQaWQoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRVaWQoKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNUcnVzdGVkKEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UgbXlBdHRyaWJ1dGlvblNvdXJjZSgpOwpAQCAtOTY5Miw2ICs5Njk2LDcgQEAKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZS5CdWlsZGVyIHNldEF0dHJpYnV0aW9uVGFnKEBOdWxsYWJsZSBTdHJpbmcpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlLkJ1aWxkZXIgc2V0TmV4dChATnVsbGFibGUgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZS5CdWlsZGVyIHNldFBhY2thZ2VOYW1lKEBOdWxsYWJsZSBTdHJpbmcpOworICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlLkJ1aWxkZXIgc2V0UGlkKGludCk7CiAgIH0KIAogICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnJvYWRjYXN0UmVjZWl2ZXIgewpAQCAtMTE0MDEsNyArMTE0MDYsNyBAQAogICBwdWJsaWMgY2xhc3MgUmVzdHJpY3Rpb25zTWFuYWdlciB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5vcy5CdW5kbGUgY29udmVydFJlc3RyaWN0aW9uc1RvQnVuZGxlKGphdmEudXRpbC5MaXN0PGFuZHJvaWQuY29udGVudC5SZXN0cmljdGlvbkVudHJ5Pik7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGNyZWF0ZUxvY2FsQXBwcm92YWxJbnRlbnQoKTsKLSAgICBtZXRob2QgQERlcHJlY2F0ZWQgcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zKCk7CisgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9ucygpOwogICAgIG1ldGhvZCBATm9uTnVsbCBAV29ya2VyVGhyZWFkIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLm9zLkJ1bmRsZT4gZ2V0QXBwbGljYXRpb25SZXN0cmljdGlvbnNQZXJBZG1pbigpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5jb250ZW50LlJlc3RyaWN0aW9uRW50cnk+IGdldE1hbmlmZXN0UmVzdHJpY3Rpb25zKFN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGhhc1Jlc3RyaWN0aW9uc1Byb3ZpZGVyKCk7CkBAIC0xMjgxMiw2ICsxMjgxNyw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE1BWElNVU1fVkVSSUZJQ0FUSU9OX1RJTUVPVVQgPSAzNjAwMDAwTDsgLy8gMHgzNmVlODBMCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSTUlTU0lPTl9ERU5JRUQgPSAtMTsgLy8gMHhmZmZmZmZmZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUk1JU1NJT05fR1JBTlRFRCA9IDA7IC8vIDB4MAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NPTVBBVF9PVkVSUklERV9MQU5EU0NBUEVfVE9fUE9SVFJBSVQgPSAiYW5kcm9pZC5jYW1lcmEuUFJPUEVSVFlfQ09NUEFUX09WRVJSSURFX0xBTkRTQ0FQRV9UT19QT1JUUkFJVCI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTUVESUFfQ0FQQUJJTElUSUVTID0gImFuZHJvaWQubWVkaWEuUFJPUEVSVFlfTUVESUFfQ0FQQUJJTElUSUVTIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TRUxGX0NFUlRJRklFRF9ORVRXT1JLX0NBUEFCSUxJVElFUyA9ICJhbmRyb2lkLm5ldC5QUk9QRVJUWV9TRUxGX0NFUlRJRklFRF9ORVRXT1JLX0NBUEFCSUxJVElFUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU1BFQ0lBTF9VU0VfRkdTX1NVQlRZUEUgPSAiYW5kcm9pZC5hcHAuUFJPUEVSVFlfU1BFQ0lBTF9VU0VfRkdTX1NVQlRZUEUiOwpAQCAtMjczNDIsNyArMjczNDgsOSBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVfU0hJRlRfU1RBVFVTX1VOQVZBSUxBQkxFID0gMjsgLy8gMHgyCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9TSElGVF9TVEFUVVNfVU5LTk9XTiA9IDA7IC8vIDB4MAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVfU0hJRlRfU1RBVFVTX1VOU1VQUE9SVEVEID0gMTsgLy8gMHgxCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFZfTUVTU0FHRV9LRVlfUkFXX0RBVEEgPSAiYW5kcm9pZC5tZWRpYS50di5UdklucHV0TWFuYWdlci5yYXdfZGF0YSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFZfTUVTU0FHRV9LRVlfU1RSRUFNX0lEID0gImFuZHJvaWQubWVkaWEudHYuVHZJbnB1dE1hbmFnZXIuc3RyZWFtX2lkIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUVl9NRVNTQUdFX0tFWV9TVUJUWVBFID0gImFuZHJvaWQubWVkaWEudHYuVHZJbnB1dE1hbmFnZXIuc3VidHlwZSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFZfTUVTU0FHRV9UWVBFX0NMT1NFRF9DQVBUSU9OID0gMjsgLy8gMHgyCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFZfTUVTU0FHRV9UWVBFX09USEVSID0gMTAwMDsgLy8gMHgzZTgKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUVl9NRVNTQUdFX1RZUEVfV0FURVJNQVJLID0gMTsgLy8gMHgxCkBAIC0yNzQ3Miw3ICsyNzQ4MCw3IEBACiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnQoYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25UdW5lKGFuZHJvaWQubmV0LlVyaSk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIG9uVHVuZShhbmRyb2lkLm5ldC5VcmksIGFuZHJvaWQub3MuQnVuZGxlKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgb25Udk1lc3NhZ2UoQE5vbk51bGwgU3RyaW5nLCBATm9uTnVsbCBhbmRyb2lkLm9zLkJ1bmRsZSk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uVHZNZXNzYWdlKGludCwgQE5vbk51bGwgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBvblVuYmxvY2tDb250ZW50KGFuZHJvaWQubWVkaWEudHYuVHZDb250ZW50UmF0aW5nKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0T3ZlcmxheVZpZXdFbmFibGVkKGJvb2xlYW4pOwogICB9CkBAIC0zMzYwOSw2ICszMzYxNyw3IEBACiAgICAgbWV0aG9kIEBEZXByZWNhdGVkIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBzdXBwb3J0c1Byb2Nlc3NlcygpOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJMVUVUT09USF9VSUQgPSAxMDAyOyAvLyAweDNlYQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJUlNUX0FQUExJQ0FUSU9OX1VJRCA9IDEwMDAwOyAvLyAweDI3MTAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1BJRCA9IC0xOyAvLyAweGZmZmZmZmZmCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9VSUQgPSAtMTsgLy8gMHhmZmZmZmZmZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBU1RfQVBQTElDQVRJT05fVUlEID0gMTk5OTk7IC8vIDB4NGUxZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBIT05FX1VJRCA9IDEwMDE7IC8vIDB4M2U5CkBAIC0zMzg2MCw3ICszMzg2OSw3IEBACiAKICAgcHVibGljIGNsYXNzIFVzZXJNYW5hZ2VyIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGNyZWF0ZVVzZXJDcmVhdGlvbkludGVudChATnVsbGFibGUgU3RyaW5nLCBATnVsbGFibGUgU3RyaW5nLCBATnVsbGFibGUgU3RyaW5nLCBATnVsbGFibGUgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZSk7Ci0gICAgbWV0aG9kIEBEZXByZWNhdGVkIEBXb3JrZXJUaHJlYWQgcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zKFN0cmluZyk7CisgICAgbWV0aG9kIEBXb3JrZXJUaHJlYWQgcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zKFN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBsb25nIGdldFNlcmlhbE51bWJlckZvclVzZXIoYW5kcm9pZC5vcy5Vc2VySGFuZGxlKTsKICAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbnlPZj17ImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfVVNFUlMiLCAiYW5kcm9pZC5wZXJtaXNzaW9uLkNSRUFURV9VU0VSUyJ9KSBwdWJsaWMgaW50IGdldFVzZXJDb3VudCgpOwogICAgIG1ldGhvZCBwdWJsaWMgbG9uZyBnZXRVc2VyQ3JlYXRpb25UaW1lKGFuZHJvaWQub3MuVXNlckhhbmRsZSk7CkBAIC00MDU4Nyw3ICs0MDU5Niw3IEBACiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLnNlcnZpY2UuY3JlZGVudGlhbHMuQmVnaW5DcmVhdGVDcmVkZW50aWFsUmVzcG9uc2UuQnVpbGRlciBhZGRDcmVhdGVFbnRyeShATm9uTnVsbCBhbmRyb2lkLnNlcnZpY2UuY3JlZGVudGlhbHMuQ3JlYXRlRW50cnkpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLkJlZ2luQ3JlYXRlQ3JlZGVudGlhbFJlc3BvbnNlIGJ1aWxkKCk7CiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLnNlcnZpY2UuY3JlZGVudGlhbHMuQmVnaW5DcmVhdGVDcmVkZW50aWFsUmVzcG9uc2UuQnVpbGRlciBzZXRDcmVhdGVFbnRyaWVzKEBOb25OdWxsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5DcmVhdGVFbnRyeT4pOwotICAgIG1ldGhvZCBATm9uTnVsbCBAUmVxdWlyZXNQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uUFJPVklERV9SRU1PVEVfQ1JFREVOVElBTFMiKSBwdWJsaWMgYW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLkJlZ2luQ3JlYXRlQ3JlZGVudGlhbFJlc3BvbnNlLkJ1aWxkZXIgc2V0UmVtb3RlQ3JlYXRlRW50cnkoQE51bGxhYmxlIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5SZW1vdGVFbnRyeSk7CisgICAgbWV0aG9kIEBOb25OdWxsIEBSZXF1aXJlc1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlBST1ZJREVfUkVNT1RFX0NSRURFTlRJQUxTKSBwdWJsaWMgYW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLkJlZ2luQ3JlYXRlQ3JlZGVudGlhbFJlc3BvbnNlLkJ1aWxkZXIgc2V0UmVtb3RlQ3JlYXRlRW50cnkoQE51bGxhYmxlIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5SZW1vdGVFbnRyeSk7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQmVnaW5HZXRDcmVkZW50aWFsT3B0aW9uIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKQEAgLTQwNjM2LDcgKzQwNjQ1LDcgQEAKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5CZWdpbkdldENyZWRlbnRpYWxSZXNwb25zZS5CdWlsZGVyIHNldEFjdGlvbnMoQE5vbk51bGwgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLkFjdGlvbj4pOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLkJlZ2luR2V0Q3JlZGVudGlhbFJlc3BvbnNlLkJ1aWxkZXIgc2V0QXV0aGVudGljYXRpb25BY3Rpb25zKEBOb25OdWxsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5BY3Rpb24+KTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5CZWdpbkdldENyZWRlbnRpYWxSZXNwb25zZS5CdWlsZGVyIHNldENyZWRlbnRpYWxFbnRyaWVzKEBOb25OdWxsIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5DcmVkZW50aWFsRW50cnk+KTsKLSAgICBtZXRob2QgQE5vbk51bGwgQFJlcXVpcmVzUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLlBST1ZJREVfUkVNT1RFX0NSRURFTlRJQUxTIikgcHVibGljIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5CZWdpbkdldENyZWRlbnRpYWxSZXNwb25zZS5CdWlsZGVyIHNldFJlbW90ZUNyZWRlbnRpYWxFbnRyeShATnVsbGFibGUgYW5kcm9pZC5zZXJ2aWNlLmNyZWRlbnRpYWxzLlJlbW90ZUVudHJ5KTsKKyAgICBtZXRob2QgQE5vbk51bGwgQFJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUFJPVklERV9SRU1PVEVfQ1JFREVOVElBTFMpIHB1YmxpYyBhbmRyb2lkLnNlcnZpY2UuY3JlZGVudGlhbHMuQmVnaW5HZXRDcmVkZW50aWFsUmVzcG9uc2UuQnVpbGRlciBzZXRSZW1vdGVDcmVkZW50aWFsRW50cnkoQE51bGxhYmxlIGFuZHJvaWQuc2VydmljZS5jcmVkZW50aWFscy5SZW1vdGVFbnRyeSk7CiAgIH0KIAogICBwdWJsaWMgZmluYWwgY2xhc3MgQ2FsbGluZ0FwcEluZm8gaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewpAQCAtNDE1NTQsNyArNDE1NjMsNiBAQAogCiAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWNvZ25pdGlvblNlcnZpY2UgZXh0ZW5kcyBhbmRyb2lkLmFwcC5TZXJ2aWNlIHsKICAgICBjdG9yIHB1YmxpYyBSZWNvZ25pdGlvblNlcnZpY2UoKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgY2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkludGVudCwgQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRNYXhDb25jdXJyZW50U2Vzc2lvbnNDb3VudCgpOwogICAgIG1ldGhvZCBwdWJsaWMgZmluYWwgYW5kcm9pZC5vcy5JQmluZGVyIG9uQmluZChhbmRyb2lkLmNvbnRlbnQuSW50ZW50KTsKICAgICBtZXRob2QgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25DYW5jZWwoYW5kcm9pZC5zcGVlY2guUmVjb2duaXRpb25TZXJ2aWNlLkNhbGxiYWNrKTsKQEAgLTQxNTY0LDcgKzQxNTcyLDcgQEAKICAgICBtZXRob2QgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25TdG9wTGlzdGVuaW5nKGFuZHJvaWQuc3BlZWNoLlJlY29nbml0aW9uU2VydmljZS5DYWxsYmFjayk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uVHJpZ2dlck1vZGVsRG93bmxvYWQoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkludGVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uVHJpZ2dlck1vZGVsRG93bmxvYWQoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkludGVudCwgQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5JbnRlbnQsIEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5BdHRyaWJ1dGlvblNvdXJjZSwgQE5vbk51bGwgYW5kcm9pZC5zcGVlY2guTW9kZWxEb3dubG9hZExpc3RlbmVyKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgb25UcmlnZ2VyTW9kZWxEb3dubG9hZChATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuQXR0cmlidXRpb25Tb3VyY2UsIEBOb25OdWxsIGFuZHJvaWQuc3BlZWNoLk1vZGVsRG93bmxvYWRMaXN0ZW5lcik7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPSAiYW5kcm9pZC5zcGVlY2guUmVjb2duaXRpb25TZXJ2aWNlIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX01FVEFfREFUQSA9ICJhbmRyb2lkLnNwZWVjaCI7CiAgIH0KQEAgLTQxNjg5LDE4ICs0MTY5NywxNyBAQAogICBwdWJsaWMgY2xhc3MgU3BlZWNoUmVjb2duaXplciB7CiAgICAgbWV0aG9kIEBNYWluVGhyZWFkIHB1YmxpYyB2b2lkIGNhbmNlbCgpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBjaGVja1JlY29nbml0aW9uU3VwcG9ydChATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBATm9uTnVsbCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvciwgQE5vbk51bGwgYW5kcm9pZC5zcGVlY2guUmVjb2duaXRpb25TdXBwb3J0Q2FsbGJhY2spOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBjbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcihATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50KTsKICAgICBtZXRob2QgQE1haW5UaHJlYWQgQE5vbk51bGwgcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5TcGVlY2hSZWNvZ25pemVyIGNyZWF0ZU9uRGV2aWNlU3BlZWNoUmVjb2duaXplcihATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7CiAgICAgbWV0aG9kIEBNYWluVGhyZWFkIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5zcGVlY2guU3BlZWNoUmVjb2duaXplciBjcmVhdGVTcGVlY2hSZWNvZ25pemVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKICAgICBtZXRob2QgQE1haW5UaHJlYWQgcHVibGljIHN0YXRpYyBhbmRyb2lkLnNwZWVjaC5TcGVlY2hSZWNvZ25pemVyIGNyZWF0ZVNwZWVjaFJlY29nbml6ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgZGVzdHJveSgpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPbkRldmljZVJlY29nbml0aW9uQXZhaWxhYmxlKEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVjb2duaXRpb25BdmFpbGFibGUoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkludGVudCwgQE5vbk51bGwgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3IsIEBOb25OdWxsIGFuZHJvaWQuc3BlZWNoLk1vZGVsRG93bmxvYWRMaXN0ZW5lcik7CiAgICAgbWV0aG9kIEBNYWluVGhyZWFkIHB1YmxpYyB2b2lkIHNldFJlY29nbml0aW9uTGlzdGVuZXIoYW5kcm9pZC5zcGVlY2guUmVjb2duaXRpb25MaXN0ZW5lcik7CiAgICAgbWV0aG9kIEBNYWluVGhyZWFkIHB1YmxpYyB2b2lkIHN0YXJ0TGlzdGVuaW5nKGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwogICAgIG1ldGhvZCBATWFpblRocmVhZCBwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHRyaWdnZXJNb2RlbERvd25sb2FkKEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB0cmlnZ2VyTW9kZWxEb3dubG9hZChATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LCBATm9uTnVsbCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvciwgQE5vbk51bGwgYW5kcm9pZC5zcGVlY2guTW9kZWxEb3dubG9hZExpc3RlbmVyKTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSURFTkNFX1NDT1JFUyA9ICJjb25maWRlbmNlX3Njb3JlcyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVURUNURURfTEFOR1VBR0UgPSAiZGV0ZWN0ZWRfbGFuZ3VhZ2UiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0FVRElPID0gMzsgLy8gMHgzCkBAIC01MzkwMiw2ICs1MzkwOSwxNCBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCByZW1vdmVWaWV3SW1tZWRpYXRlKGFuZHJvaWQudmlldy5WaWV3KTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BQ1RJVklUWV9FTUJFRERJTkdfQUxMT1dfU1lTVEVNX09WRVJSSURFID0gImFuZHJvaWQud2luZG93LlBST1BFUlRZX0FDVElWSVRZX0VNQkVERElOR19BTExPV19TWVNURU1fT1ZFUlJJREUiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FDVElWSVRZX0VNQkVERElOR19TUExJVFNfRU5BQkxFRCA9ICJhbmRyb2lkLndpbmRvdy5QUk9QRVJUWV9BQ1RJVklUWV9FTUJFRERJTkdfU1BMSVRTX0VOQUJMRUQiOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NBTUVSQV9DT01QQVRfQUxMT1dfRk9SQ0VfUk9UQVRJT04gPSAiYW5kcm9pZC53aW5kb3cuUFJPUEVSVFlfQ0FNRVJBX0NPTVBBVF9BTExPV19GT1JDRV9ST1RBVElPTiI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ0FNRVJBX0NPTVBBVF9BTExPV19SRUZSRVNIID0gImFuZHJvaWQud2luZG93LlBST1BFUlRZX0NBTUVSQV9DT01QQVRfQUxMT1dfUkVGUkVTSCI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ0FNRVJBX0NPTVBBVF9FTkFCTEVfUkVGUkVTSF9WSUFfUEFVU0UgPSAiYW5kcm9pZC53aW5kb3cuUFJPUEVSVFlfQ0FNRVJBX0NPTVBBVF9FTkFCTEVfUkVGUkVTSF9WSUFfUEFVU0UiOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NPTVBBVF9BTExPV19ESVNQTEFZX09SSUVOVEFUSU9OX09WRVJSSURFID0gImFuZHJvaWQud2luZG93LlBST1BFUlRZX0NPTVBBVF9BTExPV19ESVNQTEFZX09SSUVOVEFUSU9OX09WRVJSSURFIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9DT01QQVRfQUxMT1dfT1JJRU5UQVRJT05fT1ZFUlJJREUgPSAiYW5kcm9pZC53aW5kb3cuUFJPUEVSVFlfQ09NUEFUX0FMTE9XX09SSUVOVEFUSU9OX09WRVJSSURFIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9DT01QQVRfQUxMT1dfU0FOREJPWElOR19WSUVXX0JPVU5EU19BUElTID0gImFuZHJvaWQud2luZG93LlBST1BFUlRZX0NPTVBBVF9BTExPV19TQU5EQk9YSU5HX1ZJRVdfQk9VTkRTX0FQSVMiOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NPTVBBVF9FTkFCTEVfRkFLRV9GT0NVUyA9ICJhbmRyb2lkLndpbmRvdy5QUk9QRVJUWV9DT01QQVRfRU5BQkxFX0ZBS0VfRk9DVVMiOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NPTVBBVF9JR05PUkVfUkVRVUVTVEVEX09SSUVOVEFUSU9OID0gImFuZHJvaWQud2luZG93LlBST1BFUlRZX0NPTVBBVF9JR05PUkVfUkVRVUVTVEVEX09SSUVOVEFUSU9OIjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2luZG93TWFuYWdlci5CYWRUb2tlbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2NvcmUvYXBpL3N5c3RlbS1jdXJyZW50LnR4dCBiL2NvcmUvYXBpL3N5c3RlbS1jdXJyZW50LnR4dAppbmRleCBkNTZhOTM3Li5jZTU3MjNiIDEwMDY0NAotLS0gYS9jb3JlL2FwaS9zeXN0ZW0tY3VycmVudC50eHQKKysrIGIvY29yZS9hcGkvc3lzdGVtLWN1cnJlbnQudHh0CkBAIC0yNTUsNyArMjU1LDYgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJGT1JNX1NJTV9BQ1RJVkFUSU9OID0gImFuZHJvaWQucGVybWlzc2lvbi5QRVJGT1JNX1NJTV9BQ1RJVkFUSU9OIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1dFUl9TQVZFUiA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUE9XRVJfU0FWRVIiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVfREVGQVVMVF9FTkFCTEVEX0NSRURFTlRJQUxfU0VSVklDRSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUFJPVklERV9ERUZBVUxUX0VOQUJMRURfQ1JFREVOVElBTF9TRVJWSUNFIjsKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFX1JFTU9URV9DUkVERU5USUFMUyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUFJPVklERV9SRU1PVEVfQ1JFREVOVElBTFMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVfUkVTT0xWRVJfUkFOS0VSX1NFUlZJQ0UgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBST1ZJREVfUkVTT0xWRVJfUkFOS0VSX1NFUlZJQ0UiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVfVFJVU1RfQUdFTlQgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBST1ZJREVfVFJVU1RfQUdFTlQiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJU0lPTl9ERU1PX0RFVklDRSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUFJPVklTSU9OX0RFTU9fREVWSUNFIjsKQEAgLTk2OSwxMCArOTY4LDYgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU1BTlRJQ19BQ1RJT05fTUFSS19DT05WRVJTQVRJT05fQVNfUFJJT1JJVFkgPSAxMTsgLy8gMHhiCiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vdGlmaWNhdGlvbi5NZWRpYVN0eWxlIGV4dGVuZHMgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uLlN0eWxlIHsKLSAgICBtZXRob2QgQE5vbk51bGwgQFJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTUVESUFfQ09OVEVOVF9DT05UUk9MKSBwdWJsaWMgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uLk1lZGlhU3R5bGUgc2V0UmVtb3RlUGxheWJhY2tJbmZvKEBOb25OdWxsIENoYXJTZXF1ZW5jZSwgQERyYXdhYmxlUmVzIGludCwgQE51bGxhYmxlIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQpOwotICB9Ci0KICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBOb3RpZmljYXRpb24uVHZFeHRlbmRlciBpbXBsZW1lbnRzIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbi5FeHRlbmRlciB7CiAgICAgY3RvciBwdWJsaWMgTm90aWZpY2F0aW9uLlR2RXh0ZW5kZXIoKTsKICAgICBjdG9yIHB1YmxpYyBOb3RpZmljYXRpb24uVHZFeHRlbmRlcihhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24pOwpAQCAtMTc5NywyNSArMTc5MiwxOSBAQAogICAgIGZpZWxkIHB1YmxpYyBmaW5hbCBsb25nIGJ5dGVzVHJhbnNmZXJyZWQ7CiAgIH0KIAotICBwdWJsaWMgY2xhc3MgQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyIHsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgbG9nQmFja3VwTWV0YURhdGEoQGFuZHJvaWQuYXBwLmJhY2t1cC5CYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXIuQmFja3VwUmVzdG9yZURhdGFUeXBlIEBOb25OdWxsIFN0cmluZywgQE5vbk51bGwgU3RyaW5nKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgbG9nSXRlbXNCYWNrZWRVcChAYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cFJlc3RvcmVFdmVudExvZ2dlci5CYWNrdXBSZXN0b3JlRGF0YVR5cGUgQE5vbk51bGwgU3RyaW5nLCBpbnQpOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBsb2dJdGVtc0JhY2t1cEZhaWxlZChAYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cFJlc3RvcmVFdmVudExvZ2dlci5CYWNrdXBSZXN0b3JlRGF0YVR5cGUgQE5vbk51bGwgU3RyaW5nLCBpbnQsIEBhbmRyb2lkLmFwcC5iYWNrdXAuQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyLkJhY2t1cFJlc3RvcmVFcnJvciBATnVsbGFibGUgU3RyaW5nKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgbG9nSXRlbXNSZXN0b3JlRmFpbGVkKEBhbmRyb2lkLmFwcC5iYWNrdXAuQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyLkJhY2t1cFJlc3RvcmVEYXRhVHlwZSBATm9uTnVsbCBTdHJpbmcsIGludCwgQGFuZHJvaWQuYXBwLmJhY2t1cC5CYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXIuQmFja3VwUmVzdG9yZUVycm9yIEBOdWxsYWJsZSBTdHJpbmcpOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBsb2dJdGVtc1Jlc3RvcmVkKEBhbmRyb2lkLmFwcC5iYWNrdXAuQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyLkJhY2t1cFJlc3RvcmVEYXRhVHlwZSBATm9uTnVsbCBTdHJpbmcsIGludCk7Ci0gICAgbWV0aG9kIHB1YmxpYyB2b2lkIGxvZ1Jlc3RvcmVNZXRhZGF0YShAYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cFJlc3RvcmVFdmVudExvZ2dlci5CYWNrdXBSZXN0b3JlRGF0YVR5cGUgQE5vbk51bGwgU3RyaW5nLCBATm9uTnVsbCBTdHJpbmcpOwotICB9Ci0KLSAgQGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuU09VUkNFKSBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyLkJhY2t1cFJlc3RvcmVEYXRhVHlwZSB7Ci0gIH0KLQotICBAamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5TT1VSQ0UpIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBCYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXIuQmFja3VwUmVzdG9yZUVycm9yIHsKKyAgcHVibGljIGZpbmFsIGNsYXNzIEJhY2t1cFJlc3RvcmVFdmVudExvZ2dlciB7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGxvZ0JhY2t1cE1ldGFkYXRhKEBOb25OdWxsIFN0cmluZywgQE5vbk51bGwgU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgbG9nSXRlbXNCYWNrZWRVcChATm9uTnVsbCBTdHJpbmcsIGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGxvZ0l0ZW1zQmFja3VwRmFpbGVkKEBOb25OdWxsIFN0cmluZywgaW50LCBATnVsbGFibGUgU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgbG9nSXRlbXNSZXN0b3JlRmFpbGVkKEBOb25OdWxsIFN0cmluZywgaW50LCBATnVsbGFibGUgU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgbG9nSXRlbXNSZXN0b3JlZChATm9uTnVsbCBTdHJpbmcsIGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGxvZ1Jlc3RvcmVNZXRhZGF0YShATm9uTnVsbCBTdHJpbmcsIEBOb25OdWxsIFN0cmluZyk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJhY2t1cFJlc3RvcmVFdmVudExvZ2dlci5EYXRhVHlwZVJlc3VsdCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgICAgY3RvciBwdWJsaWMgQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyLkRhdGFUeXBlUmVzdWx0KEBOb25OdWxsIFN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpOwotICAgIG1ldGhvZCBAYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cFJlc3RvcmVFdmVudExvZ2dlci5CYWNrdXBSZXN0b3JlRGF0YVR5cGUgQE5vbk51bGwgcHVibGljIFN0cmluZyBnZXREYXRhVHlwZSgpOworICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCk7CiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLkludGVnZXI+IGdldEVycm9ycygpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldEZhaWxDb3VudCgpOwogICAgIG1ldGhvZCBATnVsbGFibGUgcHVibGljIGJ5dGVbXSBnZXRNZXRhZGF0YUhhc2goKTsKQEAgLTk5OTEsNiArOTk4MCw3IEBACiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBIb3RzcG90TmV0d29yayBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpOwogICAgIG1ldGhvZCBwdWJsaWMgbG9uZyBnZXREZXZpY2VJZCgpOworICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgZ2V0RXh0cmFzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0SG9zdE5ldHdvcmtUeXBlKCk7CiAgICAgbWV0aG9kIEBOdWxsYWJsZSBwdWJsaWMgU3RyaW5nIGdldEhvdHNwb3RCc3NpZCgpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgamF2YS51dGlsLlNldDxqYXZhLmxhbmcuSW50ZWdlcj4gZ2V0SG90c3BvdFNlY3VyaXR5VHlwZXMoKTsKQEAgLTEwMDEwLDYgKzEwMDAwLDcgQEAKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQubmV0LndpZmkuc2hhcmVkY29ubmVjdGl2aXR5LmFwcC5Ib3RzcG90TmV0d29yay5CdWlsZGVyIGFkZEhvdHNwb3RTZWN1cml0eVR5cGUoaW50KTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQubmV0LndpZmkuc2hhcmVkY29ubmVjdGl2aXR5LmFwcC5Ib3RzcG90TmV0d29yayBidWlsZCgpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLkhvdHNwb3ROZXR3b3JrLkJ1aWxkZXIgc2V0RGV2aWNlSWQobG9uZyk7CisgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLnNoYXJlZGNvbm5lY3Rpdml0eS5hcHAuSG90c3BvdE5ldHdvcmsuQnVpbGRlciBzZXRFeHRyYXMoQE5vbk51bGwgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLkhvdHNwb3ROZXR3b3JrLkJ1aWxkZXIgc2V0SG9zdE5ldHdvcmtUeXBlKGludCk7CiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLnNoYXJlZGNvbm5lY3Rpdml0eS5hcHAuSG90c3BvdE5ldHdvcmsuQnVpbGRlciBzZXRIb3RzcG90QnNzaWQoQE5vbk51bGwgU3RyaW5nKTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQubmV0LndpZmkuc2hhcmVkY29ubmVjdGl2aXR5LmFwcC5Ib3RzcG90TmV0d29yay5CdWlsZGVyIHNldEhvdHNwb3RTc2lkKEBOb25OdWxsIFN0cmluZyk7CkBAIC0xMDA0Niw2ICsxMDAzNyw3IEBACiAKICAgcHVibGljIGZpbmFsIGNsYXNzIEtub3duTmV0d29yayBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpOworICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgZ2V0RXh0cmFzKCk7CiAgICAgbWV0aG9kIEBOdWxsYWJsZSBwdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLk5ldHdvcmtQcm92aWRlckluZm8gZ2V0TmV0d29ya1Byb3ZpZGVySW5mbygpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE5ldHdvcmtTb3VyY2UoKTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLkludGVnZXI+IGdldFNlY3VyaXR5VHlwZXMoKTsKQEAgLTEwMDYxLDYgKzEwMDUzLDcgQEAKICAgICBjdG9yIHB1YmxpYyBLbm93bk5ldHdvcmsuQnVpbGRlcigpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLktub3duTmV0d29yay5CdWlsZGVyIGFkZFNlY3VyaXR5VHlwZShpbnQpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLktub3duTmV0d29yayBidWlsZCgpOworICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLktub3duTmV0d29yay5CdWlsZGVyIHNldEV4dHJhcyhATm9uTnVsbCBhbmRyb2lkLm9zLkJ1bmRsZSk7CiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLnNoYXJlZGNvbm5lY3Rpdml0eS5hcHAuS25vd25OZXR3b3JrLkJ1aWxkZXIgc2V0TmV0d29ya1Byb3ZpZGVySW5mbyhATnVsbGFibGUgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLk5ldHdvcmtQcm92aWRlckluZm8pOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLktub3duTmV0d29yay5CdWlsZGVyIHNldE5ldHdvcmtTb3VyY2UoaW50KTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQubmV0LndpZmkuc2hhcmVkY29ubmVjdGl2aXR5LmFwcC5Lbm93bk5ldHdvcmsuQnVpbGRlciBzZXRTc2lkKEBOb25OdWxsIFN0cmluZyk7CkBAIC0xMDA5Miw2ICsxMDA4NSw3IEBACiAgICAgbWV0aG9kIEBJbnRSYW5nZShmcm9tPTAsIHRvPTMpIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0cmVuZ3RoKCk7CiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBTdHJpbmcgZ2V0RGV2aWNlTmFtZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKTsKKyAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQub3MuQnVuZGxlIGdldEV4dHJhcygpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgU3RyaW5nIGdldE1vZGVsTmFtZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKEBOb25OdWxsIGFuZHJvaWQub3MuUGFyY2VsLCBpbnQpOwogICAgIGZpZWxkIEBOb25OdWxsIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8YW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLk5ldHdvcmtQcm92aWRlckluZm8+IENSRUFUT1I7CkBAIC0xMDExMCw2ICsxMDEwNCw3IEBACiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLnNoYXJlZGNvbm5lY3Rpdml0eS5hcHAuTmV0d29ya1Byb3ZpZGVySW5mby5CdWlsZGVyIHNldENvbm5lY3Rpb25TdHJlbmd0aChASW50UmFuZ2UoZnJvbT0wLCB0bz0zKSBpbnQpOwogICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLk5ldHdvcmtQcm92aWRlckluZm8uQnVpbGRlciBzZXREZXZpY2VOYW1lKEBOb25OdWxsIFN0cmluZyk7CiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLnNoYXJlZGNvbm5lY3Rpdml0eS5hcHAuTmV0d29ya1Byb3ZpZGVySW5mby5CdWlsZGVyIHNldERldmljZVR5cGUoaW50KTsKKyAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQubmV0LndpZmkuc2hhcmVkY29ubmVjdGl2aXR5LmFwcC5OZXR3b3JrUHJvdmlkZXJJbmZvLkJ1aWxkZXIgc2V0RXh0cmFzKEBOb25OdWxsIGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQubmV0LndpZmkuc2hhcmVkY29ubmVjdGl2aXR5LmFwcC5OZXR3b3JrUHJvdmlkZXJJbmZvLkJ1aWxkZXIgc2V0TW9kZWxOYW1lKEBOb25OdWxsIFN0cmluZyk7CiAgIH0KIApAQCAtMTAxNDEsMTYgKzEwMTM2LDE4IEBACiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKICAgICBtZXRob2QgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCk7CiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLm9zLkJ1bmRsZSBnZXRFeHRyYXMoKTsKKyAgICBtZXRob2QgQE51bGxhYmxlIHB1YmxpYyBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50IGdldEluc3RhbnRUZXRoZXJTZXR0aW5nc1BlbmRpbmdJbnRlbnQoKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNJbnN0YW50VGV0aGVyRW5hYmxlZCgpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKEBOb25OdWxsIGFuZHJvaWQub3MuUGFyY2VsLCBpbnQpOwogICAgIGZpZWxkIEBOb25OdWxsIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8YW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLlNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGU+IENSRUFUT1I7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuQnVpbGRlciB7Ci0gICAgY3RvciBwdWJsaWMgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyKCk7CisgICAgY3RvciBwdWJsaWMgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyKEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQubmV0LndpZmkuc2hhcmVkY29ubmVjdGl2aXR5LmFwcC5TaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIGJ1aWxkKCk7CiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLnNoYXJlZGNvbm5lY3Rpdml0eS5hcHAuU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyIHNldEV4dHJhcyhATm9uTnVsbCBhbmRyb2lkLm9zLkJ1bmRsZSk7CiAgICAgbWV0aG9kIEBOb25OdWxsIHB1YmxpYyBhbmRyb2lkLm5ldC53aWZpLnNoYXJlZGNvbm5lY3Rpdml0eS5hcHAuU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyIHNldEluc3RhbnRUZXRoZXJFbmFibGVkKGJvb2xlYW4pOworICAgIG1ldGhvZCBATm9uTnVsbCBwdWJsaWMgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuYXBwLlNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuQnVpbGRlciBzZXRJbnN0YW50VGV0aGVyU2V0dGluZ3NQZW5kaW5nSW50ZW50KEBOb25OdWxsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpOwogICB9CiAKIH0KQEAgLTEzMDAwLDIwICsxMjk5NywyMCBAQAogcGFja2FnZSBhbmRyb2lkLnNlcnZpY2Uudm9pY2UgewogCiAgIHB1YmxpYyBjbGFzcyBBbHdheXNPbkhvdHdvcmREZXRlY3RvciBpbXBsZW1lbnRzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IgewotICAgIG1ldGhvZCBATnVsbGFibGUgcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgY3JlYXRlRW5yb2xsSW50ZW50KCkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIEBOdWxsYWJsZSBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBjcmVhdGVSZUVucm9sbEludGVudCgpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOwotICAgIG1ldGhvZCBATnVsbGFibGUgcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgY3JlYXRlVW5FbnJvbGxJbnRlbnQoKSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKLSAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRH0pIHB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyKGludCkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247CisgICAgbWV0aG9kIEBOdWxsYWJsZSBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBjcmVhdGVFbnJvbGxJbnRlbnQoKTsKKyAgICBtZXRob2QgQE51bGxhYmxlIHB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IGNyZWF0ZVJlRW5yb2xsSW50ZW50KCk7CisgICAgbWV0aG9kIEBOdWxsYWJsZSBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBjcmVhdGVVbkVucm9sbEludGVudCgpOworICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkgcHVibGljIGludCBnZXRQYXJhbWV0ZXIoaW50KTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRTdXBwb3J0ZWRBdWRpb0NhcGFiaWxpdGllcygpOwotICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFN1cHBvcnRlZFJlY29nbml0aW9uTW9kZXMoKSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKLSAgICBtZXRob2QgQE51bGxhYmxlIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkFsd2F5c09uSG90d29yZERldGVjdG9yLk1vZGVsUGFyYW1SYW5nZSBxdWVyeVBhcmFtZXRlcihpbnQpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOwotICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkgcHVibGljIGludCBzZXRQYXJhbWV0ZXIoaW50LCBpbnQpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOwotICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbihpbnQsIEBOb25OdWxsIGJ5dGVbXSkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKGludCkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKCkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oQE5vbk51bGwgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciwgQE5vbk51bGwgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdCwgQE51bGxhYmxlIGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGUpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOwotICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIHB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlLCBATnVsbGFibGUgYW5kcm9pZC5vcy5TaGFyZWRNZW1vcnkpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFN1cHBvcnRlZFJlY29nbml0aW9uTW9kZXMoKTsKKyAgICBtZXRob2QgQE51bGxhYmxlIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkFsd2F5c09uSG90d29yZERldGVjdG9yLk1vZGVsUGFyYW1SYW5nZSBxdWVyeVBhcmFtZXRlcihpbnQpOworICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkgcHVibGljIGludCBzZXRQYXJhbWV0ZXIoaW50LCBpbnQpOworICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbihpbnQsIEBOb25OdWxsIGJ5dGVbXSk7CisgICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKGludCk7CisgICAgbWV0aG9kIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2Y9e2FuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU8sIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkR9KSBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oQE5vbk51bGwgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciwgQE5vbk51bGwgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdCwgQE51bGxhYmxlIGFuZHJvaWQub3MuUGVyc2lzdGFibGVCdW5kbGUpOworICAgIG1ldGhvZCBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mPXthbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLCBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCk7CisgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBhbmRyb2lkLm9zLlBlcnNpc3RhYmxlQnVuZGxlLCBATnVsbGFibGUgYW5kcm9pZC5vcy5TaGFyZWRNZW1vcnkpOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVRElPX0NBUEFCSUxJVFlfRUNIT19DQU5DRUxMQVRJT04gPSAxOyAvLyAweDEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVURJT19DQVBBQklMSVRZX05PSVNFX1NVUFBSRVNTSU9OID0gMjsgLy8gMHgyCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUEFSQU1fVEhSRVNIT0xEX0ZBQ1RPUiA9IDA7IC8vIDB4MApAQCAtMTMxOTIsMTAgKzEzMTg5LDEwIEBACiAKICAgcHVibGljIGludGVyZmFjZSBIb3R3b3JkRGV0ZWN0b3IgewogICAgIG1ldGhvZCBwdWJsaWMgZGVmYXVsdCB2b2lkIGRlc3Ryb3koKTsKLSAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRH0pIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKLSAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbihATm9uTnVsbCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLCBATm9uTnVsbCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0LCBATnVsbGFibGUgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZSkgdGhyb3dzIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247Ci0gICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIHN0b3BSZWNvZ25pdGlvbigpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZShATnVsbGFibGUgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZSwgQE51bGxhYmxlIGFuZHJvaWQub3MuU2hhcmVkTWVtb3J5KSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKKyAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTywgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRH0pIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbihATm9uTnVsbCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yLCBATm9uTnVsbCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0LCBATnVsbGFibGUgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZSk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIHN0b3BSZWNvZ25pdGlvbigpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZShATnVsbGFibGUgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZSwgQE51bGxhYmxlIGFuZHJvaWQub3MuU2hhcmVkTWVtb3J5KTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEhvdHdvcmREZXRlY3Rvci5DYWxsYmFjayB7CkBAIC0xMzIwOSw5ICsxMzIwNiw2IEBACiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uUmVqZWN0ZWQoQE5vbk51bGwgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmRSZWplY3RlZFJlc3VsdCk7CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIEhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uIHsKLSAgfQotCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBIb3R3b3JkUmVqZWN0ZWRSZXN1bHQgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewogICAgIG1ldGhvZCBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRDb25maWRlbmNlTGV2ZWwoKTsKQEAgLTEzMjc5LDkgKzEzMjczLDkgQEAKIAogICBwdWJsaWMgY2xhc3MgVmlzdWFsUXVlcnlEZXRlY3RvciB7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGRlc3Ryb3koKTsKLSAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQSwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJT30pIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKLSAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQSwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJT30pIHB1YmxpYyBib29sZWFuIHN0b3BSZWNvZ25pdGlvbigpIHRocm93cyBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZShATnVsbGFibGUgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZSwgQE51bGxhYmxlIGFuZHJvaWQub3MuU2hhcmVkTWVtb3J5KSB0aHJvd3MgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKKyAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQSwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJT30pIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKTsKKyAgICBtZXRob2QgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZj17YW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQSwgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJT30pIHB1YmxpYyBib29sZWFuIHN0b3BSZWNvZ25pdGlvbigpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZShATnVsbGFibGUgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZSwgQE51bGxhYmxlIGFuZHJvaWQub3MuU2hhcmVkTWVtb3J5KTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZpc3VhbFF1ZXJ5RGV0ZWN0b3IuQ2FsbGJhY2sgewpkaWZmIC0tZ2l0IGEvY29yZS9hcGkvdGVzdC1jdXJyZW50LnR4dCBiL2NvcmUvYXBpL3Rlc3QtY3VycmVudC50eHQKaW5kZXggNTc0ZWQ2Zi4uNmJmYWEzNSAxMDA2NDQKLS0tIGEvY29yZS9hcGkvdGVzdC1jdXJyZW50LnR4dAorKysgYi9jb3JlL2FwaS90ZXN0LWN1cnJlbnQudHh0CkBAIC01MTYsNiArNTE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHAuYWRtaW4gewogCisgIHB1YmxpYyBmaW5hbCBjbGFzcyBBY2NvdW50VHlwZVBvbGljeUtleSBleHRlbmRzIGFuZHJvaWQuYXBwLmFkbWluLlBvbGljeUtleSB7CisgICAgY3RvciBwdWJsaWMgQWNjb3VudFR5cGVQb2xpY3lLZXkoQE5vbk51bGwgU3RyaW5nLCBATm9uTnVsbCBTdHJpbmcpOworICB9CisKICAgcHVibGljIGZpbmFsIGNsYXNzIERldmljZUFkbWluQXV0aG9yaXR5IGV4dGVuZHMgYW5kcm9pZC5hcHAuYWRtaW4uQXV0aG9yaXR5IHsKICAgICBmaWVsZCBATm9uTnVsbCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZUFkbWluQXV0aG9yaXR5IERFVklDRV9BRE1JTl9BVVRIT1JJVFk7CiAgIH0KQEAgLTYxMiw2ICs2MTYsMTAgQEAKICAgICBmaWVsZCBATm9uTnVsbCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuYXBwLmFkbWluLkZsYWdVbmlvbiBGTEFHX1VOSU9OOwogICB9CiAKKyAgcHVibGljIGZpbmFsIGNsYXNzIEludGVudEZpbHRlclBvbGljeUtleSBleHRlbmRzIGFuZHJvaWQuYXBwLmFkbWluLlBvbGljeUtleSB7CisgICAgY3RvciBwdWJsaWMgSW50ZW50RmlsdGVyUG9saWN5S2V5KEBOb25OdWxsIFN0cmluZywgQE5vbk51bGwgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcik7CisgIH0KKwogICBwdWJsaWMgZmluYWwgY2xhc3MgTW9zdFJlY2VudDxWPiBleHRlbmRzIGFuZHJvaWQuYXBwLmFkbWluLlJlc29sdXRpb25NZWNoYW5pc208Vj4gewogICAgIGN0b3IgcHVibGljIE1vc3RSZWNlbnQoKTsKICAgICBtZXRob2QgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCk7CkBAIC02MjcsNiArNjM1LDE0IEBACiAgICAgZmllbGQgQE5vbk51bGwgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjxhbmRyb2lkLmFwcC5hZG1pbi5Nb3N0UmVzdHJpY3RpdmU8Pz4+IENSRUFUT1I7CiAgIH0KIAorICBwdWJsaWMgZmluYWwgY2xhc3MgUGFja2FnZVBlcm1pc3Npb25Qb2xpY3lLZXkgZXh0ZW5kcyBhbmRyb2lkLmFwcC5hZG1pbi5Qb2xpY3lLZXkgeworICAgIGN0b3IgcHVibGljIFBhY2thZ2VQZXJtaXNzaW9uUG9saWN5S2V5KEBOb25OdWxsIFN0cmluZywgQE5vbk51bGwgU3RyaW5nLCBATm9uTnVsbCBTdHJpbmcpOworICB9CisKKyAgcHVibGljIGZpbmFsIGNsYXNzIFBhY2thZ2VQb2xpY3lLZXkgZXh0ZW5kcyBhbmRyb2lkLmFwcC5hZG1pbi5Qb2xpY3lLZXkgeworICAgIGN0b3IgcHVibGljIFBhY2thZ2VQb2xpY3lLZXkoQE5vbk51bGwgU3RyaW5nLCBATm9uTnVsbCBTdHJpbmcpOworICB9CisKICAgcHVibGljIGZpbmFsIGNsYXNzIFBvbGljeVN0YXRlPFY+IGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKICAgICBtZXRob2QgQE5vbk51bGwgcHVibGljIGFuZHJvaWQuYXBwLmFkbWluLlJlc29sdXRpb25NZWNoYW5pc208Vj4gZ2V0UmVzb2x1dGlvbk1lY2hhbmlzbSgpOwogICB9CkBAIC02NzYsNiArNjkyLDEwIEBACiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0T3BlcmF0aW9uKCk7CiAgIH0KIAorICBwdWJsaWMgZmluYWwgY2xhc3MgVXNlclJlc3RyaWN0aW9uUG9saWN5S2V5IGV4dGVuZHMgYW5kcm9pZC5hcHAuYWRtaW4uUG9saWN5S2V5IHsKKyAgICBjdG9yIHB1YmxpYyBVc2VyUmVzdHJpY3Rpb25Qb2xpY3lLZXkoQE5vbk51bGwgU3RyaW5nLCBATm9uTnVsbCBTdHJpbmcpOworICB9CisKIH0KIAogcGFja2FnZSBhbmRyb2lkLmFwcC5hc3Npc3QgewpAQCAtMjAyNyw3ICsyMDQ3LDkgQEAKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBib29sZWFuIGlzNjRCaXRBYmkoU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnYWJsZSgpOwogICAgIGZpZWxkIEBOdWxsYWJsZSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFORF9GT1JfQVRURVNUQVRJT047CisgICAgZmllbGQgQE51bGxhYmxlIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9GT1JfQVRURVNUQVRJT047CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0VNVUxBVE9SOworICAgIGZpZWxkIEBOdWxsYWJsZSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5VRkFDVFVSRVJfRk9SX0FUVEVTVEFUSU9OOwogICAgIGZpZWxkIEBOdWxsYWJsZSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9GT1JfQVRURVNUQVRJT047CiAgICAgZmllbGQgQE51bGxhYmxlIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfRk9SX0FUVEVTVEFUSU9OOwogICB9CkBAIC0zOTg2LDYgKzQwMDgsNyBAQAogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2luZG93SW5mb3NMaXN0ZW5lckZvclRlc3QuV2luZG93SW5mbyB7CiAgICAgZmllbGQgQE5vbk51bGwgcHVibGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCBib3VuZHM7CisgICAgZmllbGQgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNUcnVzdGVkT3ZlcmxheTsKICAgICBmaWVsZCBATm9uTnVsbCBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CiAgICAgZmllbGQgQE5vbk51bGwgcHVibGljIGZpbmFsIGFuZHJvaWQub3MuSUJpbmRlciB3aW5kb3dUb2tlbjsKICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YQppbmRleCBhODFlZjE4Li5kMGNlNzAxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YQpAQCAtNjksNyArNjksNyBAQAogICAgICAqIGJhY2tpbmcgZmllbGQgZm9yIGJhY2tncm91bmRQYXVzZURlbGF5IHByb3BlcnR5LiBUaGlzIGNvdWxkIGJlIHNpbXBseSBhIGhhcmRjb2RlZAogICAgICAqIHZhbHVlIGluIEFuaW1hdGlvbkhhbmRsZXIsIGJ1dCBpdCBpcyB1c2VmdWwgdG8gYmUgYWJsZSB0byBjaGFuZ2UgdGhlIHZhbHVlIGluIHRlc3RzLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgc0JhY2tncm91bmRQYXVzZURlbGF5ID0gMTAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzQmFja2dyb3VuZFBhdXNlRGVsYXkgPSAxMDAwOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZHVyYXRpb24gZm9yIGRlbGF5aW5nIHBhdXNpbmcgYW5pbWF0b3JzIHdoZW4gYXBwcyBnbyBpbnRvIHRoZSBiYWNrZ3JvdW5kLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQppbmRleCBhM2FkYTc2Li42ODJmZWM4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQpAQCAtODQ5LDggKzg0OSwxMCBAQAogICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICBJbnRlbnQgaW50ZW50OwogICAgICAgICBib29sZWFuIHJlYmluZDsKKyAgICAgICAgbG9uZyBiaW5kU2VxOwogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJCaW5kU2VydmljZURhdGF7dG9rZW49IiArIHRva2VuICsgIiBpbnRlbnQ9IiArIGludGVudCArICJ9IjsKKyAgICAgICAgICAgIHJldHVybiAiQmluZFNlcnZpY2VEYXRhe3Rva2VuPSIgKyB0b2tlbiArICIgaW50ZW50PSIgKyBpbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGJpbmRTZXE9IiArIGJpbmRTZXEgKyAifSI7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExMDcsMTIgKzExMDksMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNjaGVkdWxlQmluZFNlcnZpY2UoSUJpbmRlciB0b2tlbiwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlYmluZCwgaW50IHByb2Nlc3NTdGF0ZSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gcmViaW5kLCBpbnQgcHJvY2Vzc1N0YXRlLCBsb25nIGJpbmRTZXEpIHsKICAgICAgICAgICAgIHVwZGF0ZVByb2Nlc3NTdGF0ZShwcm9jZXNzU3RhdGUsIGZhbHNlKTsKICAgICAgICAgICAgIEJpbmRTZXJ2aWNlRGF0YSBzID0gbmV3IEJpbmRTZXJ2aWNlRGF0YSgpOwogICAgICAgICAgICAgcy50b2tlbiA9IHRva2VuOwogICAgICAgICAgICAgcy5pbnRlbnQgPSBpbnRlbnQ7CiAgICAgICAgICAgICBzLnJlYmluZCA9IHJlYmluZDsKKyAgICAgICAgICAgIHMuYmluZFNlcSA9IGJpbmRTZXE7CiAKICAgICAgICAgICAgIGlmIChERUJVR19TRVJWSUNFKQogICAgICAgICAgICAgICAgIFNsb2cudihUQUcsICJzY2hlZHVsZUJpbmRTZXJ2aWNlIHRva2VuPSIgKyB0b2tlbiArICIgaW50ZW50PSIgKyBpbnRlbnQgKyAiIHVpZD0iCkBAIC0xMTI0LDYgKzExMjcsNyBAQAogICAgICAgICAgICAgQmluZFNlcnZpY2VEYXRhIHMgPSBuZXcgQmluZFNlcnZpY2VEYXRhKCk7CiAgICAgICAgICAgICBzLnRva2VuID0gdG9rZW47CiAgICAgICAgICAgICBzLmludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIHMuYmluZFNlcSA9IC0xOwogCiAgICAgICAgICAgICBzZW5kTWVzc2FnZShILlVOQklORF9TRVJWSUNFLCBzKTsKICAgICAgICAgfQpAQCAtMzU1Nyw4ICszNTYxLDEzIEBACiAgICAgICAgICAgICBpZiAobUxhc3RQcm9jZXNzU3RhdGUgPT0gcHJvY2Vzc1N0YXRlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRG8gbm90IGlzc3VlIGEgdHJhbnNpdGlvbmFsIEdDIGlmIHdlIGFyZSB0cmFuc2l0aW9uaW5nIGJldHdlZW4gMiBjYWNoZWQgc3RhdGVzLgorICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgaWYgdGhlIHN0YXRlIGZsaXBzIGJldHdlZW4gY2FjaGVkIGFuZCB1bmNhY2hlZCBvciB2aWNlIHZlcnNhCisgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyLmlzUHJvY1N0YXRlQ2FjaGVkKG1MYXN0UHJvY2Vzc1N0YXRlKQorICAgICAgICAgICAgICAgICAgICAhPSBBY3Rpdml0eU1hbmFnZXIuaXNQcm9jU3RhdGVDYWNoZWQocHJvY2Vzc1N0YXRlKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVZtUHJvY2Vzc1N0YXRlKHByb2Nlc3NTdGF0ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTGFzdFByb2Nlc3NTdGF0ZSA9IHByb2Nlc3NTdGF0ZTsKLSAgICAgICAgICAgIHVwZGF0ZVZtUHJvY2Vzc1N0YXRlKHByb2Nlc3NTdGF0ZSk7CiAgICAgICAgICAgICBpZiAobG9jYWxMT0dWKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIioqKioqKioqKioqKioqKioqKiogUFJPQ0VTUyBTVEFURSBDSEFOR0VEIFRPOiAiICsgcHJvY2Vzc1N0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICArIChmcm9tSXBjID8gIiAoZnJvbSBpcGMiIDogIiIpKTsKQEAgLTM1NjcsMTIgKzM1NzYsMTYgQEAKICAgICB9CiAKICAgICAvKiogVXBkYXRlIFZNIHN0YXRlIGJhc2VkIG9uIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFXyogY29uc3RhbnRzLiAqLworICAgIC8vIEN1cnJlbnRseSBBUlQgVk0gb25seSB1c2VzIHN0YXRlIHVwZGF0ZXMgZm9yIFRyYW5zaXRpb25hbCBHQywgYW5kIHRodXMKKyAgICAvLyB0aGlzIGZ1bmN0aW9uIGluaXRpYXRlcyBhIFRyYW5zaXRpb25hbCBHQyBmb3IgdHJhbnNpdGlvbnMgaW50byBDYWNoZWQgYXBwcyBzdGF0ZXMuCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVZtUHJvY2Vzc1N0YXRlKGludCBwcm9jZXNzU3RhdGUpIHsKLSAgICAgICAgLy8gVE9ETzogVHVuZSB0aGlzIHNpbmNlIHRoaW5ncyBsaWtlIGdtYWlsIHN5bmMgYXJlIGltcG9ydGFudCBiYWNrZ3JvdW5kIGJ1dCBub3QgamFuawotICAgICAgICAvLyBwZXJjZXB0aWJsZS4KLSAgICAgICAgZmluYWwgaW50IHN0YXRlID0gcHJvY2Vzc1N0YXRlIDw9IEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX0lNUE9SVEFOVF9GT1JFR1JPVU5ECi0gICAgICAgICAgICAgICAgPyBWTV9QUk9DRVNTX1NUQVRFX0pBTktfUEVSQ0VQVElCTEUKLSAgICAgICAgICAgICAgICA6IFZNX1BST0NFU1NfU1RBVEVfSkFOS19JTVBFUkNFUFRJQkxFOworICAgICAgICAvLyBPbmx5IGEgdHJhbnNpdGlvbiBpbnRvIENhY2hlZCBzdGF0ZSBzaG91bGQgcmVzdWx0IGluIGEgVHJhbnNpdGlvbmFsIEdDIHJlcXVlc3QKKyAgICAgICAgLy8gdG8gdGhlIEFSVCBydW50aW1lLiBVcGRhdGUgVk0gc3RhdGUgdG8gSkFOS19JTVBFUkNFUFRJQkxFIGluIHRoYXQgY2FzZS4KKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoZXJlIGFyZSA0IHBvc3NpYmxlIGNhY2hlZCBzdGF0ZXMgY3VycmVudGx5LCBhbGwgb2Ygd2hpY2ggYXJlCisgICAgICAgIC8vIEpBTktfSU1QRVJDRVBUSUJMRSBmcm9tIEdDIHBvaW50IG9mIHZpZXcuCisgICAgICAgIGZpbmFsIGludCBzdGF0ZSA9IEFjdGl2aXR5TWFuYWdlci5pc1Byb2NTdGF0ZUNhY2hlZChwcm9jZXNzU3RhdGUpCisgICAgICAgICAgICAgICAgPyBWTV9QUk9DRVNTX1NUQVRFX0pBTktfSU1QRVJDRVBUSUJMRQorICAgICAgICAgICAgICAgIDogVk1fUFJPQ0VTU19TVEFURV9KQU5LX1BFUkNFUFRJQkxFOwogICAgICAgICBWTVJ1bnRpbWUuZ2V0UnVudGltZSgpLnVwZGF0ZVByb2Nlc3NTdGF0ZShzdGF0ZSk7CiAgICAgfQogCkBAIC01ODI3LDI2ICs1ODQwLDYgQEAKIAogICAgICAgICByLmFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gdHJ1ZTsKIAotICAgICAgICAvLyBJZiB3ZSBhcmUgcHJlc2VydmluZyB0aGUgbWFpbiB3aW5kb3cgYWNyb3NzIHJlbGF1bmNoZXMgd2Ugd291bGQgYWxzbyBsaWtlIHRvIHByZXNlcnZlCi0gICAgICAgIC8vIHRoZSBjaGlsZHJlbi4gSG93ZXZlciB0aGUgY2xpZW50IHNpZGUgdmlldyBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBwcmVzZXJ2aW5nCi0gICAgICAgIC8vIHRoZSBjaGlsZCB2aWV3cyBzbyB3ZSBub3RpZnkgdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIGV4cGVjdCB0aGVzZSB3aW5kb3dzIHRvCi0gICAgICAgIC8vIGJlIHJlcGxhY2VkIGFuZCBkZWZlciByZXF1ZXN0cyB0byBkZXN0cm95IG9yIGhpZGUgdGhlbS4gVGhpcyB3YXkgd2UgY2FuIGFjaGlldmUKLSAgICAgICAgLy8gdmlzdWFsIGNvbnRpbnVpdHkuIEl0J3MgaW1wb3J0YW50IHRoYXQgd2UgZG8gdGhpcyBoZXJlIHByaW9yIHRvIHBhdXNlIGFuZCBkZXN0cm95Ci0gICAgICAgIC8vIGFzIHRoYXQgaXMgd2hlbiB3ZSBtYXkgaGlkZSBvciByZW1vdmUgdGhlIGNoaWxkIHZpZXdzLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGVyZSBpcyBhbm90aGVyIHNjZW5hcmlvLCBpZiB3ZSBoYXZlIGRlY2lkZWQgbG9jYWxseSB0byByZWxhdW5jaCB0aGUgYXBwIGZyb20gYQotICAgICAgICAvLyBjYWxsIHRvIHJlY3JlYXRlLCB0aGVuIG5vbmUgb2YgdGhlIHdpbmRvd3Mgd2lsbCBiZSBwcmVwYXJlZCBmb3IgcmVwbGFjZW1lbnQgb3IKLSAgICAgICAgLy8gcHJlc2VydmVkIGJ5IHRoZSBzZXJ2ZXIsIHNvIHdlIHdhbnQgdG8gbm90aWZ5IGl0IHRoYXQgd2UgYXJlIHByZXBhcmluZyB0byByZXBsYWNlCi0gICAgICAgIC8vIGV2ZXJ5dGhpbmcKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChyLm1QcmVzZXJ2ZVdpbmRvdykgewotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXJHbG9iYWwuZ2V0V2luZG93U2Vzc2lvbigpLnByZXBhcmVUb1JlcGxhY2VXaW5kb3dzKAotICAgICAgICAgICAgICAgICAgICAgICAgci50b2tlbiwgdHJ1ZSAvKiBjaGlsZHJlbk9ubHkgKi8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9Ci0KICAgICAgICAgaGFuZGxlUmVsYXVuY2hBY3Rpdml0eUlubmVyKHIsIGNvbmZpZ0NoYW5nZXMsIHRtcC5wZW5kaW5nUmVzdWx0cywgdG1wLnBlbmRpbmdJbnRlbnRzLAogICAgICAgICAgICAgICAgIHBlbmRpbmdBY3Rpb25zLCB0bXAuc3RhcnRzTm90UmVzdW1lZCwgdG1wLm92ZXJyaWRlQ29uZmlnLCAiaGFuZGxlUmVsYXVuY2hBY3Rpdml0eSIpOwogICAgIH0KQEAgLTY2NDQsMTIgKzY2MzcsMTMgQEAKICAgICAgICAgICAgIC8vIFNldHVwIGEgbG9jYXRpb24gdG8gc3RvcmUgZ2VuZXJhdGVkL2NvbXBpbGVkIGdyYXBoaWNzIGNvZGUuCiAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGRldmljZUNvbnRleHQgPSBjb250ZXh0LmNyZWF0ZURldmljZVByb3RlY3RlZFN0b3JhZ2VDb250ZXh0KCk7CiAgICAgICAgICAgICBmaW5hbCBGaWxlIGNvZGVDYWNoZURpciA9IGRldmljZUNvbnRleHQuZ2V0Q29kZUNhY2hlRGlyKCk7Ci0gICAgICAgICAgICBpZiAoY29kZUNhY2hlRGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIEZpbGUgZGV2aWNlQ2FjaGVEaXIgPSBkZXZpY2VDb250ZXh0LmdldENhY2hlRGlyKCk7CisgICAgICAgICAgICBpZiAoY29kZUNhY2hlRGlyICE9IG51bGwgJiYgZGV2aWNlQ2FjaGVEaXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSBQcm9jZXNzLm15VWlkKCk7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhY2thZ2VzID0gZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRQYWNrYWdlc0ZvclVpZCh1aWQpOwogICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSGFyZHdhcmVSZW5kZXJlci5zZXR1cERpc2tDYWNoZShjb2RlQ2FjaGVEaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgSGFyZHdhcmVSZW5kZXJlci5zZXR1cERpc2tDYWNoZShkZXZpY2VDYWNoZURpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJTY3JpcHRDYWNoZURpci5zZXR1cERpc2tDYWNoZShjb2RlQ2FjaGVEaXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBPcHNNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwT3BzTWFuYWdlci5qYXZhCmluZGV4IDE4MWJkMzUuLjI2NWI1NjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBPcHNNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcE9wc01hbmFnZXIuamF2YQpAQCAtODQwOCw5ICs4NDA4LDkgQEAKICAgICBwdWJsaWMgaW50IG5vdGVQcm94eU9wKGludCBvcCwgQE51bGxhYmxlIFN0cmluZyBwcm94aWVkUGFja2FnZU5hbWUsIGludCBwcm94aWVkVWlkLAogICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBwcm94aWVkQXR0cmlidXRpb25UYWcsIEBOdWxsYWJsZSBTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICByZXR1cm4gbm90ZVByb3h5T3Aob3AsIG5ldyBBdHRyaWJ1dGlvblNvdXJjZShtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpLAotICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGlvblNvdXJjZShwcm94aWVkVWlkLCBwcm94aWVkUGFja2FnZU5hbWUsIHByb3hpZWRBdHRyaWJ1dGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldEF0dHJpYnV0aW9uU291cmNlKCkuZ2V0VG9rZW4oKSkpLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgLypza2lwUHJveHlPcGVyYXRpb24qLyBmYWxzZSk7CisgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0aW9uU291cmNlKHByb3hpZWRVaWQsIFByb2Nlc3MuSU5WQUxJRF9QSUQsIHByb3hpZWRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3hpZWRBdHRyaWJ1dGlvblRhZywgbUNvbnRleHQuZ2V0QXR0cmlidXRpb25Tb3VyY2UoKS5nZXRUb2tlbigpKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCAvKnNraXBQcm94eU9wZXJhdGlvbiovIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg0OTUsOCArODQ5NSw5IEBACiAgICAgICAgICAgICBpbnQgcHJveGllZFVpZCwgQE51bGxhYmxlIFN0cmluZyBwcm94aWVkQXR0cmlidXRpb25UYWcsIEBOdWxsYWJsZSBTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICByZXR1cm4gbm90ZVByb3h5T3BOb1Rocm93KHN0ck9wVG9PcChvcCksIG5ldyBBdHRyaWJ1dGlvblNvdXJjZSgKICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpLCBuZXcgQXR0cmlidXRpb25Tb3VyY2UocHJveGllZFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3hpZWRQYWNrYWdlTmFtZSwgcHJveGllZEF0dHJpYnV0aW9uVGFnLCBtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VG9rZW4oKSkpLCBtZXNzYWdlLC8qc2tpcFByb3h5T3BlcmF0aW9uKi8gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5JTlZBTElEX1BJRCwgcHJveGllZFBhY2thZ2VOYW1lLCBwcm94aWVkQXR0cmlidXRpb25UYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpLmdldFRva2VuKCkpKSwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qc2tpcFByb3h5T3BlcmF0aW9uKi8gZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODkwNiw5ICs4OTA3LDkgQEAKICAgICBwdWJsaWMgaW50IHN0YXJ0UHJveHlPcChATm9uTnVsbCBTdHJpbmcgb3AsIGludCBwcm94aWVkVWlkLCBATm9uTnVsbCBTdHJpbmcgcHJveGllZFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBwcm94aWVkQXR0cmlidXRpb25UYWcsIEBOdWxsYWJsZSBTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICByZXR1cm4gc3RhcnRQcm94eU9wKG9wLCBuZXcgQXR0cmlidXRpb25Tb3VyY2UobUNvbnRleHQuZ2V0QXR0cmlidXRpb25Tb3VyY2UoKSwKLSAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRpb25Tb3VyY2UocHJveGllZFVpZCwgcHJveGllZFBhY2thZ2VOYW1lLCBwcm94aWVkQXR0cmlidXRpb25UYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpLmdldFRva2VuKCkpKSwgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qc2tpcFByb3h5T3BlcmF0aW9uKi8gZmFsc2UpOworICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGlvblNvdXJjZShwcm94aWVkVWlkLCBQcm9jZXNzLklOVkFMSURfUElELCBwcm94aWVkUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm94aWVkQXR0cmlidXRpb25UYWcsIG1Db250ZXh0LmdldEF0dHJpYnV0aW9uU291cmNlKCkuZ2V0VG9rZW4oKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgLypza2lwUHJveHlPcGVyYXRpb24qLyBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04OTU0LDcgKzg5NTUsNyBAQAogICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBtZXNzYWdlKSB7CiAgICAgICAgIHJldHVybiBzdGFydFByb3h5T3BOb1Rocm93KEFwcE9wc01hbmFnZXIuc3RyT3BUb09wKG9wKSwgbmV3IEF0dHJpYnV0aW9uU291cmNlKAogICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldEF0dHJpYnV0aW9uU291cmNlKCksIG5ldyBBdHRyaWJ1dGlvblNvdXJjZShwcm94aWVkVWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJveGllZFBhY2thZ2VOYW1lLCBwcm94aWVkQXR0cmlidXRpb25UYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzLklOVkFMSURfUElELCBwcm94aWVkUGFja2FnZU5hbWUsIHByb3hpZWRBdHRyaWJ1dGlvblRhZywKICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldEF0dHJpYnV0aW9uU291cmNlKCkuZ2V0VG9rZW4oKSkpLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgLypza2lwUHJveHlPcGVyYXRpb24qLyBmYWxzZSk7CiAgICAgfQpAQCAtOTEwMyw4ICs5MTA0LDggQEAKICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBwcm94aWVkUGFja2FnZU5hbWUsIEBOdWxsYWJsZSBTdHJpbmcgcHJveGllZEF0dHJpYnV0aW9uVGFnKSB7CiAgICAgICAgIElCaW5kZXIgdG9rZW4gPSBtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpLmdldFRva2VuKCk7CiAgICAgICAgIGZpbmlzaFByb3h5T3AodG9rZW4sIG9wLCBuZXcgQXR0cmlidXRpb25Tb3VyY2UobUNvbnRleHQuZ2V0QXR0cmlidXRpb25Tb3VyY2UoKSwKLSAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRpb25Tb3VyY2UocHJveGllZFVpZCwgcHJveGllZFBhY2thZ2VOYW1lLCAgcHJveGllZEF0dHJpYnV0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4pKSwgLypza2lwUHJveHlPcGVyYXRpb24qLyBmYWxzZSk7CisgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0aW9uU291cmNlKHByb3hpZWRVaWQsIFByb2Nlc3MuSU5WQUxJRF9QSUQsIHByb3hpZWRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3hpZWRBdHRyaWJ1dGlvblRhZywgdG9rZW4pKSwgLypza2lwUHJveHlPcGVyYXRpb24qLyBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25QYWNrYWdlTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uUGFja2FnZU1hbmFnZXIuamF2YQppbmRleCA2MzAxYWQ3Li45OTkwNzVkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25QYWNrYWdlTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblBhY2thZ2VNYW5hZ2VyLmphdmEKQEAgLTI1NjEsNyArMjU2MSw3IEBACiAgICAgcHVibGljIEluc3RhbGxTb3VyY2VJbmZvIGdldEluc3RhbGxTb3VyY2VJbmZvKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIEluc3RhbGxTb3VyY2VJbmZvIGluc3RhbGxTb3VyY2VJbmZvOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5zdGFsbFNvdXJjZUluZm8gPSBtUE0uZ2V0SW5zdGFsbFNvdXJjZUluZm8ocGFja2FnZU5hbWUpOworICAgICAgICAgICAgaW5zdGFsbFNvdXJjZUluZm8gPSBtUE0uZ2V0SW5zdGFsbFNvdXJjZUluZm8ocGFja2FnZU5hbWUsIGdldFVzZXJJZCgpKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YQppbmRleCA3NjJmYjA0Li4wY2Q0MmEzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YQpAQCAtMzQ2MSw3ICszNDYxLDkgQEAKICAgICAgICAgICAgIEBOdWxsYWJsZSBBdHRyaWJ1dGlvblNvdXJjZSBuZXh0QXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgICAgICBATnVsbGFibGUgU2V0PFN0cmluZz4gcmVub3VuY2VkUGVybWlzc2lvbnMpIHsKICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UgPSBuZXcgQXR0cmlidXRpb25Tb3VyY2UoUHJvY2Vzcy5teVVpZCgpLAotICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lLCBhdHRyaWJ1dGlvblRhZywgcmVub3VuY2VkUGVybWlzc2lvbnMsIG5leHRBdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVBpZCgpLCBtT3BQYWNrYWdlTmFtZSwgYXR0cmlidXRpb25UYWcsCisgICAgICAgICAgICAgICAgKHJlbm91bmNlZFBlcm1pc3Npb25zICE9IG51bGwpID8gcmVub3VuY2VkUGVybWlzc2lvbnMudG9BcnJheShuZXcgU3RyaW5nWzBdKSA6IG51bGwsCisgICAgICAgICAgICAgICAgbmV4dEF0dHJpYnV0aW9uU291cmNlKTsKICAgICAgICAgLy8gSWYgd2Ugd2FudCB0byBhY2Nlc3MgcHJvdGVjdGVkIGRhdGEgb24gYmVoYWxmIG9mIGFub3RoZXIgYXBwIHdlIG5lZWQgdG8KICAgICAgICAgLy8gdGVsbCB0aGUgT1MgdGhhdCB3ZSBvcHQgaW4gdG8gcGFydGljaXBhdGUgaW4gdGhlIGF0dHJpYnV0aW9uIGNoYWluLgogICAgICAgICBpZiAobmV4dEF0dHJpYnV0aW9uU291cmNlICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuYWlkbAppbmRleCA0Zjc3MjAzLi42YjVmNmIwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5haWRsCkBAIC05NSw3ICs5NSw3IEBACiAgICAgdm9pZCBwcm9jZXNzSW5CYWNrZ3JvdW5kKCk7CiAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKICAgICB2b2lkIHNjaGVkdWxlQmluZFNlcnZpY2UoSUJpbmRlciB0b2tlbiwKLSAgICAgICAgICAgIGluIEludGVudCBpbnRlbnQsIGJvb2xlYW4gcmViaW5kLCBpbnQgcHJvY2Vzc1N0YXRlKTsKKyAgICAgICAgICAgIGluIEludGVudCBpbnRlbnQsIGJvb2xlYW4gcmViaW5kLCBpbnQgcHJvY2Vzc1N0YXRlLCBsb25nIGJpbmRTZXEpOwogICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgdm9pZCBzY2hlZHVsZVVuYmluZFNlcnZpY2UoSUJpbmRlciB0b2tlbiwKICAgICAgICAgICAgIGluIEludGVudCBpbnRlbnQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0tleWd1YXJkTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0tleWd1YXJkTWFuYWdlci5qYXZhCmluZGV4IDBlZjhlOTIuLjA5NDUwZjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9LZXlndWFyZE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvS2V5Z3VhcmRNYW5hZ2VyLmphdmEKQEAgLTE1NSw2ICsxNTUsMTQgQEAKICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5leHRyYS5SRU1PVEVfTE9DS1NDUkVFTl9WQUxJREFUSU9OX1NFU1NJT04iOwogCiAgICAgLyoqCisgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgdGhhdCBjcmVkZW50aWFsIGNvbmZpcm1hdGlvbiBhY3Rpdml0eSBzaG91bGQgYmUgYSB0YXNrIG92ZXJsYXkuCisgICAgICoge0BsaW5rICNBQ1RJT05fQ09ORklSTV9ERVZJQ0VfQ1JFREVOVElBTF9XSVRIX1VTRVJ9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRk9SQ0VfVEFTS19PVkVSTEFZID0KKyAgICAgICAgICAgICJhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXIuRk9SQ0VfVEFTS19PVkVSTEFZIjsKKworICAgIC8qKgogICAgICAqIFJlc3VsdCBjb2RlIHJldHVybmVkIGJ5IHRoZSBhY3Rpdml0eSBzdGFydGVkIGJ5CiAgICAgICoge0BsaW5rICNjcmVhdGVDb25maXJtRmFjdG9yeVJlc2V0Q3JlZGVudGlhbEludGVudH0gb3IKICAgICAgKiB7QGxpbmsgI2NyZWF0ZUNvbmZpcm1EZXZpY2VDcmVkZW50aWFsRm9yUmVtb3RlVmFsaWRhdGlvbkludGVudH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YQppbmRleCA0NDBlZTIwLi41MDJlZjBkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhCkBAIC00NjM0LDkgKzQ2MzQsOSBAQAogICAgICAgICAgKiBTZXQgd2hldGhlciB0aGlzIGlzIGFuICJvbmdvaW5nIiBub3RpZmljYXRpb24uCiAgICAgICAgICAqCiAgICAgICAgICAqIE9uZ29pbmcgbm90aWZpY2F0aW9ucyBjYW5ub3QgYmUgZGlzbWlzc2VkIGJ5IHRoZSB1c2VyIG9uIGxvY2tlZCBkZXZpY2VzLCBvciBieQotICAgICAgICAgKiBub3RpZmljYXRpb24gbGlzdGVuZXJzLCBhbmQgc29tZSBub3RpZmljYXRpb25zICAoZGV2aWNlIG1hbmFnZW1lbnQsIG1lZGlhKSBjYW5ub3QgYmUKLSAgICAgICAgICogZGlzbWlzc2VkIG9uIHVubG9ja2VkIGRldmljZXMsIHNvIHlvdXIgYXBwbGljYXRpb24gb3Igc2VydmljZSBtdXN0IHRha2UKLSAgICAgICAgICogY2FyZSBvZiBjYW5jZWxpbmcgdGhlbS4KKyAgICAgICAgICogbm90aWZpY2F0aW9uIGxpc3RlbmVycywgYW5kIHNvbWUgbm90aWZpY2F0aW9ucyAoY2FsbCwgZGV2aWNlIG1hbmFnZW1lbnQsIG1lZGlhKSBjYW5ub3QKKyAgICAgICAgICogYmUgZGlzbWlzc2VkIG9uIHVubG9ja2VkIGRldmljZXMsIHNvIHlvdXIgYXBwbGljYXRpb24gb3Igc2VydmljZSBtdXN0IHRha2UgY2FyZSBvZgorICAgICAgICAgKiBjYW5jZWxpbmcgdGhlbS4KICAgICAgICAgICoKICAgICAgICAgICogVGhleSBhcmUgdHlwaWNhbGx5IHVzZWQgdG8gaW5kaWNhdGUgYSBiYWNrZ3JvdW5kIHRhc2sgdGhhdCB0aGUgdXNlciBpcyBhY3RpdmVseSBlbmdhZ2VkCiAgICAgICAgICAqIHdpdGggKGUuZy4sIHBsYXlpbmcgbXVzaWMpIG9yIGlzIHBlbmRpbmcgaW4gc29tZSB3YXkgYW5kIHRoZXJlZm9yZSBvY2N1cHlpbmcgdGhlIGRldmljZQpAQCAtODY1NywxMyArODY1NywxMyBAQAogICAgICAgICAgICAgICogd2hlcmUgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgTUlNRSB0eXBlLCB0aGUgb3JpZ2luYWwgdGV4dCBwcm92aWRlZCBpbiB0aGUKICAgICAgICAgICAgICAqIGNvbnN0cnVjdG9yIHdpbGwgYmUgdXNlZC4KICAgICAgICAgICAgICAqIEBwYXJhbSBkYXRhTWltZVR5cGUgVGhlIE1JTUUgdHlwZSBvZiB0aGUgY29udGVudC4gU2VlCi0gICAgICAgICAgICAgKiA8YSBocmVmPSJ7QGRvY1Jvb3R9bm90aWZpY2F0aW9ucy9tZXNzYWdpbmcuaHRtbCI+IGZvciB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgTUlNRQotICAgICAgICAgICAgICogdHlwZXMgb24gQW5kcm9pZCBhbmQgQW5kcm9pZCBXZWFyLgorICAgICAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuSW1hZ2VEZWNvZGVyI2lzTWltZVR5cGVTdXBwb3J0ZWQoU3RyaW5nKX0gZm9yIGEgbGlzdCBvZgorICAgICAgICAgICAgICogc3VwcG9ydGVkIGltYWdlIE1JTUUgdHlwZXMuCiAgICAgICAgICAgICAgKiBAcGFyYW0gZGF0YVVyaSBUaGUgdXJpIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgd2hvc2UgdHlwZSBpcyBnaXZlbiBieSB0aGUgTUlNRSB0eXBlLgogICAgICAgICAgICAgICogPHAgY2xhc3M9Im5vdGUiPgorICAgICAgICAgICAgICogTm90aWZpY2F0aW9uIExpc3RlbmVycyBpbmNsdWRpbmcgdGhlIFN5c3RlbSBVSSBuZWVkIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZQorICAgICAgICAgICAgICogZGF0YSB0aGUgVXJpIHBvaW50cyB0by4gVGhlIHJlY29tbWVuZGVkIHdheXMgdG8gZG8gdGhpcyBhcmU6CiAgICAgICAgICAgICAgKiA8b2w+Ci0gICAgICAgICAgICAgKiAgIDxsaT5Ob3RpZmljYXRpb24gTGlzdGVuZXJzIGluY2x1ZGluZyB0aGUgU3lzdGVtIFVJIG5lZWQgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlCi0gICAgICAgICAgICAgKiAgICAgICBkYXRhIHRoZSBVcmkgcG9pbnRzIHRvLiBUaGUgcmVjb21tZW5kZWQgd2F5cyB0byBkbyB0aGlzIGFyZTo8L2xpPgogICAgICAgICAgICAgICogICA8bGk+U3RvcmUgdGhlIGRhdGEgaW4geW91ciBvd24gQ29udGVudFByb3ZpZGVyLCBtYWtpbmcgc3VyZSB0aGF0IG90aGVyIGFwcHMgaGF2ZQogICAgICAgICAgICAgICogICAgICAgdGhlIGNvcnJlY3QgcGVybWlzc2lvbiB0byBhY2Nlc3MgeW91ciBwcm92aWRlci4gVGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yCiAgICAgICAgICAgICAgKiAgICAgICBwcm92aWRpbmcgYWNjZXNzIGlzIHRvIHVzZSBwZXItVVJJIHBlcm1pc3Npb25zIHdoaWNoIGFyZSB0ZW1wb3JhcnkgYW5kIG9ubHkKQEAgLTkxNjMsMTAgKzkxNjMsNyBAQAogICAgICAgICAgKiAgICAgICAgICAgICAgICAgICB7QGNvZGUgbnVsbH0sIGluIHdoaWNoIGNhc2UgdGhlIG91dHB1dCBzd2l0Y2hlciB3aWxsIGJlIGRpc2FibGVkLgogICAgICAgICAgKiAgICAgICAgICAgICAgICAgICBUaGlzIGludGVudCBzaG91bGQgb3BlbiBhbiBBY3Rpdml0eSBvciBpdCB3aWxsIGJlIGlnbm9yZWQuCiAgICAgICAgICAqIEByZXR1cm4gTWVkaWFTdHlsZQotICAgICAgICAgKgotICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KLSAgICAgICAgQFN5c3RlbUFwaQogICAgICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NRURJQV9DT05URU5UX0NPTlRST0wpCiAgICAgICAgIEBOb25OdWxsCiAgICAgICAgIHB1YmxpYyBNZWRpYVN0eWxlIHNldFJlbW90ZVBsYXliYWNrSW5mbyhATm9uTnVsbCBDaGFyU2VxdWVuY2UgZGV2aWNlTmFtZSwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9PV05FUlMgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvT1dORVJTCmluZGV4IGU3MmIxNDEuLmY3ZDJhZmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9PV05FUlMKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL09XTkVSUwpAQCAtNTQsNiArNTQsOSBAQAogcGVyLWZpbGUgQnJvYWRjYXN0KiA9IGZpbGU6L0JST0FEQ0FTVFNfT1dORVJTCiBwZXItZmlsZSBSZWNlaXZlckluZm8qID0gZmlsZTovQlJPQURDQVNUU19PV05FUlMKIAorIyBLZXlndWFyZE1hbmFnZXIKK3Blci1maWxlIEtleWd1YXJkTWFuYWdlci5qYXZhID0gZmlsZTovc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2Nrc2V0dGluZ3MvT1dORVJTCisKICMgTG9jYWxlTWFuYWdlcgogcGVyLWZpbGUgKkxvY2FsZSogPSBmaWxlOi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2FsZXMvT1dORVJTCiAKQEAgLTk0LDcgKzk3LDUgQEAKIHBlci1maWxlIENvbmZpZ3VyYXRpb25Db250cm9sbGVyLmphdmEgPSBmaWxlOi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL09XTkVSUwogcGVyLWZpbGUgKlNjcmVlbkNhcHR1cmUqID0gZmlsZTovc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9PV05FUlMKIAotIyBUT0RPKGIvMTc0OTMyMTc0KTogZGV0ZXJtaW5lIHRoZSBvd25lcnNoaXAgb2YgS2V5Z3VhcmRNYW5hZ2VyLmphdmEKLQogIyBaeWdvdGUKIHBlci1maWxlICpaeWdvdGUqID0gZmlsZTovWllHT1RFX09XTkVSUwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1dpbmRvd0NvbmZpZ3VyYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9XaW5kb3dDb25maWd1cmF0aW9uLmphdmEKaW5kZXggMzlkNzdjNC4uNWI5NTUwMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1dpbmRvd0NvbmZpZ3VyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2luZG93Q29uZmlndXJhdGlvbi5qYXZhCkBAIC04NzUsMTUgKzg3NSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGFueSB2aXNpYmxlIHdpbmRvd3MgYmVsb25naW5nIHRvIGFwcHMgd2l0aCB0aGlzIHdpbmRvdyBjb25maWd1cmF0aW9uIHNob3VsZAotICAgICAqIGJlIGtlcHQgb24gc2NyZWVuIHdoZW4gdGhlIGFwcCBpcyBraWxsZWQgZHVlIHRvIHNvbWV0aGluZyBsaWtlIHRoZSBsb3cgbWVtb3J5IGtpbGxlci4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGtlZXBWaXNpYmxlRGVhZEFwcFdpbmRvd09uU2NyZWVuKCkgewotICAgICAgICByZXR1cm4gbVdpbmRvd2luZ01vZGUgIT0gV0lORE9XSU5HX01PREVfUElOTkVEOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYmFja2Ryb3Agb24gdGhlIGNsaWVudCBzaWRlIHNob3VsZCBtYXRjaCB0aGUgZnJhbWUgb2YgdGhlIHdpbmRvdy4KICAgICAgKiBSZXR1cm5zIGZhbHNlLCBpZiB0aGUgYmFja2Ryb3Agc2hvdWxkIGJlIGZ1bGxzY3JlZW4uCiAgICAgICogQGhpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9BY2NvdW50VHlwZVBvbGljeUtleS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0FjY291bnRUeXBlUG9saWN5S2V5LmphdmEKaW5kZXggNjQxN2NkNC4uOWUzNzZhNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0FjY291bnRUeXBlUG9saWN5S2V5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0FjY291bnRUeXBlUG9saWN5S2V5LmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlN5c3RlbUFwaTsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVGVzdEFwaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIApAQCAtNDksNiArNTAsNyBAQAogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCisgICAgQFRlc3RBcGkKICAgICBwdWJsaWMgQWNjb3VudFR5cGVQb2xpY3lLZXkoQE5vbk51bGwgU3RyaW5nIGtleSwgQE5vbk51bGwgU3RyaW5nIGFjY291bnRUeXBlKSB7CiAgICAgICAgIHN1cGVyKGtleSk7CiAgICAgICAgIG1BY2NvdW50VHlwZSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoKGFjY291bnRUeXBlKSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YQppbmRleCAwMjQxNDE3Li42YmJiZmUxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKQEAgLTU3LDYgKzU3LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbjsKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkJyb2FkY2FzdEJlaGF2aW9yOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5DYWxsYmFja0V4ZWN1dG9yOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Db2xvckludDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uSW50RGVmOwpAQCAtMzk5OCw2ICszOTk5LDI3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUkVTT1VSQ0VfSURTID0KICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5leHRyYS5SRVNPVVJDRV9JRFMiOwogCisgICAgLyoqCisgICAgICogQnJvYWRjYXN0IEFjdGlvbjogQnJvYWRjYXN0IHNlbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGV2aWNlIGZpbmFuY2luZyBzdGF0ZSBoYXMgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgb2NjdXJzIHdoZW4sIGZvciBleGFtcGxlLCBhIGZpbmFuY2luZyBraW9zayBhcHAgaGFzIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4KKyAgICAgKgorICAgICAqIDxwPlRvIHF1ZXJ5IHRoZSBjdXJyZW50IGRldmljZSBmaW5hbmNpbmcgc3RhdGUgc2VlIHtAbGluayAjaXNEZXZpY2VGaW5hbmNlZH0uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBmb2xsb3dpbmcgYXBwcyBpZiB0aGV5IGluY2x1ZGUgYSByZWNlaXZlciBmb3IgdGhpcyBhY3Rpb24KKyAgICAgKiBpbiB0aGVpciBtYW5pZmVzdDoKKyAgICAgKiA8dWw+CisgICAgICogICAgIDxsaT5EZXZpY2Ugb3duZXIgYWRtaW5zLgorICAgICAqICAgICA8bGk+T3JnYW5pemF0aW9uLW93bmVkIHByb2ZpbGUgb3duZXIgYWRtaW5zCisgICAgICogICAgIDxsaT5UaGUgc3VwZXJ2aXNpb24gYXBwCisgICAgICogICAgIDxsaT5UaGUgZGV2aWNlIG1hbmFnZW1lbnQgcm9sZSBob2xkZXIKKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgQEJyb2FkY2FzdEJlaGF2aW9yKGV4cGxpY2l0T25seSA9IHRydWUsIGluY2x1ZGVCYWNrZ3JvdW5kID0gdHJ1ZSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVWSUNFX0ZJTkFOQ0lOR19TVEFURV9DSEFOR0VEID0KKyAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hZG1pbi5hY3Rpb24uREVWSUNFX0ZJTkFOQ0lOR19TVEFURV9DSEFOR0VEIjsKKwogICAgIC8qKiBBbGxvdyB0aGUgdXNlciB0byBjaG9vc2Ugd2hldGhlciB0byBlbmFibGUgTVRFIG9uIHRoZSBkZXZpY2UuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVRFX05PVF9DT05UUk9MTEVEX0JZX1BPTElDWSA9IDA7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JbnRlbnRGaWx0ZXJQb2xpY3lLZXkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JbnRlbnRGaWx0ZXJQb2xpY3lLZXkuamF2YQppbmRleCBiMGFmNGNkLi4zMGFhZDk2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSW50ZW50RmlsdGVyUG9saWN5S2V5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0ludGVudEZpbHRlclBvbGljeUtleS5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TeXN0ZW1BcGk7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlRlc3RBcGk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKQEAgLTQ5LDYgKzUwLDcgQEAKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLworICAgIEBUZXN0QXBpCiAgICAgcHVibGljIEludGVudEZpbHRlclBvbGljeUtleShATm9uTnVsbCBTdHJpbmcgaWRlbnRpZmllciwgQE5vbk51bGwgSW50ZW50RmlsdGVyIGZpbHRlcikgewogICAgICAgICBzdXBlcihpZGVudGlmaWVyKTsKICAgICAgICAgbUZpbHRlciA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoZmlsdGVyKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9QYWNrYWdlUGVybWlzc2lvblBvbGljeUtleS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL1BhY2thZ2VQZXJtaXNzaW9uUG9saWN5S2V5LmphdmEKaW5kZXggMDhjNDIyNC4uN2ZkNTE0YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL1BhY2thZ2VQZXJtaXNzaW9uUG9saWN5S2V5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL1BhY2thZ2VQZXJtaXNzaW9uUG9saWN5S2V5LmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlN5c3RlbUFwaTsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVGVzdEFwaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CkBAIC01Myw2ICs1NCw3IEBACiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KKyAgICBAVGVzdEFwaQogICAgIHB1YmxpYyBQYWNrYWdlUGVybWlzc2lvblBvbGljeUtleShATm9uTnVsbCBTdHJpbmcgaWRlbnRpZmllciwgQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHBlcm1pc3Npb25OYW1lKSB7CiAgICAgICAgIHN1cGVyKGlkZW50aWZpZXIpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL1BhY2thZ2VQb2xpY3lLZXkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9QYWNrYWdlUG9saWN5S2V5LmphdmEKaW5kZXggYjJhOGQ1ZC4uMmFiMDBiYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL1BhY2thZ2VQb2xpY3lLZXkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vUGFja2FnZVBvbGljeUtleS5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TeXN0ZW1BcGk7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlRlc3RBcGk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwpAQCAtNTAsNiArNTEsNyBAQAogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCisgICAgQFRlc3RBcGkKICAgICBwdWJsaWMgUGFja2FnZVBvbGljeUtleShATm9uTnVsbCBTdHJpbmcga2V5LCBATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgc3VwZXIoa2V5KTsKICAgICAgICAgbVBhY2thZ2VOYW1lID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCgocGFja2FnZU5hbWUpKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9Qb2xpY3lVcGRhdGVSZWNlaXZlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL1BvbGljeVVwZGF0ZVJlY2VpdmVyLmphdmEKaW5kZXggYjVkOTI4Ni4uYmUxMzk4OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL1BvbGljeVVwZGF0ZVJlY2VpdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL1BvbGljeVVwZGF0ZVJlY2VpdmVyLmphdmEKQEAgLTIzOCw3ICsyMzgsNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZC4KICAgICAgKiBAcGFyYW0gdGFyZ2V0VXNlciBUaGUge0BsaW5rIFRhcmdldFVzZXJ9IHdoaWNoIHRoaXMgcG9saWN5IHJlbGF0ZXMgdG8uCiAgICAgICogQHBhcmFtIHBvbGljeVVwZGF0ZVJlc3VsdCBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcG9saWN5IGhhcyBiZWVuIHNldCBzdWNjZXNzZnVsbHkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICh7QGxpbmsgUG9saWN5VXBkYXRlUmVzdWx0I1JFU1VMVF9TVUNDRVNTfSkgb3IgdGhlIHJlYXNvbiBpdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKHtAbGluayBQb2xpY3lVcGRhdGVSZXN1bHQjUkVTVUxUX1BPTElDWV9TRVR9KSBvciB0aGUgcmVhc29uIGl0CiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQgdG8gYXBwbHkgKGUuZy4KICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBQb2xpY3lVcGRhdGVSZXN1bHQjUkVTVUxUX0ZBSUxVUkVfQ09ORkxJQ1RJTkdfQURNSU5fUE9MSUNZfSwKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YykuCkBAIC0yNzEsOCArMjcxLDggQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQuCiAgICAgICogQHBhcmFtIHRhcmdldFVzZXIgVGhlIHtAbGluayBUYXJnZXRVc2VyfSB3aGljaCB0aGlzIHBvbGljeSByZWxhdGVzIHRvLgogICAgICAqIEBwYXJhbSBwb2xpY3lVcGRhdGVSZXN1bHQgSW5kaWNhdGVzIHRoZSByZWFzb24gdGhlIHBvbGljeSB2YWx1ZSBoYXMgY2hhbmdlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4ge0BsaW5rIFBvbGljeVVwZGF0ZVJlc3VsdCNSRVNVTFRfU1VDQ0VTU30gaWYgdGhlIHBvbGljeSBoYXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgdG8gdGhlIHZhbHVlIHNldCBieSB0aGUgYWRtaW4sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiB7QGxpbmsgUG9saWN5VXBkYXRlUmVzdWx0I1JFU1VMVF9QT0xJQ1lfU0VUfSBpZiB0aGUgcG9saWN5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgY2hhbmdlZCB0byB0aGUgdmFsdWUgc2V0IGJ5IHRoZSBhZG1pbiwKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBQb2xpY3lVcGRhdGVSZXN1bHQjUkVTVUxUX0ZBSUxVUkVfQ09ORkxJQ1RJTkdfQURNSU5fUE9MSUNZfQogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIHBvbGljeSBoYXMgY2hhbmdlZCBiZWNhdXNlIGFub3RoZXIgYWRtaW4gaGFzIHNldCBhCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdGluZyBwb2xpY3ksIGV0YykKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9Qb2xpY3lVcGRhdGVSZXN1bHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9Qb2xpY3lVcGRhdGVSZXN1bHQuamF2YQppbmRleCA3ZDdkOTFhLi40MTRjNmVkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vUG9saWN5VXBkYXRlUmVzdWx0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL1BvbGljeVVwZGF0ZVJlc3VsdC5qYXZhCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICogUmVzdWx0IGNvZGUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcG9saWN5IGhhcyBiZWVuIGNoYW5nZWQgdG8gdGhlIGRlc2lyZWQgdmFsdWUgc2V0IGJ5CiAgICAgICogdGhlIGFkbWluLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9TVUNDRVNTID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfUE9MSUNZX1NFVCA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZXN1bHQgY29kZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwb2xpY3kgaGFzIG5vdCBiZWVuIGVuZm9yY2VkIG9yIGhhcyBjaGFuZ2VkIGJlY2F1c2UgYW5vdGhlcgpAQCAtODIsNyArODIsNyBAQAogICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKICAgICBASW50RGVmKHByZWZpeCA9IHsgIlJFU1VMVF8iIH0sIHZhbHVlID0gewogICAgICAgICAgICAgUkVTVUxUX0ZBSUxVUkVfVU5LTk9XTiwKLSAgICAgICAgICAgIFJFU1VMVF9TVUNDRVNTLAorICAgICAgICAgICAgUkVTVUxUX1BPTElDWV9TRVQsCiAgICAgICAgICAgICBSRVNVTFRfRkFJTFVSRV9DT05GTElDVElOR19BRE1JTl9QT0xJQ1ksCiAgICAgICAgICAgICBSRVNVTFRfUE9MSUNZX0NMRUFSRUQsCiAgICAgICAgICAgICBSRVNVTFRfRkFJTFVSRV9TVE9SQUdFX0xJTUlUX1JFQUNIRUQsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vVXNlclJlc3RyaWN0aW9uUG9saWN5S2V5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vVXNlclJlc3RyaWN0aW9uUG9saWN5S2V5LmphdmEKaW5kZXggODgwYjU4Yi4uYWViMjM4MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL1VzZXJSZXN0cmljdGlvblBvbGljeUtleS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9Vc2VyUmVzdHJpY3Rpb25Qb2xpY3lLZXkuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlN5c3RlbUFwaTsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVGVzdEFwaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIApAQCAtNDAsNiArNDEsNyBAQAogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCisgICAgQFRlc3RBcGkKICAgICBwdWJsaWMgVXNlclJlc3RyaWN0aW9uUG9saWN5S2V5KEBOb25OdWxsIFN0cmluZyBpZGVudGlmaWVyLCBATm9uTnVsbCBTdHJpbmcgcmVzdHJpY3Rpb24pIHsKICAgICAgICAgc3VwZXIoaWRlbnRpZmllcik7CiAgICAgICAgIG1SZXN0cmljdGlvbiA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwocmVzdHJpY3Rpb24pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9CYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyLmphdmEKaW5kZXggYzRmZjg5Mi4uZWEzMWVmMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9CYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYmFja3VwL0JhY2t1cFJlc3RvcmVFdmVudExvZ2dlci5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiAgKiBAaGlkZQogICovCiBAU3lzdGVtQXBpCi1wdWJsaWMgY2xhc3MgQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBCYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyIjsKIAogICAgIC8qKgpAQCAtNjEsNiArNjEsOCBAQAogICAgIC8qKgogICAgICAqIERlbm90ZXMgdGhhdCB0aGUgYW5ub3RhdGVkIGVsZW1lbnQgaWRlbnRpZmllcyBhIGRhdGEgdHlwZSBhcyByZXF1aXJlZCBieSB0aGUgbG9nZ2luZyBtZXRob2RzCiAgICAgICogb2Yge0Bjb2RlIEJhY2t1cFJlc3RvcmVFdmVudExvZ2dlcn0KKyAgICAgKgorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQogICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhY2t1cFJlc3RvcmVEYXRhVHlwZSB7fQpAQCAtNjgsNiArNzAsOCBAQAogICAgIC8qKgogICAgICAqIERlbm90ZXMgdGhhdCB0aGUgYW5ub3RhdGVkIGVsZW1lbnQgaWRlbnRpZmllcyBhbiBlcnJvciB0eXBlIGFzIHJlcXVpcmVkIGJ5IHRoZSBsb2dnaW5nCiAgICAgICogbWV0aG9kcyBvZiB7QGNvZGUgQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyfQorICAgICAqCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCiAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFja3VwUmVzdG9yZUVycm9yIHt9CkBAIC0xNDQsNyArMTQ4LDcgQEAKICAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIHR5cGUgb2YgZGF0YSBiZWluZyBiYWNrZWQgdXAuCiAgICAgICogQHBhcmFtIG1ldGFEYXRhIHRoZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdHlwZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2dCYWNrdXBNZXRhRGF0YShATm9uTnVsbCBAQmFja3VwUmVzdG9yZURhdGFUeXBlIFN0cmluZyBkYXRhVHlwZSwKKyAgICBwdWJsaWMgdm9pZCBsb2dCYWNrdXBNZXRhZGF0YShATm9uTnVsbCBAQmFja3VwUmVzdG9yZURhdGFUeXBlIFN0cmluZyBkYXRhVHlwZSwKICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBtZXRhRGF0YSkgewogICAgICAgICBsb2dNZXRhRGF0YShPcGVyYXRpb25UeXBlLkJBQ0tVUCwgZGF0YVR5cGUsIG1ldGFEYXRhKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhCmluZGV4IGZlMTBiN2YuLjI3ZjZhMjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkxhdW5jaGVyQXBwczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwpAQCAtMzExLDIwICszMTIsMjcgQEAKICAgICAgICAgICAgIHN1cGVyLm9uTGF5b3V0KGNoYW5nZWQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlIHByb3ZpZGVyIHRocmV3IHJ1bnRpbWUgZXhjZXB0aW9uLCB1c2luZyBlcnJvciB2aWV3IGluc3RlYWQuIiwgZSk7Ci0gICAgICAgICAgICByZW1vdmVWaWV3SW5MYXlvdXQobVZpZXcpOwotICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldEVycm9yVmlldygpOwotICAgICAgICAgICAgcHJlcGFyZVZpZXcoY2hpbGQpOwotICAgICAgICAgICAgYWRkVmlld0luTGF5b3V0KGNoaWxkLCAwLCBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKSk7Ci0gICAgICAgICAgICBtZWFzdXJlQ2hpbGQoY2hpbGQsIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhnZXRNZWFzdXJlZFdpZHRoKCksIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAotICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0TWVhc3VyZWRIZWlnaHQoKSwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOwotICAgICAgICAgICAgY2hpbGQubGF5b3V0KDAsIDAsIGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKSArIG1QYWRkaW5nTGVmdCArIG1QYWRkaW5nUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBtUGFkZGluZ1RvcCArIG1QYWRkaW5nQm90dG9tKTsKLSAgICAgICAgICAgIG1WaWV3ID0gY2hpbGQ7Ci0gICAgICAgICAgICBtVmlld01vZGUgPSBWSUVXX01PREVfRVJST1I7CisgICAgICAgICAgICBoYW5kbGVWaWV3RXJyb3IoKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJlbW92ZSBiYWQgdmlldyBhbmQgcmVwbGFjZSB3aXRoIGVycm9yIG1lc3NhZ2UgdmlldworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVWaWV3RXJyb3IoKSB7CisgICAgICAgIHJlbW92ZVZpZXdJbkxheW91dChtVmlldyk7CisgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRFcnJvclZpZXcoKTsKKyAgICAgICAgcHJlcGFyZVZpZXcoY2hpbGQpOworICAgICAgICBhZGRWaWV3SW5MYXlvdXQoY2hpbGQsIDAsIGNoaWxkLmdldExheW91dFBhcmFtcygpKTsKKyAgICAgICAgbWVhc3VyZUNoaWxkKGNoaWxkLCBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0TWVhc3VyZWRXaWR0aCgpLCBNZWFzdXJlU3BlYy5FWEFDVExZKSwKKyAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0TWVhc3VyZWRIZWlnaHQoKSwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOworICAgICAgICBjaGlsZC5sYXlvdXQoMCwgMCwgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpICsgbVBhZGRpbmdMZWZ0ICsgbVBhZGRpbmdSaWdodCwKKyAgICAgICAgICAgICAgICBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpICsgbVBhZGRpbmdUb3AgKyBtUGFkZGluZ0JvdHRvbSk7CisgICAgICAgIG1WaWV3ID0gY2hpbGQ7CisgICAgICAgIG1WaWV3TW9kZSA9IFZJRVdfTU9ERV9FUlJPUjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBQcm92aWRlIGd1aWRhbmNlIGFib3V0IHRoZSBzaXplIG9mIHRoaXMgd2lkZ2V0IHRvIHRoZSBBcHBXaWRnZXRNYW5hZ2VyLiBUaGUgd2lkdGhzIGFuZAogICAgICAqIGhlaWdodHMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIGZ1bGwgYXJlYSB0aGUgQXBwV2lkZ2V0SG9zdFZpZXcgaXMgZ2l2ZW4uIFBhZGRpbmcgYWRkZWQgYnkKICAgICAgKiB0aGUgZnJhbWV3b3JrIHdpbGwgYmUgYWNjb3VudGVkIGZvciBhdXRvbWF0aWNhbGx5LiBUaGlzIGluZm9ybWF0aW9uIGdldHMgZW1iZWRkZWQgaW50byB0aGUKQEAgLTk1Myw0ICs5NjEsMTUgQEAKICAgICAgICAgICAgIHJlYXBwbHlMYXN0UmVtb3RlVmlld3MoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdyhATm9uTnVsbCBDYW52YXMgY2FudmFzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5kaXNwYXRjaERyYXcoY2FudmFzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIENhdGNoIGRyYXcgZXhjZXB0aW9ucyB0aGF0IG1heSBiZSBjYXVzZWQgYnkgUmVtb3RlVmlld3MKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkRyYXdpbmcgdmlldyBmYWlsZWQ6ICIgKyBlKTsKKyAgICAgICAgICAgIHBvc3QodGhpczo6aGFuZGxlVmlld0Vycm9yKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2UuamF2YQppbmRleCAyYjQwMGMxZi4uY2Q0NWY0ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2UuamF2YQpAQCAtMTAxLDIyICsxMDEsMjggQEAKICAgICBAVGVzdEFwaQogICAgIHB1YmxpYyBBdHRyaWJ1dGlvblNvdXJjZShpbnQgdWlkLCBATnVsbGFibGUgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBhdHRyaWJ1dGlvblRhZykgewotICAgICAgICB0aGlzKHVpZCwgcGFja2FnZU5hbWUsIGF0dHJpYnV0aW9uVGFnLCBzRGVmYXVsdFRva2VuKTsKKyAgICAgICAgdGhpcyh1aWQsIFByb2Nlc3MuSU5WQUxJRF9QSUQsIHBhY2thZ2VOYW1lLCBhdHRyaWJ1dGlvblRhZywgc0RlZmF1bHRUb2tlbik7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIEF0dHJpYnV0aW9uU291cmNlKGludCB1aWQsIGludCBwaWQsIEBOdWxsYWJsZSBTdHJpbmcgcGFja2FnZU5hbWUsCisgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIGF0dHJpYnV0aW9uVGFnKSB7CisgICAgICAgIHRoaXModWlkLCBwaWQsIHBhY2thZ2VOYW1lLCBhdHRyaWJ1dGlvblRhZywgc0RlZmF1bHRUb2tlbik7CiAgICAgfQogCiAgICAgLyoqIEBoaWRlICovCiAgICAgQFRlc3RBcGkKICAgICBwdWJsaWMgQXR0cmlidXRpb25Tb3VyY2UoaW50IHVpZCwgQE51bGxhYmxlIFN0cmluZyBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgYXR0cmlidXRpb25UYWcsIEBOb25OdWxsIElCaW5kZXIgdG9rZW4pIHsKLSAgICAgICAgdGhpcyh1aWQsIHBhY2thZ2VOYW1lLCBhdHRyaWJ1dGlvblRhZywgdG9rZW4sIC8qcmVub3VuY2VkUGVybWlzc2lvbnMqLyBudWxsLAotICAgICAgICAgICAgICAgIC8qbmV4dCovIG51bGwpOworICAgICAgICB0aGlzKHVpZCwgUHJvY2Vzcy5JTlZBTElEX1BJRCwgcGFja2FnZU5hbWUsIGF0dHJpYnV0aW9uVGFnLCB0b2tlbiwKKyAgICAgICAgICAgICAgICAvKnJlbm91bmNlZFBlcm1pc3Npb25zKi8gbnVsbCwgLypuZXh0Ki8gbnVsbCk7CiAgICAgfQogCiAgICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIEF0dHJpYnV0aW9uU291cmNlKGludCB1aWQsIEBOdWxsYWJsZSBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIGF0dHJpYnV0aW9uVGFnLCBATm9uTnVsbCBJQmluZGVyIHRva2VuLAotICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0aW9uU291cmNlIG5leHQpIHsKLSAgICAgICAgdGhpcyh1aWQsIHBhY2thZ2VOYW1lLCBhdHRyaWJ1dGlvblRhZywgdG9rZW4sIC8qcmVub3VuY2VkUGVybWlzc2lvbnMqLyBudWxsLCBuZXh0KTsKKyAgICBwdWJsaWMgQXR0cmlidXRpb25Tb3VyY2UoaW50IHVpZCwgaW50IHBpZCwgQE51bGxhYmxlIFN0cmluZyBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgYXR0cmlidXRpb25UYWcsIEBOb25OdWxsIElCaW5kZXIgdG9rZW4pIHsKKyAgICAgICAgdGhpcyh1aWQsIHBpZCwgcGFja2FnZU5hbWUsIGF0dHJpYnV0aW9uVGFnLCB0b2tlbiwgLypyZW5vdW5jZWRQZXJtaXNzaW9ucyovIG51bGwsCisgICAgICAgICAgICAgICAgLypuZXh0Ki8gbnVsbCk7CiAgICAgfQogCiAgICAgLyoqIEBoaWRlICovCkBAIC0xMjQsMjYgKzEzMCwzMyBAQAogICAgIHB1YmxpYyBBdHRyaWJ1dGlvblNvdXJjZShpbnQgdWlkLCBATnVsbGFibGUgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBhdHRyaWJ1dGlvblRhZywgQE51bGxhYmxlIFNldDxTdHJpbmc+IHJlbm91bmNlZFBlcm1pc3Npb25zLAogICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0aW9uU291cmNlIG5leHQpIHsKLSAgICAgICAgdGhpcyh1aWQsIHBhY2thZ2VOYW1lLCBhdHRyaWJ1dGlvblRhZywgKHJlbm91bmNlZFBlcm1pc3Npb25zICE9IG51bGwpCi0gICAgICAgICAgICAgICAgPyByZW5vdW5jZWRQZXJtaXNzaW9ucy50b0FycmF5KG5ldyBTdHJpbmdbMF0pIDogbnVsbCwgbmV4dCk7CisgICAgICAgIHRoaXModWlkLCBQcm9jZXNzLklOVkFMSURfUElELCBwYWNrYWdlTmFtZSwgYXR0cmlidXRpb25UYWcsIHNEZWZhdWx0VG9rZW4sCisgICAgICAgICAgICAgICAgKHJlbm91bmNlZFBlcm1pc3Npb25zICE9IG51bGwpCisgICAgICAgICAgICAgICAgPyByZW5vdW5jZWRQZXJtaXNzaW9ucy50b0FycmF5KG5ldyBTdHJpbmdbMF0pIDogbnVsbCwgLypuZXh0Ki8gbmV4dCk7CiAgICAgfQogCiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIEF0dHJpYnV0aW9uU291cmNlKEBOb25OdWxsIEF0dHJpYnV0aW9uU291cmNlIGN1cnJlbnQsIEBOdWxsYWJsZSBBdHRyaWJ1dGlvblNvdXJjZSBuZXh0KSB7Ci0gICAgICAgIHRoaXMoY3VycmVudC5nZXRVaWQoKSwgY3VycmVudC5nZXRQYWNrYWdlTmFtZSgpLCBjdXJyZW50LmdldEF0dHJpYnV0aW9uVGFnKCksCi0gICAgICAgICAgICAgICAgY3VycmVudC5nZXRUb2tlbigpLCBjdXJyZW50Lm1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLnJlbm91bmNlZFBlcm1pc3Npb25zLCBuZXh0KTsKKyAgICAgICAgdGhpcyhjdXJyZW50LmdldFVpZCgpLCBjdXJyZW50LmdldFBpZCgpLCBjdXJyZW50LmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgY3VycmVudC5nZXRBdHRyaWJ1dGlvblRhZygpLCBjdXJyZW50LmdldFRva2VuKCksCisgICAgICAgICAgICAgICAgY3VycmVudC5tQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5yZW5vdW5jZWRQZXJtaXNzaW9ucywgbmV4dCk7CiAgICAgfQogCi0gICAgQXR0cmlidXRpb25Tb3VyY2UoaW50IHVpZCwgQE51bGxhYmxlIFN0cmluZyBwYWNrYWdlTmFtZSwgQE51bGxhYmxlIFN0cmluZyBhdHRyaWJ1dGlvblRhZywKLSAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmdbXSByZW5vdW5jZWRQZXJtaXNzaW9ucywgQE51bGxhYmxlIEF0dHJpYnV0aW9uU291cmNlIG5leHQpIHsKLSAgICAgICAgdGhpcyh1aWQsIHBhY2thZ2VOYW1lLCBhdHRyaWJ1dGlvblRhZywgc0RlZmF1bHRUb2tlbiwgcmVub3VuY2VkUGVybWlzc2lvbnMsIG5leHQpOworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGlvblNvdXJjZShpbnQgdWlkLCBpbnQgcGlkLCBATnVsbGFibGUgU3RyaW5nIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBhdHRyaWJ1dGlvblRhZywgQE51bGxhYmxlIFN0cmluZ1tdIHJlbm91bmNlZFBlcm1pc3Npb25zLAorICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0aW9uU291cmNlIG5leHQpIHsKKyAgICAgICAgdGhpcyh1aWQsIHBpZCwgcGFja2FnZU5hbWUsIGF0dHJpYnV0aW9uVGFnLCBzRGVmYXVsdFRva2VuLCByZW5vdW5jZWRQZXJtaXNzaW9ucywgbmV4dCk7CiAgICAgfQogCi0gICAgQXR0cmlidXRpb25Tb3VyY2UoaW50IHVpZCwgQE51bGxhYmxlIFN0cmluZyBwYWNrYWdlTmFtZSwgQE51bGxhYmxlIFN0cmluZyBhdHRyaWJ1dGlvblRhZywKLSAgICAgICAgICAgIEBOb25OdWxsIElCaW5kZXIgdG9rZW4sIEBOdWxsYWJsZSBTdHJpbmdbXSByZW5vdW5jZWRQZXJtaXNzaW9ucywKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRpb25Tb3VyY2UoaW50IHVpZCwgaW50IHBpZCwgQE51bGxhYmxlIFN0cmluZyBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgYXR0cmlidXRpb25UYWcsIEBOb25OdWxsIElCaW5kZXIgdG9rZW4sCisgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nW10gcmVub3VuY2VkUGVybWlzc2lvbnMsCiAgICAgICAgICAgICBATnVsbGFibGUgQXR0cmlidXRpb25Tb3VyY2UgbmV4dCkgewogICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSA9IG5ldyBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCk7CiAgICAgICAgIG1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLnVpZCA9IHVpZDsKKyAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlU3RhdGUucGlkID0gcGlkOwogICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS50b2tlbiA9IHRva2VuOwogICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwogICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5hdHRyaWJ1dGlvblRhZyA9IGF0dHJpYnV0aW9uVGFnOwpAQCAtMTYyLDcgKzE3NSwxNyBAQAogCiAgICAgICAgIC8vIFNpbmNlIHdlIGp1c3QgdW5wYWNrZWQgdGhpcyBvYmplY3QgYXMgcGFydCBvZiBpdCB0cmFuc2l0aW5nIGEgQmluZGVyCiAgICAgICAgIC8vIGNhbGwsIHRoaXMgaXMgdGhlIHBlcmZlY3QgdGltZSB0byBlbmZvcmNlIHRoYXQgaXRzIFVJRCBhbmQgUElEIGNhbiBiZSB0cnVzdGVkCi0gICAgICAgIGVuZm9yY2VDYWxsaW5nVWlkQW5kUGlkKCk7CisgICAgICAgIGVuZm9yY2VDYWxsaW5nVWlkKCk7CisKKyAgICAgICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgYmVpbmcgY29uc3RydWN0ZWQgYXMgcGFydCBvZiBhIG9uZXdheSBCaW5kZXIgY2FsbCwgZ2V0Q2FsbGluZ1BpZCB3aWxsCisgICAgICAgIC8vIHJldHVybiAwIGluc3RlYWQgb2YgdGhlIHRydWUgUElELiBJbiB0aGF0IGNhc2UsIGludmFsaWRhdGUgdGhlIFBJRCBieSBzZXR0aW5nIGl0IHRvCisgICAgICAgIC8vIElOVkFMSURfUElEICgtMSkuCisgICAgICAgIGZpbmFsIGludCBjYWxsaW5nUGlkID0gQmluZGVyLmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKGNhbGxpbmdQaWQgPT0gMCkgeworICAgICAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlU3RhdGUucGlkID0gUHJvY2Vzcy5JTlZBTElEX1BJRDsKKyAgICAgICAgfQorCisgICAgICAgIGVuZm9yY2VDYWxsaW5nUGlkKCk7CiAgICAgfQogCiAgICAgLyoqIEBoaWRlICovCkBAIC0xNzIsMjMgKzE5NSwyOSBAQAogCiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIEF0dHJpYnV0aW9uU291cmNlIHdpdGhOZXh0QXR0cmlidXRpb25Tb3VyY2UoQE51bGxhYmxlIEF0dHJpYnV0aW9uU291cmNlIG5leHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGlvblNvdXJjZShnZXRVaWQoKSwgZ2V0UGFja2FnZU5hbWUoKSwgZ2V0QXR0cmlidXRpb25UYWcoKSwKLSAgICAgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5yZW5vdW5jZWRQZXJtaXNzaW9ucywgbmV4dCk7CisgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRpb25Tb3VyY2UoZ2V0VWlkKCksIGdldFBpZCgpLCBnZXRQYWNrYWdlTmFtZSgpLCBnZXRBdHRyaWJ1dGlvblRhZygpLAorICAgICAgICAgICAgICAgIGdldFRva2VuKCksIG1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLnJlbm91bmNlZFBlcm1pc3Npb25zLCBuZXh0KTsKICAgICB9CiAKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgQXR0cmlidXRpb25Tb3VyY2Ugd2l0aFBhY2thZ2VOYW1lKEBOdWxsYWJsZSBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGlvblNvdXJjZShnZXRVaWQoKSwgcGFja2FnZU5hbWUsIGdldEF0dHJpYnV0aW9uVGFnKCksCi0gICAgICAgICAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlU3RhdGUucmVub3VuY2VkUGVybWlzc2lvbnMsIGdldE5leHQoKSk7CisgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRpb25Tb3VyY2UoZ2V0VWlkKCksIGdldFBpZCgpLCBwYWNrYWdlTmFtZSwgZ2V0QXR0cmlidXRpb25UYWcoKSwKKyAgICAgICAgICAgICAgIGdldFRva2VuKCksIG1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLnJlbm91bmNlZFBlcm1pc3Npb25zLCBnZXROZXh0KCkpOwogICAgIH0KIAogICAgIC8qKiBAaGlkZSAqLwogICAgIHB1YmxpYyBBdHRyaWJ1dGlvblNvdXJjZSB3aXRoVG9rZW4oQE5vbk51bGwgQmluZGVyIHRva2VuKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRpb25Tb3VyY2UoZ2V0VWlkKCksIGdldFBhY2thZ2VOYW1lKCksIGdldEF0dHJpYnV0aW9uVGFnKCksCisgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRpb25Tb3VyY2UoZ2V0VWlkKCksIGdldFBpZCgpLCBnZXRQYWNrYWdlTmFtZSgpLCBnZXRBdHRyaWJ1dGlvblRhZygpLAogICAgICAgICAgICAgICAgIHRva2VuLCBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5yZW5vdW5jZWRQZXJtaXNzaW9ucywgZ2V0TmV4dCgpKTsKICAgICB9CiAKICAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRpb25Tb3VyY2Ugd2l0aFBpZChpbnQgcGlkKSB7CisgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRpb25Tb3VyY2UoZ2V0VWlkKCksIHBpZCwgZ2V0UGFja2FnZU5hbWUoKSwgZ2V0QXR0cmlidXRpb25UYWcoKSwKKyAgICAgICAgICAgICAgICBnZXRUb2tlbigpLCBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5yZW5vdW5jZWRQZXJtaXNzaW9ucywgZ2V0TmV4dCgpKTsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgQE5vbk51bGwgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhc1N0YXRlKCkgewogICAgICAgICByZXR1cm4gbUF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiAgICAgfQpAQCAtMjI4LDYgKzI1Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRpb25Tb3VyY2UuQnVpbGRlcih1aWQpCisgICAgICAgICAgICAgICAgLnNldFBpZChQcm9jZXNzLm15UGlkKCkpCiAgICAgICAgICAgICAgICAgLnNldFBhY2thZ2VOYW1lKEFwcEdsb2JhbHMuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRQYWNrYWdlc0ZvclVpZCh1aWQpWzBdKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gaWdub3JlZCkgewpAQCAtMjY1LDE4ICsyOTUsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIElmIHlvdSBhcmUgaGFuZGxpbmcgYW4gSVBDIGFuZCB5b3UgZG9uJ3QgdHJ1c3QgdGhlIGNhbGxlciB5b3UgbmVlZCB0byB2YWxpZGF0ZSB3aGV0aGVyIHRoZQotICAgICAqIGF0dHJpYnV0aW9uIHNvdXJjZSBpcyBvbmUgZm9yIHRoZSBjYWxsaW5nIGFwcCB0byBwcmV2ZW50IHRoZSBjYWxsZXIgdG8gcGFzcyB5b3UgYSBzb3VyY2UgZnJvbQotICAgICAqIGFub3RoZXIgYXBwIHdpdGhvdXQgaW5jbHVkaW5nIHRoZW1zZWx2ZXMgaW4gdGhlIGF0dHJpYnV0aW9uIGNoYWluLgotICAgICAqCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgYXR0cmlidXRpb24gc291cmNlIGNhbm5vdCBiZSB0cnVzdGVkIHRvIGJlIGZyb20gdGhlIGNhbGxlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZW5mb3JjZUNhbGxpbmdVaWRBbmRQaWQoKSB7Ci0gICAgICAgIGVuZm9yY2VDYWxsaW5nVWlkKCk7Ci0gICAgICAgIGVuZm9yY2VDYWxsaW5nUGlkKCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogSWYgeW91IGFyZSBoYW5kbGluZyBhbiBJUEMgYW5kIHlvdSBkb24ndCB0cnVzdCB0aGUgY2FsbGVyIHlvdSBuZWVkIHRvIHZhbGlkYXRlCiAgICAgICogd2hldGhlciB0aGUgYXR0cmlidXRpb24gc291cmNlIGlzIG9uZSBmb3IgdGhlIGNhbGxpbmcgYXBwIHRvIHByZXZlbnQgdGhlIGNhbGxlcgogICAgICAqIHRvIHBhc3MgeW91IGEgc291cmNlIGZyb20gYW5vdGhlciBhcHAgd2l0aG91dCBpbmNsdWRpbmcgdGhlbXNlbHZlcyBpbiB0aGUKQEAgLTMxMiw3ICszMzAsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBwaWQgYmVpbmcgY2xhaW1lZCBmb3IgdGhlIGNhbGxpbmcgYXBwIGlzIG5vdCBzcG9vZmVkCisgICAgICogVmFsaWRhdGUgdGhhdCB0aGUgcGlkIGJlaW5nIGNsYWltZWQgZm9yIHRoZSBjYWxsaW5nIGFwcCBpcyBub3Qgc3Bvb2ZlZC4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGUgUElEIG1heSBiZSB1bmF2YWlsYWJsZSwgZm9yIGV4YW1wbGUgaWYgd2UncmUgaW4gYSBvbmV3YXkgQmluZGVyIGNhbGwuIEluIHRoaXMKKyAgICAgKiBjYXNlLCBjYWxsaW5nIGVuZm9yY2VDYWxsaW5nUGlkIGlzIGd1YXJhbnRlZWQgdG8gZmFpbC4gVGhlIGNhbGxlciBzaG91bGQgYW50aWNpcGF0ZSB0aGlzLgogICAgICAqCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgYXR0cmlidXRpb24gc291cmNlIGNhbm5vdCBiZSB0cnVzdGVkIHRvIGJlIGZyb20gdGhlIGNhbGxlci4KICAgICAgKiBAaGlkZQpAQCAtMzIwLDggKzM0MSwxMiBAQAogICAgIEBUZXN0QXBpCiAgICAgcHVibGljIHZvaWQgZW5mb3JjZUNhbGxpbmdQaWQoKSB7CiAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGlkKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQ2FsbGluZyBwaWQ6ICIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IG1hdGNoIHNvdXJjZSBwaWQ6ICIgKyBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5waWQpOworICAgICAgICAgICAgaWYgKEJpbmRlci5nZXRDYWxsaW5nUGlkKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQ2FsbGluZyBwaWQgdW5hdmFpbGFibGUgZHVlIHRvIG9uZXdheSBCaW5kZXIgY2FsbC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJDYWxsaW5nIHBpZDogIiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IG1hdGNoIHNvdXJjZSBwaWQ6ICIgKyBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5waWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzIsNyArMzU3LDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDYWxsaW5nUGlkKCkgewogICAgICAgICBmaW5hbCBpbnQgY2FsbGluZ1BpZCA9IEJpbmRlci5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgIGlmIChtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5waWQgIT0gLTEgJiYgY2FsbGluZ1BpZCAhPSBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5waWQpIHsKKyAgICAgICAgaWYgKG1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLnBpZCAhPSBQcm9jZXNzLklOVkFMSURfUElECisgICAgICAgICAgICAgICAgJiYgY2FsbGluZ1BpZCAhPSBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5waWQpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQ0OSw2ICs0NzUsMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGUgUElEIHRoYXQgaXMgYWNjZXNzaW5nIHRoZSBwZXJtaXNzaW9uIHByb3RlY3RlZCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGlkKCkgeworICAgICAgICByZXR1cm4gbUF0dHJpYnV0aW9uU291cmNlU3RhdGUucGlkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRoZSBwYWNrYWdlIHRoYXQgaXMgYWNjZXNzaW5nIHRoZSBwZXJtaXNzaW9uIHByb3RlY3RlZCBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBATnVsbGFibGUgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewpAQCAtNTUxLDYgKzU4NCw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY3VycmVudCBBdHRyaWJ1dGlvblNvdXJjZSBjYW4gbm90IGJlIG51bGwiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLnVpZCA9IGN1cnJlbnQuZ2V0VWlkKCk7CisgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5waWQgPSBjdXJyZW50LmdldFBpZCgpOwogICAgICAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlU3RhdGUucGFja2FnZU5hbWUgPSBjdXJyZW50LmdldFBhY2thZ2VOYW1lKCk7CiAgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5hdHRyaWJ1dGlvblRhZyA9IGN1cnJlbnQuZ2V0QXR0cmlidXRpb25UYWcoKTsKICAgICAgICAgICAgIG1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLnRva2VuID0gY3VycmVudC5nZXRUb2tlbigpOwpAQCAtNTU5LDExICs1OTMsMjUgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgYWNjZXNzaW5nIHRoZSBwZXJtaXNzaW9uIHByb3RlY3RlZCBkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBub3QgY2FsbGVkLCBwaWQgd2lsbCBkZWZhdWx0IHRvIHtAbGluayBQcm9jZXNzQElOVkFMSURfUElEfSAoLTEpLiBUaGlzIGluZGljYXRlcyB0aGF0CisgICAgICAgICAqIHRoZSBQSUQgZGF0YSBpcyBtaXNzaW5nLiBTdXBwbHlpbmcgYSBQSUQgaXMgbm90IHJlcXVpcmVkLCBidXQgcmVjb21tZW5kZWQgd2hlbgorICAgICAgICAgKiBhY2Nlc3NpYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEBOb25OdWxsIEJ1aWxkZXIgc2V0UGlkKGludCB2YWx1ZSkgeworICAgICAgICAgICAgY2hlY2tOb3RVc2VkKCk7CisgICAgICAgICAgICBtQnVpbGRlckZpZWxkc1NldCB8PSAweDI7CisgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5waWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBwYWNrYWdlIHRoYXQgaXMgYWNjZXNzaW5nIHRoZSBwZXJtaXNzaW9uIHByb3RlY3RlZCBkYXRhLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEBOb25OdWxsIEJ1aWxkZXIgc2V0UGFja2FnZU5hbWUoQE51bGxhYmxlIFN0cmluZyB2YWx1ZSkgewogICAgICAgICAgICAgY2hlY2tOb3RVc2VkKCk7Ci0gICAgICAgICAgICBtQnVpbGRlckZpZWxkc1NldCB8PSAweDI7CisgICAgICAgICAgICBtQnVpbGRlckZpZWxkc1NldCB8PSAweDQ7CiAgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5wYWNrYWdlTmFtZSA9IHZhbHVlOwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KQEAgLTU3Myw3ICs2MjEsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEBOb25OdWxsIEJ1aWxkZXIgc2V0QXR0cmlidXRpb25UYWcoQE51bGxhYmxlIFN0cmluZyB2YWx1ZSkgewogICAgICAgICAgICAgY2hlY2tOb3RVc2VkKCk7Ci0gICAgICAgICAgICBtQnVpbGRlckZpZWxkc1NldCB8PSAweDQ7CisgICAgICAgICAgICBtQnVpbGRlckZpZWxkc1NldCB8PSAweDg7CiAgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5hdHRyaWJ1dGlvblRhZyA9IHZhbHVlOwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KQEAgLTYwNiw3ICs2NTQsNyBAQAogICAgICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRU5PVU5DRV9QRVJNSVNTSU9OUykKICAgICAgICAgcHVibGljIEBOb25OdWxsIEJ1aWxkZXIgc2V0UmVub3VuY2VkUGVybWlzc2lvbnMoQE51bGxhYmxlIFNldDxTdHJpbmc+IHZhbHVlKSB7CiAgICAgICAgICAgICBjaGVja05vdFVzZWQoKTsKLSAgICAgICAgICAgIG1CdWlsZGVyRmllbGRzU2V0IHw9IDB4ODsKKyAgICAgICAgICAgIG1CdWlsZGVyRmllbGRzU2V0IHw9IDB4MTA7CiAgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5yZW5vdW5jZWRQZXJtaXNzaW9ucyA9ICh2YWx1ZSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICA/IHZhbHVlLnRvQXJyYXkobmV3IFN0cmluZ1swXSkgOiBudWxsOwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CkBAIC02MTcsNyArNjY1LDcgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBATm9uTnVsbCBCdWlsZGVyIHNldE5leHQoQE51bGxhYmxlIEF0dHJpYnV0aW9uU291cmNlIHZhbHVlKSB7CiAgICAgICAgICAgICBjaGVja05vdFVzZWQoKTsKLSAgICAgICAgICAgIG1CdWlsZGVyRmllbGRzU2V0IHw9IDB4MTA7CisgICAgICAgICAgICBtQnVpbGRlckZpZWxkc1NldCB8PSAweDIwOwogICAgICAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlU3RhdGUubmV4dCA9ICh2YWx1ZSAhPSBudWxsKSA/IG5ldyBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlW10KICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLm1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlfSA6IG1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLm5leHQ7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKQEAgLTYyOSwxNSArNjc3LDE4IEBACiAgICAgICAgICAgICBtQnVpbGRlckZpZWxkc1NldCB8PSAweDQwOyAvLyBNYXJrIGJ1aWxkZXIgdXNlZAogCiAgICAgICAgICAgICBpZiAoKG1CdWlsZGVyRmllbGRzU2V0ICYgMHgyKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlU3RhdGUucGFja2FnZU5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLnBpZCA9IFByb2Nlc3MuSU5WQUxJRF9QSUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKG1CdWlsZGVyRmllbGRzU2V0ICYgMHg0KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlU3RhdGUuYXR0cmlidXRpb25UYWcgPSBudWxsOworICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLnBhY2thZ2VOYW1lID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgobUJ1aWxkZXJGaWVsZHNTZXQgJiAweDgpID09IDApIHsKLSAgICAgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5yZW5vdW5jZWRQZXJtaXNzaW9ucyA9IG51bGw7CisgICAgICAgICAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlU3RhdGUuYXR0cmlidXRpb25UYWcgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChtQnVpbGRlckZpZWxkc1NldCAmIDB4MTApID09IDApIHsKKyAgICAgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5yZW5vdW5jZWRQZXJtaXNzaW9ucyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1CdWlsZGVyRmllbGRzU2V0ICYgMHgyMCkgPT0gMCkgewogICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLm5leHQgPSBudWxsOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQppbmRleCA4NWRhZjE1Li42NjdlYzdlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKQEAgLTU5MjAsOSArNTkyMCw4IEBACiAKICAgICAvKioKICAgICAgKiBPcHRpb25hbCBhcmd1bWVudCB0byBiZSB1c2VkIHdpdGgge0BsaW5rICNBQ1RJT05fQ0hPT1NFUn0uCi0gICAgICogQSB7QGxpbmsgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudH0gdG8gYmUgc2VudCB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIG1vZGlmeSB0aGUgY29udGVudCB0aGF0Ci0gICAgICogdGhleSdyZSBzaGFyaW5nLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFsbG93IHRoZSB1c2VyIHRvIHJldHVybiB0byB0aGUgc291cmNlIGFwcCB0bywgZm9yCi0gICAgICogZXhhbXBsZSwgc2VsZWN0IGRpZmZlcmVudCBtZWRpYS4KKyAgICAgKiBBIHtAbGluayBDaG9vc2VyQWN0aW9ufSB0byBhbGxvdyB0aGUgdXNlciB0byBtb2RpZnkgd2hhdCBpcyBiZWluZyBzaGFyZWQgaW4gc29tZSB3YXkuIFRoaXMKKyAgICAgKiBtYXkgYmUgaW50ZWdyYXRlZCBpbnRvIHRoZSBjb250ZW50IHByZXZpZXcgb24gc2hhcmVzaGVldHMgdGhhdCBoYXZlIGEgcHJldmlldyBVSS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9DSE9PU0VSX01PRElGWV9TSEFSRV9BQ1RJT04gPQogICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmV4dHJhLkNIT09TRVJfTU9ESUZZX1NIQVJFX0FDVElPTiI7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1Blcm1pc3Npb25DaGVja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1Blcm1pc3Npb25DaGVja2VyLmphdmEKaW5kZXggOGQzNDUyZS4uMGUzMjE3ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9QZXJtaXNzaW9uQ2hlY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvUGVybWlzc2lvbkNoZWNrZXIuamF2YQpAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcGVybWlzc2lvbiwgaW50IHBpZCwgaW50IHVpZCwgQE51bGxhYmxlIFN0cmluZyBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgYXR0cmlidXRpb25UYWcsIEBOdWxsYWJsZSBTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiBzdGFydERhdGFEZWxpdmVyeSkgewogICAgICAgICByZXR1cm4gY2hlY2tQZXJtaXNzaW9uRm9yRGF0YURlbGl2ZXJ5KGNvbnRleHQsIHBlcm1pc3Npb24sIHBpZCwgbmV3IEF0dHJpYnV0aW9uU291cmNlKHVpZCwKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgYXR0cmlidXRpb25UYWcpLCBtZXNzYWdlLCBzdGFydERhdGFEZWxpdmVyeSk7CisgICAgICAgICAgICAgICAgcGlkLCBwYWNrYWdlTmFtZSwgYXR0cmlidXRpb25UYWcpLCBtZXNzYWdlLCBzdGFydERhdGFEZWxpdmVyeSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1Jlc3RyaWN0aW9uc01hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvUmVzdHJpY3Rpb25zTWFuYWdlci5qYXZhCmluZGV4IDgxMTUyOTIuLjQ0YTg0ZTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvUmVzdHJpY3Rpb25zTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvUmVzdHJpY3Rpb25zTWFuYWdlci5qYXZhCkBAIC00MjcsMTEgKzQyNywxMiBAQAogICAgICAqIEByZXR1cm4gdGhlIGFwcGxpY2F0aW9uIHJlc3RyaWN0aW9ucyBhcyBhIEJ1bmRsZS4gUmV0dXJucyBudWxsIGlmIHRoZXJlCiAgICAgICogYXJlIG5vIHJlc3RyaWN0aW9ucy4KICAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zUGVyQWRtaW59IGluc3RlYWQuCi0gICAgICogU3RhcnRpbmcgZnJvbSBBbmRyb2lkIHZlcnNpb24ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNVUFNJREVfRE9XTl9DQUtFfSwgaXQgaXMKLSAgICAgKiBwb3NzaWJsZSBmb3IgdGhlcmUgdG8gYmUgbXVsdGlwbGUgbWFuYWdpbmcgYWdlbnRzIG9uIHRoZSBkZXZpY2Ugd2l0aCB0aGUgYWJpbGl0eSB0byBzZXQKLSAgICAgKiByZXN0cmljdGlvbnMuIFRoaXMgQVBJIHdpbGwgb25seSB0byByZXR1cm4gdGhlIHJlc3RyaWN0aW9ucyBzZXQgYnkgZGV2aWNlIHBvbGljeSBjb250cm9sbGVycwotICAgICAqIChEUENzKQorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCB2ZXJzaW9uIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVVBTSURFX0RPV05fQ0FLRX0sCisgICAgICogaXQgaXMgcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIG11bHRpcGxlIG1hbmFnaW5nIGFwcHMgb24gdGhlIGRldmljZSB3aXRoIHRoZSBhYmlsaXR5IHRvIHNldAorICAgICAqIHJlc3RyaWN0aW9ucywgZS5nLiBhIERldmljZSBQb2xpY3kgQ29udHJvbGxlciAoRFBDKSBhbmQgYSBTdXBlcnZpc2lvbiBhZG1pbi4KKyAgICAgKiBUaGlzIEFQSSB3aWxsIG9ubHkgcmV0dXJuIHRoZSByZXN0cmljdGlvbnMgc2V0IGJ5IHRoZSBEUENzLiBUbyByZXRyaWV2ZSByZXN0cmljdGlvbnMKKyAgICAgKiBzZXQgYnkgYWxsIG1hbmFnaW5nIGFwcHMsIHVzZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuUmVzdHJpY3Rpb25zTWFuYWdlciNnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9uc1BlckFkbWlufSBpbnN0ZWFkLgogICAgICAqCiAgICAgICogQHNlZSBEZXZpY2VQb2xpY3lNYW5hZ2VyCiAgICAgICovCkBAIC00NTMsOCArNDU0LDggQEAKICAgICAgKiBzdGFibGUgYmV0d2VlbiBtdWx0aXBsZSBjYWxscy4KICAgICAgKgogICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCB2ZXJzaW9uIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVVBTSURFX0RPV05fQ0FLRX0sCi0gICAgICogaXQgaXMgcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIG11bHRpcGxlIG1hbmFnaW5nIGFnZW50cyBvbiB0aGUgZGV2aWNlIHdpdGggdGhlIGFiaWxpdHkgdG8gc2V0Ci0gICAgICogcmVzdHJpY3Rpb25zLCBlLmcuIGFuIEVudGVycHJpc2UgRFBDIGFuZCBhIFN1cGVydmlzaW9uIGFkbWluLgorICAgICAqIGl0IGlzIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSBtdWx0aXBsZSBtYW5hZ2luZyBhcHBzIG9uIHRoZSBkZXZpY2Ugd2l0aCB0aGUgYWJpbGl0eSB0byBzZXQKKyAgICAgKiByZXN0cmljdGlvbnMsIGUuZy4gYW4gRW50ZXJwcmlzZSBEZXZpY2UgUG9saWN5IENvbnRyb2xsZXIgKERQQykgYW5kIGEgU3VwZXJ2aXNpb24gYWRtaW4uCiAgICAgICoKICAgICAgKiA8cD5FYWNoIHtAbGluayBCdW5kbGV9IGNvbnNpc3RzIG9mIGtleS12YWx1ZSBwYWlycywgYXMgZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24sCiAgICAgICogd2hlcmUgdGhlIHR5cGVzIG9mIHZhbHVlcyBtYXkgYmU6CkBAIC00NzEsNiArNDcyLDcgQEAKICAgICAgKiBwYWNrYWdlLiBSZXR1cm5zIGFuIGVtcHR5IHtAbGluayBMaXN0fSBpZiB0aGVyZSBhcmUgbm8gc2F2ZWQgcmVzdHJpY3Rpb25zLgogICAgICAqCiAgICAgICogQHNlZSBVc2VyTWFuYWdlciNLRVlfUkVTVFJJQ1RJT05TX1BFTkRJTkcKKyAgICAgKiBAc2VlIERldmljZVBvbGljeU1hbmFnZXIKICAgICAgKi8KICAgICBAV29ya2VyVGhyZWFkCiAgICAgQFVzZXJIYW5kbGVBd2FyZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyLmFpZGwKaW5kZXggMTMyYjlhZi4uNDEwOTk0ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlci5haWRsCkBAIC0yNDcsNyArMjQ3LDcgQEAKICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgIFN0cmluZyBnZXRJbnN0YWxsZXJQYWNrYWdlTmFtZShpbiBTdHJpbmcgcGFja2FnZU5hbWUpOwogCi0gICAgSW5zdGFsbFNvdXJjZUluZm8gZ2V0SW5zdGFsbFNvdXJjZUluZm8oaW4gU3RyaW5nIHBhY2thZ2VOYW1lKTsKKyAgICBJbnN0YWxsU291cmNlSW5mbyBnZXRJbnN0YWxsU291cmNlSW5mbyhpbiBTdHJpbmcgcGFja2FnZU5hbWUsIGludCB1c2VySWQpOwogCiAgICAgdm9pZCByZXNldEFwcGxpY2F0aW9uUHJlZmVyZW5jZXMoaW50IHVzZXJJZCk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vSW5jcmVtZW50YWxTdGF0ZXNJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0luY3JlbWVudGFsU3RhdGVzSW5mby5qYXZhCmluZGV4IDAzOTNkMzRiLi5mMTVhZmRmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0luY3JlbWVudGFsU3RhdGVzSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vSW5jcmVtZW50YWxTdGF0ZXNJbmZvLmphdmEKQEAgLTI3LDE0ICsyNywxOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNMb2FkaW5nOwogICAgIHByaXZhdGUgZmxvYXQgbVByb2dyZXNzOwogCi0gICAgcHVibGljIEluY3JlbWVudGFsU3RhdGVzSW5mbyhib29sZWFuIGlzTG9hZGluZywgZmxvYXQgcHJvZ3Jlc3MpIHsKKyAgICBwcml2YXRlIGxvbmcgbUxvYWRpbmdDb21wbGV0ZWRUaW1lOworCisgICAgcHVibGljIEluY3JlbWVudGFsU3RhdGVzSW5mbyhib29sZWFuIGlzTG9hZGluZywgZmxvYXQgcHJvZ3Jlc3MsIGxvbmcgbG9hZGluZ0NvbXBsZXRlZFRpbWUpIHsKICAgICAgICAgbUlzTG9hZGluZyA9IGlzTG9hZGluZzsKICAgICAgICAgbVByb2dyZXNzID0gcHJvZ3Jlc3M7CisgICAgICAgIG1Mb2FkaW5nQ29tcGxldGVkVGltZSA9IGxvYWRpbmdDb21wbGV0ZWRUaW1lOwogICAgIH0KIAogICAgIHByaXZhdGUgSW5jcmVtZW50YWxTdGF0ZXNJbmZvKFBhcmNlbCBzb3VyY2UpIHsKICAgICAgICAgbUlzTG9hZGluZyA9IHNvdXJjZS5yZWFkQm9vbGVhbigpOwogICAgICAgICBtUHJvZ3Jlc3MgPSBzb3VyY2UucmVhZEZsb2F0KCk7CisgICAgICAgIG1Mb2FkaW5nQ29tcGxldGVkVGltZSA9IHNvdXJjZS5yZWFkTG9uZygpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzTG9hZGluZygpIHsKQEAgLTQ1LDYgKzQ5LDEwIEBACiAgICAgICAgIHJldHVybiBtUHJvZ3Jlc3M7CiAgICAgfQogCisgICAgcHVibGljIGxvbmcgZ2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUoKSB7CisgICAgICAgIHJldHVybiBtTG9hZGluZ0NvbXBsZXRlZFRpbWU7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgewogICAgICAgICByZXR1cm4gMDsKQEAgLTU0LDYgKzYyLDcgQEAKICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKICAgICAgICAgZGVzdC53cml0ZUJvb2xlYW4obUlzTG9hZGluZyk7CiAgICAgICAgIGRlc3Qud3JpdGVGbG9hdChtUHJvZ3Jlc3MpOworICAgICAgICBkZXN0LndyaXRlTG9uZyhtTG9hZGluZ0NvbXBsZXRlZFRpbWUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIENyZWF0b3I8SW5jcmVtZW50YWxTdGF0ZXNJbmZvPiBDUkVBVE9SID0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YQppbmRleCA2NDg2Mjc4Li5iOWM2NzFhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlci5qYXZhCkBAIC0yMDQsNiArMjA0LDM2IEBACiAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuUFJPUEVSVFlfU1BFQ0lBTF9VU0VfRkdTX1NVQlRZUEUiOwogCiAgICAgLyoqCisgICAgICogQXBwbGljYXRpb24gbGV2ZWwge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5Qcm9wZXJ0eSBQYWNrYWdlTWFuYWdlcgorICAgICAqIC5Qcm9wZXJ0eX0gZm9yIGFuIGFwcCB0byBpbmZvcm0gdGhlIHN5c3RlbSB0aGF0IHRoZSBhcHAgY2FuIGJlIG9wdGVkLWluIG9yIG9wdGVkLW91dAorICAgICAqIGZyb20gdGhlIGNvbXBhdGliaWxpdHkgdHJlYXRtZW50IHRoYXQgcm90YXRlcyBjYW1lcmEgb3V0cHV0IGJ5IDkwIGRlZ3JlZXMgb24gbGFuZHNjYXBlCisgICAgICogc2Vuc29ycyBvbiBkZXZpY2VzIGtub3duIHRvIGhhdmUgY29tcGF0aWJpbGl0eSBpc3N1ZXMuCisgICAgICoKKyAgICAgKiA8cD5UaGUgdHJlYXRtZW50IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYnV0IGRldmljZSBtYW51ZmFjdHVyZXJzIGNhbiBlbmFibGUgdGhlIHRyZWF0bWVudAorICAgICAqIHVzaW5nIHRoZWlyIGRpc2NyZXRpb24gdG8gaW1wcm92ZSBjYW1lcmEgY29tcGF0aWJpbGl0eS4gV2l0aCB0aGlzIHByb3BlcnR5IHNldCB0bworICAgICAqIHtAY29kZSBmYWxzZX0sIHRoZSByb3RhdGlvbiB3aWxsIG5vdCBiZSBhcHBsaWVkLiBBIHZhbHVlIG9mIHtAY29kZSB0cnVlfQorICAgICAqIHdpbGwgZW5zdXJlIHRoYXQgcm90YXRpb24gaXMgYXBwbGllZCwgcHJvdmlkZWQgaXQgaXMgZW5hYmxlZCBmb3IgdGhlIGRldmljZS4gSW4gbW9zdCBjYXNlcywKKyAgICAgKiBpZiByb3RhdGlvbiBpcyB0aGUgZGVzaXJlZCBiZWhhdmlvciB0aGlzIHByb3BlcnR5IG5lZWQgbm90IGJlIHNldC4gSG93ZXZlciwgaWYgeW91ciBhcHAKKyAgICAgKiBleHBlcmllbmNlcyBzdHJldGNoaW5nIG9yIGluY29ycmVjdCByb3RhdGlvbiBvbiB0aGVzZSBkZXZpY2VzLCBleHBsaWNpdGx5IHNldHRpbmcgdGhpcyB0bworICAgICAqIHtAY29kZSB0cnVlfSBtYXkgcmVzb2x2ZSB0aGF0IGJlaGF2aW9yLiBBcHBzIHNob3VsZCBzZXQgdGhpcyB0byB7QGNvZGUgZmFsc2V9IGlmIHRoZXJlCisgICAgICogaXMgY29uZmlkZW5jZSB0aGF0IHRoZSBhcHAgaGFuZGxlcworICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9PUklFTlRBVElPTn0gY29ycmVjdGx5LgorICAgICAqIFNlZSA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS90cmFpbmluZy9jYW1lcmEyL2NhbWVyYS1wcmV2aWV3Ij4gdGhlCisgICAgICogZG9jdW1lbnRhdGlvbiBmb3IgYmVzdCBwcmFjdGljZS48L2E+CisgICAgICoKKyAgICAgKiA8cD48Yj5TeW50YXg6PC9iPgorICAgICAqIDxwcmU+CisgICAgICogJmx0O2FwcGxpY2F0aW9uJmd0OworICAgICAqICAgJmx0O3Byb3BlcnR5CisgICAgICogICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jYW1lcmEuUFJPUEVSVFlfQ09NUEFUX09WRVJSSURFX0xBTkRTQ0FQRV9UT19QT1JUUkFJVCIKKyAgICAgKiAgICAgYW5kcm9pZDp2YWx1ZT0idHJ1ZXxmYWxzZSIvJmd0OworICAgICAqICZsdDsvYXBwbGljYXRpb24mZ3Q7CisgICAgICogPC9wcmU+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ09NUEFUX09WRVJSSURFX0xBTkRTQ0FQRV9UT19QT1JUUkFJVCA9CisgICAgICAgICAgICAiYW5kcm9pZC5jYW1lcmEuUFJPUEVSVFlfQ09NUEFUX09WRVJSSURFX0xBTkRTQ0FQRV9UT19QT1JUUkFJVCI7CisKKyAgICAvKioKICAgICAgKiBBIHByb3BlcnR5IHZhbHVlIHNldCB3aXRoaW4gdGhlIG1hbmlmZXN0LgogICAgICAqIDxwPgogICAgICAqIFRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHdpbGwgb25seSBoYXZlIGEgc2luZ2xlIHR5cGUsIGFzIGRlZmluZWQgYnkKQEAgLTg2MzYsNyArODY2Niw3IEBACiAgICAgICogcmVxdWVzdGluZyBpdHMgb3duIGluc3RhbGwgaW5mb3JtYXRpb24gYW5kIGlzIG5vdCBhbiBpbnN0YW50IGFwcC4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBxdWVyeQotICAgICAqIEB0aHJvd3MgTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUgaXMgbm90IGluc3RhbGxlZAorICAgICAqIEB0aHJvd3MgTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUgaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyLgogICAgICAqLwogICAgIEBOb25OdWxsCiAgICAgcHVibGljIEluc3RhbGxTb3VyY2VJbmZvIGdldEluc3RhbGxTb3VyY2VJbmZvKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSkKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NyZWRlbnRpYWxzL0NyZWRlbnRpYWxEZXNjcmlwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY3JlZGVudGlhbHMvQ3JlZGVudGlhbERlc2NyaXB0aW9uLmphdmEKaW5kZXggYmYzNGMxYy4uYTIzZDdlNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY3JlZGVudGlhbHMvQ3JlZGVudGlhbERlc2NyaXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY3JlZGVudGlhbHMvQ3JlZGVudGlhbERlc2NyaXB0aW9uLmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVHlwZTsKIAogICAgIC8qKgotICAgICAqIFRoZSBmbGF0dGVuZWQgSlNPTiBzdHJpbmcgdGhhdCB3aWxsIGJlIG1hdGNoZWQgd2l0aCByZXF1ZXN0cy4KKyAgICAgKiBGbGF0dGVuZWQgc2VtaWNvbG9uIHNlcGFyYXRlZCBrZXlzIG9mIEpTT04gdmFsdWVzIHRvIG1hdGNoIHdpdGggcmVxdWVzdHMuCiAgICAgICovCiAgICAgQE5vbk51bGwKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRmxhdHRlbmVkUmVxdWVzdFN0cmluZzsKQEAgLTU3LDcgKzU3LDggQEAKICAgICAgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIENyZWRlbnRpYWxEZXNjcmlwdGlvbn0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgY3JlZGVudGlhbCByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gZmxhdHRlbmVkUmVxdWVzdFN0cmluZyBmbGF0dGVuZWQgSlNPTiBzdHJpbmcgdGhhdCB3aWxsIGJlIG1hdGNoZWQgd2l0aCByZXF1ZXN0cy4KKyAgICAgKiBAcGFyYW0gZmxhdHRlbmVkUmVxdWVzdFN0cmluZyBmbGF0dGVuZWQgc2VtaWNvbG9uIHNlcGFyYXRlZCBrZXlzIG9mIEpTT04gdmFsdWVzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBtYXRjaCB3aXRoIHJlcXVlc3RzLgogICAgICAqIEBwYXJhbSBjcmVkZW50aWFsRW50cmllcyBhIGxpc3Qgb2Yge0BsaW5rIENyZWRlbnRpYWxFbnRyeX1zIHRoYXQgYXJlIHRvIGJlIHNob3duIG9uIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50IHNlbGVjdG9yIGlmIGEgY3JlZGVudGlhbCBtYXRjaGVzIHdpdGggdGhpcyBkZXNjcmlwdGlvbi4KICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRWFjaCBlbnRyeSBjb250YWlucyBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQgd2l0aGluIGFuCkBAIC0xNTEsNCArMTUyLDI5IEBACiAgICAgcHVibGljIExpc3Q8Q3JlZGVudGlhbEVudHJ5PiBnZXRDcmVkZW50aWFsRW50cmllcygpIHsKICAgICAgICAgcmV0dXJuIG1DcmVkZW50aWFsRW50cmllczsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgQ3JlZGVudGlhbERlc2NyaXB0aW9uI21UeXBlfSBhbmQKKyAgICAgKiB7QGxpbmsgQ3JlZGVudGlhbERlc2NyaXB0aW9uI21GbGF0dGVuZWRSZXF1ZXN0U3RyaW5nfSBhcmUgZW5vdWdoIGZvciBoYXNoaW5nLiBDb25zdHJ1Y3RvcgorICAgICAqIGVuZm9yY2VzIHtAbGluayBDcmVkZW50aWFsRW50cnl9IHRvIGhhdmUgdGhlIHNhbWUgdHlwZSBhbmQKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuc2xpY2UuU2xpY2V9IGNvbnRhaW5lZCBieSB0aGUgZW50cnkgY2FuIG5vdCBiZSBoYXNoZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChtVHlwZSwgbUZsYXR0ZW5lZFJlcXVlc3RTdHJpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBDcmVkZW50aWFsRGVzY3JpcHRpb24jbVR5cGV9IGFuZAorICAgICAqIHtAbGluayBDcmVkZW50aWFsRGVzY3JpcHRpb24jbUZsYXR0ZW5lZFJlcXVlc3RTdHJpbmd9IGFyZSBlbm91Z2ggZm9yIGVxdWFsaXR5IGNoZWNrLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENyZWRlbnRpYWxEZXNjcmlwdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBDcmVkZW50aWFsRGVzY3JpcHRpb24gb3RoZXIgPSAoQ3JlZGVudGlhbERlc2NyaXB0aW9uKSBvYmo7CisgICAgICAgIHJldHVybiBtVHlwZS5lcXVhbHMob3RoZXIubVR5cGUpCisgICAgICAgICAgICAgICAgJiYgbUZsYXR0ZW5lZFJlcXVlc3RTdHJpbmcuZXF1YWxzKG90aGVyLm1GbGF0dGVuZWRSZXF1ZXN0U3RyaW5nKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9DcmVkZW50aWFsTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY3JlZGVudGlhbHMvQ3JlZGVudGlhbE1hbmFnZXIuamF2YQppbmRleCAwODA2ZjFkLi40OTNhNGZmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9DcmVkZW50aWFsTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NyZWRlbnRpYWxzL0NyZWRlbnRpYWxNYW5hZ2VyLmphdmEKQEAgLTE2Nyw2ICsxNjcsNDggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBHZXRzIGEge0BsaW5rIEdldFBlbmRpbmdDcmVkZW50aWFsUmVzcG9uc2V9IHRoYXQgY2FuIGxhdW5jaCB0aGUgY3JlZGVudGlhbCByZXRyaWV2YWwgVUkgZmxvdworICAgICAqIHRvIHJlcXVlc3QgYSB1c2VyIGNyZWRlbnRpYWwgZm9yIHlvdXIgYXBwLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgICAgICAgICAgICB0aGUgcmVxdWVzdCBzcGVjaWZ5aW5nIHR5cGUocykgb2YgY3JlZGVudGlhbHMgdG8gZ2V0IGZyb20gdGhlIHVzZXIKKyAgICAgKiBAcGFyYW0gY2FuY2VsbGF0aW9uU2lnbmFsIGFuIG9wdGlvbmFsIHNpZ25hbCB0aGF0IGFsbG93cyBmb3IgY2FuY2VsbGluZyB0aGlzIGNhbGwKKyAgICAgKiBAcGFyYW0gZXhlY3V0b3IgICAgICAgICAgIHRoZSBjYWxsYmFjayB3aWxsIHRha2UgcGxhY2Ugb24gdGhpcyB7QGxpbmsgRXhlY3V0b3J9CisgICAgICogQHBhcmFtIGNhbGxiYWNrICAgICAgICAgICB0aGUgY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzIG9yIGZhaWxzCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldFBlbmRpbmdDcmVkZW50aWFsKAorICAgICAgICAgICAgQE5vbk51bGwgR2V0Q3JlZGVudGlhbFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBDYW5jZWxsYXRpb25TaWduYWwgY2FuY2VsbGF0aW9uU2lnbmFsLAorICAgICAgICAgICAgQENhbGxiYWNrRXhlY3V0b3IgQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsCisgICAgICAgICAgICBATm9uTnVsbCBPdXRjb21lUmVjZWl2ZXI8CisgICAgICAgICAgICAgICAgICAgIEdldFBlbmRpbmdDcmVkZW50aWFsUmVzcG9uc2UsIEdldENyZWRlbnRpYWxFeGNlcHRpb24+IGNhbGxiYWNrKSB7CisgICAgICAgIHJlcXVpcmVOb25OdWxsKHJlcXVlc3QsICJyZXF1ZXN0IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgcmVxdWlyZU5vbk51bGwoZXhlY3V0b3IsICJleGVjdXRvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIHJlcXVpcmVOb25OdWxsKGNhbGxiYWNrLCAiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOworCisgICAgICAgIGlmIChjYW5jZWxsYXRpb25TaWduYWwgIT0gbnVsbCAmJiBjYW5jZWxsYXRpb25TaWduYWwuaXNDYW5jZWxlZCgpKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRQZW5kaW5nQ3JlZGVudGlhbCBhbHJlYWR5IGNhbmNlbGVkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBJQ2FuY2VsbGF0aW9uU2lnbmFsIGNhbmNlbFJlbW90ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYW5jZWxSZW1vdGUgPQorICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5leGVjdXRlR2V0UGVuZGluZ0NyZWRlbnRpYWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR2V0UGVuZGluZ0NyZWRlbnRpYWxUcmFuc3BvcnQoZXhlY3V0b3IsIGNhbGxiYWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNhbmNlbGxhdGlvblNpZ25hbCAhPSBudWxsICYmIGNhbmNlbFJlbW90ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjYW5jZWxsYXRpb25TaWduYWwuc2V0UmVtb3RlKGNhbmNlbFJlbW90ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMYXVuY2hlcyB0aGUgbmVjZXNzYXJ5IGZsb3dzIHRvIHJlZ2lzdGVyIGFuIGFwcCBjcmVkZW50aWFsIGZvciB0aGUgdXNlci4KICAgICAgKgogICAgICAqIDxwPlRoZSBleGVjdXRpb24gY2FuIHBvdGVudGlhbGx5IGxhdW5jaCBVSSBmbG93cyB0byBjb2xsZWN0IHVzZXIgY29uc2VudCB0byBjcmVhdGluZyBvcgpAQCAtNDQyLDYgKzQ4NCwzMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR2V0UGVuZGluZ0NyZWRlbnRpYWxUcmFuc3BvcnQgZXh0ZW5kcyBJR2V0UGVuZGluZ0NyZWRlbnRpYWxDYWxsYmFjay5TdHViIHsKKyAgICAgICAgLy8gVE9ETzogbGlzdGVuIGZvciBjYW5jZWxsYXRpb24gdG8gcmVsZWFzZSBjYWxsYmFjay4KKworICAgICAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIG1FeGVjdXRvcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdXRjb21lUmVjZWl2ZXI8CisgICAgICAgICAgICAgICAgR2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZSwgR2V0Q3JlZGVudGlhbEV4Y2VwdGlvbj4gbUNhbGxiYWNrOworCisgICAgICAgIHByaXZhdGUgR2V0UGVuZGluZ0NyZWRlbnRpYWxUcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsCisgICAgICAgICAgICAgICAgT3V0Y29tZVJlY2VpdmVyPEdldFBlbmRpbmdDcmVkZW50aWFsUmVzcG9uc2UsIEdldENyZWRlbnRpYWxFeGNlcHRpb24+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtRXhlY3V0b3IgPSBleGVjdXRvcjsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzcG9uc2UoR2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gbUNhbGxiYWNrLm9uUmVzdWx0KHJlc3BvbnNlKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3JUeXBlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IG1DYWxsYmFjay5vbkVycm9yKG5ldyBHZXRDcmVkZW50aWFsRXhjZXB0aW9uKGVycm9yVHlwZSwgbWVzc2FnZSkpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdldENyZWRlbnRpYWxUcmFuc3BvcnQgZXh0ZW5kcyBJR2V0Q3JlZGVudGlhbENhbGxiYWNrLlN0dWIgewogICAgICAgICAvLyBUT0RPOiBsaXN0ZW4gZm9yIGNhbmNlbGxhdGlvbiB0byByZWxlYXNlIGNhbGxiYWNrLgogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvc2hhcmVkL21vZGVsL0tleWd1YXJkQm91bmNlck1vZGVsLmt0IGIvY29yZS9qYXZhL2FuZHJvaWQvY3JlZGVudGlhbHMvR2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZS5haWRsCnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvc2hhcmVkL21vZGVsL0tleWd1YXJkQm91bmNlck1vZGVsLmt0CmNvcHkgdG8gY29yZS9qYXZhL2FuZHJvaWQvY3JlZGVudGlhbHMvR2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZS5haWRsCmluZGV4IGFkNzgzZGEuLjFjZGQ2MzcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9zaGFyZWQvbW9kZWwvS2V5Z3VhcmRCb3VuY2VyTW9kZWwua3QKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY3JlZGVudGlhbHMvR2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZS5haWRsCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMSwxNCArMTEsOSBAQAogICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuc2hhcmVkLm1vZGVsCitwYWNrYWdlIGFuZHJvaWQuY3JlZGVudGlhbHM7CiAKLS8qKiBNb2RlbHMgdGhlIHN0YXRlIG9mIHRoZSBsb2NrLXNjcmVlbiBib3VuY2VyICovCi1kYXRhIGNsYXNzIEtleWd1YXJkQm91bmNlck1vZGVsKAotICAgIHZhbCBwcm9tcHRSZWFzb246IEludCA9IDAsCi0gICAgdmFsIGVycm9yTWVzc2FnZTogQ2hhclNlcXVlbmNlPyA9IG51bGwsCi0gICAgdmFsIGV4cGFuc2lvbkFtb3VudDogRmxvYXQgPSAwZiwKLSkKK3BhcmNlbGFibGUgR2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9HZXRQZW5kaW5nQ3JlZGVudGlhbFJlc3BvbnNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9HZXRQZW5kaW5nQ3JlZGVudGlhbFJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAwNWQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NyZWRlbnRpYWxzL0dldFBlbmRpbmdDcmVkZW50aWFsUmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNyZWRlbnRpYWxzOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkNhbGxiYWNrRXhlY3V0b3I7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQ2FuY2VsbGF0aW9uU2lnbmFsOworaW1wb3J0IGFuZHJvaWQub3MuT3V0Y29tZVJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCisKKy8qKgorICogQSByZXNwb25zZSBvYmplY3QgdGhhdCBwcmVmZXRjaGVzIHVzZXIgYXBwIGNyZWRlbnRpYWxzIGFuZCBwcm92aWRlcyBtZXRhZGF0YSBhYm91dCB0aGVtLiBJdCBjYW4KKyAqIHRoZW4gYmUgdXNlZCB0byBpc3N1ZSB0aGUgZnVsbCBjcmVkZW50aWFsIHJldHJpZXZhbCBmbG93IHZpYSB0aGUKKyAqIHtAbGluayAjc2hvdyhBY3Rpdml0eSwgQ2FuY2VsbGF0aW9uU2lnbmFsLCBFeGVjdXRvciwgT3V0Y29tZVJlY2VpdmVyKX0gbWV0aG9kIHRvIHBlcmZvcm0gdGhlCisgKiBuZWNlc3NhcnkgZmxvd3Mgc3VjaCBhcyBjb25zZW50IGNvbGxlY3Rpb24gYW5kIG9mZmljaWFsbHkgcmV0cmlldmUgYSBjcmVkZW50aWFsLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHZXRQZW5kaW5nQ3JlZGVudGlhbFJlc3BvbnNlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1IYXNDcmVkZW50aWFsUmVzdWx0czsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUhhc0F1dGhlbnRpY2F0aW9uUmVzdWx0czsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUhhc1JlbW90ZVJlc3VsdHM7CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSB1c2VyIGhhcyBhbnkgY2FuZGlkYXRlIGNyZWRlbnRpYWxzLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0NyZWRlbnRpYWxSZXN1bHRzKCkgeworICAgICAgICByZXR1cm4gbUhhc0NyZWRlbnRpYWxSZXN1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXNlciBoYXMgYW55IGNhbmRpZGF0ZSBhdXRoZW50aWNhdGlvbiBhY3Rpb25zIChsb2NrZWQgY3JlZGVudGlhbAorICAgICAqIHN1cHBsaWVyKSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdXRoZW50aWNhdGlvblJlc3VsdHMoKSB7CisgICAgICAgIHJldHVybiBtSGFzQXV0aGVudGljYXRpb25SZXN1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXNlciBoYXMgYW55IGNhbmRpZGF0ZSByZW1vdGUgY3JlZGVudGlhbCByZXN1bHRzLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1JlbW90ZVJlc3VsdHMoKSB7CisgICAgICAgIHJldHVybiBtSGFzUmVtb3RlUmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyB0aGUgbmVjZXNzYXJ5IGZsb3dzIHN1Y2ggYXMgY29uc2VudCBjb2xsZWN0aW9uIGFuZCBjcmVkZW50aWFsIHNlbGVjdGlvbiB0bworICAgICAqIG9mZmljaWFsbHkgcmV0cmlldmUgYSBjcmVkZW50aWFsIGFtb25nIHRoZSBwZW5kaW5nIGNyZWRlbnRpYWwgY2FuZGlkYXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpdml0eSAgICAgICAgICAgdGhlIGFjdGl2aXR5IHVzZWQgdG8gbGF1bmNoIGFueSBVSSBuZWVkZWQKKyAgICAgKiBAcGFyYW0gY2FuY2VsbGF0aW9uU2lnbmFsIGFuIG9wdGlvbmFsIHNpZ25hbCB0aGF0IGFsbG93cyBmb3IgY2FuY2VsbGluZyB0aGlzIGNhbGwKKyAgICAgKiBAcGFyYW0gZXhlY3V0b3IgICAgICAgICAgIHRoZSBjYWxsYmFjayB3aWxsIHRha2UgcGxhY2Ugb24gdGhpcyB7QGxpbmsgRXhlY3V0b3J9CisgICAgICogQHBhcmFtIGNhbGxiYWNrICAgICAgICAgICB0aGUgY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzIG9yIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvdyhATm9uTnVsbCBBY3Rpdml0eSBhY3Rpdml0eSwgQE51bGxhYmxlIENhbmNlbGxhdGlvblNpZ25hbCBjYW5jZWxsYXRpb25TaWduYWwsCisgICAgICAgICAgICBAQ2FsbGJhY2tFeGVjdXRvciBATm9uTnVsbCBFeGVjdXRvciBleGVjdXRvciwKKyAgICAgICAgICAgIEBOb25OdWxsIE91dGNvbWVSZWNlaXZlcjxHZXRDcmVkZW50aWFsUmVzcG9uc2UsIEdldENyZWRlbnRpYWxFeGNlcHRpb24+IGNhbGxiYWNrKSB7CisgICAgICAgIC8vIFRPRE8oYi8yNzMzMDg4OTUpOiBpbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKEBOb25OdWxsIFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZUJvb2xlYW4obUhhc0NyZWRlbnRpYWxSZXN1bHRzKTsKKyAgICAgICAgZGVzdC53cml0ZUJvb2xlYW4obUhhc0F1dGhlbnRpY2F0aW9uUmVzdWx0cyk7CisgICAgICAgIGRlc3Qud3JpdGVCb29sZWFuKG1IYXNSZW1vdGVSZXN1bHRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiR2V0Q3JlZGVudGlhbFJlc3BvbnNlIHsiICsgImNyZWRlbnRpYWw9IiArIG1IYXNDcmVkZW50aWFsUmVzdWx0cyArICJ9IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIEdldFBlbmRpbmdDcmVkZW50aWFsUmVzcG9uc2V9LgorICAgICAqCisgICAgICogQHBhcmFtIGhhc0NyZWRlbnRpYWxSZXN1bHRzIHdoZXRoZXIgdGhlIHVzZXIgaGFzIGFueSBjYW5kaWRhdGUgY3JlZGVudGlhbHMKKyAgICAgKiBAcGFyYW0gaGFzQXV0aGVudGljYXRpb25SZXN1bHRzIHdoZXRoZXIgdGhlIHVzZXIgaGFzIGFueSBjYW5kaWRhdGUgYXV0aGVudGljYXRpb24gYWN0aW9ucworICAgICAqIEBwYXJhbSBoYXNSZW1vdGVSZXN1bHRzIHdoZXRoZXIgdGhlIHVzZXIgaGFzIGFueSBjYW5kaWRhdGUgcmVtb3RlIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgR2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZShib29sZWFuIGhhc0NyZWRlbnRpYWxSZXN1bHRzLAorICAgICAgICAgICAgYm9vbGVhbiBoYXNBdXRoZW50aWNhdGlvblJlc3VsdHMsIGJvb2xlYW4gaGFzUmVtb3RlUmVzdWx0cykgeworICAgICAgICBtSGFzQ3JlZGVudGlhbFJlc3VsdHMgPSBoYXNDcmVkZW50aWFsUmVzdWx0czsKKyAgICAgICAgbUhhc0F1dGhlbnRpY2F0aW9uUmVzdWx0cyA9IGhhc0F1dGhlbnRpY2F0aW9uUmVzdWx0czsKKyAgICAgICAgbUhhc1JlbW90ZVJlc3VsdHMgPSBoYXNSZW1vdGVSZXN1bHRzOworICAgIH0KKworICAgIHByaXZhdGUgR2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZShATm9uTnVsbCBQYXJjZWwgaW4pIHsKKyAgICAgICAgbUhhc0NyZWRlbnRpYWxSZXN1bHRzID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgbUhhc0F1dGhlbnRpY2F0aW9uUmVzdWx0cyA9IGluLnJlYWRCb29sZWFuKCk7CisgICAgICAgIG1IYXNSZW1vdGVSZXN1bHRzID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEBOb25OdWxsIENyZWF0b3I8R2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZT4gQ1JFQVRPUiA9IG5ldyBDcmVhdG9yPD4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgR2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEdldFBlbmRpbmdDcmVkZW50aWFsUmVzcG9uc2Vbc2l6ZV07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEdldFBlbmRpbmdDcmVkZW50aWFsUmVzcG9uc2UgY3JlYXRlRnJvbVBhcmNlbChATm9uTnVsbCBQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR2V0UGVuZGluZ0NyZWRlbnRpYWxSZXNwb25zZShpbik7CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY3JlZGVudGlhbHMvSUNyZWRlbnRpYWxNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9JQ3JlZGVudGlhbE1hbmFnZXIuYWlkbAppbmRleCA4YzJjYjVhLi5hZjhlN2I0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9JQ3JlZGVudGlhbE1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9JQ3JlZGVudGlhbE1hbmFnZXIuYWlkbApAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IGFuZHJvaWQuY3JlZGVudGlhbHMuSUNsZWFyQ3JlZGVudGlhbFN0YXRlQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5jcmVkZW50aWFscy5JQ3JlYXRlQ3JlZGVudGlhbENhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQuY3JlZGVudGlhbHMuSUdldENyZWRlbnRpYWxDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLmNyZWRlbnRpYWxzLklHZXRQZW5kaW5nQ3JlZGVudGlhbENhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQuY3JlZGVudGlhbHMuSVNldEVuYWJsZWRQcm92aWRlcnNDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLm9zLklDYW5jZWxsYXRpb25TaWduYWw7CkBAIC00MCw2ICs0MSw4IEBACiAKICAgICBAbnVsbGFibGUgSUNhbmNlbGxhdGlvblNpZ25hbCBleGVjdXRlR2V0Q3JlZGVudGlhbChpbiBHZXRDcmVkZW50aWFsUmVxdWVzdCByZXF1ZXN0LCBpbiBJR2V0Q3JlZGVudGlhbENhbGxiYWNrIGNhbGxiYWNrLCBTdHJpbmcgY2FsbGluZ1BhY2thZ2UpOwogCisgICAgQG51bGxhYmxlIElDYW5jZWxsYXRpb25TaWduYWwgZXhlY3V0ZUdldFBlbmRpbmdDcmVkZW50aWFsKGluIEdldENyZWRlbnRpYWxSZXF1ZXN0IHJlcXVlc3QsIGluIElHZXRQZW5kaW5nQ3JlZGVudGlhbENhbGxiYWNrIGNhbGxiYWNrLCBTdHJpbmcgY2FsbGluZ1BhY2thZ2UpOworCiAgICAgQG51bGxhYmxlIElDYW5jZWxsYXRpb25TaWduYWwgZXhlY3V0ZUNyZWF0ZUNyZWRlbnRpYWwoaW4gQ3JlYXRlQ3JlZGVudGlhbFJlcXVlc3QgcmVxdWVzdCwgaW4gSUNyZWF0ZUNyZWRlbnRpYWxDYWxsYmFjayBjYWxsYmFjaywgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKTsKIAogICAgIEBudWxsYWJsZSBJQ2FuY2VsbGF0aW9uU2lnbmFsIGNsZWFyQ3JlZGVudGlhbFN0YXRlKGluIENsZWFyQ3JlZGVudGlhbFN0YXRlUmVxdWVzdCByZXF1ZXN0LCBpbiBJQ2xlYXJDcmVkZW50aWFsU3RhdGVDYWxsYmFjayBjYWxsYmFjaywgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NyZWRlbnRpYWxzL0lHZXRQZW5kaW5nQ3JlZGVudGlhbENhbGxiYWNrLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9JR2V0UGVuZGluZ0NyZWRlbnRpYWxDYWxsYmFjay5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjBmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jcmVkZW50aWFscy9JR2V0UGVuZGluZ0NyZWRlbnRpYWxDYWxsYmFjay5haWRsCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jcmVkZW50aWFsczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jcmVkZW50aWFscy5HZXRQZW5kaW5nQ3JlZGVudGlhbFJlc3BvbnNlOworCisvKioKKyAqIExpc3RlbmVyIGZvciBhIGV4ZWN1dGVHZXRQZW5kaW5nQ3JlZGVudGlhbCByZXF1ZXN0LgorICoKKyAqIEBoaWRlCisgKi8KK2ludGVyZmFjZSBJR2V0UGVuZGluZ0NyZWRlbnRpYWxDYWxsYmFjayB7CisgICAgb25ld2F5IHZvaWQgb25SZXNwb25zZShpbiBHZXRQZW5kaW5nQ3JlZGVudGlhbFJlc3BvbnNlIHJlc3BvbnNlKTsKKyAgICBvbmV3YXkgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvclR5cGUsIFN0cmluZyBtZXNzYWdlKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQppbmRleCAzMzQxODAwLi41ZTUyM2MwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKQEAgLTUxMyw2ICs1MTMsMTkgQEAKICAgICAgKiBUaGlzIG1ldGhvZCBleGVjdXRlcyB3aXRoaW4gYSB0cmFuc2FjdGlvbi4gIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIGFsbCBjaGFuZ2VzCiAgICAgICogd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJvbGxlZCBiYWNrLgogICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiA8ZW0+SW1wb3J0YW50OjwvZW0+IFlvdSBzaG91bGQgTk9UIG1vZGlmeSBhbiBleGlzdGluZyBtaWdyYXRpb24gc3RlcCBmcm9tIHZlcnNpb24gWCB0byBYKzEKKyAgICAgKiBvbmNlIGEgYnVpbGQgaGFzIGJlZW4gcmVsZWFzZWQgY29udGFpbmluZyB0aGF0IG1pZ3JhdGlvbiBzdGVwLiAgSWYgYSBtaWdyYXRpb24gc3RlcCBoYXMgYW4KKyAgICAgKiBlcnJvciBhbmQgaXQgcnVucyBvbiBhIGRldmljZSwgdGhlIHN0ZXAgd2lsbCBOT1QgcmUtcnVuIGl0c2VsZiBpbiB0aGUgZnV0dXJlIGlmIGEgZml4IGlzIG1hZGUKKyAgICAgKiB0byB0aGUgbWlncmF0aW9uIHN0ZXAuPC9wPgorICAgICAqIDxwPkZvciBleGFtcGxlLCBzdXBwb3NlIGEgbWlncmF0aW9uIHN0ZXAgcmVuYW1lcyBhIGRhdGFiYXNlIGNvbHVtbiBmcm9tIHtAY29kZSBmb299IHRvCisgICAgICoge0Bjb2RlIGJhcn0gd2hlbiB0aGUgbmFtZSBzaG91bGQgaGF2ZSBiZWVuIHtAY29kZSBiYXp9LiAgSWYgdGhhdCBtaWdyYXRpb24gc3RlcCBpcyByZWxlYXNlZAorICAgICAqIGluIGEgYnVpbGQgYW5kIHJ1bnMgb24gYSB1c2VyJ3MgZGV2aWNlLCB0aGUgY29sdW1uIHdpbGwgYmUgcmVuYW1lZCB0byB7QGNvZGUgYmFyfS4gIElmIHRoZQorICAgICAqIGRldmVsb3BlciBzdWJzZXF1ZW50bHkgZWRpdHMgdGhpcyBzYW1lIG1pZ3JhdGlvbiBzdGVwIHRvIGNoYW5nZSB0aGUgbmFtZSB0byB7QGNvZGUgYmF6fSBhcworICAgICAqIGludGVuZGVkLCB0aGUgdXNlciBkZXZpY2VzIHdoaWNoIGhhdmUgYWxyZWFkeSBydW4gdGhpcyBzdGVwIHdpbGwgc3RpbGwgaGF2ZSB0aGUgbmFtZQorICAgICAqIHtAY29kZSBiYXJ9LiAgSW5zdGVhZCwgYSBORVcgbWlncmF0aW9uIHN0ZXAgc2hvdWxkIGJlIGNyZWF0ZWQgdG8gY29ycmVjdCB0aGUgZXJyb3IgYW5kIHJlbmFtZQorICAgICAqIHtAY29kZSBiYXJ9IHRvIHtAY29kZSBiYXp9LCBlbnN1cmluZyB0aGUgZXJyb3IgaXMgY29ycmVjdGVkIG9uIGRldmljZXMgd2hpY2ggaGF2ZSBhbHJlYWR5IHJ1bgorICAgICAqIHRoZSBtaWdyYXRpb24gc3RlcCB3aXRoIHRoZSBlcnJvci48L3A+CiAgICAgICoKICAgICAgKiBAcGFyYW0gZGIgVGhlIGRhdGFiYXNlLgogICAgICAqIEBwYXJhbSBvbGRWZXJzaW9uIFRoZSBvbGQgZGF0YWJhc2UgdmVyc2lvbi4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYVNlc3Npb25TdGF0cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhU2Vzc2lvblN0YXRzLmphdmEKaW5kZXggY2YyMDQ1OS4uNzlhNTUxYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhU2Vzc2lvblN0YXRzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhU2Vzc2lvblN0YXRzLmphdmEKQEAgLTU0LDYgKzU0LDcgQEAKICAgICBwcml2YXRlIGludCBtQXBpTGV2ZWw7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc05kazsKICAgICBwcml2YXRlIGludCBtTGF0ZW5jeU1zOworICAgIHByaXZhdGUgbG9uZyBtTG9nSWQ7CiAgICAgcHJpdmF0ZSBpbnQgbVNlc3Npb25UeXBlOwogICAgIHByaXZhdGUgaW50IG1JbnRlcm5hbFJlY29uZmlndXJlOwogICAgIHByaXZhdGUgbG9uZyBtUmVxdWVzdENvdW50OwpAQCAtNzAsNiArNzEsNyBAQAogICAgICAgICBtQXBpTGV2ZWwgPSAtMTsKICAgICAgICAgbUlzTmRrID0gZmFsc2U7CiAgICAgICAgIG1MYXRlbmN5TXMgPSAtMTsKKyAgICAgICAgbUxvZ0lkID0gMDsKICAgICAgICAgbU1heFByZXZpZXdGcHMgPSAwOwogICAgICAgICBtU2Vzc2lvblR5cGUgPSAtMTsKICAgICAgICAgbUludGVybmFsUmVjb25maWd1cmUgPSAtMTsKQEAgLTgyLDcgKzg0LDcgQEAKIAogICAgIHB1YmxpYyBDYW1lcmFTZXNzaW9uU3RhdHMoU3RyaW5nIGNhbWVyYUlkLCBpbnQgZmFjaW5nLCBpbnQgbmV3Q2FtZXJhU3RhdGUsCiAgICAgICAgICAgICBTdHJpbmcgY2xpZW50TmFtZSwgaW50IGFwaUxldmVsLCBib29sZWFuIGlzTmRrLCBpbnQgY3JlYXRpb25EdXJhdGlvbiwKLSAgICAgICAgICAgIGZsb2F0IG1heFByZXZpZXdGcHMsIGludCBzZXNzaW9uVHlwZSwgaW50IGludGVybmFsUmVjb25maWd1cmUpIHsKKyAgICAgICAgICAgIGZsb2F0IG1heFByZXZpZXdGcHMsIGludCBzZXNzaW9uVHlwZSwgaW50IGludGVybmFsUmVjb25maWd1cmUsIGxvbmcgbG9nSWQpIHsKICAgICAgICAgbUNhbWVyYUlkID0gY2FtZXJhSWQ7CiAgICAgICAgIG1GYWNpbmcgPSBmYWNpbmc7CiAgICAgICAgIG1OZXdDYW1lcmFTdGF0ZSA9IG5ld0NhbWVyYVN0YXRlOwpAQCAtOTAsNiArOTIsNyBAQAogICAgICAgICBtQXBpTGV2ZWwgPSBhcGlMZXZlbDsKICAgICAgICAgbUlzTmRrID0gaXNOZGs7CiAgICAgICAgIG1MYXRlbmN5TXMgPSBjcmVhdGlvbkR1cmF0aW9uOworICAgICAgICBtTG9nSWQgPSBsb2dJZDsKICAgICAgICAgbU1heFByZXZpZXdGcHMgPSBtYXhQcmV2aWV3RnBzOwogICAgICAgICBtU2Vzc2lvblR5cGUgPSBzZXNzaW9uVHlwZTsKICAgICAgICAgbUludGVybmFsUmVjb25maWd1cmUgPSBpbnRlcm5hbFJlY29uZmlndXJlOwpAQCAtMTI3LDYgKzEzMCw3IEBACiAgICAgICAgIGRlc3Qud3JpdGVJbnQobUFwaUxldmVsKTsKICAgICAgICAgZGVzdC53cml0ZUJvb2xlYW4obUlzTmRrKTsKICAgICAgICAgZGVzdC53cml0ZUludChtTGF0ZW5jeU1zKTsKKyAgICAgICAgZGVzdC53cml0ZUxvbmcobUxvZ0lkKTsKICAgICAgICAgZGVzdC53cml0ZUZsb2F0KG1NYXhQcmV2aWV3RnBzKTsKICAgICAgICAgZGVzdC53cml0ZUludChtU2Vzc2lvblR5cGUpOwogICAgICAgICBkZXN0LndyaXRlSW50KG1JbnRlcm5hbFJlY29uZmlndXJlKTsKQEAgLTE0Niw2ICsxNTAsNyBAQAogICAgICAgICBtQXBpTGV2ZWwgPSBpbi5yZWFkSW50KCk7CiAgICAgICAgIG1Jc05kayA9IGluLnJlYWRCb29sZWFuKCk7CiAgICAgICAgIG1MYXRlbmN5TXMgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1Mb2dJZCA9IGluLnJlYWRMb25nKCk7CiAgICAgICAgIG1NYXhQcmV2aWV3RnBzID0gaW4ucmVhZEZsb2F0KCk7CiAgICAgICAgIG1TZXNzaW9uVHlwZSA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgbUludGVybmFsUmVjb25maWd1cmUgPSBpbi5yZWFkSW50KCk7CkBAIC0xODksNiArMTk0LDEwIEBACiAgICAgICAgIHJldHVybiBtTGF0ZW5jeU1zOwogICAgIH0KIAorICAgIHB1YmxpYyBsb25nIGdldExvZ0lkKCkgeworICAgICAgICByZXR1cm4gbUxvZ0lkOworICAgIH0KKwogICAgIHB1YmxpYyBmbG9hdCBnZXRNYXhQcmV2aWV3RnBzKCkgewogICAgICAgICByZXR1cm4gbU1heFByZXZpZXdGcHM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmphdmEKaW5kZXggYjliMzEwZi4uYzk1ZDA4MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5qYXZhCkBAIC00MTIzLDcgKzQxMjMsOCBAQAogICAgICAqIGNvdW50ZXJwYXJ0cy4KICAgICAgKiBUaGlzIGtleSB3aWxsIG9ubHkgYmUgcHJlc2VudCBmb3IgZGV2aWNlcyB3aGljaCBhZHZlcnRpc2UgdGhlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogY2FwYWJpbGl0eS48L3A+CisgICAgICogY2FwYWJpbGl0eSBvciBkZXZpY2VzIHdoZXJlIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0QXZhaWxhYmxlQ2FwdHVyZVJlcXVlc3RLZXlzIH0KKyAgICAgKiBsaXN0cyB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX19PC9wPgogICAgICAqIDxwPjxiPlVuaXRzPC9iPjogUGl4ZWwgY29vcmRpbmF0ZXMgb24gdGhlIGltYWdlIHNlbnNvcjwvcD4KICAgICAgKiA8cD48Yj5PcHRpb25hbDwvYj4gLSBUaGUgdmFsdWUgZm9yIHRoaXMga2V5IG1heSBiZSB7QGNvZGUgbnVsbH0gb24gc29tZSBkZXZpY2VzLjwvcD4KICAgICAgKgpAQCAtNDE0OCw3ICs0MTQ5LDggQEAKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiB9LgogICAgICAqIFRoaXMga2V5IHdpbGwgb25seSBiZSBwcmVzZW50IGZvciBkZXZpY2VzIHdoaWNoIGFkdmVydGlzZSB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5LjwvcD4KKyAgICAgKiBjYXBhYmlsaXR5IG9yIGRldmljZXMgd2hlcmUge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXRBdmFpbGFibGVDYXB0dXJlUmVxdWVzdEtleXMgfQorICAgICAqIGxpc3RzIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfX08L3A+CiAgICAgICogPHA+PGI+VW5pdHM8L2I+OiBQaXhlbHM8L3A+CiAgICAgICogPHA+PGI+T3B0aW9uYWw8L2I+IC0gVGhlIHZhbHVlIGZvciB0aGlzIGtleSBtYXkgYmUge0Bjb2RlIG51bGx9IG9uIHNvbWUgZGV2aWNlcy48L3A+CiAgICAgICoKQEAgLTQxNzIsNyArNDE3NCw4IEBACiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04gfS4KICAgICAgKiBUaGlzIGtleSB3aWxsIG9ubHkgYmUgcHJlc2VudCBmb3IgZGV2aWNlcyB3aGljaCBhZHZlcnRpc2UgdGhlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogY2FwYWJpbGl0eS48L3A+CisgICAgICogY2FwYWJpbGl0eSBvciBkZXZpY2VzIHdoZXJlIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0QXZhaWxhYmxlQ2FwdHVyZVJlcXVlc3RLZXlzIH0KKyAgICAgKiBsaXN0cyB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX19PC9wPgogICAgICAqIDxwPjxiPlVuaXRzPC9iPjogUGl4ZWwgY29vcmRpbmF0ZXMgb24gdGhlIGltYWdlIHNlbnNvcjwvcD4KICAgICAgKiA8cD48Yj5PcHRpb25hbDwvYj4gLSBUaGUgdmFsdWUgZm9yIHRoaXMga2V5IG1heSBiZSB7QGNvZGUgbnVsbH0gb24gc29tZSBkZXZpY2VzLjwvcD4KICAgICAgKgpAQCAtNDE5MiwxNCArNDE5NSwyOSBAQAogICAgICAqIHRvIGltcHJvdmUgdmFyaW91cyBhc3BlY3RzIG9mIGltYWdpbmcgc3VjaCBhcyBub2lzZSByZWR1Y3Rpb24sIGxvdyBsaWdodAogICAgICAqIHBlcmZvcm1hbmNlIGV0Yy4gVGhlc2UgZ3JvdXBzIGNhbiBiZSBvZiB2YXJpb3VzIHNpemVzIHN1Y2ggYXMgMlgyIChxdWFkIGJheWVyKSwKICAgICAgKiAzWDMgKG5vbmEtYmF5ZXIpLiBUaGlzIGtleSBzcGVjaWZpZXMgdGhlIGxlbmd0aCBhbmQgd2lkdGggb2YgdGhlIHBpeGVscyBncm91cGVkIHVuZGVyCi0gICAgICogdGhlIHNhbWUgY29sb3IgZmlsdGVyLjwvcD4KLSAgICAgKiA8cD5UaGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGlmIFJFTU9TQUlDX1JFUFJPQ0VTU0lORyBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSBSQVcgaW1hZ2VzCi0gICAgICogd2lsbCBoYXZlIGEgcmVndWxhciBiYXllciBwYXR0ZXJuLjwvcD4KLSAgICAgKiA8cD5UaGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBzZW5zb3JzIHdoaWNoIGRvbid0IGhhdmUgdGhlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogY2FwYWJpbGl0eS48L3A+CisgICAgICogdGhlIHNhbWUgY29sb3IgZmlsdGVyLgorICAgICAqIEluIGNhc2UgdGhlIGRldmljZSBoYXMgdGhlCisgICAgICoge0BsaW5rIENhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KKyAgICAgKiBjYXBhYmlsaXR5IDo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGlmIFJFTU9TQUlDX1JFUFJPQ0VTU0lORyBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSBSQVcKKyAgICAgKiAgIGltYWdlcyB3aWxsIGhhdmUgYSByZWd1bGFyIGJheWVyIHBhdHRlcm4uPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPkluIGNhc2UgdGhlIGRldmljZSBkb2VzIG5vdCBoYXZlIHRoZQorICAgICAqIHtAbGluayBDYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9CisgICAgICogY2FwYWJpbGl0eSA6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+VGhpcyBrZXkgd2lsbCBiZSBwcmVzZW50IGlmCisgICAgICogICB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldEF2YWlsYWJsZUNhcHR1cmVSZXF1ZXN0S2V5cyB9CisgICAgICogICBsaXN0cyB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX19LCBzaW5jZSBSQVcKKyAgICAgKiAgIGltYWdlcyBtYXkgbm90IG5lY2Vzc2FyaWx5IGhhdmUgYSByZWd1bGFyIGJheWVyIHBhdHRlcm4gd2hlbgorICAgICAqICAge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9fSBpcyBzZXQgdG8KKyAgICAgKiAgIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0uPC9saT4KKyAgICAgKiA8L3VsPgogICAgICAqIDxwPjxiPlVuaXRzPC9iPjogUGl4ZWxzPC9wPgogICAgICAqIDxwPjxiPk9wdGlvbmFsPC9iPiAtIFRoZSB2YWx1ZSBmb3IgdGhpcyBrZXkgbWF5IGJlIHtAY29kZSBudWxsfSBvbiBzb21lIGRldmljZXMuPC9wPgorICAgICAqCisgICAgICogQHNlZSBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERQogICAgICAqLwogICAgIEBQdWJsaWNLZXkKICAgICBATm9uTnVsbApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuamF2YQppbmRleCA2Y2Q0YTJlLi5lNmIzMDY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuamF2YQpAQCAtMTE4LDEzICsxMTgsNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBPVkVSUklERV9DQU1FUkFfTEFORFNDQVBFX1RPX1BPUlRSQUlUID0gMjUwNjc4ODgwTDsKIAogICAgIC8qKgotICAgICAqIFBhY2thZ2UtbGV2ZWwgb3B0IGluL291dCBmb3IgdGhlIGFib3ZlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ09NUEFUX09WRVJSSURFX0xBTkRTQ0FQRV9UT19QT1JUUkFJVCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5jYW1lcmEuUFJPUEVSVFlfQ09NUEFUX09WRVJSSURFX0xBTkRTQ0FQRV9UT19QT1JUUkFJVCI7Ci0KLSAgICAvKioKICAgICAgKiBTeXN0ZW0gcHJvcGVydHkgZm9yIGFsbG93aW5nIHRoZSBhYm92ZQogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC0xMzIsNiArMTI1LDIzIEBACiAgICAgICAgICAgICAiY2FtZXJhLmVuYWJsZV9sYW5kc2NhcGVfdG9fcG9ydHJhaXQiOwogCiAgICAgLyoqCisgICAgICogRW5hYmxlIHBoeXNpY2FsIGNhbWVyYSBhdmFpbGFiaWxpdHkgY2FsbGJhY2tzIHdoZW4gdGhlIGxvZ2ljYWwgY2FtZXJhIGlzIHVuYXZhaWxhYmxlCisgICAgICoKKyAgICAgKiA8cD5QcmV2aW91c2x5IG9uY2UgYSBsb2dpY2FsIGNhbWVyYSBiZWNvbWVzIHVuYXZhaWxhYmxlLCBubyB7QGxpbmsKKyAgICAgKiAjb25QaHlzaWNhbENhbWVyYUF2YWlsYWJsZX0gb3Ige0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhVW5hdmFpbGFibGV9IHdpbGwgYmUgY2FsbGVkIHVudGlsCisgICAgICogdGhlIGxvZ2ljYWwgY2FtZXJhIGJlY29tZXMgYXZhaWxhYmxlIGFnYWluLiBUaGUgcmVzdWx0cyBpbiB0aGUgYXBwIG9wZW5pbmcgdGhlIGxvZ2ljYWwKKyAgICAgKiBjYW1lcmEgbm90IGFibGUgdG8gcmVjZWl2ZSBwaHlzaWNhbCBjYW1lcmEgYXZhaWxhYmlsaXR5IGNoYW5nZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5XaXRoIHRoaXMgY2hhbmdlLCB0aGUge0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhQXZhaWxhYmxlfSBhbmQge0BsaW5rCisgICAgICogI29uUGh5c2ljYWxDYW1lcmFVbmF2YWlsYWJsZX0gY2FuIHN0aWxsIGJlIGNhbGxlZCB3aGlsZSB0aGUgbG9naWNhbCBjYW1lcmEgaXMgdW5hdmFpbGFibGUuCisgICAgICogPC9wPgorICAgICAqLworICAgIEBDaGFuZ2VJZAorICAgIEBFbmFibGVkU2luY2UodGFyZ2V0U2RrVmVyc2lvbiA9IGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5VUFNJREVfRE9XTl9DQUtFKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRU5BQkxFX1BIWVNJQ0FMX0NBTUVSQV9DQUxMQkFDS19GT1JfVU5BVkFJTEFCTEVfTE9HSUNBTF9DQU1FUkEgPQorICAgICAgICAgICAgMjQ0MzU4NTA2TDsKKworICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIENhbWVyYU1hbmFnZXIoQ29udGV4dCBjb250ZXh0KSB7CkBAIC0xMTg5LDcgKzExOTksOCBAQAogICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VNYW5hZ2VyLmdldFByb3BlcnR5KFBST1BFUlRZX0NPTVBBVF9PVkVSUklERV9MQU5EU0NBUEVfVE9fUE9SVFJBSVQsCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VNYW5hZ2VyLmdldFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuUFJPUEVSVFlfQ09NUEFUX09WRVJSSURFX0xBTkRTQ0FQRV9UT19QT1JUUkFJVCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpKS5nZXRCb29sZWFuKCk7CiAgICAgICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIC8vIE5vIHN1Y2ggcHJvcGVydHkKQEAgLTEyMDAsNiArMTIxMSwxNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHBoeXNpY2FsQ2FsbGJhY2tzQXJlRW5hYmxlZEZvclVuYXZhaWxhYmxlQ2FtZXJhKCkgeworICAgICAgICByZXR1cm4gQ29tcGF0Q2hhbmdlcy5pc0NoYW5nZUVuYWJsZWQoCisgICAgICAgICAgICAgICAgRU5BQkxFX1BIWVNJQ0FMX0NBTUVSQV9DQUxMQkFDS19GT1JfVU5BVkFJTEFCTEVfTE9HSUNBTF9DQU1FUkEpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEEgY2FsbGJhY2sgZm9yIGNhbWVyYSBkZXZpY2VzIGJlY29taW5nIGF2YWlsYWJsZSBvciB1bmF2YWlsYWJsZSB0byBvcGVuLgogICAgICAqCiAgICAgICogPHA+Q2FtZXJhcyBiZWNvbWUgYXZhaWxhYmxlIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIGluIHVzZSwgb3Igd2hlbiBhIG5ldwpAQCAtMTI3Niw5ICsxMjk1LDEwIEBACiAgICAgICAgICAqIHRvIGJlZ2luIHdpdGgsIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfSBtYXkgYmUgaW52b2tlZCBhZnRlcgogICAgICAgICAgKiB7QGxpbmsgI29uQ2FtZXJhQXZhaWxhYmxlfS48L3A+CiAgICAgICAgICAqCi0gICAgICAgICAqIDxwPkxpbWl0YXRpb246IE9wZW5pbmcgYSBsb2dpY2FsIGNhbWVyYSBkaXNhYmxlcyB0aGUge0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhQXZhaWxhYmxlfQotICAgICAgICAgKiBhbmQge0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhVW5hdmFpbGFibGV9IGNhbGxiYWNrcyBmb3IgaXRzIHBoeXNpY2FsIGNhbWVyYXMuIEZvciBleGFtcGxlLAotICAgICAgICAgKiBpZiBhcHAgQSBvcGVucyB0aGUgY2FtZXJhIGRldmljZTo8L3A+CisgICAgICAgICAqIDxwPklmIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvI3RhcmdldFNka1ZlcnNpb24gdGFyZ2V0U2RrVmVyc2lvbn0KKyAgICAgICAgICogJmx0OyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1VQU0lERV9ET1dOX0NBS0V9LCBvcGVuaW5nIGEgbG9naWNhbCBjYW1lcmEKKyAgICAgICAgICogZGlzYWJsZXMgdGhlIHtAbGluayAjb25QaHlzaWNhbENhbWVyYUF2YWlsYWJsZX0gYW5kIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfQorICAgICAgICAgKiBjYWxsYmFja3MgZm9yIGl0cyBwaHlzaWNhbCBjYW1lcmFzLiBGb3IgZXhhbXBsZSwgaWYgYXBwIEEgb3BlbnMgdGhlIGNhbWVyYSBkZXZpY2U6PC9wPgogICAgICAgICAgKgogICAgICAgICAgKiA8dWw+CiAgICAgICAgICAqCkBAIC0xMjkwLDYgKzEzMTAsMzMgQEAKICAgICAgICAgICoKICAgICAgICAgICogPC91bD4KICAgICAgICAgICoKKyAgICAgICAgICogPHA+SWYge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8jdGFyZ2V0U2RrVmVyc2lvbiB0YXJnZXRTZGtWZXJzaW9ufQorICAgICAgICAgKiAmZ2U7IHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVVBTSURFX0RPV05fQ0FLRX06PC9wPgorICAgICAgICAgKgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqCisgICAgICAgICAqIDxsaT5BIHBoeXNpY2FsIGNhbWVyYSBzdGF0dXMgY2hhbmdlIHdpbGwgdHJpZ2dlciB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFBdmFpbGFibGV9CisgICAgICAgICAqIG9yIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfSBldmVuIGFmdGVyIHRoZSBsb2dpY2FsIGNhbWVyYSBiZWNvbWVzCisgICAgICAgICAqIHVuYXZhaWxhYmxlLiBBIHtAbGluayAjb25DYW1lcmFVbmF2YWlsYWJsZX0gY2FsbCBmb3IgYSBsb2dpY2FsIGNhbWVyYSBkb2Vzbid0IHJlc2V0IHRoZQorICAgICAgICAgKiBwaHlzaWNhbCBjYW1lcmFzJyBhdmFpbGFiaWxpdHkgc3RhdHVzLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBhbiBhcHBsaWNhdGlvbiBvcGVuaW5nCisgICAgICAgICAqIHRoZSBsb2dpY2FsIGNhbWVyYSBkZXZpY2UgdG8ga25vdyB3aGljaCBwaHlzaWNhbCBjYW1lcmEgYmVjb21lcyB1bmF2YWlsYWJsZSBvciBhdmFpbGFibGUKKyAgICAgICAgICogdG8gdXNlLjwvbGk+CisgICAgICAgICAqCisgICAgICAgICAqIDxsaT5TaW1pbGFyIHRvIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVElSQU1JU1UgQW5kcm9pZCAxM30gYW5kIGVhcmxpZXIsCisgICAgICAgICAqIHRoZSBsb2dpY2FsIGNhbWVyYSdzIHtAbGluayAjb25DYW1lcmFBdmFpbGFibGV9IGNhbGxiYWNrIGltcGxpZXMgYWxsIG9mIGl0cyBwaHlzaWNhbAorICAgICAgICAgKiBjYW1lcmFzJyBzdGF0dXMgYmVjb21lIGF2YWlsYWJsZS4ge0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhVW5hdmFpbGFibGV9IHdpbGwgYmUgY2FsbGVkCisgICAgICAgICAqIGZvciBhbnkgdW5hdmFpbGFibGUgcGh5c2ljYWwgY2FtZXJhcyB1cG9uIHRoZSBsb2dpY2FsIGNhbWVyYSBiZWNvbWluZyBhdmFpbGFibGUuPC9saT4KKyAgICAgICAgICoKKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+R2l2ZW4gdGhlIHBpcGVsaW5lIG5hdHVyZSBvZiB0aGUgY2FtZXJhIGNhcHR1cmUgdGhyb3VnaCB7QGxpbmsKKyAgICAgICAgICogYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXF1ZXN0fSwgdGhlcmUgbWF5IGJlIGZyYW1lIGRyb3BzIGlmIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgKiByZXF1ZXN0cyBpbWFnZXMgZnJvbSBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGFuZCB0aGF0IHBoeXNpY2FsIGNhbWVyYQorICAgICAgICAgKiBiZWNvbWVzIHVuYXZhaWxhYmxlLiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHN0b3AgcmVxdWVzdGluZyBkaXJlY3RseSBmcm9tIGFuIHVuYXZhaWxhYmxlCisgICAgICAgICAqIHBoeXNpY2FsIGNhbWVyYSBhcyBzb29uIGFzIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfSBpcyByZWNlaXZlZCwgYW5kIGFsc28gYmUKKyAgICAgICAgICogcmVhZHkgdG8gcm9idXN0bHkgaGFuZGxlIGZyYW1lIGRyb3AgZXJyb3JzIGZvciByZXF1ZXN0cyB0YXJnZXRpbmcgcGh5c2ljYWwgY2FtZXJhcywKKyAgICAgICAgICogc2luY2UgdGhvc2UgZXJyb3JzIG1heSBhcnJpdmUgYmVmb3JlIHRoZSB1bmF2YWlsYWJpbGl0eSBjYWxsYmFjay48L3A+CisgICAgICAgICAqCiAgICAgICAgICAqIDxwPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy48L3A+CiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBjYW1lcmFJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgpAQCAtMTMxMiw5ICsxMzU5LDEwIEBACiAgICAgICAgICAqIGNhbWVyYXMgb2YgaXRzIHBhcmVudCBsb2dpY2FsIG11bHRpLWNhbWVyYSwgd2hlbiB7QGxpbmsgI29uQ2FtZXJhVW5hdmFpbGFibGV9IGZvcgogICAgICAgICAgKiB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEgaXMgaW52b2tlZC48L3A+CiAgICAgICAgICAqCi0gICAgICAgICAqIDxwPkxpbWl0YXRpb246IE9wZW5pbmcgYSBsb2dpY2FsIGNhbWVyYSBkaXNhYmxlcyB0aGUge0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhQXZhaWxhYmxlfQotICAgICAgICAgKiBhbmQge0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhVW5hdmFpbGFibGV9IGNhbGxiYWNrcyBmb3IgaXRzIHBoeXNpY2FsIGNhbWVyYXMuIEZvciBleGFtcGxlLAotICAgICAgICAgKiBpZiBhcHAgQSBvcGVucyB0aGUgY2FtZXJhIGRldmljZTo8L3A+CisgICAgICAgICAqIDxwPklmIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvI3RhcmdldFNka1ZlcnNpb24gdGFyZ2V0U2RrVmVyc2lvbn0KKyAgICAgICAgICogJmx0OyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1VQU0lERV9ET1dOX0NBS0V9LCBvcGVuaW5nIGEgbG9naWNhbCBjYW1lcmEKKyAgICAgICAgICogZGlzYWJsZXMgdGhlIHtAbGluayAjb25QaHlzaWNhbENhbWVyYUF2YWlsYWJsZX0gYW5kIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfQorICAgICAgICAgKiBjYWxsYmFja3MgZm9yIGl0cyBwaHlzaWNhbCBjYW1lcmFzLiBGb3IgZXhhbXBsZSwgaWYgYXBwIEEgb3BlbnMgdGhlIGNhbWVyYSBkZXZpY2U6PC9wPgogICAgICAgICAgKgogICAgICAgICAgKiA8dWw+CiAgICAgICAgICAqCkBAIC0xMzI2LDYgKzEzNzQsMzMgQEAKICAgICAgICAgICoKICAgICAgICAgICogPC91bD4KICAgICAgICAgICoKKyAgICAgICAgICogPHA+SWYge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8jdGFyZ2V0U2RrVmVyc2lvbiB0YXJnZXRTZGtWZXJzaW9ufQorICAgICAgICAgKiAmZ2U7IHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVVBTSURFX0RPV05fQ0FLRX06PC9wPgorICAgICAgICAgKgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqCisgICAgICAgICAqIDxsaT5BIHBoeXNpY2FsIGNhbWVyYSBzdGF0dXMgY2hhbmdlIHdpbGwgdHJpZ2dlciB7QGxpbmsgI29uUGh5c2ljYWxDYW1lcmFBdmFpbGFibGV9CisgICAgICAgICAqIG9yIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfSBldmVuIGFmdGVyIHRoZSBsb2dpY2FsIGNhbWVyYSBiZWNvbWVzCisgICAgICAgICAqIHVuYXZhaWxhYmxlLiBBIHtAbGluayAjb25DYW1lcmFVbmF2YWlsYWJsZX0gY2FsbCBmb3IgYSBsb2dpY2FsIGNhbWVyYSBkb2Vzbid0IHJlc2V0IHRoZQorICAgICAgICAgKiBwaHlzaWNhbCBjYW1lcmFzJyBhdmFpbGFiaWxpdHkgc3RhdHVzLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBhbiBhcHBsaWNhdGlvbiBvcGVuaW5nCisgICAgICAgICAqIHRoZSBsb2dpY2FsIGNhbWVyYSBkZXZpY2UgdG8ga25vdyB3aGljaCBwaHlzaWNhbCBjYW1lcmEgYmVjb21lcyB1bmF2YWlsYWJsZSBvciBhdmFpbGFibGUKKyAgICAgICAgICogdG8gdXNlLjwvbGk+CisgICAgICAgICAqCisgICAgICAgICAqIDxsaT5TaW1pbGFyIHRvIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVElSQU1JU1UgQW5kcm9pZCAxM30gYW5kIGVhcmxpZXIsCisgICAgICAgICAqIHRoZSBsb2dpY2FsIGNhbWVyYSdzIHtAbGluayAjb25DYW1lcmFBdmFpbGFibGV9IGNhbGxiYWNrIGltcGxpZXMgYWxsIG9mIGl0cyBwaHlzaWNhbAorICAgICAgICAgKiBjYW1lcmFzJyBzdGF0dXMgYmVjb21lIGF2YWlsYWJsZS4ge0BsaW5rICNvblBoeXNpY2FsQ2FtZXJhVW5hdmFpbGFibGV9IHdpbGwgYmUgY2FsbGVkCisgICAgICAgICAqIGZvciBhbnkgdW5hdmFpbGFibGUgcGh5c2ljYWwgY2FtZXJhcyB1cG9uIHRoZSBsb2dpY2FsIGNhbWVyYSBiZWNvbWluZyBhdmFpbGFibGUuPC9saT4KKyAgICAgICAgICoKKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+R2l2ZW4gdGhlIHBpcGVsaW5lIG5hdHVyZSBvZiB0aGUgY2FtZXJhIGNhcHR1cmUgdGhyb3VnaCB7QGxpbmsKKyAgICAgICAgICogYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXF1ZXN0fSwgdGhlcmUgbWF5IGJlIGZyYW1lIGRyb3BzIGlmIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgKiByZXF1ZXN0cyBpbWFnZXMgZnJvbSBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGFuZCB0aGF0IHBoeXNpY2FsIGNhbWVyYQorICAgICAgICAgKiBiZWNvbWVzIHVuYXZhaWxhYmxlLiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHN0b3AgcmVxdWVzdGluZyBkaXJlY3RseSBmcm9tIGFuIHVuYXZhaWxhYmxlCisgICAgICAgICAqIHBoeXNpY2FsIGNhbWVyYSBhcyBzb29uIGFzIHtAbGluayAjb25QaHlzaWNhbENhbWVyYVVuYXZhaWxhYmxlfSBpcyByZWNlaXZlZCwgYW5kIGFsc28gYmUKKyAgICAgICAgICogcmVhZHkgdG8gcm9idXN0bHkgaGFuZGxlIGZyYW1lIGRyb3AgZXJyb3JzIGZvciByZXF1ZXN0cyB0YXJnZXRpbmcgcGh5c2ljYWwgY2FtZXJhcywKKyAgICAgICAgICogc2luY2UgdGhvc2UgZXJyb3JzIG1heSBhcnJpdmUgYmVmb3JlIHRoZSB1bmF2YWlsYWJpbGl0eSBjYWxsYmFjay48L3A+CisgICAgICAgICAqCiAgICAgICAgICAqIDxwPlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy48L3A+CiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBjYW1lcmFJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgpAQCAtMjI4OSw3ICsyMzY0LDggQEAKICAgICAgICAgICAgICAgICBwb3N0U2luZ2xlVXBkYXRlKGNhbGxiYWNrLCBleGVjdXRvciwgaWQsIG51bGwgLypwaHlzaWNhbElkKi8sIHN0YXR1cyk7CiAKICAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBOT1RfUFJFU0VOVCBzdGF0ZSBmb3IgdW5hdmFpbGFibGUgcGh5c2ljYWwgY2FtZXJhcwotICAgICAgICAgICAgICAgIGlmIChpc0F2YWlsYWJsZShzdGF0dXMpICYmIG1VbmF2YWlsYWJsZVBoeXNpY2FsRGV2aWNlcy5jb250YWluc0tleShpZCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGlzQXZhaWxhYmxlKHN0YXR1cykgfHwgcGh5c2ljYWxDYWxsYmFja3NBcmVFbmFibGVkRm9yVW5hdmFpbGFibGVDYW1lcmEoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1VbmF2YWlsYWJsZVBoeXNpY2FsRGV2aWNlcy5jb250YWluc0tleShpZCkpIHsKICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdW5hdmFpbGFibGVJZHMgPSBtVW5hdmFpbGFibGVQaHlzaWNhbERldmljZXMuZ2V0KGlkKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdW5hdmFpbGFibGVJZCA6IHVuYXZhaWxhYmxlSWRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0U2luZ2xlVXBkYXRlKGNhbGxiYWNrLCBleGVjdXRvciwgaWQsIHVuYXZhaWxhYmxlSWQsCkBAIC0yNDIyLDcgKzI0OTgsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCFpc0F2YWlsYWJsZShtRGV2aWNlU3RhdHVzLmdldChpZCkpKSB7CisgICAgICAgICAgICBpZiAoIXBoeXNpY2FsQ2FsbGJhY2tzQXJlRW5hYmxlZEZvclVuYXZhaWxhYmxlQ2FtZXJhKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIWlzQXZhaWxhYmxlKG1EZXZpY2VTdGF0dXMuZ2V0KGlkKSkpIHsKICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoIkNhbWVyYSAlcyBpcyBub3QgYXZhaWxhYmxlLiBJZ25vcmUgcGh5c2ljYWwgY2FtZXJhICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgInN0YXR1cyBjaGFuZ2UgY2FsbGJhY2socykiLCBpZCkpOwogICAgICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuamF2YQppbmRleCA3MDVhZmM1Li5lZDJhMTk4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5qYXZhCkBAIC0zNjQ1LDE3ICszNjQ1LDEzIEBACiAgICAgLy8KIAogICAgIC8qKgotICAgICAqIDxwPlRoaXMgaXMgdGhlIGRlZmF1bHQgc2Vuc29yIHBpeGVsIG1vZGUuIFRoaXMgaXMgdGhlIG9ubHkgc2Vuc29yIHBpeGVsIG1vZGUKLSAgICAgKiBzdXBwb3J0ZWQgdW5sZXNzIGEgY2FtZXJhIGRldmljZSBhZHZlcnRpc2VzCi0gICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9LjwvcD4KKyAgICAgKiA8cD5UaGlzIGlzIHRoZSBkZWZhdWx0IHNlbnNvciBwaXhlbCBtb2RlLjwvcD4KICAgICAgKiBAc2VlIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCA9IDA7CiAKICAgICAvKioKLSAgICAgKiA8cD5UaGlzIHNlbnNvciBwaXhlbCBtb2RlIGlzIG9mZmVyZWQgYnkgZGV2aWNlcyB3aXRoIGNhcGFiaWxpdHkKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0uCi0gICAgICogSW4gdGhpcyBtb2RlLCBzZW5zb3JzIHR5cGljYWxseSBkbyBub3QgYmluIHBpeGVscywgYXMgYSByZXN1bHQgY2FuIG9mZmVyIGxhcmdlcgorICAgICAqIDxwPkluIHRoaXMgbW9kZSwgc2Vuc29ycyB0eXBpY2FsbHkgZG8gbm90IGJpbiBwaXhlbHMsIGFzIGEgcmVzdWx0IGNhbiBvZmZlciBsYXJnZXIKICAgICAgKiBpbWFnZSBzaXplcy48L3A+CiAgICAgICogQHNlZSBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERQogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5qYXZhCmluZGV4IDM4MWM4N2QuLjkyOTg2OGIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmphdmEKQEAgLTE0MzAsNyArMTQzMCw5IEBACiAgICAgICogbW9kZS48L3A+CiAgICAgICogPHA+Rm9yIGNhbWVyYSBkZXZpY2VzIHdpdGggdGhlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogY2FwYWJpbGl0eSwKKyAgICAgKiBjYXBhYmlsaXR5IG9yIGRldmljZXMgd2hlcmUKKyAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldEF2YWlsYWJsZUNhcHR1cmVSZXF1ZXN0S2V5cyB9CisgICAgICogbGlzdHMge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9fQogICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IC8KICAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gbXVzdCBiZSB1c2VkIGFzIHRoZQogICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIGZvciByZXF1ZXN0cyB3aGVyZSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfSBpcyBzZXQgdG8KQEAgLTE2NjAsNyArMTY2MiwxMCBAQAogICAgICAqIG1vZGUuPC9wPgogICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIHRoZQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQotICAgICAqIGNhcGFiaWxpdHksIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IC8KKyAgICAgKiBjYXBhYmlsaXR5IG9yIGRldmljZXMgd2hlcmUKKyAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldEF2YWlsYWJsZUNhcHR1cmVSZXF1ZXN0S2V5cyB9CisgICAgICogbGlzdHMge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9fSwKKyAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSAvCiAgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IG11c3QgYmUgdXNlZCBhcyB0aGUKICAgICAgKiBjb29yZGluYXRlIHN5c3RlbSBmb3IgcmVxdWVzdHMgd2hlcmUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX0gaXMgc2V0IHRvCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04gfS48L3A+CkBAIC0xODgyLDcgKzE4ODcsMTAgQEAKICAgICAgKiBtb2RlLjwvcD4KICAgICAgKiA8cD5Gb3IgY2FtZXJhIGRldmljZXMgd2l0aCB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5LCB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSAvCisgICAgICogY2FwYWJpbGl0eSBvciBkZXZpY2VzIHdoZXJlCisgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXRBdmFpbGFibGVDYXB0dXJlUmVxdWVzdEtleXMgfQorICAgICAqIGxpc3RzIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfX0sCisgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gLwogICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSBtdXN0IGJlIHVzZWQgYXMgdGhlCiAgICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gZm9yIHJlcXVlc3RzIHdoZXJlIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9IGlzIHNldCB0bwogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0uPC9wPgpAQCAtMzE2OSw3ICszMTc3LDkgQEAKICAgICAgKiB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjQ09OVFJPTF9aT09NX1JBVElPIGFuZHJvaWQuY29udHJvbC56b29tUmF0aW99IGZvciBkZXRhaWxzLjwvcD4KICAgICAgKiA8cD5Gb3IgY2FtZXJhIGRldmljZXMgd2l0aCB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5LCB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSAvCisgICAgICogY2FwYWJpbGl0eSBvciBkZXZpY2VzIHdoZXJlIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0QXZhaWxhYmxlQ2FwdHVyZVJlcXVlc3RLZXlzIH0KKyAgICAgKiBsaXN0cyB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX19PC9wPgorICAgICAqIDxwPntAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IC8KICAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gbXVzdCBiZSB1c2VkIGFzIHRoZQogICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIGZvciByZXF1ZXN0cyB3aGVyZSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfSBpcyBzZXQgdG8KICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiB9LjwvcD4KQEAgLTM1MTcsMTMgKzM1MjcsMTAgQEAKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQgfSBtb2RlLgogICAgICAqIFdoZW4gb3BlcmF0aW5nIGluCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUIH0gbW9kZSwgc2Vuc29ycwotICAgICAqIHdpdGgge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogY2FwYWJpbGl0eSB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSBwaXhlbCBiaW5uaW5nIGluIG9yZGVyIHRvIGltcHJvdmUgbG93IGxpZ2h0CisgICAgICogd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gcGl4ZWwgYmlubmluZyBpbiBvcmRlciB0byBpbXByb3ZlIGxvdyBsaWdodAogICAgICAqIHBlcmZvcm1hbmNlLCBub2lzZSByZWR1Y3Rpb24gZXRjLiBIb3dldmVyLCBpbgogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0KLSAgICAgKiBtb2RlIChzdXBwb3J0ZWQgb25seQotICAgICAqIGJ5IHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQotICAgICAqIHNlbnNvcnMpLCBzZW5zb3JzIHR5cGljYWxseSBvcGVyYXRlIGluIHVuYmlubmVkIG1vZGUgYWxsb3dpbmcgZm9yIGEgbGFyZ2VyIGltYWdlIHNpemUuCisgICAgICogbW9kZSwgc2Vuc29ycyB0eXBpY2FsbHkgb3BlcmF0ZSBpbiB1bmJpbm5lZCBtb2RlIGFsbG93aW5nIGZvciBhIGxhcmdlciBpbWFnZSBzaXplLgogICAgICAqIFRoZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGluCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04gfQogICAgICAqIG1vZGUgYXJlIGFsc28gZGlmZmVyZW50IGZyb20gdGhvc2Ugb2YKQEAgLTM1MzcsNyArMzU0NCwzMiBAQAogICAgICAqIDxjb2RlPntAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUCBhbmRyb2lkLnNjYWxlci5zdHJlYW1Db25maWd1cmF0aW9uTWFwfTwvY29kZT4KICAgICAgKiBtdXN0IG5vdCBiZSBtaXhlZCBpbiB0aGUgc2FtZSBDYXB0dXJlUmVxdWVzdC4gSW4gb3RoZXIgd29yZHMsIHRoZXNlIG91dHB1dHMgYXJlCiAgICAgICogZXhjbHVzaXZlIHRvIGVhY2ggb3RoZXIuCi0gICAgICogVGhpcyBrZXkgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQgZm9yIHJlcHJvY2VzcyByZXF1ZXN0cy48L3A+CisgICAgICogVGhpcyBrZXkgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQgZm9yIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgKiBUaGlzIGtleSB3aWxsIGJlIGJlIHByZXNlbnQgb24gZGV2aWNlcyBzdXBwb3J0aW5nIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQorICAgICAqIGNhcGFiaWxpdHkuIEl0IG1heSBhbHNvIGJlIHByZXNlbnQgb24gZGV2aWNlcyB3aGljaCBkbyBub3Qgc3VwcG9ydCB0aGUgYWZvcmVtZW50aW9uZWQKKyAgICAgKiBjYXBhYmlsaXR5LiBJbiB0aGF0IGNhc2U6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+CisgICAgICogPHA+VGhlIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb25zIGxpc3RlZCBpbgorICAgICAqICAge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MubWFuZGF0b3J5TWF4aW11bVJlc29sdXRpb25TdHJlYW1Db21iaW5hdGlvbnMgfQorICAgICAqICAgd291bGQgbm90IGFwcGx5LjwvcD4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiA8cD5UaGUgYmF5ZXIgcGF0dGVybiBvZiB7QGNvZGUgUkFXfSBzdHJlYW1zIHdoZW4KKyAgICAgKiAgIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0KKyAgICAgKiAgIGlzIHNlbGVjdGVkIHdpbGwgYmUgdGhlIG9uZSBsaXN0ZWQgaW4ge0BsaW5rIGFuZHJvaWQuc2Vuc29yLmluZm8uYmlubmluZ0ZhY3RvciB9LjwvcD4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiA8cD5UaGUgZm9sbG93aW5nIGtleXMgd2lsbCBhbHdheXMgYmUgcHJlc2VudDo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NDQUxFUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NQVBfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2NhbGVyLnN0cmVhbUNvbmZpZ3VyYXRpb25NYXBNYXhpbXVtUmVzb2x1dGlvbn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufTwvbGk+CisgICAgICogPGxpPntAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5waXhlbEFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufTwvbGk+CisgICAgICogPGxpPntAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L2xpPgorICAgICAqIDwvdWw+CiAgICAgICogPHA+PGI+UG9zc2libGUgdmFsdWVzOjwvYj48L3A+CiAgICAgICogPHVsPgogICAgICAqICAgPGxpPntAbGluayAjU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCBERUZBVUxUfTwvbGk+CkBAIC0zNTQ4LDYgKzM1ODAsOSBAQAogICAgICAqCiAgICAgICogQHNlZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUAogICAgICAqIEBzZWUgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NDQUxFUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NQVBfTUFYSU1VTV9SRVNPTFVUSU9OCisgICAgICogQHNlZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OCisgICAgICogQHNlZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04KKyAgICAgKiBAc2VlIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04KICAgICAgKiBAc2VlICNTRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUCiAgICAgICogQHNlZSAjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhcHR1cmVSZXN1bHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FwdHVyZVJlc3VsdC5qYXZhCmluZGV4IDYzNWU3OWMuLmE0MjlmMzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FwdHVyZVJlc3VsdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FwdHVyZVJlc3VsdC5qYXZhCkBAIC04NDksNyArODQ5LDkgQEAKICAgICAgKiBtb2RlLjwvcD4KICAgICAgKiA8cD5Gb3IgY2FtZXJhIGRldmljZXMgd2l0aCB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5LAorICAgICAqIGNhcGFiaWxpdHkgb3IgZGV2aWNlcyB3aGVyZQorICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0QXZhaWxhYmxlQ2FwdHVyZVJlcXVlc3RLZXlzIH0KKyAgICAgKiBsaXN0cyB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX19CiAgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gLwogICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSBtdXN0IGJlIHVzZWQgYXMgdGhlCiAgICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gZm9yIHJlcXVlc3RzIHdoZXJlIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9IGlzIHNldCB0bwpAQCAtMTMyOSw3ICsxMzMxLDEwIEBACiAgICAgICogbW9kZS48L3A+CiAgICAgICogPHA+Rm9yIGNhbWVyYSBkZXZpY2VzIHdpdGggdGhlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogY2FwYWJpbGl0eSwge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gLworICAgICAqIGNhcGFiaWxpdHkgb3IgZGV2aWNlcyB3aGVyZQorICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0QXZhaWxhYmxlQ2FwdHVyZVJlcXVlc3RLZXlzIH0KKyAgICAgKiBsaXN0cyB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX19LAorICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IC8KICAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gbXVzdCBiZSB1c2VkIGFzIHRoZQogICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIGZvciByZXF1ZXN0cyB3aGVyZSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfSBpcyBzZXQgdG8KICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiB9LjwvcD4KQEAgLTE5NjIsNyArMTk2NywxMCBAQAogICAgICAqIG1vZGUuPC9wPgogICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIHRoZQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQotICAgICAqIGNhcGFiaWxpdHksIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IC8KKyAgICAgKiBjYXBhYmlsaXR5IG9yIGRldmljZXMgd2hlcmUKKyAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldEF2YWlsYWJsZUNhcHR1cmVSZXF1ZXN0S2V5cyB9CisgICAgICogbGlzdHMge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9fSwKKyAgICAgKiB7QGxpbmsgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLmFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSAvCiAgICAgICoge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IG11c3QgYmUgdXNlZCBhcyB0aGUKICAgICAgKiBjb29yZGluYXRlIHN5c3RlbSBmb3IgcmVxdWVzdHMgd2hlcmUge0BsaW5rIENhcHR1cmVSZXF1ZXN0I1NFTlNPUl9QSVhFTF9NT0RFIGFuZHJvaWQuc2Vuc29yLnBpeGVsTW9kZX0gaXMgc2V0IHRvCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04gfS48L3A+CkBAIC0zODMxLDcgKzM4MzksOSBAQAogICAgICAqIHtAbGluayBDYXB0dXJlUmVxdWVzdCNDT05UUk9MX1pPT01fUkFUSU8gYW5kcm9pZC5jb250cm9sLnpvb21SYXRpb30gZm9yIGRldGFpbHMuPC9wPgogICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIHRoZQogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IgfQotICAgICAqIGNhcGFiaWxpdHksIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259IC8KKyAgICAgKiBjYXBhYmlsaXR5IG9yIGRldmljZXMgd2hlcmUge0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXRBdmFpbGFibGVDYXB0dXJlUmVxdWVzdEtleXMgfQorICAgICAqIGxpc3RzIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSB7QGxpbmsgQ2FwdHVyZVJlcXVlc3QjU0VOU09SX1BJWEVMX01PREUgYW5kcm9pZC5zZW5zb3IucGl4ZWxNb2RlfX08L3A+CisgICAgICogPHA+e0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5hY3RpdmVBcnJheVNpemVNYXhpbXVtUmVzb2x1dGlvbn0gLwogICAgICAqIHtAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8ucHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZU1heGltdW1SZXNvbHV0aW9ufSBtdXN0IGJlIHVzZWQgYXMgdGhlCiAgICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gZm9yIHJlcXVlc3RzIHdoZXJlIHtAbGluayBDYXB0dXJlUmVxdWVzdCNTRU5TT1JfUElYRUxfTU9ERSBhbmRyb2lkLnNlbnNvci5waXhlbE1vZGV9IGlzIHNldCB0bwogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIH0uPC9wPgpAQCAtNDQ0MiwxMyArNDQ1MiwxMCBAQAogICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCB9IG1vZGUuCiAgICAgICogV2hlbiBvcGVyYXRpbmcgaW4KICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQgfSBtb2RlLCBzZW5zb3JzCi0gICAgICogd2l0aCB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIH0KLSAgICAgKiBjYXBhYmlsaXR5IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHBpeGVsIGJpbm5pbmcgaW4gb3JkZXIgdG8gaW1wcm92ZSBsb3cgbGlnaHQKKyAgICAgKiB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSBwaXhlbCBiaW5uaW5nIGluIG9yZGVyIHRvIGltcHJvdmUgbG93IGxpZ2h0CiAgICAgICogcGVyZm9ybWFuY2UsIG5vaXNlIHJlZHVjdGlvbiBldGMuIEhvd2V2ZXIsIGluCiAgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04gfQotICAgICAqIG1vZGUgKHN1cHBvcnRlZCBvbmx5Ci0gICAgICogYnkge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9Ci0gICAgICogc2Vuc29ycyksIHNlbnNvcnMgdHlwaWNhbGx5IG9wZXJhdGUgaW4gdW5iaW5uZWQgbW9kZSBhbGxvd2luZyBmb3IgYSBsYXJnZXIgaW1hZ2Ugc2l6ZS4KKyAgICAgKiBtb2RlLCBzZW5zb3JzIHR5cGljYWxseSBvcGVyYXRlIGluIHVuYmlubmVkIG1vZGUgYWxsb3dpbmcgZm9yIGEgbGFyZ2VyIGltYWdlIHNpemUuCiAgICAgICogVGhlIHN0cmVhbSBjb25maWd1cmF0aW9ucyBzdXBwb3J0ZWQgaW4KICAgICAgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiB9CiAgICAgICogbW9kZSBhcmUgYWxzbyBkaWZmZXJlbnQgZnJvbSB0aG9zZSBvZgpAQCAtNDQ2Miw3ICs0NDY5LDMyIEBACiAgICAgICogPGNvZGU+e0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTQ0FMRVJfU1RSRUFNX0NPTkZJR1VSQVRJT05fTUFQIGFuZHJvaWQuc2NhbGVyLnN0cmVhbUNvbmZpZ3VyYXRpb25NYXB9PC9jb2RlPgogICAgICAqIG11c3Qgbm90IGJlIG1peGVkIGluIHRoZSBzYW1lIENhcHR1cmVSZXF1ZXN0LiBJbiBvdGhlciB3b3JkcywgdGhlc2Ugb3V0cHV0cyBhcmUKICAgICAgKiBleGNsdXNpdmUgdG8gZWFjaCBvdGhlci4KLSAgICAgKiBUaGlzIGtleSBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldCBmb3IgcmVwcm9jZXNzIHJlcXVlc3RzLjwvcD4KKyAgICAgKiBUaGlzIGtleSBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldCBmb3IgcmVwcm9jZXNzIHJlcXVlc3RzLgorICAgICAqIFRoaXMga2V5IHdpbGwgYmUgYmUgcHJlc2VudCBvbiBkZXZpY2VzIHN1cHBvcnRpbmcgdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiB9CisgICAgICogY2FwYWJpbGl0eS4gSXQgbWF5IGFsc28gYmUgcHJlc2VudCBvbiBkZXZpY2VzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZSBhZm9yZW1lbnRpb25lZAorICAgICAqIGNhcGFiaWxpdHkuIEluIHRoYXQgY2FzZTo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT4KKyAgICAgKiA8cD5UaGUgbWFuZGF0b3J5IHN0cmVhbSBjb21iaW5hdGlvbnMgbGlzdGVkIGluCisgICAgICogICB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUNoYXJhY3RlcmlzdGljcy5tYW5kYXRvcnlNYXhpbXVtUmVzb2x1dGlvblN0cmVhbUNvbWJpbmF0aW9ucyB9CisgICAgICogICB3b3VsZCBub3QgYXBwbHkuPC9wPgorICAgICAqIDwvbGk+CisgICAgICogPGxpPgorICAgICAqIDxwPlRoZSBiYXllciBwYXR0ZXJuIG9mIHtAY29kZSBSQVd9IHN0cmVhbXMgd2hlbgorICAgICAqICAge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04gfQorICAgICAqICAgaXMgc2VsZWN0ZWQgd2lsbCBiZSB0aGUgb25lIGxpc3RlZCBpbiB7QGxpbmsgYW5kcm9pZC5zZW5zb3IuaW5mby5iaW5uaW5nRmFjdG9yIH0uPC9wPgorICAgICAqIDwvbGk+CisgICAgICogPGxpPgorICAgICAqIDxwPlRoZSBmb2xsb3dpbmcga2V5cyB3aWxsIGFsd2F5cyBiZSBwcmVzZW50OjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUF9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zY2FsZXIuc3RyZWFtQ29uZmlndXJhdGlvbk1hcE1heGltdW1SZXNvbHV0aW9ufTwvbGk+CisgICAgICogPGxpPntAbGluayBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIGFuZHJvaWQuc2Vuc29yLmluZm8uYWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19QSVhFTF9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBhbmRyb2lkLnNlbnNvci5pbmZvLnBpeGVsQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gYW5kcm9pZC5zZW5zb3IuaW5mby5wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlTaXplTWF4aW11bVJlc29sdXRpb259PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KICAgICAgKiA8cD48Yj5Qb3NzaWJsZSB2YWx1ZXM6PC9iPjwvcD4KICAgICAgKiA8dWw+CiAgICAgICogICA8bGk+e0BsaW5rICNTRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUIERFRkFVTFR9PC9saT4KQEAgLTQ0NzMsNiArNDUwNSw5IEBACiAgICAgICoKICAgICAgKiBAc2VlIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTQ0FMRVJfU1RSRUFNX0NPTkZJR1VSQVRJT05fTUFQCiAgICAgICogQHNlZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MjU0NBTEVSX1NUUkVBTV9DT05GSUdVUkFUSU9OX01BUF9NQVhJTVVNX1JFU09MVVRJT04KKyAgICAgKiBAc2VlIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04KKyAgICAgKiBAc2VlIENhbWVyYUNoYXJhY3RlcmlzdGljcyNTRU5TT1JfSU5GT19QSVhFTF9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTgorICAgICAqIEBzZWUgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzI1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTgogICAgICAqIEBzZWUgI1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQKICAgICAgKiBAc2VlICNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFBZHZhbmNlZEV4dGVuc2lvblNlc3Npb25JbXBsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL2ltcGwvQ2FtZXJhQWR2YW5jZWRFeHRlbnNpb25TZXNzaW9uSW1wbC5qYXZhCmluZGV4IGRiODNlNjIuLjJmYThiODcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFBZHZhbmNlZEV4dGVuc2lvblNlc3Npb25JbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9pbXBsL0NhbWVyYUFkdmFuY2VkRXh0ZW5zaW9uU2Vzc2lvbkltcGwuamF2YQpAQCAtMTAxLDE1ICsxMDEsMTUgQEAKIAogCiAgICAgLy8gTG9jayB0byBzeW5jaHJvbml6ZSBjcm9zcy10aHJlYWQgYWNjZXNzIHRvIGRldmljZSBwdWJsaWMgaW50ZXJmYWNlCi0gICAgZmluYWwgT2JqZWN0IG1JbnRlcmZhY2VMb2NrID0gbmV3IE9iamVjdCgpOyAvLyBhY2Nlc3MgZnJvbSB0aGlzIGNsYXNzIGFuZCBTZXNzaW9uIG9ubHkhCisgICAgZmluYWwgT2JqZWN0IG1JbnRlcmZhY2VMb2NrOwogCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DQU1FUkEpCiAgICAgcHVibGljIHN0YXRpYyBDYW1lcmFBZHZhbmNlZEV4dGVuc2lvblNlc3Npb25JbXBsIGNyZWF0ZUNhbWVyYUFkdmFuY2VkRXh0ZW5zaW9uU2Vzc2lvbigKLSAgICAgICAgICAgIEBOb25OdWxsIENhbWVyYURldmljZSBjYW1lcmFEZXZpY2UsIEBOb25OdWxsIENvbnRleHQgY3R4LAotICAgICAgICAgICAgQE5vbk51bGwgRXh0ZW5zaW9uU2Vzc2lvbkNvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgc2Vzc2lvbklkKQorICAgICAgICAgICAgQE5vbk51bGwgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmltcGwuQ2FtZXJhRGV2aWNlSW1wbCBjYW1lcmFEZXZpY2UsCisgICAgICAgICAgICBATm9uTnVsbCBDb250ZXh0IGN0eCwgQE5vbk51bGwgRXh0ZW5zaW9uU2Vzc2lvbkNvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgc2Vzc2lvbklkKQogICAgICAgICAgICAgdGhyb3dzIENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiwgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgbG9uZyBjbGllbnRJZCA9IENhbWVyYUV4dGVuc2lvbkNoYXJhY3RlcmlzdGljcy5yZWdpc3RlckNsaWVudChjdHgpOwogICAgICAgICBpZiAoY2xpZW50SWQgPCAwKSB7CkBAIC0yMDksNyArMjA5LDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIENhbWVyYUFkdmFuY2VkRXh0ZW5zaW9uU2Vzc2lvbkltcGwobG9uZyBleHRlbnNpb25DbGllbnRJZCwKLSAgICAgICAgICAgIEBOb25OdWxsIElBZHZhbmNlZEV4dGVuZGVySW1wbCBleHRlbmRlciwgQE5vbk51bGwgQ2FtZXJhRGV2aWNlIGNhbWVyYURldmljZSwKKyAgICAgICAgICAgIEBOb25OdWxsIElBZHZhbmNlZEV4dGVuZGVySW1wbCBleHRlbmRlciwKKyAgICAgICAgICAgIEBOb25OdWxsIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhbWVyYURldmljZUltcGwgY2FtZXJhRGV2aWNlLAogICAgICAgICAgICAgQE51bGxhYmxlIFN1cmZhY2UgcmVwZWF0aW5nUmVxdWVzdFN1cmZhY2UsIEBOdWxsYWJsZSBTdXJmYWNlIGJ1cnN0Q2FwdHVyZVN1cmZhY2UsCiAgICAgICAgICAgICBATnVsbGFibGUgU3VyZmFjZSBwb3N0dmlld1N1cmZhY2UsCiAgICAgICAgICAgICBATm9uTnVsbCBDYW1lcmFFeHRlbnNpb25TZXNzaW9uLlN0YXRlQ2FsbGJhY2sgY2FsbGJhY2ssIEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yLApAQCAtMjI4LDYgKzIyOSw3IEBACiAgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOwogICAgICAgICBtSW5pdGlhbGl6ZUhhbmRsZXIgPSBuZXcgSW5pdGlhbGl6ZVNlc3Npb25IYW5kbGVyKCk7CiAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgIG1JbnRlcmZhY2VMb2NrID0gY2FtZXJhRGV2aWNlLm1JbnRlcmZhY2VMb2NrOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTk5LDEzICs2MDEsMTQgQEAKICAgICAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmVkKEBOb25OdWxsIENhbWVyYUNhcHR1cmVTZXNzaW9uIHNlc3Npb24pIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUludGVyZmFjZUxvY2spIHsKICAgICAgICAgICAgICAgICBtQ2FwdHVyZVNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENhbWVyYUV4dGVuc2lvbkNoYXJhY3RlcmlzdGljcy5pbml0aWFsaXplU2Vzc2lvbihtSW5pdGlhbGl6ZUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBpbml0aWFsaXplIHNlc3Npb24hIEV4dGVuc2lvbiBzZXJ2aWNlIGRvZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCByZXNwb25kISIpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlDb25maWd1cmF0aW9uRmFpbHVyZSgpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDYW1lcmFFeHRlbnNpb25DaGFyYWN0ZXJpc3RpY3MuaW5pdGlhbGl6ZVNlc3Npb24obUluaXRpYWxpemVIYW5kbGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgc2Vzc2lvbiEgRXh0ZW5zaW9uIHNlcnZpY2UgZG9lcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgcmVzcG9uZCEiKTsKKyAgICAgICAgICAgICAgICBub3RpZnlDb25maWd1cmF0aW9uRmFpbHVyZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNjEzLDQ2ICs2MTYsNTYgQEAKICAgICBwcml2YXRlIGNsYXNzIEluaXRpYWxpemVTZXNzaW9uSGFuZGxlciBleHRlbmRzIElJbml0aWFsaXplU2Vzc2lvbkNhbGxiYWNrLlN0dWIgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKCkgewotICAgICAgICAgICAgYm9vbGVhbiBzdGF0dXMgPSB0cnVlOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtSW50ZXJmYWNlTG9jaykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvblByb2Nlc3NvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblByb2Nlc3Nvci5vbkNhcHR1cmVTZXNzaW9uU3RhcnQobVJlcXVlc3RQcm9jZXNzb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkZhaWxlZCB0byBzdGFydCBjYXB0dXJlIHNlc3Npb24sIHNlc3Npb24gcmVsZWFzZWQgYmVmb3JlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIHN0YXJ0ISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2FwdHVyZVNlc3Npb24uY2xvc2UoKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdGF0dXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnRlcmZhY2VMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvblByb2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uUHJvY2Vzc29yLm9uQ2FwdHVyZVNlc3Npb25TdGFydChtUmVxdWVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRmFpbGVkIHRvIHN0YXJ0IGNhcHR1cmUgc2Vzc2lvbiwgc2Vzc2lvbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVsZWFzZWQgYmVmb3JlIGV4dGVuc2lvbiBzdGFydCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnQgY2FwdHVyZSBzZXNzaW9uLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleHRlbnNpb24gc2VydmljZSBkb2VzIG5vdCByZXNwb25kISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHN0YXJ0IGNhcHR1cmUgc2Vzc2lvbiwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGV4dGVuc2lvbiBzZXJ2aWNlIGRvZXMgbm90IHJlc3BvbmQhIik7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtQ2FwdHVyZVNlc3Npb24uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbUNhbGxiYWNrcy5vbkNvbmZpZ3VyZWQoQ2FtZXJhQWR2YW5jZWRFeHRlbnNpb25TZXNzaW9uSW1wbC50aGlzKSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FeGVjdXRvci5leGVjdXRlKCgpIC0+IG1DYWxsYmFja3Mub25Db25maWd1cmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhQWR2YW5jZWRFeHRlbnNpb25TZXNzaW9uSW1wbC50aGlzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uRmFpbHVyZSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBub3RpZnlDb25maWd1cmF0aW9uRmFpbHVyZSgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKCkgewotICAgICAgICAgICAgbUNhcHR1cmVTZXNzaW9uLmNsb3NlKCk7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm94eSBzZXJ2aWNlIHNlc3Npb24hIgotICAgICAgICAgICAgICAgICAgICArICIgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdHJ5aW5nIHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSAiCi0gICAgICAgICAgICAgICAgICAgICsgImNvbmN1cnJlbnQgZXh0ZW5zaW9uIHNlc3Npb25zISIpOwotICAgICAgICAgICAgbm90aWZ5Q29uZmlndXJhdGlvbkZhaWx1cmUoKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVTZXNzaW9uLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJveHkgc2VydmljZSBzZXNzaW9uISIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdHJ5aW5nIHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29uY3VycmVudCBleHRlbnNpb24gc2Vzc2lvbnMhIik7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUNvbmZpZ3VyYXRpb25GYWlsdXJlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFFeHRlbnNpb25TZXNzaW9uSW1wbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9pbXBsL0NhbWVyYUV4dGVuc2lvblNlc3Npb25JbXBsLmphdmEKaW5kZXggYzJiMzY1Ni4uOWM4NzhjNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9pbXBsL0NhbWVyYUV4dGVuc2lvblNlc3Npb25JbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9pbXBsL0NhbWVyYUV4dGVuc2lvblNlc3Npb25JbXBsLmphdmEKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtSW50ZXJuYWxSZXBlYXRpbmdSZXF1ZXN0RW5hYmxlZCA9IHRydWU7CiAKICAgICAvLyBMb2NrIHRvIHN5bmNocm9uaXplIGNyb3NzLXRocmVhZCBhY2Nlc3MgdG8gZGV2aWNlIHB1YmxpYyBpbnRlcmZhY2UKLSAgICBmaW5hbCBPYmplY3QgbUludGVyZmFjZUxvY2sgPSBuZXcgT2JqZWN0KCk7IC8vIGFjY2VzcyBmcm9tIHRoaXMgY2xhc3MgYW5kIFNlc3Npb24gb25seSEKKyAgICBmaW5hbCBPYmplY3QgbUludGVyZmFjZUxvY2s7CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmF0aXZlR2V0U3VyZmFjZUZvcm1hdChTdXJmYWNlIHN1cmZhY2UpIHsKICAgICAgICAgcmV0dXJuIFN1cmZhY2VVdGlscy5nZXRTdXJmYWNlRm9ybWF0KHN1cmZhY2UpOwpAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ0FNRVJBKQogICAgIHB1YmxpYyBzdGF0aWMgQ2FtZXJhRXh0ZW5zaW9uU2Vzc2lvbkltcGwgY3JlYXRlQ2FtZXJhRXh0ZW5zaW9uU2Vzc2lvbigKLSAgICAgICAgICAgIEBOb25OdWxsIENhbWVyYURldmljZSBjYW1lcmFEZXZpY2UsCisgICAgICAgICAgICBATm9uTnVsbCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuaW1wbC5DYW1lcmFEZXZpY2VJbXBsIGNhbWVyYURldmljZSwKICAgICAgICAgICAgIEBOb25OdWxsIENvbnRleHQgY3R4LAogICAgICAgICAgICAgQE5vbk51bGwgRXh0ZW5zaW9uU2Vzc2lvbkNvbmZpZ3VyYXRpb24gY29uZmlnLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKQEAgLTI1MSw3ICsyNTEsNyBAQAogICAgICAgICAgICAgQE5vbk51bGwgSVByZXZpZXdFeHRlbmRlckltcGwgcHJldmlld0V4dGVuZGVyLAogICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxTaXplPiBwcmV2aWV3U2l6ZXMsCiAgICAgICAgICAgICBsb25nIGV4dGVuc2lvbkNsaWVudElkLAotICAgICAgICAgICAgQE5vbk51bGwgQ2FtZXJhRGV2aWNlIGNhbWVyYURldmljZSwKKyAgICAgICAgICAgIEBOb25OdWxsIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhbWVyYURldmljZUltcGwgY2FtZXJhRGV2aWNlLAogICAgICAgICAgICAgQE51bGxhYmxlIFN1cmZhY2UgcmVwZWF0aW5nUmVxdWVzdFN1cmZhY2UsCiAgICAgICAgICAgICBATnVsbGFibGUgU3VyZmFjZSBidXJzdENhcHR1cmVTdXJmYWNlLAogICAgICAgICAgICAgQE51bGxhYmxlIFN1cmZhY2UgcG9zdHZpZXdTdXJmYWNlLApAQCAtMjc5LDYgKzI3OSw3IEBACiAgICAgICAgIG1TdXBwb3J0ZWRSZXF1ZXN0S2V5cyA9IHJlcXVlc3RLZXlzOwogICAgICAgICBtU3VwcG9ydGVkUmVzdWx0S2V5cyA9IHJlc3VsdEtleXM7CiAgICAgICAgIG1DYXB0dXJlUmVzdWx0c1N1cHBvcnRlZCA9ICFyZXN1bHRLZXlzLmlzRW1wdHkoKTsKKyAgICAgICAgbUludGVyZmFjZUxvY2sgPSBjYW1lcmFEZXZpY2UubUludGVyZmFjZUxvY2s7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVSZXBlYXRpbmdSZXF1ZXN0UGlwZWxpbmUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKQEAgLTk2OSw0NiArOTcwLDU2IEBACiAgICAgcHJpdmF0ZSBjbGFzcyBJbml0aWFsaXplU2Vzc2lvbkhhbmRsZXIgZXh0ZW5kcyBJSW5pdGlhbGl6ZVNlc3Npb25DYWxsYmFjay5TdHViIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcygpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc3RhdHVzID0gdHJ1ZTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxDYXB0dXJlU3RhZ2VJbXBsPiBpbml0aWFsUmVxdWVzdExpc3QgPQotICAgICAgICAgICAgICAgICAgICBjb21waWxlSW5pdGlhbFJlcXVlc3RMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoIWluaXRpYWxSZXF1ZXN0TGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzZXRJbml0aWFsQ2FwdHVyZVJlcXVlc3QoaW5pdGlhbFJlcXVlc3RMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbml0aWFsUmVxdWVzdEhhbmRsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVwZWF0aW5nUmVxdWVzdEltYWdlQ2FsbGJhY2spKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDYW1lcmFBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBpbml0aWFsIGNhcHR1cmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVxdWVzdCEiKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzZXRSZXBlYXRpbmdSZXF1ZXN0KG1QcmV2aWV3RXh0ZW5kZXIuZ2V0Q2FwdHVyZVN0YWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByZXZpZXdSZXF1ZXN0SGFuZGxlcihudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlcGVhdGluZ1JlcXVlc3RJbWFnZUNhbGxiYWNrKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2FtZXJhQWNjZXNzRXhjZXB0aW9uIHwgUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBpbnRlcm5hbCByZXBlYXRpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVxdWVzdCEiKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN0YXR1cyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxDYXB0dXJlU3RhZ2VJbXBsPiBpbml0aWFsUmVxdWVzdExpc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVJbml0aWFsUmVxdWVzdExpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0aWFsUmVxdWVzdExpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluaXRpYWxDYXB0dXJlUmVxdWVzdChpbml0aWFsUmVxdWVzdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5pdGlhbFJlcXVlc3RIYW5kbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVwZWF0aW5nUmVxdWVzdEltYWdlQ2FsbGJhY2spKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBpbml0aWFsIGNhcHR1cmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZXF1ZXN0ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXBlYXRpbmdSZXF1ZXN0KG1QcmV2aWV3RXh0ZW5kZXIuZ2V0Q2FwdHVyZVN0YWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJldmlld1JlcXVlc3RIYW5kbGVyKG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXBlYXRpbmdSZXF1ZXN0SW1hZ2VDYWxsYmFjaykpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2FtZXJhQWNjZXNzRXhjZXB0aW9uIHwgUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluaXRpYWxpemUgaW50ZXJuYWwgcmVwZWF0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVxdWVzdCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICghc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5Q29uZmlndXJhdGlvbkZhaWx1cmUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUNvbmZpZ3VyYXRpb25GYWlsdXJlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoKSB7Ci0gICAgICAgICAgICBtQ2FwdHVyZVNlc3Npb24uY2xvc2UoKTsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBpbml0aWFsaXplIHByb3h5IHNlcnZpY2Ugc2Vzc2lvbiEiCi0gICAgICAgICAgICAgICAgICAgICsgIiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0cnlpbmcgdG8gY29uZmlndXJlIG11bHRpcGxlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiY29uY3VycmVudCBleHRlbnNpb24gc2Vzc2lvbnMhIik7Ci0gICAgICAgICAgICBub3RpZnlDb25maWd1cmF0aW9uRmFpbHVyZSgpOworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtQ2FwdHVyZVNlc3Npb24uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgcHJveHkgc2VydmljZSBzZXNzaW9uISIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdHJ5aW5nIHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29uY3VycmVudCBleHRlbnNpb24gc2Vzc2lvbnMhIik7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUNvbmZpZ3VyYXRpb25GYWlsdXJlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9DYW1lcmFNZXRhZGF0YU5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9pbXBsL0NhbWVyYU1ldGFkYXRhTmF0aXZlLmphdmEKaW5kZXggNjMxZGYwMS4uOTc0M2MxZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9pbXBsL0NhbWVyYU1ldGFkYXRhTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9pbXBsL0NhbWVyYU1ldGFkYXRhTmF0aXZlLmphdmEKQEAgLTE2MTgsMTUgKzE2MTgsMjAgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgZ2V0U3RyZWFtQ29uZmlndXJhdGlvbk1hcE1heGltdW1SZXNvbHV0aW9uKCkgewotICAgICAgICBpZiAoIWlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uW10gY29uZmlndXJhdGlvbnMgPSBnZXRCYXNlKAogICAgICAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcy5TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04pOwogICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uRHVyYXRpb25bXSBtaW5GcmFtZUR1cmF0aW9ucyA9IGdldEJhc2UoCiAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04pOwogICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uRHVyYXRpb25bXSBzdGFsbER1cmF0aW9ucyA9IGdldEJhc2UoCiAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTik7CisgICAgICAgIC8vIElmIHRoZSBhdCBsZWFzdCB0aGVzZSBrZXlzIGhhdmVuJ3QgYmVlbiBhZHZlcnRpc2VkLCB0aGVyZSBjYW5ub3QgYmUgYSBtZWFuaW5nZnVsIG1heAorICAgICAgICAvLyByZXNvbHV0aW9uIFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAKKyAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25zID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICBtaW5GcmFtZUR1cmF0aW9ucyA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgc3RhbGxEdXJhdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKwogICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uW10gZGVwdGhDb25maWd1cmF0aW9ucyA9IGdldEJhc2UoCiAgICAgICAgICAgICAgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLkRFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OKTsKICAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbkR1cmF0aW9uW10gZGVwdGhNaW5GcmFtZUR1cmF0aW9ucyA9IGdldEJhc2UoCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9EeW5hbWljUmFuZ2VQcm9maWxlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvRHluYW1pY1JhbmdlUHJvZmlsZXMuamF2YQppbmRleCAzNGM4MzM2Li43Y2Q2MjdkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9EeW5hbWljUmFuZ2VQcm9maWxlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvcGFyYW1zL0R5bmFtaWNSYW5nZVByb2ZpbGVzLmphdmEKQEAgLTE4MSwxMyArMTgxLDE1IEBACiAgICAgICogZm9yIGEgZ2l2ZW4gY2FtZXJhIGlkIGluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSBkZXZpY2UgY2FwYWJpbGl0aWVzLjwvcD4KICAgICAgKgogICAgICAqIEBwYXJhbSBlbGVtZW50cwotICAgICAqICAgICAgICAgIEFuIGFycmF5IG9mIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIG1hcC4gSXQgY29udGFpbnMgdHdvIGVsZW1lbnRzIHBlciBlbnRyeSB3aGljaAotICAgICAqICAgICAgICAgIGRlc2NyaWJlIHRoZSBzdXBwb3J0ZWQgZHluYW1pYyByYW5nZSBwcm9maWxlIHZhbHVlIGluIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBpbiB0aGUKLSAgICAgKiAgICAgICAgICBzZWNvbmQgZWxlbWVudCBhIGJpdG1hcCBvZiBjb25jdXJyZW50bHkgc3VwcG9ydGVkIGR5bmFtaWMgcmFuZ2UgcHJvZmlsZXMgd2l0aGluIHRoZQotICAgICAqICAgICAgICAgIHNhbWUgY2FwdHVyZSByZXF1ZXN0LiBCaXRtYXAgdmFsdWVzIG9mIDAgaW5kaWNhdGUgdGhhdCB0aGVyZSBhcmUgbm8gY29uc3RyYWludHMuCisgICAgICogICAgICAgICAgQW4gYXJyYXkgb2YgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgbWFwLiBJdCBjb250YWlucyB0aHJlZSBlbGVtZW50cyBwZXIgZW50cnkuIFRoZQorICAgICAqICAgICAgICAgIGZpcnN0IGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBzdXBwb3J0ZWQgZHluYW1pYyByYW5nZSBwcm9maWxlIHZhbHVlLiBUaGUKKyAgICAgKiAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyBhIGJpdG1hcCBvZiBjb25jdXJyZW50bHkgc3VwcG9ydGVkIGR5bmFtaWMgcmFuZ2UgcHJvZmlsZXMKKyAgICAgKiAgICAgICAgICB3aXRoaW4gdGhlIHNhbWUgY2FwdHVyZSByZXF1ZXN0LiBUaGUgdGhpcmQgZWxlbWVudCBjb250YWlucyBhIGhpbnQgYWJvdXQKKyAgICAgKiAgICAgICAgICBleHRyYSBsYXRlbmN5IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBkeW5hbWljIHJhbmdlLiBCaXRtYXAgdmFsdWVzIG9mIDAKKyAgICAgKiAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZXJlIGFyZSBubyBjb25zdHJhaW50cy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGVsZW1lbnRzfSBhcnJheSBsZW5ndGggaXMgaW52YWxpZCwgbm90IGRpdmlzaWJsZSBieSAyIG9yIGNvbnRhaW5zCisgICAgICogICAgICAgICAgICBpZiB0aGUge0Bjb2RlIGVsZW1lbnRzfSBhcnJheSBsZW5ndGggaXMgaW52YWxpZCwgbm90IGRpdmlzaWJsZSBieSAzIG9yIGNvbnRhaW5zCiAgICAgICogICAgICAgICAgICBpbnZhbGlkIGVsZW1lbnQgdmFsdWVzCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgaWYge0Bjb2RlIGVsZW1lbnRzfSBpcyB7QGNvZGUgbnVsbH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0RGV2aWNlTGlnaHRzTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXREZXZpY2VMaWdodHNNYW5hZ2VyLmphdmEKaW5kZXggODAyZTZkZC4uZjRlZTlhMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXREZXZpY2VMaWdodHNNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXREZXZpY2VMaWdodHNNYW5hZ2VyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUubGlnaHRzLkxpZ2h0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUubGlnaHRzLkxpZ2h0U3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5saWdodHMuTGlnaHRzTWFuYWdlcjsKQEAgLTMwLDIyICszMSwyMiBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKLSAqIExpZ2h0c01hbmFnZXIgbWFuYWdlcyBhbiBpbnB1dCBkZXZpY2UncyBsaWdodHMge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuTGlnaHR9LgorICogTGlnaHRzTWFuYWdlciBtYW5hZ2VzIGFuIGlucHV0IGRldmljZSdzIGxpZ2h0cyB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5saWdodHMuTGlnaHR9CiAgKi8KIGNsYXNzIElucHV0RGV2aWNlTGlnaHRzTWFuYWdlciBleHRlbmRzIExpZ2h0c01hbmFnZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiSW5wdXREZXZpY2VMaWdodHNNYW5hZ2VyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAKLSAgICBwcml2YXRlIGZpbmFsIElucHV0TWFuYWdlciBtSW5wdXRNYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgSW5wdXRNYW5hZ2VyR2xvYmFsIG1HbG9iYWw7CiAKICAgICAvLyBUaGUgaW5wdXQgZGV2aWNlIElELgogICAgIHByaXZhdGUgZmluYWwgaW50IG1EZXZpY2VJZDsKICAgICAvLyBQYWNrYWdlIG5hbWUKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7CiAKLSAgICBJbnB1dERldmljZUxpZ2h0c01hbmFnZXIoSW5wdXRNYW5hZ2VyIGlucHV0TWFuYWdlciwgaW50IGRldmljZUlkKSB7Ci0gICAgICAgIHN1cGVyKEFjdGl2aXR5VGhyZWFkLmN1cnJlbnRBY3Rpdml0eVRocmVhZCgpLmdldFN5c3RlbUNvbnRleHQoKSk7Ci0gICAgICAgIG1JbnB1dE1hbmFnZXIgPSBpbnB1dE1hbmFnZXI7CisgICAgSW5wdXREZXZpY2VMaWdodHNNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgaW50IGRldmljZUlkKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBtR2xvYmFsID0gSW5wdXRNYW5hZ2VyR2xvYmFsLmdldEluc3RhbmNlKCk7CiAgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgICAgICBtUGFja2FnZU5hbWUgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50UGFja2FnZU5hbWUoKTsKICAgICB9CkBAIC01Nyw3ICs1OCw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEBOb25OdWxsIExpc3Q8TGlnaHQ+IGdldExpZ2h0cygpIHsKLSAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuZ2V0TGlnaHRzKG1EZXZpY2VJZCk7CisgICAgICAgIHJldHVybiBtR2xvYmFsLmdldExpZ2h0cyhtRGV2aWNlSWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjgsNyArNjksNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBATm9uTnVsbCBMaWdodFN0YXRlIGdldExpZ2h0U3RhdGUoQE5vbk51bGwgTGlnaHQgbGlnaHQpIHsKICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwobGlnaHQpOwotICAgICAgICByZXR1cm4gbUlucHV0TWFuYWdlci5nZXRMaWdodFN0YXRlKG1EZXZpY2VJZCwgbGlnaHQpOworICAgICAgICByZXR1cm4gbUdsb2JhbC5nZXRMaWdodFN0YXRlKG1EZXZpY2VJZCwgbGlnaHQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzcsNyArNzgsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBATm9uTnVsbCBMaWdodHNTZXNzaW9uIG9wZW5TZXNzaW9uKCkgewogICAgICAgICBmaW5hbCBMaWdodHNTZXNzaW9uIHNlc3Npb24gPSBuZXcgSW5wdXREZXZpY2VMaWdodHNTZXNzaW9uKCk7Ci0gICAgICAgIG1JbnB1dE1hbmFnZXIub3BlbkxpZ2h0U2Vzc2lvbihtRGV2aWNlSWQsIG1QYWNrYWdlTmFtZSwgc2Vzc2lvbi5nZXRUb2tlbigpKTsKKyAgICAgICAgbUdsb2JhbC5vcGVuTGlnaHRTZXNzaW9uKG1EZXZpY2VJZCwgbVBhY2thZ2VOYW1lLCBzZXNzaW9uLmdldFRva2VuKCkpOwogICAgICAgICByZXR1cm4gc2Vzc2lvbjsKICAgICB9CiAKQEAgLTExMyw3ICsxMTQsNyBAQAogICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwocmVxdWVzdCk7CiAgICAgICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoIW1DbG9zZWQpOwogCi0gICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnJlcXVlc3RMaWdodHMobURldmljZUlkLCByZXF1ZXN0LCBnZXRUb2tlbigpKTsKKyAgICAgICAgICAgIG1HbG9iYWwucmVxdWVzdExpZ2h0cyhtRGV2aWNlSWQsIHJlcXVlc3QsIGdldFRva2VuKCkpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xMjIsNyArMTIzLDcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgICAgICAgICAgaWYgKCFtQ2xvc2VkKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5jbG9zZUxpZ2h0U2Vzc2lvbihtRGV2aWNlSWQsIGdldFRva2VuKCkpOworICAgICAgICAgICAgICAgIG1HbG9iYWwuY2xvc2VMaWdodFNlc3Npb24obURldmljZUlkLCBnZXRUb2tlbigpKTsKICAgICAgICAgICAgICAgICBtQ2xvc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtQ2xvc2VHdWFyZC5jbG9zZSgpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dERldmljZVNlbnNvck1hbmFnZXIuamF2YQppbmRleCA4YTQwZDAwLi5hYTU1ZTU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dERldmljZVNlbnNvck1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dERldmljZVNlbnNvck1hbmFnZXIuamF2YQpAQCAtNTYsNyArNTYsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VOU09SX0FDQ1VSQUNZX0NIQU5HRUQgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VOU09SX0NIQU5HRUQgPSAyOwogCi0gICAgcHJpdmF0ZSBJbnB1dE1hbmFnZXIgbUlucHV0TWFuYWdlcjsKKyAgICBwcml2YXRlIElucHV0TWFuYWdlckdsb2JhbCBtR2xvYmFsOwogCiAgICAgLy8gc2Vuc29yIG1hcCBmcm9tIGRldmljZSBpZCB0byBzZW5zb3IgbGlzdAogICAgIEBHdWFyZGVkQnkoIm1JbnB1dFNlbnNvckxvY2siKQpAQCAtNzAsMTUgKzcwLDE1IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyVGhyZWFkIG1TZW5zb3JUaHJlYWQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1TZW5zb3JIYW5kbGVyOwogCi0gICAgcHVibGljIElucHV0RGV2aWNlU2Vuc29yTWFuYWdlcihJbnB1dE1hbmFnZXIgaW5wdXRNYW5hZ2VyKSB7Ci0gICAgICAgIG1JbnB1dE1hbmFnZXIgPSBpbnB1dE1hbmFnZXI7CisgICAgcHVibGljIElucHV0RGV2aWNlU2Vuc29yTWFuYWdlcihJbnB1dE1hbmFnZXJHbG9iYWwgaW5wdXRNYW5hZ2VyR2xvYmFsKSB7CisgICAgICAgIG1HbG9iYWwgPSBpbnB1dE1hbmFnZXJHbG9iYWw7CiAKICAgICAgICAgbVNlbnNvclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJTZW5zb3JUaHJlYWQiKTsKICAgICAgICAgbVNlbnNvclRocmVhZC5zdGFydCgpOwogICAgICAgICBtU2Vuc29ySGFuZGxlciA9IG5ldyBIYW5kbGVyKG1TZW5zb3JUaHJlYWQuZ2V0TG9vcGVyKCkpOwogCiAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBpbnB1dCBkZXZpY2UgbGlzdGVuZXIKLSAgICAgICAgbUlucHV0TWFuYWdlci5yZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIodGhpcywgbVNlbnNvckhhbmRsZXIpOworICAgICAgICBtR2xvYmFsLnJlZ2lzdGVySW5wdXREZXZpY2VMaXN0ZW5lcih0aGlzLCBtU2Vuc29ySGFuZGxlcik7CiAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHNlbnNvciBsaXN0CiAgICAgICAgIGluaXRpYWxpemVTZW5zb3JzKCk7CiAgICAgfQpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlIGlucHV0RGV2aWNlID0gSW5wdXREZXZpY2UuZ2V0RGV2aWNlKGRldmljZUlkKTsKICAgICAgICAgaWYgKGlucHV0RGV2aWNlICE9IG51bGwgJiYgaW5wdXREZXZpY2UuaGFzU2Vuc29yKCkpIHsKICAgICAgICAgICAgIGZpbmFsIElucHV0U2Vuc29ySW5mb1tdIHNlbnNvckluZm9zID0KLSAgICAgICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5nZXRTZW5zb3JMaXN0KGRldmljZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgbUdsb2JhbC5nZXRTZW5zb3JMaXN0KGRldmljZUlkKTsKICAgICAgICAgICAgIHBvcHVsYXRlU2Vuc29yc0ZvcklucHV0RGV2aWNlTG9ja2VkKGRldmljZUlkLCBzZW5zb3JJbmZvcyk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTQsNyArMTU0LDcgQEAKICAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNlbnNvcnMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUlucHV0U2Vuc29yTG9jaykgewogICAgICAgICAgICAgbVNlbnNvcnMuY2xlYXIoKTsKLSAgICAgICAgICAgIGludFtdIGRldmljZUlkcyA9IG1JbnB1dE1hbmFnZXIuZ2V0SW5wdXREZXZpY2VJZHMoKTsKKyAgICAgICAgICAgIGludFtdIGRldmljZUlkcyA9IG1HbG9iYWwuZ2V0SW5wdXREZXZpY2VJZHMoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGV2aWNlSWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRldmljZUlkID0gZGV2aWNlSWRzW2ldOwogICAgICAgICAgICAgICAgIHVwZGF0ZUlucHV0RGV2aWNlU2Vuc29ySW5mb0xvY2tlZChkZXZpY2VJZCk7CkBAIC00NTUsNyArNDU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIlRoZSBkZXZpY2UgZG9lc24ndCBoYXZlIHRoZSBzZW5zb3I6IiArIHNlbnNvcik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtSW5wdXRNYW5hZ2VyLmVuYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yLmdldFR5cGUoKSwgZGVsYXlVcywKKyAgICAgICAgICAgICAgICBpZiAoIW1HbG9iYWwuZW5hYmxlU2Vuc29yKGRldmljZUlkLCBzZW5zb3IuZ2V0VHlwZSgpLCBkZWxheVVzLAogICAgICAgICAgICAgICAgICAgICAgICAgbWF4QmF0Y2hSZXBvcnRMYXRlbmN5VXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDYW4ndCBlbmFibGUgdGhlIHNlbnNvcjoiICsgc2Vuc29yKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAgICAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgSW5wdXRNYW5hZ2VyU2VydmljZSBzZW5zb3IgbGlzdGVuZXIgaWYgbm90IHlldC4KICAgICAgICAgICAgIGlmIChtSW5wdXRTZXJ2aWNlU2Vuc29yTGlzdGVuZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1JbnB1dFNlcnZpY2VTZW5zb3JMaXN0ZW5lciA9IG5ldyBJbnB1dFNlbnNvckV2ZW50TGlzdGVuZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1JbnB1dE1hbmFnZXIucmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihtSW5wdXRTZXJ2aWNlU2Vuc29yTGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtR2xvYmFsLnJlZ2lzdGVyU2Vuc29yTGlzdGVuZXIobUlucHV0U2VydmljZVNlbnNvckxpc3RlbmVyKSkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHJlZ2lzdGVyaW5nIHRoZSBzZW5zb3IgbGlzdGVuZXIiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KQEAgLTUxNiw3ICs1MTYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gSWYgbm8gZGVsZWdhdGlvbiByZW1haW5zLCB1bnJlZ2lzdGVyIHRoZSBsaXN0ZW5lciB0byBpbnB1dCBzZXJ2aWNlCiAgICAgICAgICAgICBpZiAobUlucHV0U2VydmljZVNlbnNvckxpc3RlbmVyICE9IG51bGwgJiYgbUlucHV0U2Vuc29yRXZlbnRMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnVucmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihtSW5wdXRTZXJ2aWNlU2Vuc29yTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIG1HbG9iYWwudW5yZWdpc3RlclNlbnNvckxpc3RlbmVyKG1JbnB1dFNlcnZpY2VTZW5zb3JMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgbUlucHV0U2VydmljZVNlbnNvckxpc3RlbmVyID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEZvciBlYWNoIHNlbnNvciB0eXBlIGNoZWNrIGlmIGl0IGlzIHN0aWxsIGluIHVzZSBieSBvdGhlciBsaXN0ZW5lcnMuCkBAIC01MzksNyArNTM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZGV2aWNlICIgKyBkZXZpY2VJZCArICIgc2Vuc29yICIgKyBzZW5zb3JUeXBlICsgIiBkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuZGlzYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIG1HbG9iYWwuZGlzYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yVHlwZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01NTMsNyArNTUzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoU2Vuc29yIHNlbnNvciA6IG1JbnB1dFNlbnNvckV2ZW50TGlzdGVuZXJzLmdldChpZHgpLmdldFNlbnNvcnMoKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZXZpY2VJZCA9IHNlbnNvci5nZXRJZCgpOwotICAgICAgICAgICAgICAgIGlmICghbUlucHV0TWFuYWdlci5mbHVzaFNlbnNvcihkZXZpY2VJZCwgc2Vuc29yLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1HbG9iYWwuZmx1c2hTZW5zb3IoZGV2aWNlSWQsIHNlbnNvci5nZXRUeXBlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dERldmljZVZpYnJhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dERldmljZVZpYnJhdG9yLmphdmEKaW5kZXggY2U2YjUyMy4uOWMxODI2MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXREZXZpY2VWaWJyYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0RGV2aWNlVmlicmF0b3IuamF2YQpAQCAtNDUsMTQgKzQ1LDE0IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbURldmljZUlkOwogICAgIHByaXZhdGUgZmluYWwgVmlicmF0b3JJbmZvIG1WaWJyYXRvckluZm87CiAgICAgcHJpdmF0ZSBmaW5hbCBCaW5kZXIgbVRva2VuOwotICAgIHByaXZhdGUgZmluYWwgSW5wdXRNYW5hZ2VyIG1JbnB1dE1hbmFnZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBJbnB1dE1hbmFnZXJHbG9iYWwgbUdsb2JhbDsKIAogICAgIEBHdWFyZGVkQnkoIm1EZWxlZ2F0ZXMiKQogICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8T25WaWJyYXRvclN0YXRlQ2hhbmdlZExpc3RlbmVyLAogICAgICAgICAgICAgT25WaWJyYXRvclN0YXRlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGU+IG1EZWxlZ2F0ZXMgPSBuZXcgQXJyYXlNYXA8PigpOwogCi0gICAgSW5wdXREZXZpY2VWaWJyYXRvcihJbnB1dE1hbmFnZXIgaW5wdXRNYW5hZ2VyLCBpbnQgZGV2aWNlSWQsIGludCB2aWJyYXRvcklkKSB7Ci0gICAgICAgIG1JbnB1dE1hbmFnZXIgPSBpbnB1dE1hbmFnZXI7CisgICAgSW5wdXREZXZpY2VWaWJyYXRvcihpbnQgZGV2aWNlSWQsIGludCB2aWJyYXRvcklkKSB7CisgICAgICAgIG1HbG9iYWwgPSBJbnB1dE1hbmFnZXJHbG9iYWwuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgICAgIG1WaWJyYXRvckluZm8gPSBuZXcgVmlicmF0b3JJbmZvLkJ1aWxkZXIodmlicmF0b3JJZCkKICAgICAgICAgICAgICAgICAuc2V0Q2FwYWJpbGl0aWVzKElWaWJyYXRvci5DQVBfQU1QTElUVURFX0NPTlRST0wpCkBAIC05Myw3ICs5Myw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZpYnJhdGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1JbnB1dE1hbmFnZXIuaXNWaWJyYXRpbmcobURldmljZUlkKTsKKyAgICAgICAgcmV0dXJuIG1HbG9iYWwuaXNWaWJyYXRpbmcobURldmljZUlkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzMiw3ICsxMzIsNyBAQAogCiAgICAgICAgICAgICBmaW5hbCBPblZpYnJhdG9yU3RhdGVDaGFuZ2VkTGlzdGVuZXJEZWxlZ2F0ZSBkZWxlZ2F0ZSA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBPblZpYnJhdG9yU3RhdGVDaGFuZ2VkTGlzdGVuZXJEZWxlZ2F0ZShsaXN0ZW5lciwgZXhlY3V0b3IpOwotICAgICAgICAgICAgaWYgKCFtSW5wdXRNYW5hZ2VyLnJlZ2lzdGVyVmlicmF0b3JTdGF0ZUxpc3RlbmVyKG1EZXZpY2VJZCwgZGVsZWdhdGUpKSB7CisgICAgICAgICAgICBpZiAoIW1HbG9iYWwucmVnaXN0ZXJWaWJyYXRvclN0YXRlTGlzdGVuZXIobURldmljZUlkLCBkZWxlZ2F0ZSkpIHsKICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmVnaXN0ZXIgdmlicmF0ZSBzdGF0ZSBsaXN0ZW5lciIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTE1Niw3ICsxNTYsNyBAQAogICAgICAgICAgICAgaWYgKG1EZWxlZ2F0ZXMuY29udGFpbnNLZXkobGlzdGVuZXIpKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgT25WaWJyYXRvclN0YXRlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGUgZGVsZWdhdGUgPSBtRGVsZWdhdGVzLmdldChsaXN0ZW5lcik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIW1JbnB1dE1hbmFnZXIudW5yZWdpc3RlclZpYnJhdG9yU3RhdGVMaXN0ZW5lcihtRGV2aWNlSWQsIGRlbGVnYXRlKSkgeworICAgICAgICAgICAgICAgIGlmICghbUdsb2JhbC51bnJlZ2lzdGVyVmlicmF0b3JTdGF0ZUxpc3RlbmVyKG1EZXZpY2VJZCwgZGVsZWdhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byB1bnJlZ2lzdGVyIHZpYnJhdGUgc3RhdGUgbGlzdGVuZXIiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KQEAgLTE3NiwxMiArMTc2LDEyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdmlicmF0ZShpbnQgdWlkLCBTdHJpbmcgb3BQa2csIEBOb25OdWxsIFZpYnJhdGlvbkVmZmVjdCBlZmZlY3QsIFN0cmluZyByZWFzb24sCiAgICAgICAgICAgICBATm9uTnVsbCBWaWJyYXRpb25BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgbUlucHV0TWFuYWdlci52aWJyYXRlKG1EZXZpY2VJZCwgZWZmZWN0LCBtVG9rZW4pOworICAgICAgICBtR2xvYmFsLnZpYnJhdGUobURldmljZUlkLCBlZmZlY3QsIG1Ub2tlbik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtSW5wdXRNYW5hZ2VyLmNhbmNlbFZpYnJhdGUobURldmljZUlkLCBtVG9rZW4pOworICAgICAgICBtR2xvYmFsLmNhbmNlbFZpYnJhdGUobURldmljZUlkLCBtVG9rZW4pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXREZXZpY2VWaWJyYXRvck1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0RGV2aWNlVmlicmF0b3JNYW5hZ2VyLmphdmEKaW5kZXggZDc3ZjljMy4uNjRiNTY2NzcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0RGV2aWNlVmlicmF0b3JNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXREZXZpY2VWaWJyYXRvck1hbmFnZXIuamF2YQpAQCAtNDAsNyArNDAsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAogICAgIHByaXZhdGUgZmluYWwgQmluZGVyIG1Ub2tlbjsKLSAgICBwcml2YXRlIGZpbmFsIElucHV0TWFuYWdlciBtSW5wdXRNYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgSW5wdXRNYW5hZ2VyR2xvYmFsIG1HbG9iYWw7CiAKICAgICAvLyBUaGUgaW5wdXQgZGV2aWNlIElkLgogICAgIHByaXZhdGUgZmluYWwgaW50IG1EZXZpY2VJZDsKQEAgLTQ4LDggKzQ4LDggQEAKICAgICBAR3VhcmRlZEJ5KCJtVmlicmF0b3JzIikKICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PFZpYnJhdG9yPiBtVmlicmF0b3JzID0gbmV3IFNwYXJzZUFycmF5PD4oKTsKIAotICAgIHB1YmxpYyBJbnB1dERldmljZVZpYnJhdG9yTWFuYWdlcihJbnB1dE1hbmFnZXIgaW5wdXRNYW5hZ2VyLCBpbnQgZGV2aWNlSWQpIHsKLSAgICAgICAgbUlucHV0TWFuYWdlciA9IGlucHV0TWFuYWdlcjsKKyAgICBwdWJsaWMgSW5wdXREZXZpY2VWaWJyYXRvck1hbmFnZXIoaW50IGRldmljZUlkKSB7CisgICAgICAgIG1HbG9iYWwgPSBJbnB1dE1hbmFnZXJHbG9iYWwuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgICAgIG1Ub2tlbiA9IG5ldyBCaW5kZXIoKTsKIApAQCAtNjEsMTAgKzYxLDEwIEBACiAgICAgICAgICAgICBtVmlicmF0b3JzLmNsZWFyKCk7CiAgICAgICAgICAgICBJbnB1dERldmljZSBpbnB1dERldmljZSA9IElucHV0RGV2aWNlLmdldERldmljZShtRGV2aWNlSWQpOwogICAgICAgICAgICAgZmluYWwgaW50W10gdmlicmF0b3JJZHMgPQotICAgICAgICAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLmdldFZpYnJhdG9ySWRzKG1EZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgICAgIG1HbG9iYWwuZ2V0VmlicmF0b3JJZHMobURldmljZUlkKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlicmF0b3JJZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICBtVmlicmF0b3JzLnB1dCh2aWJyYXRvcklkc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dERldmljZVZpYnJhdG9yKG1JbnB1dE1hbmFnZXIsIG1EZXZpY2VJZCwgdmlicmF0b3JJZHNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dERldmljZVZpYnJhdG9yKG1EZXZpY2VJZCwgdmlicmF0b3JJZHNbaV0pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEyNywxMiArMTI3LDEyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdmlicmF0ZShpbnQgdWlkLCBTdHJpbmcgb3BQa2csIEBOb25OdWxsIENvbWJpbmVkVmlicmF0aW9uIGVmZmVjdCwKICAgICAgICAgICAgIFN0cmluZyByZWFzb24sIEBOdWxsYWJsZSBWaWJyYXRpb25BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgbUlucHV0TWFuYWdlci52aWJyYXRlKG1EZXZpY2VJZCwgZWZmZWN0LCBtVG9rZW4pOworICAgICAgICBtR2xvYmFsLnZpYnJhdGUobURldmljZUlkLCBlZmZlY3QsIG1Ub2tlbik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtSW5wdXRNYW5hZ2VyLmNhbmNlbFZpYnJhdGUobURldmljZUlkLCBtVG9rZW4pOworICAgICAgICBtR2xvYmFsLmNhbmNlbFZpYnJhdGUobURldmljZUlkLCBtVG9rZW4pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvaW5wdXQvSW5wdXRNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dE1hbmFnZXIuamF2YQppbmRleCA0OTA1ODlmLi41ZGMzODI1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dE1hbmFnZXIuamF2YQpAQCAtMzMsMjcgKzMzLDE4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5CYXR0ZXJ5U3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUubGlnaHRzLkxpZ2h0OwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUubGlnaHRzLkxpZ2h0U3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5saWdodHMuTGlnaHRzTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmxpZ2h0cy5MaWdodHNSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Db21iaW5lZFZpYnJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSVZpYnJhdG9yU3RhdGVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLm9zLklucHV0RXZlbnRJbmplY3Rpb25TeW5jOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdGlvbkVmZmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuVmlicmF0b3JNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRFdmVudDsKQEAgLTY2LDkgKzU3LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGU7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU29tZUFyZ3M7CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwpAQCAtODgsMTAgKzc3LDYgQEAKICAgICAvLyBUbyBlbmFibGUgdGhlc2UgbG9ncywgcnVuOiAnYWRiIHNoZWxsIHNldHByb3AgbG9nLnRhZy5JbnB1dE1hbmFnZXIgREVCVUcnIChyZXF1aXJlcyByZXN0YXJ0KQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFVklDRV9BRERFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ERVZJQ0VfUkVNT1ZFRCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ERVZJQ0VfQ0hBTkdFRCA9IDM7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBJbnB1dE1hbmFnZXIgc0luc3RhbmNlOwogCiAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UobWF4VGFyZ2V0U2RrID0gQnVpbGQuVkVSU0lPTl9DT0RFUy5QLCB0cmFja2luZ0J1ZyA9IDExNTYwOTAyMykKQEAgLTExMiwzMyArOTcsNiBAQAogICAgIEBOdWxsYWJsZQogICAgIHByaXZhdGUgQm9vbGVhbiBtSXNTdHlsdXNQb2ludGVySWNvbkVuYWJsZWQgPSBudWxsOwogCi0gICAgLy8gR3VhcmRlZCBieSBtSW5wdXREZXZpY2VzTG9jawotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1JbnB1dERldmljZXNMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgU3BhcnNlQXJyYXk8SW5wdXREZXZpY2U+IG1JbnB1dERldmljZXM7Ci0gICAgcHJpdmF0ZSBJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIgbUlucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lcjsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnB1dERldmljZUxpc3RlbmVyRGVsZWdhdGU+IG1JbnB1dERldmljZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgLy8gR3VhcmRlZCBieSBtVGFibGV0TW9kZUxvY2sKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtVGFibGV0TW9kZUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwiLCAiVW51c2VkRGVjbGFyYXRpb24ifSkKLSAgICBwcml2YXRlIFRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgbVRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8T25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGU+IG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUJhdHRlcnlMaXN0ZW5lcnNMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIC8vIE1hcHMgYSBkZXZpY2VJZCB3aG9zZSBiYXR0ZXJ5IGlzIGN1cnJlbnRseSBiZWluZyBtb25pdG9yZWQgdG8gYW4gZW50cnkgY29udGFpbmluZyB0aGUKLSAgICAvLyByZWdpc3RlcmVkIGxpc3RlbmVycyBmb3IgdGhhdCBkZXZpY2UuCi0gICAgQEd1YXJkZWRCeSgibUJhdHRlcnlMaXN0ZW5lcnNMb2NrIikKLSAgICBwcml2YXRlIFNwYXJzZUFycmF5PFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzPiBtQmF0dGVyeUxpc3RlbmVyczsKLSAgICBAR3VhcmRlZEJ5KCJtQmF0dGVyeUxpc3RlbmVyc0xvY2siKQotICAgIHByaXZhdGUgSUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIG1JbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBAR3VhcmRlZEJ5KCJtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckxvY2siKQotICAgIHByaXZhdGUgQXJyYXlMaXN0PEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJEZWxlZ2F0ZT4gbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzOwotICAgIEBHdWFyZGVkQnkoIm1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyTG9jayIpCi0gICAgcHJpdmF0ZSBJS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgSW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyIG1JbnB1dERldmljZVNlbnNvck1hbmFnZXI7CiAgICAgLyoqCiAgICAgICogQnJvYWRjYXN0IEFjdGlvbjogUXVlcnkgYXZhaWxhYmxlIGtleWJvYXJkIGxheW91dHMuCiAgICAgICogPHA+CkBAIC00MDMsMjcgKzM2MSw3IEBACiAgICAgICovCiAgICAgQE51bGxhYmxlCiAgICAgcHVibGljIElucHV0RGV2aWNlIGdldElucHV0RGV2aWNlKGludCBpZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dERldmljZXNMb2NrKSB7Ci0gICAgICAgICAgICBwb3B1bGF0ZUlucHV0RGV2aWNlc0xvY2tlZCgpOwotCi0gICAgICAgICAgICBpbnQgaW5kZXggPSBtSW5wdXREZXZpY2VzLmluZGV4T2ZLZXkoaWQpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJbnB1dERldmljZSBpbnB1dERldmljZSA9IG1JbnB1dERldmljZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXREZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0RGV2aWNlID0gbUltLmdldElucHV0RGV2aWNlKGlkKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlcy5zZXRWYWx1ZUF0KGluZGV4LCBpbnB1dERldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGlucHV0RGV2aWNlOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBtR2xvYmFsLmdldElucHV0RGV2aWNlKGlkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzMywzNCArMzcxLDcgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dERldmljZSBnZXRJbnB1dERldmljZUJ5RGVzY3JpcHRvcihTdHJpbmcgZGVzY3JpcHRvcikgewotICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXNjcmlwdG9yIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dERldmljZXNMb2NrKSB7Ci0gICAgICAgICAgICBwb3B1bGF0ZUlucHV0RGV2aWNlc0xvY2tlZCgpOwotCi0gICAgICAgICAgICBpbnQgbnVtRGV2aWNlcyA9IG1JbnB1dERldmljZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1EZXZpY2VzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJbnB1dERldmljZSBpbnB1dERldmljZSA9IG1JbnB1dERldmljZXMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXREZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBtSW5wdXREZXZpY2VzLmtleUF0KGkpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXZpY2UgPSBtSW0uZ2V0SW5wdXREZXZpY2UoaWQpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dERldmljZXMuc2V0VmFsdWVBdChpLCBpbnB1dERldmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmVxdWFscyhpbnB1dERldmljZS5nZXREZXNjcmlwdG9yKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dERldmljZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbUdsb2JhbC5nZXRJbnB1dERldmljZUJ5RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ2OCwxNiArMzc5LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBpbnB1dCBkZXZpY2UgaWRzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnRbXSBnZXRJbnB1dERldmljZUlkcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VzTG9jaykgewotICAgICAgICAgICAgcG9wdWxhdGVJbnB1dERldmljZXNMb2NrZWQoKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUlucHV0RGV2aWNlcy5zaXplKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnRbXSBpZHMgPSBuZXcgaW50W2NvdW50XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlkc1tpXSA9IG1JbnB1dERldmljZXMua2V5QXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaWRzOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBtR2xvYmFsLmdldElucHV0RGV2aWNlSWRzKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NDcsMTcgKzQ0OSw3IEBACiAgICAgICogQHNlZSAjdW5yZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIoSW5wdXREZXZpY2VMaXN0ZW5lciBsaXN0ZW5lciwgSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0ZW5lciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dERldmljZXNMb2NrKSB7Ci0gICAgICAgICAgICBwb3B1bGF0ZUlucHV0RGV2aWNlc0xvY2tlZCgpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZElucHV0RGV2aWNlTGlzdGVuZXJMb2NrZWQobGlzdGVuZXIpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIG1JbnB1dERldmljZUxpc3RlbmVycy5hZGQobmV3IElucHV0RGV2aWNlTGlzdGVuZXJEZWxlZ2F0ZShsaXN0ZW5lciwgaGFuZGxlcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1HbG9iYWwucmVnaXN0ZXJJbnB1dERldmljZUxpc3RlbmVyKGxpc3RlbmVyLCBoYW5kbGVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU2OCwyOCArNDYwLDcgQEAKICAgICAgKiBAc2VlICNyZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVySW5wdXREZXZpY2VMaXN0ZW5lcihJbnB1dERldmljZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0ZW5lciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dERldmljZXNMb2NrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kSW5wdXREZXZpY2VMaXN0ZW5lckxvY2tlZChsaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIElucHV0RGV2aWNlTGlzdGVuZXJEZWxlZ2F0ZSBkID0gbUlucHV0RGV2aWNlTGlzdGVuZXJzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgZC5yZW1vdmVDYWxsYmFja3NBbmRNZXNzYWdlcyhudWxsKTsKLSAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VMaXN0ZW5lcnMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGZpbmRJbnB1dERldmljZUxpc3RlbmVyTG9ja2VkKElucHV0RGV2aWNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgZmluYWwgaW50IG51bUxpc3RlbmVycyA9IG1JbnB1dERldmljZUxpc3RlbmVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtSW5wdXREZXZpY2VMaXN0ZW5lcnMuZ2V0KGkpLm1MaXN0ZW5lciA9PSBsaXN0ZW5lcikgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbUdsb2JhbC51bnJlZ2lzdGVySW5wdXREZXZpY2VMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MTgsMjAgKzQ4OSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIoCiAgICAgICAgICAgICBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIsIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdGVuZXIgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVRhYmxldE1vZGVMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluaXRpYWxpemVUYWJsZXRNb2RlTGlzdGVuZXJMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpZHggPSBmaW5kT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyTG9ja2VkKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChpZHggPCAwKSB7Ci0gICAgICAgICAgICAgICAgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGUgZCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJEZWxlZ2F0ZShsaXN0ZW5lciwgaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgbU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMuYWRkKGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1HbG9iYWwucmVnaXN0ZXJPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIsIGhhbmRsZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjQxLDM3ICs0OTksNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3Rlck9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcihPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3RlbmVyIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1UYWJsZXRNb2RlTG9jaykgewotICAgICAgICAgICAgaW50IGlkeCA9IGZpbmRPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJMb2NrZWQobGlzdGVuZXIpOwotICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGUgZCA9IG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShpZHgpOwotICAgICAgICAgICAgICAgIGQucmVtb3ZlQ2FsbGJhY2tzQW5kTWVzc2FnZXMobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhYmxldE1vZGVMaXN0ZW5lckxvY2tlZCgpIHsKLSAgICAgICAgZmluYWwgVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtSW0ucmVnaXN0ZXJUYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9Ci0gICAgICAgIG1UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgIG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZmluZE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckxvY2tlZChPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMuZ2V0KGkpLm1MaXN0ZW5lciA9PSBsaXN0ZW5lcikgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbUdsb2JhbC51bnJlZ2lzdGVyT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzODksMTEgKzEyMTcsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIElucHV0U2Vuc29ySW5mb1tdIGdldFNlbnNvckxpc3QoaW50IGRldmljZUlkKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbUltLmdldFNlbnNvckxpc3QoZGV2aWNlSWQpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1HbG9iYWwuZ2V0U2Vuc29yTGlzdChkZXZpY2VJZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDAzLDEyICsxMjI3LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVTZW5zb3IoaW50IGRldmljZUlkLCBpbnQgc2Vuc29yVHlwZSwgaW50IHNhbXBsaW5nUGVyaW9kVXMsCiAgICAgICAgICAgICBpbnQgbWF4QmF0Y2hSZXBvcnRMYXRlbmN5VXMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtSW0uZW5hYmxlU2Vuc29yKGRldmljZUlkLCBzZW5zb3JUeXBlLCBzYW1wbGluZ1BlcmlvZFVzLAotICAgICAgICAgICAgICAgICAgICBtYXhCYXRjaFJlcG9ydExhdGVuY3lVcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbUdsb2JhbC5lbmFibGVTZW5zb3IoZGV2aWNlSWQsIHNlbnNvclR5cGUsIHNhbXBsaW5nUGVyaW9kVXMsCisgICAgICAgICAgICAgICAgbWF4QmF0Y2hSZXBvcnRMYXRlbmN5VXMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQxNywxMSArMTIzNyw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkaXNhYmxlU2Vuc29yKGludCBkZXZpY2VJZCwgaW50IHNlbnNvclR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1JbS5kaXNhYmxlU2Vuc29yKGRldmljZUlkLCBzZW5zb3JUeXBlKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9CisgICAgICAgIG1HbG9iYWwuZGlzYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yVHlwZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDMwLDExICsxMjQ2LDcgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGZsdXNoU2Vuc29yKGludCBkZXZpY2VJZCwgaW50IHNlbnNvclR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtSW0uZmx1c2hTZW5zb3IoZGV2aWNlSWQsIHNlbnNvclR5cGUpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1HbG9iYWwuZmx1c2hTZW5zb3IoZGV2aWNlSWQsIHNlbnNvclR5cGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0MywxMSArMTI1NSw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlclNlbnNvckxpc3RlbmVyKElJbnB1dFNlbnNvckV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtSW0ucmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbUdsb2JhbC5yZWdpc3RlclNlbnNvckxpc3RlbmVyKGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0NTYsMTEgKzEyNjQsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlclNlbnNvckxpc3RlbmVyKElJbnB1dFNlbnNvckV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1JbS51bnJlZ2lzdGVyU2Vuc29yTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbUdsb2JhbC51bnJlZ2lzdGVyU2Vuc29yTGlzdGVuZXIobGlzdGVuZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU0MywxMzMgKzEzNDcsNyBAQAogICAgICAqLwogICAgIEBOdWxsYWJsZQogICAgIHB1YmxpYyBIb3N0VXNpVmVyc2lvbiBnZXRIb3N0VXNpVmVyc2lvbihATm9uTnVsbCBEaXNwbGF5IGRpc3BsYXkpIHsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChkaXNwbGF5LCAiZGlzcGxheSBzaG91bGQgbm90IGJlIG51bGwiKTsKLQotICAgICAgICAvLyBSZXR1cm4gdGhlIGZpcnN0IHZhbGlkIFVTSSB2ZXJzaW9uIHJlcG9ydGVkIGJ5IGFueSBpbnB1dCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgIC8vIHRoZSBkaXNwbGF5LgotICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dERldmljZXNMb2NrKSB7Ci0gICAgICAgICAgICBwb3B1bGF0ZUlucHV0RGV2aWNlc0xvY2tlZCgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1JbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dERldmljZSBkZXZpY2UgPSBnZXRJbnB1dERldmljZShtSW5wdXREZXZpY2VzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwgJiYgZGV2aWNlLmdldEFzc29jaWF0ZWREaXNwbGF5SWQoKSA9PSBkaXNwbGF5LmdldERpc3BsYXlJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UuZ2V0SG9zdFVzaVZlcnNpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmdldEhvc3RVc2lWZXJzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaW5wdXQgZGV2aWNlcyB0aGF0IHJlcG9ydCBhIHZhbGlkIFVTSSB2ZXJzaW9uLCBzZWUgaWYgdGhlcmUgaXMgYSBjb25maWcKLSAgICAgICAgLy8gdGhhdCBzcGVjaWZpZXMgdGhlIFVTSSB2ZXJzaW9uIGZvciB0aGUgZGlzcGxheS4gVGhpcyBpcyB0byBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlIFVTSQotICAgICAgICAvLyBpbnB1dCBkZXZpY2UgaXMgbm90IHJlZ2lzdGVyZWQgYnkgdGhlIGtlcm5lbC9kcml2ZXIgYWxsIHRoZSB0aW1lLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1JbS5nZXRIb3N0VXNpVmVyc2lvbkZyb21EaXNwbGF5Q29uZmlnKGRpc3BsYXkuZ2V0RGlzcGxheUlkKCkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlSW5wdXREZXZpY2VzTG9ja2VkKCkgewotICAgICAgICBpZiAobUlucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1JbS5yZWdpc3RlcklucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUlucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbnB1dERldmljZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50W10gaWRzOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZHMgPSBtSW0uZ2V0SW5wdXREZXZpY2VJZHMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbnB1dERldmljZXMgPSBuZXcgU3BhcnNlQXJyYXk8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaWQgOiBpZHMpIHsKLSAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VzLnB1dChpZCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25JbnB1dERldmljZXNDaGFuZ2VkKGludFtdIGRldmljZUlkQW5kR2VuZXJhdGlvbikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIGlucHV0IGRldmljZXMgY2hhbmdlZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUlucHV0RGV2aWNlc0xvY2spIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtSW5wdXREZXZpY2VzLnNpemUoKTsgLS1pID4gMDsgKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGRldmljZUlkID0gbUlucHV0RGV2aWNlcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zRGV2aWNlSWQoZGV2aWNlSWRBbmRHZW5lcmF0aW9uLCBkZXZpY2VJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZXZpY2UgcmVtb3ZlZDogIiArIGRldmljZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VzLnJlbW92ZUF0KGkpOwotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZVRvSW5wdXREZXZpY2VMaXN0ZW5lcnNMb2NrZWQoTVNHX0RFVklDRV9SRU1PVkVELCBkZXZpY2VJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZUlkQW5kR2VuZXJhdGlvbi5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZXZpY2VJZCA9IGRldmljZUlkQW5kR2VuZXJhdGlvbltpXTsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtSW5wdXREZXZpY2VzLmluZGV4T2ZLZXkoZGV2aWNlSWQpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlIGRldmljZSA9IG1JbnB1dERldmljZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGdlbmVyYXRpb24gPSBkZXZpY2VJZEFuZEdlbmVyYXRpb25baSArIDFdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZS5nZXRHZW5lcmF0aW9uKCkgIT0gZ2VuZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZXZpY2UgY2hhbmdlZDogIiArIGRldmljZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlcy5zZXRWYWx1ZUF0KGluZGV4LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZVRvSW5wdXREZXZpY2VMaXN0ZW5lcnNMb2NrZWQoTVNHX0RFVklDRV9DSEFOR0VELCBkZXZpY2VJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRldmljZSBhZGRlZDogIiArIGRldmljZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VzLnB1dChkZXZpY2VJZCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlVG9JbnB1dERldmljZUxpc3RlbmVyc0xvY2tlZChNU0dfREVWSUNFX0FEREVELCBkZXZpY2VJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRNZXNzYWdlVG9JbnB1dERldmljZUxpc3RlbmVyc0xvY2tlZChpbnQgd2hhdCwgaW50IGRldmljZUlkKSB7Ci0gICAgICAgIGZpbmFsIGludCBudW1MaXN0ZW5lcnMgPSBtSW5wdXREZXZpY2VMaXN0ZW5lcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgaSsrKSB7Ci0gICAgICAgICAgICBJbnB1dERldmljZUxpc3RlbmVyRGVsZWdhdGUgbGlzdGVuZXIgPSBtSW5wdXREZXZpY2VMaXN0ZW5lcnMuZ2V0KGkpOwotICAgICAgICAgICAgbGlzdGVuZXIuc2VuZE1lc3NhZ2UobGlzdGVuZXIub2J0YWluTWVzc2FnZSh3aGF0LCBkZXZpY2VJZCwgMCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc0RldmljZUlkKGludFtdIGRldmljZUlkQW5kR2VuZXJhdGlvbiwgaW50IGRldmljZUlkKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGV2aWNlSWRBbmRHZW5lcmF0aW9uLmxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlSWRBbmRHZW5lcmF0aW9uW2ldID09IGRldmljZUlkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIG9uVGFibGV0TW9kZUNoYW5nZWQobG9uZyB3aGVuTmFub3MsIGJvb2xlYW4gaW5UYWJsZXRNb2RlKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgdGFibGV0IG1vZGUgY2hhbmdlZDogIgotICAgICAgICAgICAgICAgICAgICArICJ3aGVuTmFub3M9IiArIHdoZW5OYW5vcyArICIsIGluVGFibGV0TW9kZT0iICsgaW5UYWJsZXRNb2RlKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1UYWJsZXRNb2RlTG9jaykgewotICAgICAgICAgICAgZmluYWwgaW50IG51bUxpc3RlbmVycyA9IG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJEZWxlZ2F0ZSBsaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuc2VuZFRhYmxldE1vZGVDaGFuZ2VkKHdoZW5OYW5vcywgaW5UYWJsZXRNb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbUdsb2JhbC5nZXRIb3N0VXNpVmVyc2lvbihkaXNwbGF5KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2OTYsNyArMTM3NCw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgVmlicmF0b3IgZ2V0SW5wdXREZXZpY2VWaWJyYXRvcihpbnQgZGV2aWNlSWQsIGludCB2aWJyYXRvcklkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW5wdXREZXZpY2VWaWJyYXRvcih0aGlzLCBkZXZpY2VJZCwgdmlicmF0b3JJZCk7CisgICAgICAgIHJldHVybiBuZXcgSW5wdXREZXZpY2VWaWJyYXRvcihkZXZpY2VJZCwgdmlicmF0b3JJZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzA3LDg1ICsxMzg1LDcgQEAKICAgICAgKi8KICAgICBATm9uTnVsbAogICAgIHB1YmxpYyBWaWJyYXRvck1hbmFnZXIgZ2V0SW5wdXREZXZpY2VWaWJyYXRvck1hbmFnZXIoaW50IGRldmljZUlkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW5wdXREZXZpY2VWaWJyYXRvck1hbmFnZXIoSW5wdXRNYW5hZ2VyLnRoaXMsIGRldmljZUlkKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBkZXZpY2UgdmlicmF0b3JzCi0gICAgICogQHJldHVybiBUaGUgbGlzdCBvZiB2aWJyYXRvcnMgSURzCi0gICAgICovCi0gICAgaW50W10gZ2V0VmlicmF0b3JJZHMoaW50IGRldmljZUlkKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbUltLmdldFZpYnJhdG9ySWRzKGRldmljZUlkKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQZXJmb3JtIHZpYnJhdGlvbiBlZmZlY3QKLSAgICAgKi8KLSAgICB2b2lkIHZpYnJhdGUoaW50IGRldmljZUlkLCBWaWJyYXRpb25FZmZlY3QgZWZmZWN0LCBJQmluZGVyIHRva2VuKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtSW0udmlicmF0ZShkZXZpY2VJZCwgZWZmZWN0LCB0b2tlbik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUGVyZm9ybSBjb21iaW5lZCB2aWJyYXRpb24gZWZmZWN0Ci0gICAgICovCi0gICAgdm9pZCB2aWJyYXRlKGludCBkZXZpY2VJZCwgQ29tYmluZWRWaWJyYXRpb24gZWZmZWN0LCBJQmluZGVyIHRva2VuKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtSW0udmlicmF0ZUNvbWJpbmVkKGRldmljZUlkLCBlZmZlY3QsIHRva2VuKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDYW5jZWwgYW4gb25nb2luZyB2aWJyYXRpb24KLSAgICAgKi8KLSAgICB2b2lkIGNhbmNlbFZpYnJhdGUoaW50IGRldmljZUlkLCBJQmluZGVyIHRva2VuKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtSW0uY2FuY2VsVmlicmF0ZShkZXZpY2VJZCwgdG9rZW4pOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGlmIGlucHV0IGRldmljZSBpcyB2aWJyYXRpbmcKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVmlicmF0aW5nKGludCBkZXZpY2VJZCkgIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtSW0uaXNWaWJyYXRpbmcoZGV2aWNlSWQpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBpbnB1dCBkZXZpY2UgdmlicmF0b3Igc3RhdGUgbGlzdGVuZXIKLSAgICAgKi8KLSAgICBib29sZWFuIHJlZ2lzdGVyVmlicmF0b3JTdGF0ZUxpc3RlbmVyKGludCBkZXZpY2VJZCwgSVZpYnJhdG9yU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1JbS5yZWdpc3RlclZpYnJhdG9yU3RhdGVMaXN0ZW5lcihkZXZpY2VJZCwgbGlzdGVuZXIpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnJlZ2lzdGVyIGlucHV0IGRldmljZSB2aWJyYXRvciBzdGF0ZSBsaXN0ZW5lcgotICAgICAqLwotICAgIGJvb2xlYW4gdW5yZWdpc3RlclZpYnJhdG9yU3RhdGVMaXN0ZW5lcihpbnQgZGV2aWNlSWQsIElWaWJyYXRvclN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtSW0udW5yZWdpc3RlclZpYnJhdG9yU3RhdGVMaXN0ZW5lcihkZXZpY2VJZCwgbGlzdGVuZXIpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJbnB1dERldmljZVZpYnJhdG9yTWFuYWdlcihkZXZpY2VJZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzk1LDEwICsxMzk1LDcgQEAKICAgICAgKi8KICAgICBATm9uTnVsbAogICAgIHB1YmxpYyBTZW5zb3JNYW5hZ2VyIGdldElucHV0RGV2aWNlU2Vuc29yTWFuYWdlcihpbnQgZGV2aWNlSWQpIHsKLSAgICAgICAgaWYgKG1JbnB1dERldmljZVNlbnNvck1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbUlucHV0RGV2aWNlU2Vuc29yTWFuYWdlciA9IG5ldyBJbnB1dERldmljZVNlbnNvck1hbmFnZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1JbnB1dERldmljZVNlbnNvck1hbmFnZXIuZ2V0U2Vuc29yTWFuYWdlcihkZXZpY2VJZCk7CisgICAgICAgIHJldHVybiBtR2xvYmFsLmdldElucHV0RGV2aWNlU2Vuc29yTWFuYWdlcihkZXZpY2VJZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODA4LDE1ICsxNDA1LDcgQEAKICAgICAgKi8KICAgICBATm9uTnVsbAogICAgIHB1YmxpYyBCYXR0ZXJ5U3RhdGUgZ2V0SW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUoaW50IGRldmljZUlkLCBib29sZWFuIGhhc0JhdHRlcnkpIHsKLSAgICAgICAgaWYgKCFoYXNCYXR0ZXJ5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsQmF0dGVyeVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIElJbnB1dERldmljZUJhdHRlcnlTdGF0ZSBzdGF0ZSA9IG1JbS5nZXRCYXR0ZXJ5U3RhdGUoZGV2aWNlSWQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbEJhdHRlcnlTdGF0ZShzdGF0ZS5pc1ByZXNlbnQsIHN0YXRlLnN0YXR1cywgc3RhdGUuY2FwYWNpdHkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1HbG9iYWwuZ2V0SW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUoZGV2aWNlSWQsIGhhc0JhdHRlcnkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTgyNiw3NyArMTQxNSw3IEBACiAgICAgICovCiAgICAgQE5vbk51bGwKICAgICBwdWJsaWMgTGlnaHRzTWFuYWdlciBnZXRJbnB1dERldmljZUxpZ2h0c01hbmFnZXIoaW50IGRldmljZUlkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW5wdXREZXZpY2VMaWdodHNNYW5hZ2VyKElucHV0TWFuYWdlci50aGlzLCBkZXZpY2VJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGxpc3Qgb2YgbGlnaHQgb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggYW4gaW5wdXQgZGV2aWNlLgotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbGlnaHRzLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsIExpc3Q8TGlnaHQ+IGdldExpZ2h0cyhpbnQgZGV2aWNlSWQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtSW0uZ2V0TGlnaHRzKGRldmljZUlkKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIGFuIGlucHV0IGRldmljZSBsaWdodC4KLSAgICAgKiBAcmV0dXJuIHRoZSBsaWdodCBzdGF0ZQotICAgICAqLwotICAgIEBOb25OdWxsIExpZ2h0U3RhdGUgZ2V0TGlnaHRTdGF0ZShpbnQgZGV2aWNlSWQsIEBOb25OdWxsIExpZ2h0IGxpZ2h0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbUltLmdldExpZ2h0U3RhdGUoZGV2aWNlSWQsIGxpZ2h0LmdldElkKCkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBtb2RpZnkgdGhlIHN0YXRlcyBvZiBtdWx0aXBsZSBsaWdodHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCB0aGUgc2V0dGluZ3MgZm9yIGxpZ2h0cyB0aGF0IHNob3VsZCBjaGFuZ2UKLSAgICAgKi8KLSAgICB2b2lkIHJlcXVlc3RMaWdodHMoaW50IGRldmljZUlkLCBATm9uTnVsbCBMaWdodHNSZXF1ZXN0IHJlcXVlc3QsIElCaW5kZXIgdG9rZW4pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gbGlnaHRJZExpc3QgPSByZXF1ZXN0LmdldExpZ2h0cygpOwotICAgICAgICAgICAgaW50W10gbGlnaHRJZHMgPSBuZXcgaW50W2xpZ2h0SWRMaXN0LnNpemUoKV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpZ2h0SWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbGlnaHRJZHNbaV0gPSBsaWdodElkTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PExpZ2h0U3RhdGU+IGxpZ2h0U3RhdGVMaXN0ID0gcmVxdWVzdC5nZXRMaWdodFN0YXRlcygpOwotICAgICAgICAgICAgbUltLnNldExpZ2h0U3RhdGVzKGRldmljZUlkLCBsaWdodElkcywKLSAgICAgICAgICAgICAgICAgICAgbGlnaHRTdGF0ZUxpc3QudG9BcnJheShuZXcgTGlnaHRTdGF0ZVswXSksCi0gICAgICAgICAgICAgICAgICAgIHRva2VuKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW4gbGlnaHQgc2Vzc2lvbiBmb3IgaW5wdXQgZGV2aWNlIG1hbmFnZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gZm9yIHRoZSBsaWdodCBzZXNzaW9uCi0gICAgICovCi0gICAgdm9pZCBvcGVuTGlnaHRTZXNzaW9uKGludCBkZXZpY2VJZCwgU3RyaW5nIG9wUGtnLCBATm9uTnVsbCBJQmluZGVyIHRva2VuKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtSW0ub3BlbkxpZ2h0U2Vzc2lvbihkZXZpY2VJZCwgb3BQa2csIHRva2VuKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIGxpZ2h0IHNlc3Npb24KLSAgICAgKgotICAgICAqLwotICAgIHZvaWQgY2xvc2VMaWdodFNlc3Npb24oaW50IGRldmljZUlkLCBATm9uTnVsbCBJQmluZGVyIHRva2VuKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtSW0uY2xvc2VMaWdodFNlc3Npb24oZGV2aWNlSWQsIHRva2VuKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IElucHV0RGV2aWNlTGlnaHRzTWFuYWdlcihnZXRDb250ZXh0KCksIGRldmljZUlkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5NTIsNDkgKzE0NzEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyKGludCBkZXZpY2VJZCwgQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsCiAgICAgICAgICAgICBATm9uTnVsbCBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGV4ZWN1dG9yLCAiZXhlY3V0b3Igc2hvdWxkIG5vdCBiZSBudWxsIik7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwobGlzdGVuZXIsICJsaXN0ZW5lciBzaG91bGQgbm90IGJlIG51bGwiKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1CYXR0ZXJ5TGlzdGVuZXJzTG9jaykgewotICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5TGlzdGVuZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeUxpc3RlbmVycyA9IG5ldyBTcGFyc2VBcnJheTw+KCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyID0gbmV3IExvY2FsSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzIGxpc3RlbmVyc0ZvckRldmljZSA9IG1CYXR0ZXJ5TGlzdGVuZXJzLmdldChkZXZpY2VJZCk7Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXJzRm9yRGV2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZGV2aWNlSWQgaXMgY3VycmVudGx5IG5vdCBiZWluZyBtb25pdG9yZWQgZm9yIGJhdHRlcnkgY2hhbmdlcy4KLSAgICAgICAgICAgICAgICAvLyBTdGFydCBtb25pdG9yaW5nIHRoZSBkZXZpY2UuCi0gICAgICAgICAgICAgICAgbGlzdGVuZXJzRm9yRGV2aWNlID0gbmV3IFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzKCk7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlMaXN0ZW5lcnMucHV0KGRldmljZUlkLCBsaXN0ZW5lcnNGb3JEZXZpY2UpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbS5yZWdpc3RlckJhdHRlcnlMaXN0ZW5lcihkZXZpY2VJZCwgbUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZGV2aWNlSWQgaXMgYWxyZWFkeSBiZWluZyBtb25pdG9yZWQgZm9yIGJhdHRlcnkgY2hhbmdlcy4KLSAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbGlzdGVuZXIgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbnVtRGVsZWdhdGVzID0gbGlzdGVuZXJzRm9yRGV2aWNlLm1EZWxlZ2F0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGVsZWdhdGVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgcmVnaXN0ZXJlZExpc3RlbmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNGb3JEZXZpY2UubURlbGVnYXRlcy5nZXQoaSkubUxpc3RlbmVyOwotICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMobGlzdGVuZXIsIHJlZ2lzdGVyZWRMaXN0ZW5lcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGFuIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIHRoYXQgaGFzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgZGV2aWNlSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRldmljZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyRGVsZWdhdGUgZGVsZWdhdGUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXJEZWxlZ2F0ZShsaXN0ZW5lciwgZXhlY3V0b3IpOwotICAgICAgICAgICAgbGlzdGVuZXJzRm9yRGV2aWNlLm1EZWxlZ2F0ZXMuYWRkKGRlbGVnYXRlKTsKLQotICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBsaXN0ZW5lciBpbW1lZGlhdGVseSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGxhdGVzdCBiYXR0ZXJ5IHN0YXRlLgotICAgICAgICAgICAgaWYgKGxpc3RlbmVyc0ZvckRldmljZS5tSW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlbGVnYXRlLm5vdGlmeUJhdHRlcnlTdGF0ZUNoYW5nZWQobGlzdGVuZXJzRm9yRGV2aWNlLm1JbnB1dERldmljZUJhdHRlcnlTdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbUdsb2JhbC5hZGRJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcihkZXZpY2VJZCwgZXhlY3V0b3IsIGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMDQsNDQgKzE0ODEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyKGludCBkZXZpY2VJZCwKICAgICAgICAgICAgIEBOb25OdWxsIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwobGlzdGVuZXIsICJsaXN0ZW5lciBzaG91bGQgbm90IGJlIG51bGwiKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1CYXR0ZXJ5TGlzdGVuZXJzTG9jaykgewotICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5TGlzdGVuZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSZWdpc3RlcmVkQmF0dGVyeUxpc3RlbmVycyBsaXN0ZW5lcnNGb3JEZXZpY2UgPSBtQmF0dGVyeUxpc3RlbmVycy5nZXQoZGV2aWNlSWQpOwotICAgICAgICAgICAgaWYgKGxpc3RlbmVyc0ZvckRldmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGRldmljZUlkIGlzIG5vdCBjdXJyZW50bHkgYmVpbmcgbW9uaXRvcmVkLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8SW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXJEZWxlZ2F0ZT4gZGVsZWdhdGVzID0KLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzRm9yRGV2aWNlLm1EZWxlZ2F0ZXM7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbGVnYXRlcy5zaXplKCk7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWxzKGxpc3RlbmVyLCBkZWxlZ2F0ZXMuZ2V0KGkpLm1MaXN0ZW5lcikpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZGVsZWdhdGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG5vIG1vcmUgYmF0dGVyeSBsaXN0ZW5lcnMgZm9yIHRoaXMgZGV2aWNlSWQuIFN0b3AgbW9uaXRvcmluZyB0aGlzIGRldmljZS4KLSAgICAgICAgICAgIG1CYXR0ZXJ5TGlzdGVuZXJzLnJlbW92ZShkZXZpY2VJZCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1JbS51bnJlZ2lzdGVyQmF0dGVyeUxpc3RlbmVyKGRldmljZUlkLCBtSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJhdHRlcnlMaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gbW9yZSBkZXZpY2VzIGJlaW5nIG1vbml0b3JlZCwgc28gdGhlIHJlZ2lzdGVyZWQKLSAgICAgICAgICAgICAgICAvLyBJSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRyb3BwZWQgYnkgdGhlIHNlcnZlci4KLSAgICAgICAgICAgICAgICBtQmF0dGVyeUxpc3RlbmVycyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtR2xvYmFsLnJlbW92ZUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyKGRldmljZUlkLCBsaXN0ZW5lcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMDY3LDMwICsxNTA3LDcgQEAKICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uTU9OSVRPUl9LRVlCT0FSRF9CQUNLTElHSFQpCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yLAogICAgICAgICAgICAgQE5vbk51bGwgS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXhlY3V0b3IsICJleGVjdXRvciBzaG91bGQgbm90IGJlIG51bGwiKTsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChsaXN0ZW5lciwgImxpc3RlbmVyIHNob3VsZCBub3QgYmUgbnVsbCIpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgIG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyID0gbmV3IExvY2FsS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcigpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbUltLnJlZ2lzdGVyS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcihtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCBudW1MaXN0ZW5lcnMgPSBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMuZ2V0KGkpLm1MaXN0ZW5lciA9PSBsaXN0ZW5lcikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lckRlbGVnYXRlIGRlbGVnYXRlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJEZWxlZ2F0ZShsaXN0ZW5lciwgZXhlY3V0b3IpOwotICAgICAgICAgICAgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzLmFkZChkZWxlZ2F0ZSk7Ci0gICAgICAgIH0KKyAgICAgICAgbUdsb2JhbC5yZWdpc3RlcktleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIoZXhlY3V0b3IsIGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxMDMsMjMgKzE1MjAsNyBAQAogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5NT05JVE9SX0tFWUJPQVJEX0JBQ0tMSUdIVCkKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcigKICAgICAgICAgICAgIEBOb25OdWxsIEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChsaXN0ZW5lciwgImxpc3RlbmVyIHNob3VsZCBub3QgYmUgbnVsbCIpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMucmVtb3ZlSWYoKGRlbGVnYXRlKSAtPiBkZWxlZ2F0ZS5tTGlzdGVuZXIgPT0gbGlzdGVuZXIpOwotICAgICAgICAgICAgaWYgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtSW0udW5yZWdpc3RlcktleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbUdsb2JhbC51bnJlZ2lzdGVyS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTQ5LDcgKzE1NTAsNyBAQAogICAgIHB1YmxpYyBpbnRlcmZhY2UgSW5wdXREZXZpY2VMaXN0ZW5lciB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDYWxsZWQgd2hlbmV2ZXIgYW4gaW5wdXQgZGV2aWNlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBzeXN0ZW0uCi0gICAgICAgICAqIFVzZSB7QGxpbmsgSW5wdXRNYW5hZ2VyI2dldElucHV0RGV2aWNlfSB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlLgorICAgICAgICAgKiBVc2Uge0BsaW5rIElucHV0TWFuYWdlckdsb2JhbCNnZXRJbnB1dERldmljZX0gdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZS4KICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRldmljZUlkIFRoZSBpZCBvZiB0aGUgaW5wdXQgZGV2aWNlIHRoYXQgd2FzIGFkZGVkLgogICAgICAgICAgKi8KQEAgLTIxNzIsMzcgKzE1NzMsNiBAQAogICAgICAgICB2b2lkIG9uSW5wdXREZXZpY2VDaGFuZ2VkKGludCBkZXZpY2VJZCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIgZXh0ZW5kcyBJSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyLlN0dWIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JbnB1dERldmljZXNDaGFuZ2VkKGludFtdIGRldmljZUlkQW5kR2VuZXJhdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBJbnB1dE1hbmFnZXIudGhpcy5vbklucHV0RGV2aWNlc0NoYW5nZWQoZGV2aWNlSWRBbmRHZW5lcmF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIElucHV0RGV2aWNlTGlzdGVuZXJEZWxlZ2F0ZSBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwdWJsaWMgZmluYWwgSW5wdXREZXZpY2VMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAgICAgcHVibGljIElucHV0RGV2aWNlTGlzdGVuZXJEZWxlZ2F0ZShJbnB1dERldmljZUxpc3RlbmVyIGxpc3RlbmVyLCBIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIgIT0gbnVsbCA/IGhhbmRsZXIuZ2V0TG9vcGVyKCkgOiBMb29wZXIubXlMb29wZXIoKSk7Ci0gICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfREVWSUNFX0FEREVEOgotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25JbnB1dERldmljZUFkZGVkKG1zZy5hcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfREVWSUNFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbklucHV0RGV2aWNlUmVtb3ZlZChtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFVklDRV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25JbnB1dERldmljZUNoYW5nZWQobXNnLmFyZzEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKiBAaGlkZSAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIHsKICAgICAgICAgLyoqCkBAIC0yMjM1LDE3MCArMTYwNSw0IEBACiAgICAgICAgIHZvaWQgb25LZXlib2FyZEJhY2tsaWdodENoYW5nZWQoCiAgICAgICAgICAgICAgICAgaW50IGRldmljZUlkLCBATm9uTnVsbCBLZXlib2FyZEJhY2tsaWdodFN0YXRlIHN0YXRlLCBib29sZWFuIGlzVHJpZ2dlcmVkQnlLZXlQcmVzcyk7CiAgICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBUYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIGV4dGVuZHMgSVRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIuU3R1YiB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblRhYmxldE1vZGVDaGFuZ2VkKGxvbmcgd2hlbk5hbm9zLCBib29sZWFuIGluVGFibGV0TW9kZSkgewotICAgICAgICAgICAgSW5wdXRNYW5hZ2VyLnRoaXMub25UYWJsZXRNb2RlQ2hhbmdlZCh3aGVuTmFub3MsIGluVGFibGV0TW9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJEZWxlZ2F0ZSBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RBQkxFVF9NT0RFX0NIQU5HRUQgPSAwOwotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgICAgIHB1YmxpYyBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJEZWxlZ2F0ZSgKLSAgICAgICAgICAgICAgICBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIsIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAgICAgc3VwZXIoaGFuZGxlciAhPSBudWxsID8gaGFuZGxlci5nZXRMb29wZXIoKSA6IExvb3Blci5teUxvb3BlcigpKTsKLSAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VuZFRhYmxldE1vZGVDaGFuZ2VkKGxvbmcgd2hlbk5hbm9zLCBib29sZWFuIGluVGFibGV0TW9kZSkgewotICAgICAgICAgICAgU29tZUFyZ3MgYXJncyA9IFNvbWVBcmdzLm9idGFpbigpOwotICAgICAgICAgICAgYXJncy5hcmdpMSA9IChpbnQpIHdoZW5OYW5vczsKLSAgICAgICAgICAgIGFyZ3MuYXJnaTIgPSAoaW50KSAod2hlbk5hbm9zID4+IDMyKTsKLSAgICAgICAgICAgIGFyZ3MuYXJnMSA9IGluVGFibGV0TW9kZTsKLSAgICAgICAgICAgIG9idGFpbk1lc3NhZ2UoTVNHX1RBQkxFVF9NT0RFX0NIQU5HRUQsIGFyZ3MpLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfVEFCTEVUX01PREVfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgIFNvbWVBcmdzIGFyZ3MgPSAoU29tZUFyZ3MpIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgbG9uZyB3aGVuTmFub3MgPSAoYXJncy5hcmdpMSAmIDB4RkZGRkZGRkZMKSB8ICgobG9uZykgYXJncy5hcmdpMiA8PCAzMik7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpblRhYmxldE1vZGUgPSAoYm9vbGVhbikgYXJncy5hcmcxOwotICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vblRhYmxldE1vZGVDaGFuZ2VkKHdoZW5OYW5vcywgaW5UYWJsZXRNb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhbmRyb2lkLmhhcmR3YXJlLkJhdHRlcnlTdGF0ZSBpbnRlcmZhY2UgdXNlZCB0byByZXBvcnQgdGhlIGJhdHRlcnkKLSAgICAvLyBzdGF0ZSB2aWEgdGhlIElucHV0RGV2aWNlI2dldEJhdHRlcnlTdGF0ZSgpIGFuZCBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciBpbnRlcmZhY2VzLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIExvY2FsQmF0dGVyeVN0YXRlIGV4dGVuZHMgQmF0dGVyeVN0YXRlIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1ByZXNlbnQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1TdGF0dXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbUNhcGFjaXR5OwotCi0gICAgICAgIExvY2FsQmF0dGVyeVN0YXRlKCkgewotICAgICAgICAgICAgdGhpcyhmYWxzZSAvKmlzUHJlc2VudCovLCBCYXR0ZXJ5U3RhdGUuU1RBVFVTX1VOS05PV04sIEZsb2F0Lk5hTiAvKmNhcGFjaXR5Ki8pOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9jYWxCYXR0ZXJ5U3RhdGUoYm9vbGVhbiBpc1ByZXNlbnQsIGludCBzdGF0dXMsIGZsb2F0IGNhcGFjaXR5KSB7Ci0gICAgICAgICAgICBtSXNQcmVzZW50ID0gaXNQcmVzZW50OwotICAgICAgICAgICAgbVN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgICAgIG1DYXBhY2l0eSA9IGNhcGFjaXR5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNQcmVzZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1TdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGZsb2F0IGdldENhcGFjaXR5KCkgewotICAgICAgICAgICAgcmV0dXJuIG1DYXBhY2l0eTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzIHsKLSAgICAgICAgZmluYWwgTGlzdDxJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lckRlbGVnYXRlPiBtRGVsZWdhdGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIElJbnB1dERldmljZUJhdHRlcnlTdGF0ZSBtSW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXJEZWxlZ2F0ZSB7Ci0gICAgICAgIGZpbmFsIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKLSAgICAgICAgZmluYWwgRXhlY3V0b3IgbUV4ZWN1dG9yOwotCi0gICAgICAgIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyRGVsZWdhdGUoSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgbGlzdGVuZXIsIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgICAgIG1FeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBub3RpZnlCYXR0ZXJ5U3RhdGVDaGFuZ2VkKElJbnB1dERldmljZUJhdHRlcnlTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQmF0dGVyeVN0YXRlQ2hhbmdlZChzdGF0ZS5kZXZpY2VJZCwgc3RhdGUudXBkYXRlVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYWxCYXR0ZXJ5U3RhdGUoc3RhdGUuaXNQcmVzZW50LCBzdGF0ZS5zdGF0dXMsIHN0YXRlLmNhcGFjaXR5KSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBMb2NhbElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIGV4dGVuZHMgSUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyLlN0dWIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25CYXR0ZXJ5U3RhdGVDaGFuZ2VkKElJbnB1dERldmljZUJhdHRlcnlTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtQmF0dGVyeUxpc3RlbmVyc0xvY2spIHsKLSAgICAgICAgICAgICAgICBpZiAobUJhdHRlcnlMaXN0ZW5lcnMgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIGZpbmFsIFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzIGVudHJ5ID0gbUJhdHRlcnlMaXN0ZW5lcnMuZ2V0KHN0YXRlLmRldmljZUlkKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgZW50cnkubUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IG51bURlbGVnYXRlcyA9IGVudHJ5Lm1EZWxlZ2F0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGVsZWdhdGVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZW50cnkubURlbGVnYXRlcy5nZXQoaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm90aWZ5QmF0dGVyeVN0YXRlQ2hhbmdlZChlbnRyeS5tSW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LktleWJvYXJkQmFja2xpZ2h0U3RhdGUgaW50ZXJmYWNlIHVzZWQgdG8gcmVwb3J0Ci0gICAgLy8gdGhlIGtleWJvYXJkIGJhY2tsaWdodCBzdGF0ZSB2aWEgdGhlIEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgaW50ZXJmYWNlcy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBMb2NhbEtleWJvYXJkQmFja2xpZ2h0U3RhdGUgZXh0ZW5kcyBLZXlib2FyZEJhY2tsaWdodFN0YXRlIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQnJpZ2h0bmVzc0xldmVsOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTWF4QnJpZ2h0bmVzc0xldmVsOwotCi0gICAgICAgIExvY2FsS2V5Ym9hcmRCYWNrbGlnaHRTdGF0ZShpbnQgYnJpZ2h0bmVzc0xldmVsLCBpbnQgbWF4QnJpZ2h0bmVzc0xldmVsKSB7Ci0gICAgICAgICAgICBtQnJpZ2h0bmVzc0xldmVsID0gYnJpZ2h0bmVzc0xldmVsOwotICAgICAgICAgICAgbU1heEJyaWdodG5lc3NMZXZlbCA9IG1heEJyaWdodG5lc3NMZXZlbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEJyaWdodG5lc3NMZXZlbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQnJpZ2h0bmVzc0xldmVsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4QnJpZ2h0bmVzc0xldmVsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NYXhCcmlnaHRuZXNzTGV2ZWw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyRGVsZWdhdGUgewotICAgICAgICBmaW5hbCBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyIG1MaXN0ZW5lcjsKLSAgICAgICAgZmluYWwgRXhlY3V0b3IgbUV4ZWN1dG9yOwotCi0gICAgICAgIEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJEZWxlZ2F0ZShLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyIGxpc3RlbmVyLCBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgICAgICBtRXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgbm90aWZ5S2V5Ym9hcmRCYWNrbGlnaHRDaGFuZ2UoaW50IGRldmljZUlkLCBJS2V5Ym9hcmRCYWNrbGlnaHRTdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJpZ2dlcmVkQnlLZXlQcmVzcykgewotICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uS2V5Ym9hcmRCYWNrbGlnaHRDaGFuZ2VkKGRldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhbEtleWJvYXJkQmFja2xpZ2h0U3RhdGUoc3RhdGUuYnJpZ2h0bmVzc0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubWF4QnJpZ2h0bmVzc0xldmVsKSwgaXNUcmlnZ2VyZWRCeUtleVByZXNzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIExvY2FsS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciBleHRlbmRzIElLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyLlN0dWIgewotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJyaWdodG5lc3NDaGFuZ2VkKGludCBkZXZpY2VJZCwgSUtleWJvYXJkQmFja2xpZ2h0U3RhdGUgc3RhdGUsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyaWdnZXJlZEJ5S2V5UHJlc3MpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJMb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycyA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IG51bUxpc3RlbmVycyA9IG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMuZ2V0KGkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vdGlmeUtleWJvYXJkQmFja2xpZ2h0Q2hhbmdlKGRldmljZUlkLCBzdGF0ZSwgaXNUcmlnZ2VyZWRCeUtleVByZXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9pbnB1dC9JbnB1dE1hbmFnZXJHbG9iYWwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0TWFuYWdlckdsb2JhbC5qYXZhCmluZGV4IDgyZGRkZmMuLjA4ZDgxYmQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0TWFuYWdlckdsb2JhbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL2lucHV0L0lucHV0TWFuYWdlckdsb2JhbC5qYXZhCkBAIC0xNiwxOCArMTYsODAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmlucHV0OwogCitpbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkJhdHRlcnlTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXIuSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXIuSW5wdXREZXZpY2VMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklucHV0TWFuYWdlci5LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSW5wdXRNYW5hZ2VyLk9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmxpZ2h0cy5MaWdodDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmxpZ2h0cy5MaWdodFN0YXRlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUubGlnaHRzLkxpZ2h0c1JlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5Db21iaW5lZFZpYnJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSVZpYnJhdG9yU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdGlvbkVmZmVjdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXREZXZpY2U7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5HdWFyZGVkQnk7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU29tZUFyZ3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwogCiAvKioKICAqIE1hbmFnZXMgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBpbnB1dCBtYW5hZ2VyIHNlcnZpY2Ugb24gYmVoYWxmIG9mCi0gKiBhbiBhcHBsaWNhdGlvbiBwcm9jZXNzLiAgWW91J3JlIHByb2JhYmx5IGxvb2tpbmcgZm9yIHtAbGluayBJbnB1dE1hbmFnZXJ9LgorICogYW4gYXBwbGljYXRpb24gcHJvY2Vzcy4gWW91J3JlIHByb2JhYmx5IGxvb2tpbmcgZm9yIHtAbGluayBJbnB1dE1hbmFnZXJ9LgogICoKICAqIEBoaWRlCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBJbnB1dE1hbmFnZXJHbG9iYWwgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiSW5wdXRNYW5hZ2VyR2xvYmFsIjsKKyAgICAvLyBUbyBlbmFibGUgdGhlc2UgbG9ncywgcnVuOiAnYWRiIHNoZWxsIHNldHByb3AgbG9nLnRhZy5JbnB1dE1hbmFnZXJHbG9iYWwgREVCVUcnCisgICAgLy8gKHJlcXVpcmVzIHJlc3RhcnQpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKKworICAgIEBHdWFyZGVkQnkoIm1JbnB1dERldmljZUxpc3RlbmVycyIpCisgICAgQE51bGxhYmxlIHByaXZhdGUgU3BhcnNlQXJyYXk8SW5wdXREZXZpY2U+IG1JbnB1dERldmljZXM7CisgICAgQEd1YXJkZWRCeSgibUlucHV0RGV2aWNlTGlzdGVuZXJzIikKKyAgICBATnVsbGFibGUgcHJpdmF0ZSBJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIgbUlucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lcjsKKyAgICBAR3VhcmRlZEJ5KCJtSW5wdXREZXZpY2VMaXN0ZW5lcnMiKQorICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PElucHV0RGV2aWNlTGlzdGVuZXJEZWxlZ2F0ZT4gbUlucHV0RGV2aWNlTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBAR3VhcmRlZEJ5KCJtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycyIpCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8T25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGU+IG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUJhdHRlcnlMaXN0ZW5lcnNMb2NrID0gbmV3IE9iamVjdCgpOworICAgIC8vIE1hcHMgYSBkZXZpY2VJZCB3aG9zZSBiYXR0ZXJ5IGlzIGN1cnJlbnRseSBiZWluZyBtb25pdG9yZWQgdG8gYW4gZW50cnkgY29udGFpbmluZyB0aGUKKyAgICAvLyByZWdpc3RlcmVkIGxpc3RlbmVycyBmb3IgdGhhdCBkZXZpY2UuCisgICAgQEd1YXJkZWRCeSgibUJhdHRlcnlMaXN0ZW5lcnNMb2NrIikKKyAgICBATnVsbGFibGUgcHJpdmF0ZSBTcGFyc2VBcnJheTxSZWdpc3RlcmVkQmF0dGVyeUxpc3RlbmVycz4gbUJhdHRlcnlMaXN0ZW5lcnM7CisgICAgQEd1YXJkZWRCeSgibUJhdHRlcnlMaXN0ZW5lcnNMb2NrIikKKyAgICBATnVsbGFibGUgcHJpdmF0ZSBJSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgbUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJMb2NrID0gbmV3IE9iamVjdCgpOworICAgIEBHdWFyZGVkQnkoIm1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyTG9jayIpCisgICAgQE51bGxhYmxlIHByaXZhdGUgQXJyYXlMaXN0PEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJEZWxlZ2F0ZT4gbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzOworICAgIEBHdWFyZGVkQnkoIm1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyTG9jayIpCisgICAgQE51bGxhYmxlIHByaXZhdGUgSUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXI7CisKKyAgICBATnVsbGFibGUgcHJpdmF0ZSBJbnB1dERldmljZVNlbnNvck1hbmFnZXIgbUlucHV0RGV2aWNlU2Vuc29yTWFuYWdlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIElucHV0TWFuYWdlckdsb2JhbCBzSW5zdGFuY2U7CiAKQEAgLTc5LDQgKzE0MSw5MjAgQEAKICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNnZXRJbnB1dERldmljZShpbnQpCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIElucHV0RGV2aWNlIGdldElucHV0RGV2aWNlKGludCBpZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dERldmljZUxpc3RlbmVycykgeworICAgICAgICAgICAgcG9wdWxhdGVJbnB1dERldmljZXNMb2NrZWQoKTsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gbUlucHV0RGV2aWNlcy5pbmRleE9mS2V5KGlkKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSW5wdXREZXZpY2UgaW5wdXREZXZpY2UgPSBtSW5wdXREZXZpY2VzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKGlucHV0RGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERldmljZSA9IG1JbS5nZXRJbnB1dERldmljZShpZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbnB1dERldmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dERldmljZXMuc2V0VmFsdWVBdChpbmRleCwgaW5wdXREZXZpY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbnB1dERldmljZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBHdWFyZGVkQnkoIm1JbnB1dERldmljZUxpc3RlbmVycyIpCisgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlSW5wdXREZXZpY2VzTG9ja2VkKCkgeworICAgICAgICBpZiAobUlucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1JbS5yZWdpc3RlcklucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUlucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgaW50W10gaWRzOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZHMgPSBtSW0uZ2V0SW5wdXREZXZpY2VJZHMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1JbnB1dERldmljZXMgPSBuZXcgU3BhcnNlQXJyYXk8PigpOworICAgICAgICAgICAgZm9yIChpbnQgaWQgOiBpZHMpIHsKKyAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VzLnB1dChpZCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIElucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lciBleHRlbmRzIElJbnB1dERldmljZXNDaGFuZ2VkTGlzdGVuZXIuU3R1YiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbklucHV0RGV2aWNlc0NoYW5nZWQoaW50W10gZGV2aWNlSWRBbmRHZW5lcmF0aW9uKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIElucHV0TWFuYWdlckdsb2JhbC50aGlzLm9uSW5wdXREZXZpY2VzQ2hhbmdlZChkZXZpY2VJZEFuZEdlbmVyYXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXREZXZpY2VzQ2hhbmdlZChpbnRbXSBkZXZpY2VJZEFuZEdlbmVyYXRpb24pIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBpbnB1dCBkZXZpY2VzIGNoYW5nZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnB1dERldmljZUxpc3RlbmVycykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1JbnB1dERldmljZXMuc2l6ZSgpOyAtLWkgPiAwOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGV2aWNlSWQgPSBtSW5wdXREZXZpY2VzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNEZXZpY2VJZChkZXZpY2VJZEFuZEdlbmVyYXRpb24sIGRldmljZUlkKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRldmljZSByZW1vdmVkOiAiICsgZGV2aWNlSWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dERldmljZXMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlVG9JbnB1dERldmljZUxpc3RlbmVyc0xvY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dERldmljZUxpc3RlbmVyRGVsZWdhdGUuTVNHX0RFVklDRV9SRU1PVkVELCBkZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZUlkQW5kR2VuZXJhdGlvbi5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZXZpY2VJZCA9IGRldmljZUlkQW5kR2VuZXJhdGlvbltpXTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtSW5wdXREZXZpY2VzLmluZGV4T2ZLZXkoZGV2aWNlSWQpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlIGRldmljZSA9IG1JbnB1dERldmljZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGdlbmVyYXRpb24gPSBkZXZpY2VJZEFuZEdlbmVyYXRpb25baSArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZS5nZXRHZW5lcmF0aW9uKCkgIT0gZ2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZXZpY2UgY2hhbmdlZDogIiArIGRldmljZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlcy5zZXRWYWx1ZUF0KGluZGV4LCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZVRvSW5wdXREZXZpY2VMaXN0ZW5lcnNMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dERldmljZUxpc3RlbmVyRGVsZWdhdGUuTVNHX0RFVklDRV9DSEFOR0VELCBkZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRldmljZSBhZGRlZDogIiArIGRldmljZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VzLnB1dChkZXZpY2VJZCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlVG9JbnB1dERldmljZUxpc3RlbmVyc0xvY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dERldmljZUxpc3RlbmVyRGVsZWdhdGUuTVNHX0RFVklDRV9BRERFRCwgZGV2aWNlSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIElucHV0RGV2aWNlTGlzdGVuZXJEZWxlZ2F0ZSBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwdWJsaWMgZmluYWwgSW5wdXREZXZpY2VMaXN0ZW5lciBtTGlzdGVuZXI7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFVklDRV9BRERFRCA9IDE7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFVklDRV9SRU1PVkVEID0gMjsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVWSUNFX0NIQU5HRUQgPSAzOworCisgICAgICAgIElucHV0RGV2aWNlTGlzdGVuZXJEZWxlZ2F0ZShJbnB1dERldmljZUxpc3RlbmVyIGxpc3RlbmVyLCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIgIT0gbnVsbCA/IGhhbmRsZXIuZ2V0TG9vcGVyKCkgOiBMb29wZXIubXlMb29wZXIoKSk7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfREVWSUNFX0FEREVEOgorICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25JbnB1dERldmljZUFkZGVkKG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfREVWSUNFX1JFTU9WRUQ6CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbklucHV0RGV2aWNlUmVtb3ZlZChtc2cuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFVklDRV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25JbnB1dERldmljZUNoYW5nZWQobXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNEZXZpY2VJZChpbnRbXSBkZXZpY2VJZEFuZEdlbmVyYXRpb24sIGludCBkZXZpY2VJZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZUlkQW5kR2VuZXJhdGlvbi5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaWYgKGRldmljZUlkQW5kR2VuZXJhdGlvbltpXSA9PSBkZXZpY2VJZCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAR3VhcmRlZEJ5KCJtSW5wdXREZXZpY2VMaXN0ZW5lcnMiKQorICAgIHByaXZhdGUgdm9pZCBzZW5kTWVzc2FnZVRvSW5wdXREZXZpY2VMaXN0ZW5lcnNMb2NrZWQoaW50IHdoYXQsIGludCBkZXZpY2VJZCkgeworICAgICAgICBmaW5hbCBpbnQgbnVtTGlzdGVuZXJzID0gbUlucHV0RGV2aWNlTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7IGkrKykgeworICAgICAgICAgICAgSW5wdXREZXZpY2VMaXN0ZW5lckRlbGVnYXRlIGxpc3RlbmVyID0gbUlucHV0RGV2aWNlTGlzdGVuZXJzLmdldChpKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLnNlbmRNZXNzYWdlKGxpc3RlbmVyLm9idGFpbk1lc3NhZ2Uod2hhdCwgZGV2aWNlSWQsIDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI3JlZ2lzdGVySW5wdXREZXZpY2VMaXN0ZW5lcgorICAgICAqLworICAgIHZvaWQgcmVnaXN0ZXJJbnB1dERldmljZUxpc3RlbmVyKElucHV0RGV2aWNlTGlzdGVuZXIgbGlzdGVuZXIsIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdGVuZXIgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIHBvcHVsYXRlSW5wdXREZXZpY2VzTG9ja2VkKCk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kSW5wdXREZXZpY2VMaXN0ZW5lckxvY2tlZChsaXN0ZW5lcik7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlTGlzdGVuZXJzLmFkZChuZXcgSW5wdXREZXZpY2VMaXN0ZW5lckRlbGVnYXRlKGxpc3RlbmVyLCBoYW5kbGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciN1bnJlZ2lzdGVySW5wdXREZXZpY2VMaXN0ZW5lcgorICAgICAqLworICAgIHZvaWQgdW5yZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIoSW5wdXREZXZpY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdGVuZXIgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRJbnB1dERldmljZUxpc3RlbmVyTG9ja2VkKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgSW5wdXREZXZpY2VMaXN0ZW5lckRlbGVnYXRlIGQgPSBtSW5wdXREZXZpY2VMaXN0ZW5lcnMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBkLnJlbW92ZUNhbGxiYWNrc0FuZE1lc3NhZ2VzKG51bGwpOworICAgICAgICAgICAgICAgIG1JbnB1dERldmljZUxpc3RlbmVycy5yZW1vdmUoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQEd1YXJkZWRCeSgibUlucHV0RGV2aWNlTGlzdGVuZXJzIikKKyAgICBwcml2YXRlIGludCBmaW5kSW5wdXREZXZpY2VMaXN0ZW5lckxvY2tlZChJbnB1dERldmljZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGZpbmFsIGludCBudW1MaXN0ZW5lcnMgPSBtSW5wdXREZXZpY2VMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgaSsrKSB7CisgICAgICAgICAgICBpZiAobUlucHV0RGV2aWNlTGlzdGVuZXJzLmdldChpKS5tTGlzdGVuZXIgPT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjZ2V0SW5wdXREZXZpY2VJZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50W10gZ2V0SW5wdXREZXZpY2VJZHMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUlucHV0RGV2aWNlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBwb3B1bGF0ZUlucHV0RGV2aWNlc0xvY2tlZCgpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtSW5wdXREZXZpY2VzLnNpemUoKTsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIGlkcyA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWRzW2ldID0gbUlucHV0RGV2aWNlcy5rZXlBdChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpZHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNnZXRJbnB1dERldmljZUJ5RGVzY3JpcHRvcgorICAgICAqLworICAgIElucHV0RGV2aWNlIGdldElucHV0RGV2aWNlQnlEZXNjcmlwdG9yKFN0cmluZyBkZXNjcmlwdG9yKSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobUlucHV0RGV2aWNlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBwb3B1bGF0ZUlucHV0RGV2aWNlc0xvY2tlZCgpOworCisgICAgICAgICAgICBpbnQgbnVtRGV2aWNlcyA9IG1JbnB1dERldmljZXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1EZXZpY2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBJbnB1dERldmljZSBpbnB1dERldmljZSA9IG1JbnB1dERldmljZXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXREZXZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBtSW5wdXREZXZpY2VzLmtleUF0KGkpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXZpY2UgPSBtSW0uZ2V0SW5wdXREZXZpY2UoaWQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dERldmljZXMuc2V0VmFsdWVBdChpLCBpbnB1dERldmljZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmVxdWFscyhpbnB1dERldmljZS5nZXREZXNjcmlwdG9yKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dERldmljZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI2dldEhvc3RVc2lWZXJzaW9uCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgSG9zdFVzaVZlcnNpb24gZ2V0SG9zdFVzaVZlcnNpb24oQE5vbk51bGwgRGlzcGxheSBkaXNwbGF5KSB7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZGlzcGxheSwgImRpc3BsYXkgc2hvdWxkIG5vdCBiZSBudWxsIik7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBmaXJzdCB2YWxpZCBVU0kgdmVyc2lvbiByZXBvcnRlZCBieSBhbnkgaW5wdXQgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAvLyB0aGUgZGlzcGxheS4KKyAgICAgICAgc3luY2hyb25pemVkIChtSW5wdXREZXZpY2VMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIHBvcHVsYXRlSW5wdXREZXZpY2VzTG9ja2VkKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlIGRldmljZSA9IGdldElucHV0RGV2aWNlKG1JbnB1dERldmljZXMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCAmJiBkZXZpY2UuZ2V0QXNzb2NpYXRlZERpc3BsYXlJZCgpID09IGRpc3BsYXkuZ2V0RGlzcGxheUlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZS5nZXRIb3N0VXNpVmVyc2lvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2UuZ2V0SG9zdFVzaVZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpbnB1dCBkZXZpY2VzIHRoYXQgcmVwb3J0IGEgdmFsaWQgVVNJIHZlcnNpb24sIHNlZSBpZiB0aGVyZSBpcyBhIGNvbmZpZworICAgICAgICAvLyB0aGF0IHNwZWNpZmllcyB0aGUgVVNJIHZlcnNpb24gZm9yIHRoZSBkaXNwbGF5LiBUaGlzIGlzIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgVVNJCisgICAgICAgIC8vIGlucHV0IGRldmljZSBpcyBub3QgcmVnaXN0ZXJlZCBieSB0aGUga2VybmVsL2RyaXZlciBhbGwgdGhlIHRpbWUuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUltLmdldEhvc3RVc2lWZXJzaW9uRnJvbURpc3BsYXlDb25maWcoZGlzcGxheS5nZXREaXNwbGF5SWQoKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25UYWJsZXRNb2RlQ2hhbmdlZChsb25nIHdoZW5OYW5vcywgYm9vbGVhbiBpblRhYmxldE1vZGUpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCB0YWJsZXQgbW9kZSBjaGFuZ2VkOiAiCisgICAgICAgICAgICAgICAgICAgICsgIndoZW5OYW5vcz0iICsgd2hlbk5hbm9zICsgIiwgaW5UYWJsZXRNb2RlPSIgKyBpblRhYmxldE1vZGUpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAobU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBudW1MaXN0ZW5lcnMgPSBtT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgaSsrKSB7CisgICAgICAgICAgICAgICAgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGUgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgbU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlbmRUYWJsZXRNb2RlQ2hhbmdlZCh3aGVuTmFub3MsIGluVGFibGV0TW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgZXh0ZW5kcyBJVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lci5TdHViIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVGFibGV0TW9kZUNoYW5nZWQobG9uZyB3aGVuTmFub3MsIGJvb2xlYW4gaW5UYWJsZXRNb2RlKSB7CisgICAgICAgICAgICBJbnB1dE1hbmFnZXJHbG9iYWwudGhpcy5vblRhYmxldE1vZGVDaGFuZ2VkKHdoZW5OYW5vcywgaW5UYWJsZXRNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckRlbGVnYXRlIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVEFCTEVUX01PREVfQ0hBTkdFRCA9IDA7CisKKyAgICAgICAgcHVibGljIGZpbmFsIE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICAgICAgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGUoCisgICAgICAgICAgICAgICAgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyLCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIgIT0gbnVsbCA/IGhhbmRsZXIuZ2V0TG9vcGVyKCkgOiBMb29wZXIubXlMb29wZXIoKSk7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRUYWJsZXRNb2RlQ2hhbmdlZChsb25nIHdoZW5OYW5vcywgYm9vbGVhbiBpblRhYmxldE1vZGUpIHsKKyAgICAgICAgICAgIFNvbWVBcmdzIGFyZ3MgPSBTb21lQXJncy5vYnRhaW4oKTsKKyAgICAgICAgICAgIGFyZ3MuYXJnaTEgPSAoaW50KSB3aGVuTmFub3M7CisgICAgICAgICAgICBhcmdzLmFyZ2kyID0gKGludCkgKHdoZW5OYW5vcyA+PiAzMik7CisgICAgICAgICAgICBhcmdzLmFyZzEgPSBpblRhYmxldE1vZGU7CisgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKE1TR19UQUJMRVRfTU9ERV9DSEFOR0VELCBhcmdzKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gTVNHX1RBQkxFVF9NT0RFX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gKFNvbWVBcmdzKSBtc2cub2JqOworICAgICAgICAgICAgICAgIGxvbmcgd2hlbk5hbm9zID0gKGFyZ3MuYXJnaTEgJiAweEZGRkZGRkZGTCkgfCAoKGxvbmcpIGFyZ3MuYXJnaTIgPDwgMzIpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5UYWJsZXRNb2RlID0gKGJvb2xlYW4pIGFyZ3MuYXJnMTsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25UYWJsZXRNb2RlQ2hhbmdlZCh3aGVuTmFub3MsIGluVGFibGV0TW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNyZWdpc3RlcklucHV0RGV2aWNlTGlzdGVuZXIoSW5wdXREZXZpY2VMaXN0ZW5lciwgSGFuZGxlcikKKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyKAorICAgICAgICAgICAgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyLCBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3RlbmVyIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpZiAobU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluaXRpYWxpemVUYWJsZXRNb2RlTGlzdGVuZXJMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpZHggPSBmaW5kT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyTG9ja2VkKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgICAgICAgICAgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGUgZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyRGVsZWdhdGUobGlzdGVuZXIsIGhhbmRsZXIpOworICAgICAgICAgICAgICAgIG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzLmFkZChkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI3VucmVnaXN0ZXJPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIoT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyKQorICAgICAqLworICAgIHZvaWQgdW5yZWdpc3Rlck9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcihPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3RlbmVyIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gZmluZE9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lckxvY2tlZChsaXN0ZW5lcik7CisgICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgICAgICAgICBPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJEZWxlZ2F0ZSBkID0gbU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGlkeCk7CisgICAgICAgICAgICAgICAgZC5yZW1vdmVDYWxsYmFja3NBbmRNZXNzYWdlcyhudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBHdWFyZGVkQnkoIm1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzIikKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhYmxldE1vZGVMaXN0ZW5lckxvY2tlZCgpIHsKKyAgICAgICAgZmluYWwgVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtSW0ucmVnaXN0ZXJUYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgQEd1YXJkZWRCeSgibU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMiKQorICAgIHByaXZhdGUgaW50IGZpbmRPblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJMb2NrZWQoT25UYWJsZXRNb2RlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGZpbmFsIGludCBuID0gbU9uVGFibGV0TW9kZUNoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgaWYgKG1PblRhYmxldE1vZGVDaGFuZ2VkTGlzdGVuZXJzLmdldChpKS5tTGlzdGVuZXIgPT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVnaXN0ZXJlZEJhdHRlcnlMaXN0ZW5lcnMgeworICAgICAgICBmaW5hbCBMaXN0PElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyRGVsZWdhdGU+IG1EZWxlZ2F0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgSUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlIG1JbnB1dERldmljZUJhdHRlcnlTdGF0ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lckRlbGVnYXRlIHsKKyAgICAgICAgZmluYWwgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgbUxpc3RlbmVyOworICAgICAgICBmaW5hbCBFeGVjdXRvciBtRXhlY3V0b3I7CisKKyAgICAgICAgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXJEZWxlZ2F0ZShJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciBsaXN0ZW5lciwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgbUV4ZWN1dG9yID0gZXhlY3V0b3I7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG5vdGlmeUJhdHRlcnlTdGF0ZUNoYW5nZWQoSUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgorICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25CYXR0ZXJ5U3RhdGVDaGFuZ2VkKHN0YXRlLmRldmljZUlkLCBzdGF0ZS51cGRhdGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhbEJhdHRlcnlTdGF0ZShzdGF0ZS5pc1ByZXNlbnQsIHN0YXRlLnN0YXR1cywgc3RhdGUuY2FwYWNpdHkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNhZGRJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcihpbnQsIEV4ZWN1dG9yLCBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcikKKyAgICAgKi8KKyAgICB2b2lkIGFkZElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyKGludCBkZXZpY2VJZCwgQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsCisgICAgICAgICAgICBATm9uTnVsbCBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGV4ZWN1dG9yLCAiZXhlY3V0b3Igc2hvdWxkIG5vdCBiZSBudWxsIik7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwobGlzdGVuZXIsICJsaXN0ZW5lciBzaG91bGQgbm90IGJlIG51bGwiKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1CYXR0ZXJ5TGlzdGVuZXJzTG9jaykgeworICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5TGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeUxpc3RlbmVycyA9IG5ldyBTcGFyc2VBcnJheTw+KCk7CisgICAgICAgICAgICAgICAgbUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyID0gbmV3IExvY2FsSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzIGxpc3RlbmVyc0ZvckRldmljZSA9IG1CYXR0ZXJ5TGlzdGVuZXJzLmdldChkZXZpY2VJZCk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXJzRm9yRGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZGV2aWNlSWQgaXMgY3VycmVudGx5IG5vdCBiZWluZyBtb25pdG9yZWQgZm9yIGJhdHRlcnkgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICAvLyBTdGFydCBtb25pdG9yaW5nIHRoZSBkZXZpY2UuCisgICAgICAgICAgICAgICAgbGlzdGVuZXJzRm9yRGV2aWNlID0gbmV3IFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzKCk7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlMaXN0ZW5lcnMucHV0KGRldmljZUlkLCBsaXN0ZW5lcnNGb3JEZXZpY2UpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1JbS5yZWdpc3RlckJhdHRlcnlMaXN0ZW5lcihkZXZpY2VJZCwgbUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZGV2aWNlSWQgaXMgYWxyZWFkeSBiZWluZyBtb25pdG9yZWQgZm9yIGJhdHRlcnkgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgbGlzdGVuZXIgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC4KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbnVtRGVsZWdhdGVzID0gbGlzdGVuZXJzRm9yRGV2aWNlLm1EZWxlZ2F0ZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGVsZWdhdGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgcmVnaXN0ZXJlZExpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNGb3JEZXZpY2UubURlbGVnYXRlcy5nZXQoaSkubUxpc3RlbmVyOworICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMobGlzdGVuZXIsIHJlZ2lzdGVyZWRMaXN0ZW5lcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGFuIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIHRoYXQgaGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgZGV2aWNlSWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRldmljZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyRGVsZWdhdGUgZGVsZWdhdGUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXJEZWxlZ2F0ZShsaXN0ZW5lciwgZXhlY3V0b3IpOworICAgICAgICAgICAgbGlzdGVuZXJzRm9yRGV2aWNlLm1EZWxlZ2F0ZXMuYWRkKGRlbGVnYXRlKTsKKworICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBsaXN0ZW5lciBpbW1lZGlhdGVseSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGxhdGVzdCBiYXR0ZXJ5IHN0YXRlLgorICAgICAgICAgICAgaWYgKGxpc3RlbmVyc0ZvckRldmljZS5tSW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlbGVnYXRlLm5vdGlmeUJhdHRlcnlTdGF0ZUNoYW5nZWQobGlzdGVuZXJzRm9yRGV2aWNlLm1JbnB1dERldmljZUJhdHRlcnlTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNyZW1vdmVJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcihpbnQsIElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyKQorICAgICAqLworICAgIHZvaWQgcmVtb3ZlSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIoaW50IGRldmljZUlkLAorICAgICAgICAgICAgQE5vbk51bGwgSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChsaXN0ZW5lciwgImxpc3RlbmVyIHNob3VsZCBub3QgYmUgbnVsbCIpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobUJhdHRlcnlMaXN0ZW5lcnNMb2NrKSB7CisgICAgICAgICAgICBpZiAobUJhdHRlcnlMaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzIGxpc3RlbmVyc0ZvckRldmljZSA9IG1CYXR0ZXJ5TGlzdGVuZXJzLmdldChkZXZpY2VJZCk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXJzRm9yRGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZGV2aWNlSWQgaXMgbm90IGN1cnJlbnRseSBiZWluZyBtb25pdG9yZWQuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgTGlzdDxJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lckRlbGVnYXRlPiBkZWxlZ2F0ZXMgPQorICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNGb3JEZXZpY2UubURlbGVnYXRlczsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVzLnNpemUoKTspIHsKKyAgICAgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMobGlzdGVuZXIsIGRlbGVnYXRlcy5nZXQoaSkubUxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gbW9yZSBiYXR0ZXJ5IGxpc3RlbmVycyBmb3IgdGhpcyBkZXZpY2VJZC4gU3RvcCBtb25pdG9yaW5nIHRoaXMgZGV2aWNlLgorICAgICAgICAgICAgbUJhdHRlcnlMaXN0ZW5lcnMucmVtb3ZlKGRldmljZUlkKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUltLnVucmVnaXN0ZXJCYXR0ZXJ5TGlzdGVuZXIoZGV2aWNlSWQsIG1JbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lcik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQmF0dGVyeUxpc3RlbmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBubyBtb3JlIGRldmljZXMgYmVpbmcgbW9uaXRvcmVkLCBzbyB0aGUgcmVnaXN0ZXJlZAorICAgICAgICAgICAgICAgIC8vIElJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZHJvcHBlZCBieSB0aGUgc2VydmVyLgorICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtSW5wdXREZXZpY2VCYXR0ZXJ5TGlzdGVuZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBMb2NhbElucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyIGV4dGVuZHMgSUlucHV0RGV2aWNlQmF0dGVyeUxpc3RlbmVyLlN0dWIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25CYXR0ZXJ5U3RhdGVDaGFuZ2VkKElJbnB1dERldmljZUJhdHRlcnlTdGF0ZSBzdGF0ZSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtQmF0dGVyeUxpc3RlbmVyc0xvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAobUJhdHRlcnlMaXN0ZW5lcnMgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgICAgIGZpbmFsIFJlZ2lzdGVyZWRCYXR0ZXJ5TGlzdGVuZXJzIGVudHJ5ID0gbUJhdHRlcnlMaXN0ZW5lcnMuZ2V0KHN0YXRlLmRldmljZUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICAgICAgZW50cnkubUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IG51bURlbGVnYXRlcyA9IGVudHJ5Lm1EZWxlZ2F0ZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGVsZWdhdGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkubURlbGVnYXRlcy5nZXQoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm90aWZ5QmF0dGVyeVN0YXRlQ2hhbmdlZChlbnRyeS5tSW5wdXREZXZpY2VCYXR0ZXJ5U3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI2dldElucHV0RGV2aWNlQmF0dGVyeVN0YXRlKGludCwgYm9vbGVhbikKKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIEJhdHRlcnlTdGF0ZSBnZXRJbnB1dERldmljZUJhdHRlcnlTdGF0ZShpbnQgZGV2aWNlSWQsIGJvb2xlYW4gaGFzQmF0dGVyeSkgeworICAgICAgICBpZiAoIWhhc0JhdHRlcnkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxCYXR0ZXJ5U3RhdGUoKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgSUlucHV0RGV2aWNlQmF0dGVyeVN0YXRlIHN0YXRlID0gbUltLmdldEJhdHRlcnlTdGF0ZShkZXZpY2VJZCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsQmF0dGVyeVN0YXRlKHN0YXRlLmlzUHJlc2VudCwgc3RhdGUuc3RhdHVzLCBzdGF0ZS5jYXBhY2l0eSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhbmRyb2lkLmhhcmR3YXJlLkJhdHRlcnlTdGF0ZSBpbnRlcmZhY2UgdXNlZCB0byByZXBvcnQgdGhlIGJhdHRlcnkKKyAgICAvLyBzdGF0ZSB2aWEgdGhlIElucHV0RGV2aWNlI2dldEJhdHRlcnlTdGF0ZSgpIGFuZCBJbnB1dERldmljZUJhdHRlcnlMaXN0ZW5lciBpbnRlcmZhY2VzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIExvY2FsQmF0dGVyeVN0YXRlIGV4dGVuZHMgQmF0dGVyeVN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1ByZXNlbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1TdGF0dXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbUNhcGFjaXR5OworCisgICAgICAgIExvY2FsQmF0dGVyeVN0YXRlKCkgeworICAgICAgICAgICAgdGhpcyhmYWxzZSAvKmlzUHJlc2VudCovLCBCYXR0ZXJ5U3RhdGUuU1RBVFVTX1VOS05PV04sIEZsb2F0Lk5hTiAvKmNhcGFjaXR5Ki8pOworICAgICAgICB9CisKKyAgICAgICAgTG9jYWxCYXR0ZXJ5U3RhdGUoYm9vbGVhbiBpc1ByZXNlbnQsIGludCBzdGF0dXMsIGZsb2F0IGNhcGFjaXR5KSB7CisgICAgICAgICAgICBtSXNQcmVzZW50ID0gaXNQcmVzZW50OworICAgICAgICAgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIG1DYXBhY2l0eSA9IGNhcGFjaXR5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNQcmVzZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGZsb2F0IGdldENhcGFjaXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYXBhY2l0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJEZWxlZ2F0ZSB7CisgICAgICAgIGZpbmFsIElucHV0TWFuYWdlci5LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICAgICAgZmluYWwgRXhlY3V0b3IgbUV4ZWN1dG9yOworCisgICAgICAgIEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJEZWxlZ2F0ZShLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyIGxpc3RlbmVyLCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBtRXhlY3V0b3IgPSBleGVjdXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgbm90aWZ5S2V5Ym9hcmRCYWNrbGlnaHRDaGFuZ2UoaW50IGRldmljZUlkLCBJS2V5Ym9hcmRCYWNrbGlnaHRTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJpZ2dlcmVkQnlLZXlQcmVzcykgeworICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uS2V5Ym9hcmRCYWNrbGlnaHRDaGFuZ2VkKGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhbEtleWJvYXJkQmFja2xpZ2h0U3RhdGUoc3RhdGUuYnJpZ2h0bmVzc0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubWF4QnJpZ2h0bmVzc0xldmVsKSwgaXNUcmlnZ2VyZWRCeUtleVByZXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIExvY2FsS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciBleHRlbmRzIElLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyLlN0dWIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkJyaWdodG5lc3NDaGFuZ2VkKGludCBkZXZpY2VJZCwgSUtleWJvYXJkQmFja2xpZ2h0U3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyaWdnZXJlZEJ5S2V5UHJlc3MpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJMb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycyA9PSBudWxsKSByZXR1cm47CisgICAgICAgICAgICAgICAgZmluYWwgaW50IG51bUxpc3RlbmVycyA9IG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMuZ2V0KGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vdGlmeUtleWJvYXJkQmFja2xpZ2h0Q2hhbmdlKGRldmljZUlkLCBzdGF0ZSwgaXNUcmlnZ2VyZWRCeUtleVByZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5LZXlib2FyZEJhY2tsaWdodFN0YXRlIGludGVyZmFjZSB1c2VkIHRvIHJlcG9ydAorICAgIC8vIHRoZSBrZXlib2FyZCBiYWNrbGlnaHQgc3RhdGUgdmlhIHRoZSBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyIGludGVyZmFjZXMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTG9jYWxLZXlib2FyZEJhY2tsaWdodFN0YXRlIGV4dGVuZHMgS2V5Ym9hcmRCYWNrbGlnaHRTdGF0ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUJyaWdodG5lc3NMZXZlbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heEJyaWdodG5lc3NMZXZlbDsKKworICAgICAgICBMb2NhbEtleWJvYXJkQmFja2xpZ2h0U3RhdGUoaW50IGJyaWdodG5lc3NMZXZlbCwgaW50IG1heEJyaWdodG5lc3NMZXZlbCkgeworICAgICAgICAgICAgbUJyaWdodG5lc3NMZXZlbCA9IGJyaWdodG5lc3NMZXZlbDsKKyAgICAgICAgICAgIG1NYXhCcmlnaHRuZXNzTGV2ZWwgPSBtYXhCcmlnaHRuZXNzTGV2ZWw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRCcmlnaHRuZXNzTGV2ZWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJyaWdodG5lc3NMZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldE1heEJyaWdodG5lc3NMZXZlbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWF4QnJpZ2h0bmVzc0xldmVsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjcmVnaXN0ZXJLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKEV4ZWN1dG9yLCBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyKQorICAgICAqLworICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5NT05JVE9SX0tFWUJPQVJEX0JBQ0tMSUdIVCkKKyAgICB2b2lkIHJlZ2lzdGVyS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcihATm9uTnVsbCBFeGVjdXRvciBleGVjdXRvciwKKyAgICAgICAgICAgIEBOb25OdWxsIEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGV4ZWN1dG9yLCAiZXhlY3V0b3Igc2hvdWxkIG5vdCBiZSBudWxsIik7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwobGlzdGVuZXIsICJsaXN0ZW5lciBzaG91bGQgbm90IGJlIG51bGwiKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyTG9jaykgeworICAgICAgICAgICAgaWYgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciA9IG5ldyBMb2NhbEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIoKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1JbS5yZWdpc3RlcktleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBpbnQgbnVtTGlzdGVuZXJzID0gbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzLmdldChpKS5tTGlzdGVuZXIgPT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJEZWxlZ2F0ZSBkZWxlZ2F0ZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBLZXlib2FyZEJhY2tsaWdodExpc3RlbmVyRGVsZWdhdGUobGlzdGVuZXIsIGV4ZWN1dG9yKTsKKyAgICAgICAgICAgIG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5hZGQoZGVsZWdhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjdW5yZWdpc3RlcktleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIoS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uTU9OSVRPUl9LRVlCT0FSRF9CQUNLTElHSFQpCisgICAgdm9pZCB1bnJlZ2lzdGVyS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcigKKyAgICAgICAgICAgIEBOb25OdWxsIEtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChsaXN0ZW5lciwgImxpc3RlbmVyIHNob3VsZCBub3QgYmUgbnVsbCIpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJMb2NrKSB7CisgICAgICAgICAgICBpZiAobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lcnMucmVtb3ZlSWYoKGRlbGVnYXRlKSAtPiBkZWxlZ2F0ZS5tTGlzdGVuZXIgPT0gbGlzdGVuZXIpOworICAgICAgICAgICAgaWYgKG1LZXlib2FyZEJhY2tsaWdodExpc3RlbmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtSW0udW5yZWdpc3RlcktleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIobUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUtleWJvYXJkQmFja2xpZ2h0TGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtS2V5Ym9hcmRCYWNrbGlnaHRMaXN0ZW5lciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNnZXRJbnB1dERldmljZVNlbnNvck1hbmFnZXIoaW50KQorICAgICAqLworICAgIEBOb25OdWxsCisgICAgU2Vuc29yTWFuYWdlciBnZXRJbnB1dERldmljZVNlbnNvck1hbmFnZXIoaW50IGRldmljZUlkKSB7CisgICAgICAgIGlmIChtSW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1JbnB1dERldmljZVNlbnNvck1hbmFnZXIgPSBuZXcgSW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5wdXREZXZpY2VTZW5zb3JNYW5hZ2VyLmdldFNlbnNvck1hbmFnZXIoZGV2aWNlSWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI2dldFNlbnNvckxpc3QoaW50KQorICAgICAqLworICAgIElucHV0U2Vuc29ySW5mb1tdIGdldFNlbnNvckxpc3QoaW50IGRldmljZUlkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUltLmdldFNlbnNvckxpc3QoZGV2aWNlSWQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNlbmFibGVTZW5zb3IoaW50LCBpbnQsIGludCwgaW50KQorICAgICAqLworICAgIGJvb2xlYW4gZW5hYmxlU2Vuc29yKGludCBkZXZpY2VJZCwgaW50IHNlbnNvclR5cGUsIGludCBzYW1wbGluZ1BlcmlvZFVzLAorICAgICAgICAgICAgaW50IG1heEJhdGNoUmVwb3J0TGF0ZW5jeVVzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUltLmVuYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yVHlwZSwgc2FtcGxpbmdQZXJpb2RVcywKKyAgICAgICAgICAgICAgICAgICAgbWF4QmF0Y2hSZXBvcnRMYXRlbmN5VXMpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIElucHV0TWFuYWdlciNkaXNhYmxlU2Vuc29yKGludCwgaW50KQorICAgICAqLworICAgIHZvaWQgZGlzYWJsZVNlbnNvcihpbnQgZGV2aWNlSWQsIGludCBzZW5zb3JUeXBlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtSW0uZGlzYWJsZVNlbnNvcihkZXZpY2VJZCwgc2Vuc29yVHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI2ZsdXNoU2Vuc29yKGludCwgaW50KQorICAgICAqLworICAgIGJvb2xlYW4gZmx1c2hTZW5zb3IoaW50IGRldmljZUlkLCBpbnQgc2Vuc29yVHlwZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1JbS5mbHVzaFNlbnNvcihkZXZpY2VJZCwgc2Vuc29yVHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgSW5wdXRNYW5hZ2VyI3JlZ2lzdGVyU2Vuc29yTGlzdGVuZXIoSUlucHV0U2Vuc29yRXZlbnRMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBib29sZWFuIHJlZ2lzdGVyU2Vuc29yTGlzdGVuZXIoSUlucHV0U2Vuc29yRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1JbS5yZWdpc3RlclNlbnNvckxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBJbnB1dE1hbmFnZXIjdW5yZWdpc3RlclNlbnNvckxpc3RlbmVyKElJbnB1dFNlbnNvckV2ZW50TGlzdGVuZXIpCisgICAgICovCisgICAgdm9pZCB1bnJlZ2lzdGVyU2Vuc29yTGlzdGVuZXIoSUlucHV0U2Vuc29yRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUltLnVucmVnaXN0ZXJTZW5zb3JMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBsaXN0IG9mIGxpZ2h0IG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIGFuIGlucHV0IGRldmljZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGxpZ2h0cywgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBATm9uTnVsbCBMaXN0PExpZ2h0PiBnZXRMaWdodHMoaW50IGRldmljZUlkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUltLmdldExpZ2h0cyhkZXZpY2VJZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBhbiBpbnB1dCBkZXZpY2UgbGlnaHQuCisgICAgICogQHJldHVybiB0aGUgbGlnaHQgc3RhdGUKKyAgICAgKi8KKyAgICBATm9uTnVsbCBMaWdodFN0YXRlIGdldExpZ2h0U3RhdGUoaW50IGRldmljZUlkLCBATm9uTnVsbCBMaWdodCBsaWdodCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1JbS5nZXRMaWdodFN0YXRlKGRldmljZUlkLCBsaWdodC5nZXRJZCgpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgdG8gbW9kaWZ5IHRoZSBzdGF0ZXMgb2YgbXVsdGlwbGUgbGlnaHRzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgdGhlIHNldHRpbmdzIGZvciBsaWdodHMgdGhhdCBzaG91bGQgY2hhbmdlCisgICAgICovCisgICAgdm9pZCByZXF1ZXN0TGlnaHRzKGludCBkZXZpY2VJZCwgQE5vbk51bGwgTGlnaHRzUmVxdWVzdCByZXF1ZXN0LCBJQmluZGVyIHRva2VuKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaXN0PEludGVnZXI+IGxpZ2h0SWRMaXN0ID0gcmVxdWVzdC5nZXRMaWdodHMoKTsKKyAgICAgICAgICAgIGludFtdIGxpZ2h0SWRzID0gbmV3IGludFtsaWdodElkTGlzdC5zaXplKCldOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaWdodElkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGxpZ2h0SWRzW2ldID0gbGlnaHRJZExpc3QuZ2V0KGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxMaWdodFN0YXRlPiBsaWdodFN0YXRlTGlzdCA9IHJlcXVlc3QuZ2V0TGlnaHRTdGF0ZXMoKTsKKyAgICAgICAgICAgIG1JbS5zZXRMaWdodFN0YXRlcyhkZXZpY2VJZCwgbGlnaHRJZHMsCisgICAgICAgICAgICAgICAgICAgIGxpZ2h0U3RhdGVMaXN0LnRvQXJyYXkobmV3IExpZ2h0U3RhdGVbMF0pLAorICAgICAgICAgICAgICAgICAgICB0b2tlbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGxpZ2h0IHNlc3Npb24gZm9yIGlucHV0IGRldmljZSBtYW5hZ2VyCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIGZvciB0aGUgbGlnaHQgc2Vzc2lvbgorICAgICAqLworICAgIHZvaWQgb3BlbkxpZ2h0U2Vzc2lvbihpbnQgZGV2aWNlSWQsIFN0cmluZyBvcFBrZywgQE5vbk51bGwgSUJpbmRlciB0b2tlbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUltLm9wZW5MaWdodFNlc3Npb24oZGV2aWNlSWQsIG9wUGtnLCB0b2tlbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBsaWdodCBzZXNzaW9uCisgICAgICoKKyAgICAgKi8KKyAgICB2b2lkIGNsb3NlTGlnaHRTZXNzaW9uKGludCBkZXZpY2VJZCwgQE5vbk51bGwgSUJpbmRlciB0b2tlbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUltLmNsb3NlTGlnaHRTZXNzaW9uKGRldmljZUlkLCB0b2tlbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBkZXZpY2UgdmlicmF0b3JzCisgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiB2aWJyYXRvcnMgSURzCisgICAgICovCisgICAgaW50W10gZ2V0VmlicmF0b3JJZHMoaW50IGRldmljZUlkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUltLmdldFZpYnJhdG9ySWRzKGRldmljZUlkKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQZXJmb3JtIHZpYnJhdGlvbiBlZmZlY3QKKyAgICAgKi8KKyAgICB2b2lkIHZpYnJhdGUoaW50IGRldmljZUlkLCBWaWJyYXRpb25FZmZlY3QgZWZmZWN0LCBJQmluZGVyIHRva2VuKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtSW0udmlicmF0ZShkZXZpY2VJZCwgZWZmZWN0LCB0b2tlbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUGVyZm9ybSBjb21iaW5lZCB2aWJyYXRpb24gZWZmZWN0CisgICAgICovCisgICAgdm9pZCB2aWJyYXRlKGludCBkZXZpY2VJZCwgQ29tYmluZWRWaWJyYXRpb24gZWZmZWN0LCBJQmluZGVyIHRva2VuKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtSW0udmlicmF0ZUNvbWJpbmVkKGRldmljZUlkLCBlZmZlY3QsIHRva2VuKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYW5jZWwgYW4gb25nb2luZyB2aWJyYXRpb24KKyAgICAgKi8KKyAgICB2b2lkIGNhbmNlbFZpYnJhdGUoaW50IGRldmljZUlkLCBJQmluZGVyIHRva2VuKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtSW0uY2FuY2VsVmlicmF0ZShkZXZpY2VJZCwgdG9rZW4pOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIGlucHV0IGRldmljZSBpcyB2aWJyYXRpbmcKKyAgICAgKi8KKyAgICBib29sZWFuIGlzVmlicmF0aW5nKGludCBkZXZpY2VJZCkgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtSW0uaXNWaWJyYXRpbmcoZGV2aWNlSWQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBpbnB1dCBkZXZpY2UgdmlicmF0b3Igc3RhdGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBib29sZWFuIHJlZ2lzdGVyVmlicmF0b3JTdGF0ZUxpc3RlbmVyKGludCBkZXZpY2VJZCwgSVZpYnJhdG9yU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1JbS5yZWdpc3RlclZpYnJhdG9yU3RhdGVMaXN0ZW5lcihkZXZpY2VJZCwgbGlzdGVuZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIGlucHV0IGRldmljZSB2aWJyYXRvciBzdGF0ZSBsaXN0ZW5lcgorICAgICAqLworICAgIGJvb2xlYW4gdW5yZWdpc3RlclZpYnJhdG9yU3RhdGVMaXN0ZW5lcihpbnQgZGV2aWNlSWQsIElWaWJyYXRvclN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtSW0udW5yZWdpc3RlclZpYnJhdG9yU3RhdGVMaXN0ZW5lcihkZXZpY2VJZCwgbGlzdGVuZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmphdmEKaW5kZXggZTYzZjU3Yi4uNTU5Mzk4OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuamF2YQpAQCAtNzksNiArNzksMTEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBS0VfSEFMX0FSQ0ggPSAiaW5qZWN0aW9uIjsKKworICAgIC8qKgogICAgICAqIFN0YXR1cyBjb2RlIHVzZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19PSyA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQppbmRleCA5Njg5YmUyLi4yNDQ2MzJhIDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKQEAgLTY0LDE3ICs2NCwyNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBwcm9kdWN0IG5hbWUgZm9yIGF0dGVzdGF0aW9uLiBJbiBub24tZGVmYXVsdCBidWlsZHMgKGxpa2UgdGhlIEFPU1AgYnVpbGQpIHRoZSB2YWx1ZSBvZgogICAgICAqIHRoZSAnUFJPRFVDVCcgc3lzdGVtIHByb3BlcnR5IG1heSBiZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSBwcm92aXNpb25lZCB0byBLZXlNaW50LAotICAgICAqIGFuZCBLZXltaW50IGF0dGVzdGF0aW9uIHdvdWxkIHN0aWxsIGF0dGVzdCB0byB0aGUgcHJvZHVjdCBuYW1lLCBpdCdzIHJ1bm5pbmcgb24uCisgICAgICogYW5kIEtleW1pbnQgYXR0ZXN0YXRpb24gd291bGQgc3RpbGwgYXR0ZXN0IHRvIHRoZSBwcm9kdWN0IG5hbWUgd2hpY2ggd2FzIHByb3Zpc2lvbmVkLgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgQE51bGxhYmxlCiAgICAgQFRlc3RBcGkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0ZPUl9BVFRFU1RBVElPTiA9Ci0gICAgICAgICAgICBnZXRTdHJpbmcoInJvLnByb2R1Y3QubmFtZV9mb3JfYXR0ZXN0YXRpb24iKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX0ZPUl9BVFRFU1RBVElPTiA9IGdldFZlbmRvckRldmljZUlkUHJvcGVydHkoIm5hbWUiKTsKIAogICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgaW5kdXN0cmlhbCBkZXNpZ24uICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFID0gZ2V0U3RyaW5nKCJyby5wcm9kdWN0LmRldmljZSIpOwogCisgICAgLyoqCisgICAgICogVGhlIGRldmljZSBuYW1lIGZvciBhdHRlc3RhdGlvbi4gSW4gbm9uLWRlZmF1bHQgYnVpbGRzIChsaWtlIHRoZSBBT1NQIGJ1aWxkKSB0aGUgdmFsdWUgb2YKKyAgICAgKiB0aGUgJ0RFVklDRScgc3lzdGVtIHByb3BlcnR5IG1heSBiZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSBwcm92aXNpb25lZCB0byBLZXlNaW50LAorICAgICAqIGFuZCBLZXltaW50IGF0dGVzdGF0aW9uIHdvdWxkIHN0aWxsIGF0dGVzdCB0byB0aGUgZGV2aWNlIG5hbWUgd2hpY2ggd2FzIHByb3Zpc2lvbmVkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgQFRlc3RBcGkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfRk9SX0FUVEVTVEFUSU9OID0KKyAgICAgICAgICAgIGdldFZlbmRvckRldmljZUlkUHJvcGVydHkoImRldmljZSIpOworCiAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIGJvYXJkLCBsaWtlICJnb2xkZmlzaCIuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9BUkQgPSBnZXRTdHJpbmcoInJvLnByb2R1Y3QuYm9hcmQiKTsKIApAQCAtOTcsMTkgKzEwNywyOSBAQAogICAgIC8qKiBUaGUgbWFudWZhY3R1cmVyIG9mIHRoZSBwcm9kdWN0L2hhcmR3YXJlLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9IGdldFN0cmluZygicm8ucHJvZHVjdC5tYW51ZmFjdHVyZXIiKTsKIAorICAgIC8qKgorICAgICAqIFRoZSBtYW51ZmFjdHVyZXIgbmFtZSBmb3IgYXR0ZXN0YXRpb24uIEluIG5vbi1kZWZhdWx0IGJ1aWxkcyAobGlrZSB0aGUgQU9TUCBidWlsZCkgdGhlIHZhbHVlCisgICAgICogb2YgdGhlICdNQU5VRkFDVFVSRVInIHN5c3RlbSBwcm9wZXJ0eSBtYXkgYmUgZGlmZmVyZW50IHRvIHRoZSBvbmUgcHJvdmlzaW9uZWQgdG8gS2V5TWludCwKKyAgICAgKiBhbmQgS2V5bWludCBhdHRlc3RhdGlvbiB3b3VsZCBzdGlsbCBhdHRlc3QgdG8gdGhlIG1hbnVmYWN0dXJlciB3aGljaCB3YXMgcHJvdmlzaW9uZWQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBAVGVzdEFwaQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04gPQorICAgICAgICAgICAgZ2V0VmVuZG9yRGV2aWNlSWRQcm9wZXJ0eSgibWFudWZhY3R1cmVyIik7CisKICAgICAvKiogVGhlIGNvbnN1bWVyLXZpc2libGUgYnJhbmQgd2l0aCB3aGljaCB0aGUgcHJvZHVjdC9oYXJkd2FyZSB3aWxsIGJlIGFzc29jaWF0ZWQsIGlmIGFueS4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFORCA9IGdldFN0cmluZygicm8ucHJvZHVjdC5icmFuZCIpOwogCiAgICAgLyoqCiAgICAgICogVGhlIHByb2R1Y3QgYnJhbmQgZm9yIGF0dGVzdGF0aW9uLiBJbiBub24tZGVmYXVsdCBidWlsZHMgKGxpa2UgdGhlIEFPU1AgYnVpbGQpIHRoZSB2YWx1ZSBvZgogICAgICAqIHRoZSAnQlJBTkQnIHN5c3RlbSBwcm9wZXJ0eSBtYXkgYmUgZGlmZmVyZW50IHRvIHRoZSBvbmUgcHJvdmlzaW9uZWQgdG8gS2V5TWludCwKLSAgICAgKiBhbmQgS2V5bWludCBhdHRlc3RhdGlvbiB3b3VsZCBzdGlsbCBhdHRlc3QgdG8gdGhlIHByb2R1Y3QgYnJhbmQsIGl0J3MgcnVubmluZyBvbi4KKyAgICAgKiBhbmQgS2V5bWludCBhdHRlc3RhdGlvbiB3b3VsZCBzdGlsbCBhdHRlc3QgdG8gdGhlIHByb2R1Y3QgYnJhbmQgd2hpY2ggd2FzIHByb3Zpc2lvbmVkLgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgQE51bGxhYmxlCiAgICAgQFRlc3RBcGkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFORF9GT1JfQVRURVNUQVRJT04gPQotICAgICAgICAgICAgICAgIGdldFN0cmluZygicm8ucHJvZHVjdC5icmFuZF9mb3JfYXR0ZXN0YXRpb24iKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFORF9GT1JfQVRURVNUQVRJT04gPSBnZXRWZW5kb3JEZXZpY2VJZFByb3BlcnR5KCJicmFuZCIpOwogCiAgICAgLyoqIFRoZSBlbmQtdXNlci12aXNpYmxlIG5hbWUgZm9yIHRoZSBlbmQgcHJvZHVjdC4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTCA9IGdldFN0cmluZygicm8ucHJvZHVjdC5tb2RlbCIpOwpAQCAtMTE3LDEzICsxMzcsMTIgQEAKICAgICAvKioKICAgICAgKiBUaGUgcHJvZHVjdCBtb2RlbCBmb3IgYXR0ZXN0YXRpb24uIEluIG5vbi1kZWZhdWx0IGJ1aWxkcyAobGlrZSB0aGUgQU9TUCBidWlsZCkgdGhlIHZhbHVlIG9mCiAgICAgICogdGhlICdNT0RFTCcgc3lzdGVtIHByb3BlcnR5IG1heSBiZSBkaWZmZXJlbnQgdG8gdGhlIG9uZSBwcm92aXNpb25lZCB0byBLZXlNaW50LAotICAgICAqIGFuZCBLZXltaW50IGF0dGVzdGF0aW9uIHdvdWxkIHN0aWxsIGF0dGVzdCB0byB0aGUgcHJvZHVjdCBtb2RlbCwgaXQncyBydW5uaW5nIG9uLgorICAgICAqIGFuZCBLZXltaW50IGF0dGVzdGF0aW9uIHdvdWxkIHN0aWxsIGF0dGVzdCB0byB0aGUgcHJvZHVjdCBtb2RlbCB3aGljaCB3YXMgcHJvdmlzaW9uZWQuCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBATnVsbGFibGUKICAgICBAVGVzdEFwaQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0ZPUl9BVFRFU1RBVElPTiA9Ci0gICAgICAgICAgICAgICAgZ2V0U3RyaW5nKCJyby5wcm9kdWN0Lm1vZGVsX2Zvcl9hdHRlc3RhdGlvbiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0ZPUl9BVFRFU1RBVElPTiA9IGdldFZlbmRvckRldmljZUlkUHJvcGVydHkoIm1vZGVsIik7CiAKICAgICAvKiogVGhlIG1hbnVmYWN0dXJlciBvZiB0aGUgZGV2aWNlJ3MgcHJpbWFyeSBzeXN0ZW0tb24tY2hpcC4gKi8KICAgICBATm9uTnVsbApAQCAtMTUyNyw2ICsxNTQ2LDE3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgcHJvcGVydHkpIHsKICAgICAgICAgcmV0dXJuIFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByb3BlcnR5LCBVTktOT1dOKTsKICAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJuIGF0dGVzdGF0aW9uIHNwZWNpZmljIHByb2VydGllcy4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgbW9kZWwsIG5hbWUsIGJyYW5kLCBkZXZpY2Ugb3IgbWFudWZhY3R1cmVyLgorICAgICAqIEByZXR1cm4gcHJvcGVydHkgdmFsdWUgb3IgVU5LTk9XTgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWZW5kb3JEZXZpY2VJZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBTdHJpbmcgYXR0ZXN0UHJvcCA9IGdldFN0cmluZygKKyAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZm9ybWF0U2ltcGxlKCJyby5wcm9kdWN0LiVzX2Zvcl9hdHRlc3RhdGlvbiIsIHByb3BlcnR5KSk7CisgICAgICAgIHJldHVybiBhdHRlc3RQcm9wLmVxdWFscyhVTktOT1dOKQorICAgICAgICAgICAgICAgID8gZ2V0U3RyaW5nKFRleHRVdGlscy5mb3JtYXRTaW1wbGUoInJvLnByb2R1Y3QudmVuZG9yLiVzIiwgcHJvcGVydHkpKSA6IFVOS05PV047CisgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0U3RyaW5nTGlzdChTdHJpbmcgcHJvcGVydHksIFN0cmluZyBzZXBhcmF0b3IpIHsKICAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJvcGVydHkpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUHJvY2Vzcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUHJvY2Vzcy5qYXZhCmluZGV4IGFjMTU4M2EuLmIyMjA4ZDEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL1Byb2Nlc3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9Qcm9jZXNzLmphdmEKQEAgLTM2NSw2ICszNjUsMTEgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX0FQUExJQ0FUSU9OX0NBQ0hFX0dJRCA9IDI5OTk5OwogCiAgICAgLyoqCisgICAgICogQW4gaW52YWxpZCBQSUQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QSUQgPSAtMTsKKworICAgIC8qKgogICAgICAqIFN0YW5kYXJkIHByaW9yaXR5IG9mIGFwcGxpY2F0aW9uIHRocmVhZHMuCiAgICAgICogVXNlIHdpdGgge0BsaW5rICNzZXRUaHJlYWRQcmlvcml0eShpbnQpfSBhbmQKICAgICAgKiB7QGxpbmsgI3NldFRocmVhZFByaW9yaXR5KGludCwgaW50KX0sIDxiPm5vdDwvYj4gd2l0aCB0aGUgbm9ybWFsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Vc2VyTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvVXNlck1hbmFnZXIuamF2YQppbmRleCAyOTBmOTI5Li44NmU2NzhkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Vc2VyTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1VzZXJNYW5hZ2VyLmphdmEKQEAgLTU2MDEsMTYgKzU2MDEsMTUgQEAKICAgICAgKgogICAgICAqIEBzZWUgI0tFWV9SRVNUUklDVElPTlNfUEVORElORwogICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlCisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIHZlcnNpb24ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNVUFNJREVfRE9XTl9DQUtFfSwKKyAgICAgKiBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlcmUgdG8gYmUgbXVsdGlwbGUgbWFuYWdpbmcgYXBwcyBvbiB0aGUgZGV2aWNlIHdpdGggdGhlIGFiaWxpdHkgdG8gc2V0CisgICAgICogcmVzdHJpY3Rpb25zLCBlLmcuIGFuIEVudGVycHJpc2UgRGV2aWNlIFBvbGljeSBDb250cm9sbGVyIChEUEMpIGFuZCBhIFN1cGVydmlzaW9uIGFkbWluLgorICAgICAqIFRoaXMgQVBJIHdpbGwgb25seSB0byByZXR1cm4gdGhlIHJlc3RyaWN0aW9ucyBzZXQgYnkgdGhlIERQQ3MuIFRvIHJldHJpZXZlIHJlc3RyaWN0aW9ucworICAgICAqIHNldCBieSBhbGwgbWFuYWdpbmcgYXBwcywgdXNlCiAgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5SZXN0cmljdGlvbnNNYW5hZ2VyI2dldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zUGVyQWRtaW59IGluc3RlYWQuCi0gICAgICogU3RhcnRpbmcgZnJvbSBBbmRyb2lkIHZlcnNpb24ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNVUFNJREVfRE9XTl9DQUtFfSwgaXQgaXMKLSAgICAgKiBwb3NzaWJsZSBmb3IgdGhlcmUgdG8gYmUgbXVsdGlwbGUgbWFuYWdpbmcgYWdlbnRzIG9uIHRoZSBkZXZpY2Ugd2l0aCB0aGUgYWJpbGl0eSB0byBzZXQKLSAgICAgKiByZXN0cmljdGlvbnMuIFRoaXMgQVBJIHdpbGwgb25seSB0byByZXR1cm4gdGhlIHJlc3RyaWN0aW9ucyBzZXQgYnkgZGV2aWNlIHBvbGljeSBjb250cm9sbGVycwotICAgICAqIChEUENzKQogICAgICAqCiAgICAgICogQHNlZSBEZXZpY2VQb2xpY3lNYW5hZ2VyCiAgICAgICovCi0gICAgQERlcHJlY2F0ZWQKICAgICBAV29ya2VyVGhyZWFkCiAgICAgQFVzZXJIYW5kbGVBd2FyZShlbmFibGVkU2luY2VUYXJnZXRTZGtWZXJzaW9uID0gQnVpbGQuVkVSU0lPTl9DT0RFUy5USVJBTUlTVSkKICAgICBwdWJsaWMgQnVuZGxlIGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zKFN0cmluZyBwYWNrYWdlTmFtZSkgewpAQCAtNTYyMywxMiArNTYyMiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFVzZQorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCB2ZXJzaW9uIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVVBTSURFX0RPV05fQ0FLRX0sCisgICAgICogaXQgaXMgcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIG11bHRpcGxlIG1hbmFnaW5nIGFwcHMgb24gdGhlIGRldmljZSB3aXRoIHRoZSBhYmlsaXR5IHRvIHNldAorICAgICAqIHJlc3RyaWN0aW9ucywgZS5nLiBhbiBFbnRlcnByaXNlIERldmljZSBQb2xpY3kgQ29udHJvbGxlciAoRFBDKSBhbmQgYSBTdXBlcnZpc2lvbiBhZG1pbi4KKyAgICAgKiBUaGlzIEFQSSB3aWxsIG9ubHkgdG8gcmV0dXJuIHRoZSByZXN0cmljdGlvbnMgc2V0IGJ5IHRoZSBEUENzLiBUbyByZXRyaWV2ZSByZXN0cmljdGlvbnMKKyAgICAgKiBzZXQgYnkgYWxsIG1hbmFnaW5nIGFwcHMsIHVzZQogICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuUmVzdHJpY3Rpb25zTWFuYWdlciNnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9uc1BlckFkbWlufSBpbnN0ZWFkLgogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBARGVwcmVjYXRlZAogICAgIEBXb3JrZXJUaHJlYWQKICAgICBwdWJsaWMgQnVuZGxlIGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zKFN0cmluZyBwYWNrYWdlTmFtZSwgVXNlckhhbmRsZSB1c2VyKSB7CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQppbmRleCAwN2QyNjViLi4wNWI2ZGE0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKQEAgLTk1NDEsNiArOTU0MSwxNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JFRU5TQVZFUl9DT01QTElDQVRJT05TX0VOQUJMRUQgPQogICAgICAgICAgICAgICAgICJzY3JlZW5zYXZlcl9jb21wbGljYXRpb25zX2VuYWJsZWQiOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIGhvbWUgY29udHJvbHMgYXJlIGVuYWJsZWQgdG8gYmUgc2hvd24gb3ZlciB0aGUgc2NyZWVuc2F2ZXIgYnkgdGhlIHVzZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JFRU5TQVZFUl9IT01FX0NPTlRST0xTX0VOQUJMRUQgPQorICAgICAgICAgICAgICAgICJzY3JlZW5zYXZlcl9ob21lX2NvbnRyb2xzX2VuYWJsZWQiOworCiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIERlZmF1bHQsIGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIGhhcyBub3QgeWV0IHN0YXJ0ZWQgdGhlIGRvY2sgc2V0dXAgZmxvdy4KQEAgLTExNDI1LDIxICsxMTQzMyw0NiBAQAogICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmcgewogICAgICAgICB9CiAKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9TVEFURV9ST1RBVElPTl9LRVlfVU5LTk9XTiA9IC0xOworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1NUQVRFX1JPVEFUSU9OX0tFWV9GT0xERUQgPSAwOworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1NUQVRFX1JPVEFUSU9OX0tFWV9IQUxGX0ZPTERFRCA9IDE7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfU1RBVEVfUk9UQVRJT05fS0VZX1VORk9MREVEID0gMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRpZmZlcmVudCBwb3N0dXJlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIGtleXMgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0RFVklDRV9TVEFURV9ST1RBVElPTl9MT0NLfS4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIEBJbnREZWYocHJlZml4ID0geyJERVZJQ0VfU1RBVEVfUk9UQVRJT05fS0VZXyJ9LCB2YWx1ZSA9IHsKKyAgICAgICAgICAgICAgICBERVZJQ0VfU1RBVEVfUk9UQVRJT05fS0VZX1VOS05PV04sCisgICAgICAgICAgICAgICAgREVWSUNFX1NUQVRFX1JPVEFUSU9OX0tFWV9GT0xERUQsCisgICAgICAgICAgICAgICAgREVWSUNFX1NUQVRFX1JPVEFUSU9OX0tFWV9IQUxGX0ZPTERFRCwKKyAgICAgICAgICAgICAgICBERVZJQ0VfU1RBVEVfUk9UQVRJT05fS0VZX1VORk9MREVELAorICAgICAgICB9KQorICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERldmljZVN0YXRlUm90YXRpb25Mb2NrS2V5IHsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBSb3RhdGlvbiBsb2NrIHNldHRpbmcga2V5ZWQgb24gZGV2aWNlIHN0YXRlLgogICAgICAgICAgKgotICAgICAgICAgKiBUaGlzIGhvbGRzIGEgc2VyaWFsaXplZCBtYXAgdXNpbmcgaW50IGtleXMgdGhhdCByZXByZXNlbnQgRGV2aWNlIFN0YXRlcyBhbmQgdmFsdWUgb2YKKyAgICAgICAgICogVGhpcyBob2xkcyBhIHNlcmlhbGl6ZWQgbWFwIHVzaW5nIGludCBrZXlzIHRoYXQgcmVwcmVzZW50IHBvc3R1cmVzIGluCisgICAgICAgICAqIHtAbGluayBEZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja0tleX0gYW5kIHZhbHVlIG9mCiAgICAgICAgICAqIHtAbGluayBEZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmd9IHJlcHJlc2VudGluZyB0aGUgcm90YXRpb24gbG9jayBzZXR0aW5nIGZvciB0aGF0Ci0gICAgICAgICAqIGRldmljZSBzdGF0ZS4KKyAgICAgICAgICogcG9zdHVyZS4KICAgICAgICAgICoKICAgICAgICAgICogU2VyaWFsaXplZCBhcyBrZXkwOnZhbHVlMDprZXkxOnZhbHVlMTouLi46a2V5Tjp2YWx1ZU4uCiAgICAgICAgICAqCiAgICAgICAgICAqIEV4YW1wbGU6ICIwOjE6MToyOjI6MSIKICAgICAgICAgICogVGhpcyBleGFtcGxlIHJlcHJlc2VudHMgYSBtYXAgb2Y6CiAgICAgICAgICAqIDx1bD4KLSAgICAgICAgICogICAgIDxsaT4wIC0+IERFVklDRV9TVEFURV9ST1RBVElPTl9MT0NLX0xPQ0tFRDwvbGk+Ci0gICAgICAgICAqICAgICA8bGk+MSAtPiBERVZJQ0VfU1RBVEVfUk9UQVRJT05fTE9DS19VTkxPQ0tFRDwvbGk+Ci0gICAgICAgICAqICAgICA8bGk+MiAtPiBERVZJQ0VfU1RBVEVfUk9UQVRJT05fTE9DS19JR05PUkVEPC9saT4KKyAgICAgICAgICogICAgIDxsaT5ERVZJQ0VfU1RBVEVfUk9UQVRJT05fS0VZX0ZPTERFRCAtPiBERVZJQ0VfU1RBVEVfUk9UQVRJT05fTE9DS19MT0NLRUQ8L2xpPgorICAgICAgICAgKiAgICAgPGxpPkRFVklDRV9TVEFURV9ST1RBVElPTl9LRVlfSEFMRl9GT0xERUQgLT4gREVWSUNFX1NUQVRFX1JPVEFUSU9OX0xPQ0tfVU5MT0NLRUQ8L2xpPgorICAgICAgICAgKiAgICAgPGxpPkRFVklDRV9TVEFURV9ST1RBVElPTl9LRVlfVU5GT0xERUQgLT4gREVWSUNFX1NUQVRFX1JPVEFUSU9OX0xPQ0tfSUdOT1JFRDwvbGk+CiAgICAgICAgICAqIDwvdWw+CiAgICAgICAgICAqCiAgICAgICAgICAqIEBoaWRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9uZXQvY29uZmlnL1N5c3RlbUNlcnRpZmljYXRlU291cmNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9uZXQvY29uZmlnL1N5c3RlbUNlcnRpZmljYXRlU291cmNlLmphdmEKaW5kZXggMTNmN2U1ZC4uM2EyNTRjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvbmV0L2NvbmZpZy9TeXN0ZW1DZXJ0aWZpY2F0ZVNvdXJjZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L25ldC9jb25maWcvU3lzdGVtQ2VydGlmaWNhdGVTb3VyY2UuamF2YQpAQCAtMzksOSArMzksMTMgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldERpcmVjdG9yeSgpIHsKLSAgICAgICAgLy8gVE9ETyhtaWd1ZWxhcmFuZGEpOiBmaWd1cmUgb3V0IGNvcnJlY3QgY29kZSBwYXRoLgorICAgICAgICBpZiAoKFN5c3RlbS5nZXRQcm9wZXJ0eSgic3lzdGVtLmNlcnRzLmVuYWJsZWQiKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICYmIChTeXN0ZW0uZ2V0UHJvcGVydHkoInN5c3RlbS5jZXJ0cy5lbmFibGVkIikpLmVxdWFscygidHJ1ZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoU3lzdGVtLmdldGVudigiQU5EUk9JRF9ST09UIikgKyAiL2V0Yy9zZWN1cml0eS9jYWNlcnRzIik7CisgICAgICAgIH0KICAgICAgICAgRmlsZSB1cGRhdGFibGVfZGlyID0gbmV3IEZpbGUoIi9hcGV4L2NvbS5hbmRyb2lkLmNvbnNjcnlwdC9jYWNlcnRzIik7Ci0gICAgICAgIGlmICh1cGRhdGFibGVfZGlyLmV4aXN0cygpICYmICEodXBkYXRhYmxlX2Rpci5saXN0KCkubGVuZ3RoID09IDApKSB7CisgICAgICAgIGlmICh1cGRhdGFibGVfZGlyLmV4aXN0cygpCisgICAgICAgICAgICAgICAgJiYgISh1cGRhdGFibGVfZGlyLmxpc3QoKS5sZW5ndGggPT0gMCkpIHsKICAgICAgICAgICAgIHJldHVybiB1cGRhdGFibGVfZGlyOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuZXcgRmlsZShTeXN0ZW0uZ2V0ZW52KCJBTkRST0lEX1JPT1QiKSArICIvZXRjL3NlY3VyaXR5L2NhY2VydHMiKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2UvZHJlYW1zL0RyZWFtT3ZlcmxheVNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2UvZHJlYW1zL0RyZWFtT3ZlcmxheVNlcnZpY2UuamF2YQppbmRleCA2ZTQ1MzViLi41NDY5OTE2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL2RyZWFtcy9EcmVhbU92ZXJsYXlTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS9kcmVhbXMvRHJlYW1PdmVybGF5U2VydmljZS5qYXZhCkBAIC0yNyw2ICsyNyw4IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIAoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCiAKIC8qKgogICogQmFzaWMgaW1wbGVtZW50YXRpb24gb2YgZm9yIHtAbGluayBJRHJlYW1PdmVybGF5fSBmb3IgdGVzdGluZy4KQEAgLTQwLDYgKzQyLDEyIEBACiAgICAgLy8gVGhlIGxhc3QgY2xpZW50IHRoYXQgc3RhcnRlZCBkcmVhbWluZyBhbmQgaGFzbid0IGVuZGVkCiAgICAgcHJpdmF0ZSBPdmVybGF5Q2xpZW50IG1DdXJyZW50Q2xpZW50OwogCisgICAgLyoqCisgICAgICogRXhlY3V0b3IgdXNlZCB0byBydW4gY2FsbGJhY2tzIHRoYXQgc3ViY2xhc3NlcyB3aWxsIGltcGxlbWVudC4gQW55IGNhbGxzIGNvbWluZyBvdmVyIEJpbmRlcgorICAgICAqIGZyb20ge0BsaW5rIE92ZXJsYXlDbGllbnR9IHNob3VsZCBwZXJmb3JtIHRoZSB3b3JrIHRoZXkgbmVlZCB0byBkbyBvbiB0aGlzIGV4ZWN1dG9yLgorICAgICAqLworICAgIHByaXZhdGUgRXhlY3V0b3IgbUV4ZWN1dG9yOworCiAgICAgLy8gQW4ge0BsaW5rIElEcmVhbU92ZXJsYXlDbGllbnR9IGltcGxlbWVudGF0aW9uIHRoYXQgaWRlbnRpZmllcyBpdHNlbGYgd2hlbiBmb3J3YXJkaW5nCiAgICAgLy8gcmVxdWVzdHMgdG8gdGhlIHtAbGluayBEcmVhbU92ZXJsYXlTZXJ2aWNlfQogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE92ZXJsYXlDbGllbnQgZXh0ZW5kcyBJRHJlYW1PdmVybGF5Q2xpZW50LlN0dWIgewpAQCAtNjEsOCArNjksNiBAQAogICAgICAgICAgICAgbVNlcnZpY2Uuc3RhcnREcmVhbSh0aGlzLCBwYXJhbXMpOwogICAgICAgICB9CiAKLQotCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCB3YWtlVXAoKSB7CiAgICAgICAgICAgICBtU2VydmljZS53YWtlVXAodGhpcywgKCkgLT4gewpAQCAtOTcsMTIgKzEwMywyMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzdGFydERyZWFtKE92ZXJsYXlDbGllbnQgY2xpZW50LCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgZW5kRHJlYW0obUN1cnJlbnRDbGllbnQpOwotICAgICAgICBtQ3VycmVudENsaWVudCA9IGNsaWVudDsKLSAgICAgICAgb25TdGFydERyZWFtKHBhcmFtcyk7CisgICAgICAgIC8vIFJ1biBvbiBleGVjdXRvciBhcyB0aGlzIGlzIGEgYmluZGVyIGNhbGwgZnJvbSBPdmVybGF5Q2xpZW50LgorICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBlbmREcmVhbUludGVybmFsKG1DdXJyZW50Q2xpZW50KTsKKyAgICAgICAgICAgIG1DdXJyZW50Q2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgb25TdGFydERyZWFtKHBhcmFtcyk7CisgICAgICAgIH0pOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBlbmREcmVhbShPdmVybGF5Q2xpZW50IGNsaWVudCkgeworICAgICAgICAvLyBSdW4gb24gZXhlY3V0b3IgYXMgdGhpcyBpcyBhIGJpbmRlciBjYWxsIGZyb20gT3ZlcmxheUNsaWVudC4KKyAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gZW5kRHJlYW1JbnRlcm5hbChjbGllbnQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kRHJlYW1JbnRlcm5hbChPdmVybGF5Q2xpZW50IGNsaWVudCkgewogICAgICAgICBpZiAoY2xpZW50ID09IG51bGwgfHwgY2xpZW50ICE9IG1DdXJyZW50Q2xpZW50KSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTExMiwxMSArMTI2LDE0IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHdha2VVcChPdmVybGF5Q2xpZW50IGNsaWVudCwgUnVubmFibGUgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKG1DdXJyZW50Q2xpZW50ICE9IGNsaWVudCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIC8vIFJ1biBvbiBleGVjdXRvciBhcyB0aGlzIGlzIGEgYmluZGVyIGNhbGwgZnJvbSBPdmVybGF5Q2xpZW50LgorICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRDbGllbnQgIT0gY2xpZW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0gICAgICAgIG9uV2FrZVVwKGNhbGxiYWNrKTsKKyAgICAgICAgICAgIG9uV2FrZVVwKGNhbGxiYWNrKTsKKyAgICAgICAgfSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBJRHJlYW1PdmVybGF5IG1EcmVhbU92ZXJsYXkgPSBuZXcgSURyZWFtT3ZlcmxheS5TdHViKCkgewpAQCAtMTM0LDYgKzE1MSwyNSBAQAogICAgIHB1YmxpYyBEcmVhbU92ZXJsYXlTZXJ2aWNlKCkgewogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHByb3ZpZGluZyBhbiBleGVjdXRvciB0byBydW4gY2FsbGJhY2tzIG9uLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRHJlYW1PdmVybGF5U2VydmljZShATm9uTnVsbCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICBtRXhlY3V0b3IgPSBleGVjdXRvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKyAgICAgICAgaWYgKG1FeGVjdXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiBubyBleGVjdXRvciB3YXMgcHJvdmlkZWQsIHVzZSB0aGUgbWFpbiBleGVjdXRvci4gb25DcmVhdGUgaXMgdGhlIGVhcmxpZXN0IHRpbWUKKyAgICAgICAgICAgIC8vIGdldE1haW5FeGVjdXRvciBpcyBhdmFpbGFibGUuCisgICAgICAgICAgICBtRXhlY3V0b3IgPSBnZXRNYWluRXhlY3V0b3IoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBOdWxsYWJsZQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBJQmluZGVyIG9uQmluZChATm9uTnVsbCBJbnRlbnQgaW50ZW50KSB7CkBAIC0xNDMsNiArMTc5LDEwIEBACiAgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBpbXBsZW1lbnRhdGlvbnMgdG8gaGFuZGxlIHdoZW4gdGhlIGRyZWFtIGhhcyBzdGFydGVkIGFuZCB0aGUKICAgICAgKiB3aW5kb3cgaXMgcmVhZHkgdG8gYmUgaW50ZXJhY3RlZCB3aXRoLgorICAgICAqCisgICAgICogVGhpcyBjYWxsYmFjayB3aWxsIGJlIHJ1biBvbiB0aGUge0BsaW5rIEV4ZWN1dG9yfSBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IgaWYgcHJvdmlkZWQsIG9yCisgICAgICogb24gdGhlIG1haW4gZXhlY3V0b3IgaWYgbm9uZSB3YXMgcHJvdmlkZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gbGF5b3V0UGFyYW1zIFRoZSB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zfSBhc3NvY2lhdGVkIHdpdGggdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBkcmVhbSB3aW5kb3cuCiAgICAgICovCkBAIC0xNTMsNiArMTkzLDkgQEAKICAgICAgKiB0byB3YWtldXAuIFRoaXMgYWxsb3dzIGFueSBvdmVybGF5IGFuaW1hdGlvbnMgdG8gcnVuLiBCeSBkZWZhdWx0LCB0aGUgbWV0aG9kIHdpbGwgaW52b2tlCiAgICAgICogdGhlIGNhbGxiYWNrIGltbWVkaWF0ZWx5LgogICAgICAqCisgICAgICogVGhpcyBjYWxsYmFjayB3aWxsIGJlIHJ1biBvbiB0aGUge0BsaW5rIEV4ZWN1dG9yfSBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IgaWYgcHJvdmlkZWQsIG9yCisgICAgICogb24gdGhlIG1haW4gZXhlY3V0b3IgaWYgbm9uZSB3YXMgcHJvdmlkZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gb25Db21wbGV0ZUNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byB0cmlnZ2VyIHRvIG5vdGlmeSB0aGUgZHJlYW0gc2VydmljZSB0aGF0IHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheSBoYXMgY29tcGxldGVkIHdha2luZyB1cC4KICAgICAgKiBAaGlkZQpAQCAtMTY0LDYgKzIwNyw5IEBACiAgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBpbXBsZW1lbnRhdGlvbnMgdG8gaGFuZGxlIHdoZW4gdGhlIGRyZWFtIGhhcyBlbmRlZC4gVGhlcmUgbWF5CiAgICAgICogYmUgZWFybGllciBzaWduYWxzIGxlYWRpbmcgdXAgdG8gdGhpcyBzdGVwLCBzdWNoIGFzIEB7QGxpbmsgI29uV2FrZVVwKFJ1bm5hYmxlKX0uCisgICAgICoKKyAgICAgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgcnVuIG9uIHRoZSB7QGxpbmsgRXhlY3V0b3J9IHByb3ZpZGVkIGluIHRoZSBjb25zdHJ1Y3RvciBpZiBwcm92aWRlZCwgb3IKKyAgICAgKiBvbiB0aGUgbWFpbiBleGVjdXRvciBpZiBub25lIHdhcyBwcm92aWRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvbkVuZERyZWFtKCkgewogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2UvZHJlYW1zL0RyZWFtU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS9kcmVhbXMvRHJlYW1TZXJ2aWNlLmphdmEKaW5kZXggY2U4YWY4My4uZDBmMzgyMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS9kcmVhbXMvRHJlYW1TZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS9kcmVhbXMvRHJlYW1TZXJ2aWNlLmphdmEKQEAgLTEzNjIsNiArMTM2MiwxMSBAQAogICAgICAgICAgICAgICAgIGlmICghQWN0aXZpdHlUYXNrTWFuYWdlci5nZXRTZXJ2aWNlKCkuc3RhcnREcmVhbUFjdGl2aXR5KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRldGFjaCgpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhtVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVkIFNlY3VyaXR5RXhjZXB0aW9uIHRyeWluZyB0byBzdGFydCBEcmVhbUFjdGl2aXR5LiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJBYm9ydGluZyBkcmVhbSBzdGFydC4iKTsKKyAgICAgICAgICAgICAgICBkZXRhY2goKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgTG9nLncobVRhZywgIkNvdWxkIG5vdCBjb25uZWN0IHRvIGFjdGl2aXR5IHRhc2sgbWFuYWdlciB0byBzdGFydCBkcmVhbSBhY3Rpdml0eSIpOwogICAgICAgICAgICAgICAgIGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvQWJzdHJhY3REZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9BYnN0cmFjdERldGVjdG9yLmphdmEKaW5kZXggNjQ0YTJiZi4uMGYzZThkMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9BYnN0cmFjdERldGVjdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9BYnN0cmFjdERldGVjdG9yLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuY29tcGF0LkNvbXBhdENoYW5nZXM7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLnBlcm1pc3Npb24uSWRlbnRpdHk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CkBAIC0xMDAsNyArOTksNyBAQAogICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oCiAgICAgICAgICAgICBATm9uTnVsbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBhdWRpb1N0cmVhbSwKICAgICAgICAgICAgIEBOb25OdWxsIEF1ZGlvRm9ybWF0IGF1ZGlvRm9ybWF0LAotICAgICAgICAgICAgQE51bGxhYmxlIFBlcnNpc3RhYmxlQnVuZGxlIG9wdGlvbnMpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBATnVsbGFibGUgUGVyc2lzdGFibGVCdW5kbGUgb3B0aW9ucykgewogICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgIFNsb2cuaShUQUcsICIjcmVjb2duaXplSG90d29yZCIpOwogICAgICAgICB9CkBAIC0xMzIsMTggKzEzMSwxMyBAQAogICAgICAqIEBwYXJhbSBzaGFyZWRNZW1vcnkgVGhlIHVucmVzdHJpY3RlZCBkYXRhIGJsb2IgdG8gcHJvdmlkZSB0byB0aGUKICAgICAgKiAgICAgICAge0BsaW5rIFZpc3VhbFF1ZXJ5RGV0ZWN0aW9uU2VydmljZX0gYW5kIHtAbGluayBIb3R3b3JkRGV0ZWN0aW9uU2VydmljZX0uIFVzZSB0aGlzIHRvCiAgICAgICogICAgICAgICBwcm92aWRlIHRoZSBob3R3b3JkIG1vZGVscyBkYXRhIG9yIG90aGVyIHN1Y2ggZGF0YSB0byB0aGUgdHJ1c3RlZCBwcm9jZXNzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBvZgotICAgICAqICAgICAgICAgQW5kcm9pZCBUaXJhbWlzdSBvciBhYm92ZSBhbmQgYXR0ZW1wdHMgdG8gc3RhcnQgYSByZWNvZ25pdGlvbiB3aGVuIHRoZSBkZXRlY3RvciBpcwotICAgICAqICAgICAgICAgbm90IGFibGUgYmFzZWQgb24gdGhlIHN0YXRlLiBCZWNhdXNlIHRoZSBjYWxsZXIgcmVjZWl2ZXMgdXBkYXRlcyB2aWEgYW4gYXN5bmNocm9ub3VzCi0gICAgICogICAgICAgICBjYWxsYmFjayBhbmQgdGhlIHN0YXRlIG9mIHRoZSBkZXRlY3RvciBjYW4gY2hhbmdlIHdpdGhvdXQgY2FsbGVyJ3Mga25vd2xlZGdlLCBhCi0gICAgICogICAgICAgICBjaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyB7QGxpbmsgSG90d29yZERldGVjdG9yfSB3YXNuJ3Qgc3BlY2lmaWVkIHRvIHVzZSBhCiAgICAgICogICAgICAgICB7QGxpbmsgSG90d29yZERldGVjdGlvblNlcnZpY2V9IG9yIHtAbGluayBWaXN1YWxRdWVyeURldGVjdGlvblNlcnZpY2V9IHdoZW4gaXQgd2FzCiAgICAgICogICAgICAgICBjcmVhdGVkLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBQZXJzaXN0YWJsZUJ1bmRsZSBvcHRpb25zLAotICAgICAgICAgICAgQE51bGxhYmxlIFNoYXJlZE1lbW9yeSBzaGFyZWRNZW1vcnkpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBATnVsbGFibGUgU2hhcmVkTWVtb3J5IHNoYXJlZE1lbW9yeSkgewogICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVTdGF0ZSgpIik7CiAgICAgICAgIH0KQEAgLTE5OSwxMyArMTkzLDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHRocm93SWZEZXRlY3RvcklzTm9Mb25nZXJBY3RpdmUoKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHByb3RlY3RlZCB2b2lkIHRocm93SWZEZXRlY3RvcklzTm9Mb25nZXJBY3RpdmUoKSB7CiAgICAgICAgIGlmICghbUlzRGV0ZWN0b3JBY3RpdmUuZ2V0KCkpIHsKICAgICAgICAgICAgIFNsb2cuZShUQUcsICJhdHRlbXB0aW5nIHRvIHVzZSBhIGRlc3Ryb3llZCBkZXRlY3RvciB3aGljaCBpcyBubyBsb25nZXIgYWN0aXZlIik7Ci0gICAgICAgICAgICBpZiAoQ29tcGF0Q2hhbmdlcy5pc0NoYW5nZUVuYWJsZWQoSE9UV09SRF9ERVRFQ1RPUl9USFJPV19DSEVDS0VEX0VYQ0VQVElPTikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGluZyB0byB1c2UgYSBkZXN0cm95ZWQgZGV0ZWN0b3Igd2hpY2ggaXMgbm8gbG9uZ2VyIGFjdGl2ZSIpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgImF0dGVtcHRpbmcgdG8gdXNlIGEgZGVzdHJveWVkIGRldGVjdG9yIHdoaWNoIGlzIG5vIGxvbmdlciBhY3RpdmUiKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9BbHdheXNPbkhvdHdvcmREZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9BbHdheXNPbkhvdHdvcmREZXRlY3Rvci5qYXZhCmluZGV4IGIxZGM2ODYuLmZmYTE1ZjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3ZvaWNlL0Fsd2F5c09uSG90d29yZERldGVjdG9yLmphdmEKQEAgLTgwNSwxMSArODA1LDEzIEBACiAgICAgICAgICAgICBJZGVudGl0eSBpZGVudGl0eSA9IG5ldyBJZGVudGl0eSgpOwogICAgICAgICAgICAgaWRlbnRpdHkucGFja2FnZU5hbWUgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50T3BQYWNrYWdlTmFtZSgpOwogICAgICAgICAgICAgaWYgKG1vZHVsZVByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExpc3Q8U291bmRUcmlnZ2VyLk1vZHVsZVByb3BlcnRpZXM+IG1vZHVsZVByb3BMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2RlbE1hbmFnZW1lbnRTZXJ2aWNlLmxpc3RNb2R1bGVQcm9wZXJ0aWVzKGlkZW50aXR5KTsKLSAgICAgICAgICAgICAgICBpZiAobW9kdWxlUHJvcExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtb2R1bGVQcm9wZXJ0aWVzID0gbW9kdWxlUHJvcExpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtb2R1bGVQcm9wZXJ0aWVzID0gbU1vZGVsTWFuYWdlbWVudFNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC5saXN0TW9kdWxlUHJvcGVydGllcyhpZGVudGl0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihwcm9wIC0+ICFwcm9wLmdldFN1cHBvcnRlZE1vZGVsQXJjaCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoU291bmRUcmlnZ2VyLkZBS0VfSEFMX0FSQ0gpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAub3JFbHNlKG51bGwpOwogICAgICAgICAgICAgICAgIC8vIChAYXRuZXlhKSBpbnRlbnRpb25hbGx5IGxldCBhIG51bGwgbW9kdWxlUHJvcGVydGllcyB0aHJvdWdoIHVudGlsCiAgICAgICAgICAgICAgICAgLy8gYWxsIENUUyB0ZXN0cyBhcmUgZml4ZWQKICAgICAgICAgICAgIH0KQEAgLTgyNSwyOCArODI3LDE5IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIG9mIEFQSSBsZXZlbCAzMwotICAgICAqICAgICAgICAgb3IgYWJvdmUgYW5kIHRoaXMgQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3Igd2Fzbid0IHNwZWNpZmllZCB0byB1c2UgYQotICAgICAqICAgICAgICAge0BsaW5rIEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlfSB3aGVuIGl0IHdhcyBjcmVhdGVkLiBJbiBhZGRpdGlvbiwgdGhlIGV4Y2VwdGlvbiBjYW4KLSAgICAgKiAgICAgICAgIGJlIHRocm93biBpZiB0aGlzIEFsd2F5c09uSG90d29yZERldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBUEkgbGV2ZWwgMzMgaWYKLSAgICAgKiAgICAgICAgIHRoaXMgQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3Igd2Fzbid0IHNwZWNpZmllZCB0byB1c2UgYQotICAgICAqICAgICAgICAge0BsaW5rIEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlfSB3aGVuIGl0IHdhcyBjcmVhdGVkLiBJbiBhZGRpdGlvbiwgdGhlIGV4Y2VwdGlvbiBjYW4KLSAgICAgKiAgICAgICAgIGJlIHRocm93biBpZiB0aGlzIEFsd2F5c09uSG90d29yZERldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBBbHdheXNPbkhvdHdvcmREZXRlY3RvciB3YXNuJ3Qgc3BlY2lmaWVkIHRvIHVzZSBhCisgICAgICoge0BsaW5rIEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlfSB3aGVuIGl0IHdhcyBjcmVhdGVkLiBJbiBhZGRpdGlvbiwgaWYgdGhpcworICAgICAqIEFsd2F5c09uSG90d29yZERldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlU3RhdGUoQE51bGxhYmxlIFBlcnNpc3RhYmxlQnVuZGxlIG9wdGlvbnMsCi0gICAgICAgICAgICBATnVsbGFibGUgU2hhcmVkTWVtb3J5IHNoYXJlZE1lbW9yeSkgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEBOdWxsYWJsZSBTaGFyZWRNZW1vcnkgc2hhcmVkTWVtb3J5KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIGlmICghbVN1cHBvcnRTYW5kYm94ZWREZXRlY3Rpb25TZXJ2aWNlKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVTdGF0ZSBjYWxsZWQsIGJ1dCBpdCBkb2Vzbid0IHN1cHBvcnQgaG90d29yZCBkZXRlY3Rpb24gc2VydmljZSIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1BdmFpbGFiaWxpdHkgPT0gU1RBVEVfSU5WQUxJRCB8fCBtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlU3RhdGUgY2FsbGVkIG9uIGFuIGludmFsaWQgZGV0ZWN0b3Igb3IgZXJyb3Igc3RhdGUiKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVTdGF0ZSBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwogICAgICAgICAgICAgfQpAQCAtODY3LDE3ICs4NjAsMTYgQEAKICAgICBAVGVzdEFwaQogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlQXZhaWxhYmlsaXR5KGludCBhdmFpbGFiaWxpdHkpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbUF2YWlsYWJpbGl0eSA9IGF2YWlsYWJpbGl0eTsKKyAgICAgICAgICAgIG1Jc0F2YWlsYWJpbGl0eU92ZXJyaWRkZW5CeVRlc3RBcGkgPSB0cnVlOwogICAgICAgICAgICAgLy8gRU5ST0xMRUQgc3RhdGUgcmVxdWlyZXMgdGhlcmUgdG8gYmUgbWV0YWRhdGEgYWJvdXQgdGhlIHNvdW5kIG1vZGVsIHNvIGEgZmFrZSBvbmUKICAgICAgICAgICAgIC8vIGlzIGNyZWF0ZWQuCi0gICAgICAgICAgICBpZiAobUtleXBocmFzZU1ldGFkYXRhID09IG51bGwgJiYgYXZhaWxhYmlsaXR5ID09IFNUQVRFX0tFWVBIUkFTRV9FTlJPTExFRCkgeworICAgICAgICAgICAgaWYgKG1LZXlwaHJhc2VNZXRhZGF0YSA9PSBudWxsICYmIG1BdmFpbGFiaWxpdHkgPT0gU1RBVEVfS0VZUEhSQVNFX0VOUk9MTEVEKSB7CiAgICAgICAgICAgICAgICAgU2V0PExvY2FsZT4gZmFrZVN1cHBvcnRlZExvY2FsZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgICAgICAgICAgZmFrZVN1cHBvcnRlZExvY2FsZXMuYWRkKG1Mb2NhbGUpOwogICAgICAgICAgICAgICAgIG1LZXlwaHJhc2VNZXRhZGF0YSA9IG5ldyBLZXlwaHJhc2VNZXRhZGF0YSgxLCBtVGV4dCwgZmFrZVN1cHBvcnRlZExvY2FsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBBbHdheXNPbkhvdHdvcmREZXRlY3Rvci5SRUNPR05JVElPTl9NT0RFX1ZPSUNFX1RSSUdHRVIpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQXZhaWxhYmlsaXR5ID0gYXZhaWxhYmlsaXR5OwotICAgICAgICAgICAgbUlzQXZhaWxhYmlsaXR5T3ZlcnJpZGRlbkJ5VGVzdEFwaSA9IHRydWU7CiAgICAgICAgICAgICBub3RpZnlTdGF0ZUNoYW5nZWRMb2NrZWQoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTkzMywyMyArOTI1LDE0IEBACiAgICAgICogQHNlZSAjUkVDT0dOSVRJT05fTU9ERV9VU0VSX0lERU5USUZJQ0FUSU9OCiAgICAgICogQHNlZSAjUkVDT0dOSVRJT05fTU9ERV9WT0lDRV9UUklHR0VSCiAgICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBvciBhYm92ZS4gQmVjYXVzZSB0aGUgY2FsbGVyIHJlY2VpdmVzIGF2YWlsYWJpbGl0eSB1cGRhdGVzIHZpYSBhbiBhc3luY2hyb25vdXMKLSAgICAgKiAgICAgICAgIGNhbGxiYWNrLCBpdCBtYXkgYmUgZHVlIHRvIHRoZSBhdmFpbGFiaWxpdHkgY2hhbmdpbmcgd2hpbGUgdGhpcyBjYWxsIGlzIHBlcmZvcm1lZC4KLSAgICAgKiAgICAgICAgIC0gVGhyb3dzIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLgotICAgICAqICAgICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCi0gICAgICogICAgICAgICAgIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsCi0gICAgICogICAgICAgICAzMyBBbmRyb2lkIGlmIHRoZSByZWNvZ25pdGlvbiBpc24ndCBzdXBwb3J0ZWQuIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG1ldGhvZAotICAgICAqICAgICAgICAgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24ge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0bwotICAgICAqICAgICAgICAgYXZvaWQgdGhpcyBleGNlcHRpb24uCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBbmRyb2lkIEFQSSBsZXZlbAotICAgICAqICAgICAgICAgMzMgaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyCi0gICAgICogICAgICAgICBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzCi0gICAgICogICAgICAgICBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUga2V5cGhyYXNlIGl0c2VsZiBpc24ndCBzdXBwb3J0ZWQuCisgICAgICogICAgICAgICBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24KKyAgICAgKiAgICAgICAgIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcyBleGNlcHRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCisgICAgICogICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCisgICAgICogICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCiAgICAgICovCi0gICAgcHVibGljIEBSZWNvZ25pdGlvbk1vZGVzCi0gICAgaW50IGdldFN1cHBvcnRlZFJlY29nbml0aW9uTW9kZXMoKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBAUmVjb2duaXRpb25Nb2RlcyBpbnQgZ2V0U3VwcG9ydGVkUmVjb2duaXRpb25Nb2RlcygpIHsKICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgImdldFN1cHBvcnRlZFJlY29nbml0aW9uTW9kZXMoKSIpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0U3VwcG9ydGVkUmVjb2duaXRpb25Nb2Rlc0xvY2tlZCgpOwpAQCAtOTU3LDIyICs5NDAsMTQgQEAKICAgICB9CiAKICAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U3VwcG9ydGVkUmVjb2duaXRpb25Nb2Rlc0xvY2tlZCgpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBpbnQgZ2V0U3VwcG9ydGVkUmVjb2duaXRpb25Nb2Rlc0xvY2tlZCgpIHsKICAgICAgICAgaWYgKG1BdmFpbGFiaWxpdHkgPT0gU1RBVEVfSU5WQUxJRCB8fCBtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoQ29tcGF0Q2hhbmdlcy5pc0NoYW5nZUVuYWJsZWQoSE9UV09SRF9ERVRFQ1RPUl9USFJPV19DSEVDS0VEX0VYQ0VQVElPTikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24oImdldFN1cHBvcnRlZFJlY29nbml0aW9uTW9kZXMgY2FsbGVkIG9uIGFuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGludmFsaWQgZGV0ZWN0b3Igb3IgZXJyb3Igc3RhdGUiKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJnZXRTdXBwb3J0ZWRSZWNvZ25pdGlvbk1vZGVzIGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBUaGlzIG1ldGhvZCBvbmx5IG1ha2VzIHNlbnNlIGlmIHdlIGNhbiBhY3R1YWxseSBzdXBwb3J0IGEgcmVjb2duaXRpb24uCiAgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ICE9IFNUQVRFX0tFWVBIUkFTRV9FTlJPTExFRCB8fCBtS2V5cGhyYXNlTWV0YWRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uKCJHZXR0aW5nIHN1cHBvcnRlZCByZWNvZ25pdGlvbiBtb2RlcyBmb3IiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgdGhlIGtleXBocmFzZSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJHZXR0aW5nIHN1cHBvcnRlZCByZWNvZ25pdGlvbiBtb2RlcyBmb3IgdGhlIGtleXBocmFzZSBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KQEAgLTEwMjcsMzAgKzEwMDIsMTUgQEAKICAgICAgKiAgICAgICAgICAgICBzdGFydFJlY29nbml0aW9uIHJlcXVlc3QuIFRoaXMgZGF0YSBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgcGFyYW1ldGVycwogICAgICAqICAgICAgICAgICAgIHdoZW4gc3RhcnRpbmcgdGhlIG9wYXF1ZSBzb3VuZCBtb2RlbC4KICAgICAgKiBAcmV0dXJuIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjYWxsIHN1Y2NlZWRlZCBvciBub3QuCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIG9mIEFQSSBsZXZlbCAzMwotICAgICAqICAgICAgICAgb3IgYWJvdmUgYW5kIGF0dGVtcHRzIHRvIHN0YXJ0IGEgcmVjb2duaXRpb24gd2hlbiB0aGUgZGV0ZWN0b3IgaXMgbm90IGFibGUgYmFzZWQgb24KLSAgICAgKiAgICAgICAgIHRoZSBhdmFpbGFiaWxpdHkgc3RhdGUuIFRoaXMgY2FuIGJlIHRocm93biBldmVuIGlmIHRoZSBzdGF0ZSBoYXMgYmVlbiBjaGVja2VkIGJlZm9yZQotICAgICAqICAgICAgICAgY2FsbGluZyB0aGlzIG1ldGhvZCBiZWNhdXNlIHRoZSBjYWxsZXIgcmVjZWl2ZXMgYXZhaWxhYmlsaXR5IHVwZGF0ZXMgdmlhIGFuCi0gICAgICogICAgICAgICBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGl0IG1heSBiZSBkdWUgdG8gdGhlIGF2YWlsYWJpbGl0eSBjaGFuZ2luZyB3aGlsZSB0aGlzIGNhbGwgaXMKLSAgICAgKiAgICAgICAgIHBlcmZvcm1lZC4KLSAgICAgKiAgICAgICAgIC0gVGhyb3dzIGlmIHRoZSByZWNvZ25pdGlvbiBpc24ndCBzdXBwb3J0ZWQuCi0gICAgICogICAgICAgICAgIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBhZnRlciBhIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbgotICAgICAqICAgICAgICAgICB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgotICAgICAqICAgICAgICAgLSBBbHNvIHRocm93cyBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4KLSAgICAgKiAgICAgICAgICAgVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZQotICAgICAqICAgICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbAotICAgICAqICAgICAgICAgMzMgQW5kcm9pZCBpZiB0aGUgcmVjb2duaXRpb24gaXNuJ3Qgc3VwcG9ydGVkLiBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QKLSAgICAgKiAgICAgICAgIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8KLSAgICAgKiAgICAgICAgIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQW5kcm9pZCBBUEkgbGV2ZWwKLSAgICAgKiAgICAgICAgIDMzIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLiBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlcgotICAgICAqICAgICAgICAgZGV0ZWN0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZSB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcwotICAgICAqICAgICAgICAgZGV0ZWN0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJlY29nbml0aW9uIGlzbid0IHN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBhZnRlciBhIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbgorICAgICAqICAgICAgICAge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0byBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4KKyAgICAgKiAgICAgICAgIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUKKyAgICAgKiAgICAgICAgIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mID0ge1JFQ09SRF9BVURJTywgQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkKLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKEBSZWNvZ25pdGlvbkZsYWdzIGludCByZWNvZ25pdGlvbkZsYWdzLCBATm9uTnVsbCBieXRlW10gZGF0YSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbihAUmVjb2duaXRpb25GbGFncyBpbnQgcmVjb2duaXRpb25GbGFncywgQE5vbk51bGwgYnl0ZVtdIGRhdGEpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UmVjb2duaXRpb25Mb2NrZWQocmVjb2duaXRpb25GbGFncywgZGF0YSkKICAgICAgICAgICAgICAgICAgICAgPT0gU1RBVFVTX09LOwpAQCAtMTA2NywzMCArMTAyNywxNSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHJlY29nbml0aW9uRmxhZ3MgVGhlIGZsYWdzIHRvIGNvbnRyb2wgdGhlIHJlY29nbml0aW9uIHByb3BlcnRpZXMuCiAgICAgICogQHJldHVybiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY2FsbCBzdWNjZWVkZWQgb3Igbm90LgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBvZiBBUEkgbGV2ZWwgMzMKLSAgICAgKiAgICAgICAgIG9yIGFib3ZlIGFuZCBhdHRlbXB0cyB0byBzdGFydCBhIHJlY29nbml0aW9uIHdoZW4gdGhlIGRldGVjdG9yIGlzIG5vdCBhYmxlIGJhc2VkIG9uCi0gICAgICogICAgICAgICB0aGUgYXZhaWxhYmlsaXR5IHN0YXRlLiBUaGlzIGNhbiBiZSB0aHJvd24gZXZlbiBpZiB0aGUgc3RhdGUgaGFzIGJlZW4gY2hlY2tlZCBiZWZvcmUKLSAgICAgKiAgICAgICAgIGNhbGxpbmcgdGhpcyBtZXRob2QgYmVjYXVzZSB0aGUgY2FsbGVyIHJlY2VpdmVzIGF2YWlsYWJpbGl0eSB1cGRhdGVzIHZpYSBhbgotICAgICAqICAgICAgICAgYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBpdCBtYXkgYmUgZHVlIHRvIHRoZSBhdmFpbGFiaWxpdHkgY2hhbmdpbmcgd2hpbGUgdGhpcyBjYWxsIGlzCi0gICAgICogICAgICAgICBwZXJmb3JtZWQuCi0gICAgICogICAgICAgICAtIFRocm93cyBpZiB0aGUgcmVjb2duaXRpb24gaXNuJ3Qgc3VwcG9ydGVkLgotICAgICAqICAgICAgICAgICBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24KLSAgICAgKiAgICAgICAgICAge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0byBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKiAgICAgICAgIC0gQWxzbyB0aHJvd3MgaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCi0gICAgICogICAgICAgICAgIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUKLSAgICAgKiAgICAgICAgICAge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBUEkgbGV2ZWwKLSAgICAgKiAgICAgICAgIDMzIGlmIHRoZSByZWNvZ25pdGlvbiBpc24ndCBzdXBwb3J0ZWQuIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBhZnRlciBhCi0gICAgICogICAgICAgICBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24ge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0byBhdm9pZCB0aGlzCi0gICAgICogICAgICAgICBleGNlcHRpb24uCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBUEkgbGV2ZWwgMzMgaWYgdGhlCi0gICAgICogICAgICAgICBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLiBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMKLSAgICAgKiAgICAgICAgIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZSB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMKLSAgICAgKiAgICAgICAgIGJlZW4gc2h1dCBkb3duLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJlY29nbml0aW9uIGlzbid0IHN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBhZnRlciBhIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbgorICAgICAqICAgICAgICAge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0byBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4KKyAgICAgKiAgICAgICAgIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUKKyAgICAgKiAgICAgICAgIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mID0ge1JFQ09SRF9BVURJTywgQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkKLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKEBSZWNvZ25pdGlvbkZsYWdzIGludCByZWNvZ25pdGlvbkZsYWdzKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKEBSZWNvZ25pdGlvbkZsYWdzIGludCByZWNvZ25pdGlvbkZsYWdzKSB7CiAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJzdGFydFJlY29nbml0aW9uKCIgKyByZWNvZ25pdGlvbkZsYWdzICsgIikiKTsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UmVjb2duaXRpb25Mb2NrZWQocmVjb2duaXRpb25GbGFncywgbnVsbCAvKiBkYXRhICovKSA9PSBTVEFUVVNfT0s7CkBAIC0xMTA0LDggKzEwNDksNyBAQAogICAgICAqLwogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2YgPSB7UkVDT1JEX0FVRElPLCBDQVBUVVJFX0FVRElPX0hPVFdPUkR9KQogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKCkgewogICAgICAgICByZXR1cm4gc3RhcnRSZWNvZ25pdGlvbigwKTsKICAgICB9CiAKQEAgLTExMTUsNDQgKzEwNTksMjggQEAKICAgICAgKiBTZXR0aW5ncy5TZWN1cmUuVk9JQ0VfSU5URVJBQ1RJT05fU0VSVklDRS4KICAgICAgKgogICAgICAqIEByZXR1cm4gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhbGwgc3VjY2VlZGVkIG9yIG5vdC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YKLSAgICAgKiAgICAgICAgIEFQSSBsZXZlbCAzMyBvciBhYm92ZSBhbmQgYXR0ZW1wdHMgdG8gc3RvcCBhIHJlY29nbml0aW9uIHdoZW4gdGhlIGRldGVjdG9yIGlzCi0gICAgICogICAgICAgICBub3QgYWJsZSBiYXNlZCBvbiB0aGUgc3RhdGUuIFRoaXMgY2FuIGJlIHRocm93biBldmVuIGlmIHRoZSBzdGF0ZSBoYXMgYmVlbiBjaGVja2VkCi0gICAgICogICAgICAgICBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCBiZWNhdXNlIHRoZSBjYWxsZXIgcmVjZWl2ZXMgYXZhaWxhYmlsaXR5IHVwZGF0ZXMgdmlhIGFuCi0gICAgICogICAgICAgICBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGl0IG1heSBiZSBkdWUgdG8gdGhlIGF2YWlsYWJpbGl0eSBjaGFuZ2luZyB3aGlsZSB0aGlzIGNhbGwgaXMKLSAgICAgKiAgICAgICAgIHBlcmZvcm1lZC4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsCi0gICAgICogICAgICAgICAzMyBpZiB0aGUgcmVjb2duaXRpb24gaXNuJ3Qgc3VwcG9ydGVkLiBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYQotICAgICAqICAgICAgICAgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcwotICAgICAqICAgICAgICAgZXhjZXB0aW9uLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsIDMzIGlmIHRoZQotICAgICAqICAgICAgICAgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzCi0gICAgICogICAgICAgICBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzCi0gICAgICogICAgICAgICBiZWVuIHNodXQgZG93bi4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByZWNvZ25pdGlvbiBpc24ndCBzdXBwb3J0ZWQuCisgICAgICogICAgICAgICBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24KKyAgICAgKiAgICAgICAgIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcyBleGNlcHRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCisgICAgICogICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCisgICAgICogICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCiAgICAgICovCiAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgUmVxdWlyZXNQZXJtaXNzaW9uIHNpbmNlIGl0IGlzbid0IGFjdHVhbGx5IGVuZm9yY2VkLiBBbHNvIGZpeCB0aGUgamF2YWRvYwogICAgIC8vIGFib3V0IHBlcm1pc3Npb25zIGVuZm9yY2VtZW50ICh3aGVuIGl0IHRocm93cyB2cyB3aGVuIGl0IGp1c3QgcmV0dXJucyBmYWxzZSkgZm9yIG90aGVyCiAgICAgLy8gbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2YgPSB7UkVDT1JEX0FVRElPLCBDQVBUVVJFX0FVRElPX0hPVFdPUkR9KQogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN0b3BSZWNvZ25pdGlvbigpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCkgewogICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAic3RvcFJlY29nbml0aW9uKCkiKTsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgaWYgKG1BdmFpbGFiaWxpdHkgPT0gU1RBVEVfSU5WQUxJRCB8fCBtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RvcFJlY29nbml0aW9uIGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAic3RvcFJlY29nbml0aW9uIGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiBzdGFydC9zdG9wIGEgcmVjb2duaXRpb24uCiAgICAgICAgICAgICBpZiAobUF2YWlsYWJpbGl0eSAhPSBTVEFURV9LRVlQSFJBU0VfRU5ST0xMRUQpIHsKLSAgICAgICAgICAgICAgICBpZiAoQ29tcGF0Q2hhbmdlcy5pc0NoYW5nZUVuYWJsZWQoSE9UV09SRF9ERVRFQ1RPUl9USFJPV19DSEVDS0VEX0VYQ0VQVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWNvZ25pdGlvbiBmb3IgdGhlIGdpdmVuIGtleXBocmFzZSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJSZWNvZ25pdGlvbiBmb3IgdGhlIGdpdmVuIGtleXBocmFzZSBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgICAgICB9CkBAIC0xMTc3LDI4ICsxMTA1LDE4IEBACiAgICAgICogICAgICAgICAtIHtAbGluayBTb3VuZFRyaWdnZXIjU1RBVFVTX0JBRF9WQUxVRX0gaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXIKICAgICAgKiAgICAgICAgIC0ge0BsaW5rIFNvdW5kVHJpZ2dlciNTVEFUVVNfSU5WQUxJRF9PUEVSQVRJT059IGlmIHRoZSBjYWxsIGlzIG91dCBvZiBzZXF1ZW5jZSBvcgogICAgICAqICAgICAgICAgICBpZiBBUEkgaXMgbm90IHN1cHBvcnRlZCBieSBIQUwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IKLSAgICAgKiAgICAgICAgIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IKLSAgICAgKiAgICAgICAgIGhhcyBiZWVuIHNodXQgZG93bi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbCAzMyBpZiB0aGUKLSAgICAgKiAgICAgICAgIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcwotICAgICAqICAgICAgICAgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcwotICAgICAqICAgICAgICAgYmVlbiBzaHV0IGRvd24uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCisgICAgICogICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCisgICAgICogICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHtSRUNPUkRfQVVESU8sIENBUFRVUkVfQVVESU9fSE9UV09SRH0pCi0gICAgcHVibGljIGludCBzZXRQYXJhbWV0ZXIoQE1vZGVsUGFyYW1zIGludCBtb2RlbFBhcmFtLCBpbnQgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBpbnQgc2V0UGFyYW1ldGVyKEBNb2RlbFBhcmFtcyBpbnQgbW9kZWxQYXJhbSwgaW50IHZhbHVlKSB7CiAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgIFNsb2cuZChUQUcsICJzZXRQYXJhbWV0ZXIoIiArIG1vZGVsUGFyYW0gKyAiLCAiICsgdmFsdWUgKyAiKSIpOwogICAgICAgICB9CiAKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgaWYgKG1BdmFpbGFiaWxpdHkgPT0gU1RBVEVfSU5WQUxJRCB8fCBtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0UGFyYW1ldGVyIGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAic2V0UGFyYW1ldGVyIGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7CiAgICAgICAgICAgICB9CkBAIC0xMjE5LDI3ICsxMTM3LDE4IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbW9kZWxQYXJhbSAgIHtAbGluayBNb2RlbFBhcmFtc30KICAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHBhcmFtZXRlcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBvZiBBUEkgbGV2ZWwgMzMKLSAgICAgKiAgICAgICAgIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLiBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvcgotICAgICAqICAgICAgICAgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZSB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvcgotICAgICAqICAgICAgICAgaGFzIGJlZW4gc2h1dCBkb3duLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsIDMzIGlmCi0gICAgICogICAgICAgICB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzCi0gICAgICogICAgICAgICBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzCi0gICAgICogICAgICAgICBiZWVuIHNodXQgZG93bi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4KKyAgICAgKiAgICAgICAgIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUKKyAgICAgKiAgICAgICAgIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mID0ge1JFQ09SRF9BVURJTywgQ0FQVFVSRV9BVURJT19IT1RXT1JEfSkKLSAgICBwdWJsaWMgaW50IGdldFBhcmFtZXRlcihATW9kZWxQYXJhbXMgaW50IG1vZGVsUGFyYW0pIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIGludCBnZXRQYXJhbWV0ZXIoQE1vZGVsUGFyYW1zIGludCBtb2RlbFBhcmFtKSB7CiAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgIFNsb2cuZChUQUcsICJnZXRQYXJhbWV0ZXIoIiArIG1vZGVsUGFyYW0gKyAiKSIpOwogICAgICAgICB9CiAKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgaWYgKG1BdmFpbGFiaWxpdHkgPT0gU1RBVEVfSU5WQUxJRCB8fCBtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0UGFyYW1ldGVyIGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0UGFyYW1ldGVyIGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7CiAgICAgICAgICAgICB9CkBAIC0xMjU3LDI5ICsxMTY2LDE5IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbW9kZWxQYXJhbSB7QGxpbmsgTW9kZWxQYXJhbXN9CiAgICAgICogQHJldHVybiBzdXBwb3J0ZWQgcmFuZ2Ugb2YgcGFyYW1ldGVyLCBudWxsIGlmIG5vdCBzdXBwb3J0ZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBvciBlcnJvciBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IKLSAgICAgKiAgICAgICAgIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IKLSAgICAgKiAgICAgICAgIGhhcyBiZWVuIHNodXQgZG93bi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbCAzMyBpZgotICAgICAqICAgICAgICAgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcwotICAgICAqICAgICAgICAgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcwotICAgICAqICAgICAgICAgYmVlbiBzaHV0IGRvd24uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgb3IgZXJyb3Igc3RhdGUuCisgICAgICogICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCisgICAgICogICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihhbGxPZiA9IHtSRUNPUkRfQVVESU8sIENBUFRVUkVfQVVESU9fSE9UV09SRH0pCiAgICAgQE51bGxhYmxlCi0gICAgcHVibGljIE1vZGVsUGFyYW1SYW5nZSBxdWVyeVBhcmFtZXRlcihATW9kZWxQYXJhbXMgaW50IG1vZGVsUGFyYW0pCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBNb2RlbFBhcmFtUmFuZ2UgcXVlcnlQYXJhbWV0ZXIoQE1vZGVsUGFyYW1zIGludCBtb2RlbFBhcmFtKSB7CiAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgIFNsb2cuZChUQUcsICJxdWVyeVBhcmFtZXRlcigiICsgbW9kZWxQYXJhbSArICIpIik7CiAgICAgICAgIH0KIAogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICBpZiAobUF2YWlsYWJpbGl0eSA9PSBTVEFURV9JTlZBTElEIHx8IG1BdmFpbGFiaWxpdHkgPT0gU1RBVEVfRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoQ29tcGF0Q2hhbmdlcy5pc0NoYW5nZUVuYWJsZWQoSE9UV09SRF9ERVRFQ1RPUl9USFJPV19DSEVDS0VEX0VYQ0VQVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWVyeVBhcmFtZXRlciBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgInF1ZXJ5UGFyYW1ldGVyIGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7CiAgICAgICAgICAgICB9CkBAIC0xMjk2LDI1ICsxMTk1LDE1IEBACiAgICAgICogb3RoZXJ3aXNlIHtAbGluayAjY3JlYXRlUmVFbnJvbGxJbnRlbnQoKX0gc2hvdWxkIGJlIHByZWZlcnJlZC4KICAgICAgKgogICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIEludGVudH0gdG8gc3RhcnQgZW5yb2xsbWVudCBmb3IgdGhlIGdpdmVuIGtleXBocmFzZS4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBvciBhYm92ZS4KLSAgICAgKiAgICAgICAgIC0gVGhyb3duIGlmIG1hbmFnaW5nIHRoZXkga2V5cGhyYXNlIGlzbid0IHN1cHBvcnRlZC4gQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMKLSAgICAgKiAgICAgICAgICAgbWV0aG9kIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uCi0gICAgICogICAgICAgICAgIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcyBleGNlcHRpb24uCi0gICAgICogICAgICAgICAtIFRocm93biBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IKLSAgICAgKiAgICAgICAgICAgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZSB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvcgotICAgICAqICAgICAgICAgICBoYXMgYmVlbiBzaHV0IGRvd24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbAotICAgICAqICAgICAgICAgMzMgaWYgbWFuYWdpbmcgdGhleSBrZXlwaHJhc2UgaXNuJ3Qgc3VwcG9ydGVkLiBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QKLSAgICAgKiAgICAgICAgIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8KLSAgICAgKiAgICAgICAgIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsIDMzIGlmIHRoZQotICAgICAqICAgICAgICAgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBzdGF0ZS4gVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzIGJlZW4KLSAgICAgKiAgICAgICAgIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzIGJlZW4KLSAgICAgKiAgICAgICAgIHNodXQgZG93bi4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIG1hbmFnaW5nIHRoZXkga2V5cGhyYXNlIGlzbid0IHN1cHBvcnRlZC4KKyAgICAgKiAgICAgICAgIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBhZnRlciBhIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbgorICAgICAqICAgICAgICAge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0byBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZGV0ZWN0b3IgaXMgaW4gYW4gaW52YWxpZCBzdGF0ZS4KKyAgICAgKiAgICAgICAgIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUKKyAgICAgKiAgICAgICAgIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KICAgICAgKi8KICAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgSW50ZW50IGNyZWF0ZUVucm9sbEludGVudCgpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIEludGVudCBjcmVhdGVFbnJvbGxJbnRlbnQoKSB7CiAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJjcmVhdGVFbnJvbGxJbnRlbnQiKTsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgcmV0dXJuIGdldE1hbmFnZUludGVudExvY2tlZChLZXlwaHJhc2VFbnJvbGxtZW50SW5mby5NQU5BR0VfQUNUSU9OX0VOUk9MTCk7CkBAIC0xMzI4LDI1ICsxMjE3LDE1IEBACiAgICAgICogaS5lLiB7QGxpbmsgI1NUQVRFX0tFWVBIUkFTRV9FTlJPTExFRH0sIG90aGVyd2lzZSBpbnZva2luZyB0aGlzIG1heSByZXN1bHQgaW4gYW4gZXJyb3IuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIEFuIHtAbGluayBJbnRlbnR9IHRvIHN0YXJ0IHVuLWVucm9sbG1lbnQgZm9yIHRoZSBnaXZlbiBrZXlwaHJhc2UuCi0gICAgICogQHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIG9mIEFQSSBsZXZlbCAzMwotICAgICAqICAgICAgICAgb3IgYWJvdmUuCi0gICAgICogICAgICAgICAtIFRocm93biBpZiBtYW5hZ2luZyB0aGV5IGtleXBocmFzZSBpc24ndCBzdXBwb3J0ZWQuIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzCi0gICAgICogICAgICAgICAgIG1ldGhvZCBhZnRlciBhIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbgotICAgICAqICAgICAgICAgICB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgotICAgICAqICAgICAgICAgLSBUaHJvd24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yCi0gICAgICogICAgICAgICAgIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBvciB0aGUge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IKLSAgICAgKiAgICAgICAgICAgaGFzIGJlZW4gc2h1dCBkb3duLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBUEkgbGV2ZWwKLSAgICAgKiAgICAgICAgIDMzIGlmIG1hbmFnaW5nIHRoZXkga2V5cGhyYXNlIGlzbid0IHN1cHBvcnRlZC4gQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMgbWV0aG9kCi0gICAgICogICAgICAgICBhZnRlciBhIHN1cHBvcnRlZCBzdGF0ZSBjYWxsYmFjayBvbiB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvCi0gICAgICogICAgICAgICBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gd2hlbiBhIGNhbGxlciBoYXMgYSB0YXJnZXQgU0RLIGJlbG93IEFQSSBsZXZlbCAzMyBpZiB0aGUKLSAgICAgKiAgICAgICAgIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgc3RhdGUuIFRoaXMgbWF5IGhhcHBlbiBpZiBhbm90aGVyIGRldGVjdG9yIGhhcyBiZWVuCi0gICAgICogICAgICAgICBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yIGhhcyBiZWVuCi0gICAgICogICAgICAgICBzaHV0IGRvd24uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBtYW5hZ2luZyB0aGV5IGtleXBocmFzZSBpc24ndCBzdXBwb3J0ZWQuCisgICAgICogICAgICAgICBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24KKyAgICAgKiAgICAgICAgIHtAbGluayBDYWxsYmFjayNvbkF2YWlsYWJpbGl0eUNoYW5nZWQoaW50KX0gdG8gYXZvaWQgdGhpcyBleGNlcHRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGRldGVjdG9yIGlzIGluIGFuIGludmFsaWQgc3RhdGUuCisgICAgICogICAgICAgICBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlCisgICAgICogICAgICAgICB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbiBzaHV0IGRvd24uCiAgICAgICovCiAgICAgQE51bGxhYmxlCi0gICAgcHVibGljIEludGVudCBjcmVhdGVVbkVucm9sbEludGVudCgpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIEludGVudCBjcmVhdGVVbkVucm9sbEludGVudCgpIHsKICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgImNyZWF0ZVVuRW5yb2xsSW50ZW50Iik7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIHJldHVybiBnZXRNYW5hZ2VJbnRlbnRMb2NrZWQoS2V5cGhyYXNlRW5yb2xsbWVudEluZm8uTUFOQUdFX0FDVElPTl9VTl9FTlJPTEwpOwpAQCAtMTM2MCwyNSArMTIzOSwxNSBAQAogICAgICAqIGkuZS4ge0BsaW5rICNTVEFURV9LRVlQSFJBU0VfRU5ST0xMRUR9LCBvdGhlcndpc2UgaW52b2tpbmcgdGhpcyBtYXkgcmVzdWx0IGluIGFuIGVycm9yLgogICAgICAqCiAgICAgICogQHJldHVybiBBbiB7QGxpbmsgSW50ZW50fSB0byBzdGFydCByZS1lbnJvbGxtZW50IGZvciB0aGUgZ2l2ZW4ga2V5cGhyYXNlLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBvZiBBUEkgbGV2ZWwgMzMKLSAgICAgKiAgICAgICAgIG9yIGFib3ZlLgotICAgICAqICAgICAgICAgLSBUaHJvd24gaWYgbWFuYWdpbmcgdGhleSBrZXlwaHJhc2UgaXNuJ3Qgc3VwcG9ydGVkLiBDYWxsZXJzIHNob3VsZCBvbmx5IGNhbGwgdGhpcwotICAgICAqICAgICAgICAgICBtZXRob2QgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24KLSAgICAgKiAgICAgICAgICAge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0byBhdm9pZCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKiAgICAgICAgIC0gVGhyb3duIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLiBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvcgotICAgICAqICAgICAgICAgICBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgb3IgdGhlIHtAbGluayBWb2ljZUludGVyYWN0aW9uU2VydmljZX0gaG9zdGluZyB0aGlzIGRldGVjdG9yCi0gICAgICogICAgICAgICAgIGhhcyBiZWVuIHNodXQgZG93bi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgYmVsb3cgQVBJIGxldmVsCi0gICAgICogICAgICAgICAzMyBpZiBtYW5hZ2luZyB0aGV5IGtleXBocmFzZSBpc24ndCBzdXBwb3J0ZWQuIENhbGxlcnMgc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG1ldGhvZAotICAgICAqICAgICAgICAgYWZ0ZXIgYSBzdXBwb3J0ZWQgc3RhdGUgY2FsbGJhY2sgb24ge0BsaW5rIENhbGxiYWNrI29uQXZhaWxhYmlsaXR5Q2hhbmdlZChpbnQpfSB0bwotICAgICAqICAgICAgICAgYXZvaWQgdGhpcyBleGNlcHRpb24uCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBiZWxvdyBBUEkgbGV2ZWwgMzMgaWYgdGhlCi0gICAgICogICAgICAgICBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLiBUaGlzIG1heSBoYXBwZW4gaWYgYW5vdGhlciBkZXRlY3RvciBoYXMgYmVlbgotICAgICAqICAgICAgICAgaW5zdGFudGlhdGVkIG9yIHRoZSB7QGxpbmsgVm9pY2VJbnRlcmFjdGlvblNlcnZpY2V9IGhvc3RpbmcgdGhpcyBkZXRlY3RvciBoYXMgYmVlbgotICAgICAqICAgICAgICAgc2h1dCBkb3duLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgbWFuYWdpbmcgdGhleSBrZXlwaHJhc2UgaXNuJ3Qgc3VwcG9ydGVkLgorICAgICAqICAgICAgICAgQ2FsbGVycyBzaG91bGQgb25seSBjYWxsIHRoaXMgbWV0aG9kIGFmdGVyIGEgc3VwcG9ydGVkIHN0YXRlIGNhbGxiYWNrIG9uCisgICAgICogICAgICAgICB7QGxpbmsgQ2FsbGJhY2sjb25BdmFpbGFiaWxpdHlDaGFuZ2VkKGludCl9IHRvIGF2b2lkIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBkZXRlY3RvciBpcyBpbiBhbiBpbnZhbGlkIG9yIGVycm9yIHN0YXRlLgorICAgICAqICAgICAgICAgVGhpcyBtYXkgaGFwcGVuIGlmIGFub3RoZXIgZGV0ZWN0b3IgaGFzIGJlZW4gaW5zdGFudGlhdGVkIG9yIHRoZQorICAgICAqICAgICAgICAge0BsaW5rIFZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlfSBob3N0aW5nIHRoaXMgZGV0ZWN0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgogICAgICAqLwogICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBJbnRlbnQgY3JlYXRlUmVFbnJvbGxJbnRlbnQoKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBJbnRlbnQgY3JlYXRlUmVFbnJvbGxJbnRlbnQoKSB7CiAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJjcmVhdGVSZUVucm9sbEludGVudCIpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0TWFuYWdlSW50ZW50TG9ja2VkKEtleXBocmFzZUVucm9sbG1lbnRJbmZvLk1BTkFHRV9BQ1RJT05fUkVfRU5ST0xMKTsKQEAgLTEzODYsMjQgKzEyNTUsMTUgQEAKICAgICB9CiAKICAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBJbnRlbnQgZ2V0TWFuYWdlSW50ZW50TG9ja2VkKEBLZXlwaHJhc2VFbnJvbGxtZW50SW5mby5NYW5hZ2VBY3Rpb25zIGludCBhY3Rpb24pCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgIHByaXZhdGUgSW50ZW50IGdldE1hbmFnZUludGVudExvY2tlZChAS2V5cGhyYXNlRW5yb2xsbWVudEluZm8uTWFuYWdlQWN0aW9ucyBpbnQgYWN0aW9uKSB7CiAgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0lOVkFMSUQgfHwgbUF2YWlsYWJpbGl0eSA9PSBTVEFURV9FUlJPUikgewotICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgImdldE1hbmFnZUludGVudCBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiZ2V0TWFuYWdlSW50ZW50IGNhbGxlZCBvbiBhbiBpbnZhbGlkIGRldGVjdG9yIG9yIGVycm9yIHN0YXRlIik7CisgICAgICAgICAgICAgICAgICAgICJnZXRNYW5hZ2VJbnRlbnQgY2FsbGVkIG9uIGFuIGludmFsaWQgZGV0ZWN0b3Igb3IgZXJyb3Igc3RhdGUiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRoaXMgbWV0aG9kIG9ubHkgbWFrZXMgc2Vuc2UgaWYgd2UgY2FuIGFjdHVhbGx5IHN1cHBvcnQgYSByZWNvZ25pdGlvbi4KICAgICAgICAgaWYgKG1BdmFpbGFiaWxpdHkgIT0gU1RBVEVfS0VZUEhSQVNFX0VOUk9MTEVECiAgICAgICAgICAgICAgICAgJiYgbUF2YWlsYWJpbGl0eSAhPSBTVEFURV9LRVlQSFJBU0VfVU5FTlJPTExFRCkgewotICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIk1hbmFnaW5nIHRoZSBnaXZlbiBrZXlwaHJhc2UgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiTWFuYWdpbmcgdGhlIGdpdmVuIGtleXBocmFzZSBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KQEAgLTE0ODcsMjcgKzEzNDcsMTkgQEAKIAogICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKICAgICBwcml2YXRlIGludCBzdGFydFJlY29nbml0aW9uTG9ja2VkKGludCByZWNvZ25pdGlvbkZsYWdzLAotICAgICAgICAgICAgQE51bGxhYmxlIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgQE51bGxhYmxlIGJ5dGVbXSBkYXRhKSB7CiAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdGFydFJlY29nbml0aW9uKCIKICAgICAgICAgICAgICAgICAgICAgKyByZWNvZ25pdGlvbkZsYWdzCiAgICAgICAgICAgICAgICAgICAgICsgIiwgIiArIEFycmF5cy50b1N0cmluZyhkYXRhKSArICIpIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1BdmFpbGFiaWxpdHkgPT0gU1RBVEVfSU5WQUxJRCB8fCBtQXZhaWxhYmlsaXR5ID09IFNUQVRFX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoQ29tcGF0Q2hhbmdlcy5pc0NoYW5nZUVuYWJsZWQoSE9UV09SRF9ERVRFQ1RPUl9USFJPV19DSEVDS0VEX0VYQ0VQVElPTikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAic3RhcnRSZWNvZ25pdGlvbiBjYWxsZWQgb24gYW4gaW52YWxpZCBkZXRlY3RvciBvciBlcnJvciBzdGF0ZSIpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0UmVjb2duaXRpb24gY2FsbGVkIG9uIGFuIGludmFsaWQgZGV0ZWN0b3Igb3IgZXJyb3Igc3RhdGUiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIENoZWNrIGlmIHdlIGNhbiBzdGFydC9zdG9wIGEgcmVjb2duaXRpb24uCiAgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ICE9IFNUQVRFX0tFWVBIUkFTRV9FTlJPTExFRCkgewotICAgICAgICAgICAgaWYgKENvbXBhdENoYW5nZXMuaXNDaGFuZ2VFbmFibGVkKEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlJlY29nbml0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5cGhyYXNlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIlJlY29nbml0aW9uIGZvciB0aGUgZ2l2ZW4ga2V5cGhyYXNlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9Ib3R3b3JkRGV0ZWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvSG90d29yZERldGVjdG9yLmphdmEKaW5kZXggOTNmY2VjMS4uMGM4ZmQ0OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9Ib3R3b3JkRGV0ZWN0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3ZvaWNlL0hvdHdvcmREZXRlY3Rvci5qYXZhCkBAIC0yMywxNCArMjMsMTAgQEAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbjsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU3lzdGVtQXBpOwotaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uQ2hhbmdlSWQ7Ci1pbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5FbmFibGVkU2luY2U7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlNoYXJlZE1lbW9yeTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiAKQEAgLTQ0LDIzICs0MCw2IEBACiBwdWJsaWMgaW50ZXJmYWNlIEhvdHdvcmREZXRlY3RvciB7CiAKICAgICAvKioKLSAgICAgKiBQcmlvciB0byBBUEkgbGV2ZWwgMzMsIEFQSSBjYWxscyBvZiB7QGxpbmsgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rvcn0gY291bGQKLSAgICAgKiByZXR1cm4gYm90aCB7QGxpbmsgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gb3IKLSAgICAgKiB7QGxpbmsgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBkZXBlbmRpbmcgb24gdGhlIGRldGVjdG9yJ3MgdW5kZXJseWluZyBzdGF0ZS4KLSAgICAgKiBUaGlzIGxlYWQgdG8gY29uZnVzaW5nIGJlaGF2aW9yIGFzIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSBkZXRlY3RvciBjYW4gYmUgbW9kaWZpZWQKLSAgICAgKiB3aXRob3V0IHRoZSBrbm93bGVkZ2Ugb2YgdGhlIGNhbGxlciB2aWEgc3lzdGVtIHNlcnZpY2UgbGF5ZXIgdXBkYXRlcy4KLSAgICAgKgotICAgICAqIFRoaXMgY2hhbmdlIElELCB3aGVuIGVuYWJsZWQsIGNoYW5nZXMgdGhlIEFQSSBjYWxscyB0byBvbmx5IHRocm93IGNoZWNrZWQgZXhjZXB0aW9uCi0gICAgICoge0BsaW5rIGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb259IHdoZW4gY2hlY2tpbmcKLSAgICAgKiBhZ2FpbnN0IHN0YXRlIGluZm9ybWF0aW9uIG1vZGlmaWVkIGJ5IGJvdGggdGhlIGNhbGxlciBhbmQgdGhlIHN5c3RlbSBzZXJ2aWNlcy4KLSAgICAgKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgQENoYW5nZUlkCi0gICAgQEVuYWJsZWRTaW5jZSh0YXJnZXRTZGtWZXJzaW9uID0gQnVpbGQuVkVSU0lPTl9DT0RFUy5USVJBTUlTVSkKLSAgICBsb25nIEhPVFdPUkRfREVURUNUT1JfVEhST1dfQ0hFQ0tFRF9FWENFUFRJT04gPSAyMjYzNTUxMTJMOwotCi0gICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoYXQgaXQgaXMgYSBub24tdHJ1c3RlZCBob3R3b3JkIGRldGVjdG9yLgogICAgICAqCiAgICAgICogQGhpZGUKQEAgLTEwOSwyNiArODgsMTYgQEAKICAgICAgKiBDYWxsaW5nIHRoaXMgYWdhaW4gd2hpbGUgcmVjb2duaXRpb24gaXMgYWN0aXZlIGRvZXMgbm90aGluZy4KICAgICAgKgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSByZXF1ZXN0IHRvIHN0YXJ0IHJlY29nbml0aW9uIHN1Y2NlZWRlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBvZiBBUEkgbGV2ZWwgMzMKLSAgICAgKiAgICAgICAgIG9yIGFib3ZlIGFuZCBhdHRlbXB0cyB0byBzdGFydCBhIHJlY29nbml0aW9uIHdoZW4gdGhlIGRldGVjdG9yIGlzIG5vdCBhYmxlIGJhc2VkIG9uCi0gICAgICogICAgICAgICB0aGUgc3RhdGUuIFRoaXMgY2FuIGJlIHRocm93biBldmVuIGlmIHRoZSBzdGF0ZSBoYXMgYmVlbiBjaGVja2VkIGJlZm9yZSBjYWxsaW5nIHRoaXMKLSAgICAgKiAgICAgICAgIG1ldGhvZCBiZWNhdXNlIHRoZSBjYWxsZXIgcmVjZWl2ZXMgdXBkYXRlcyB2aWEgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBhbmQgdGhlCi0gICAgICogICAgICAgICBzdGF0ZSBvZiB0aGUgZGV0ZWN0b3IgY2FuIGNoYW5nZSBjb25jdXJyZW50bHkgdG8gdGhlIGNhbGxlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgICAqLwogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oYWxsT2YgPSB7UkVDT1JEX0FVRElPLCBDQVBUVVJFX0FVRElPX0hPVFdPUkR9KQotICAgIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKKyAgICBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oKTsKIAogICAgIC8qKgogICAgICAqIFN0b3BzIHNhbmRib3hlZCBkZXRlY3Rpb24gcmVjb2duaXRpb24uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVxdWVzdCB0byBzdG9wIHJlY29nbml0aW9uIHN1Y2NlZWRlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBvZiBBUEkgbGV2ZWwgMzMKLSAgICAgKiAgICAgICAgIG9yIGFib3ZlIGFuZCBhdHRlbXB0cyB0byBzdG9wIGEgcmVjb2duaXRpb24gd2hlbiB0aGUgZGV0ZWN0b3IgaXMgbm90IGFibGUgYmFzZWQgb24KLSAgICAgKiAgICAgICAgIHRoZSBzdGF0ZS4gVGhpcyBjYW4gYmUgdGhyb3duIGV2ZW4gaWYgdGhlIHN0YXRlIGhhcyBiZWVuIGNoZWNrZWQgYmVmb3JlIGNhbGxpbmcgdGhpcwotICAgICAqICAgICAgICAgbWV0aG9kIGJlY2F1c2UgdGhlIGNhbGxlciByZWNlaXZlcyB1cGRhdGVzIHZpYSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGFuZCB0aGUKLSAgICAgKiAgICAgICAgIHN0YXRlIG9mIHRoZSBkZXRlY3RvciBjYW4gY2hhbmdlIGNvbmN1cnJlbnRseSB0byB0aGUgY2FsbGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCiAgICAgICovCi0gICAgYm9vbGVhbiBzdG9wUmVjb2duaXRpb24oKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb247CisgICAgYm9vbGVhbiBzdG9wUmVjb2duaXRpb24oKTsKIAogICAgIC8qKgogICAgICAqIFN0YXJ0cyBob3R3b3JkIHJlY29nbml0aW9uIG9uIGF1ZGlvIGNvbWluZyBmcm9tIGFuIGV4dGVybmFsIGNvbm5lY3RlZCBtaWNyb3Bob25lLgpAQCAtMTQyLDE2ICsxMTEsMTEgQEAKICAgICAgKiAgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGRvZXMgbm90IGFsbG93IGFueSByZW1vdGFibGUgb2JqZWN0cyBvciBvdGhlciBjb250ZW50cyB0aGF0IGNhbiBiZQogICAgICAqICAgICAgICAgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIG90aGVyIHByb2Nlc3Nlcy4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVxdWVzdCB0byBzdGFydCByZWNvZ25pdGlvbiBzdWNjZWVkZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIFRocm93biB3aGVuIGEgY2FsbGVyIGhhcyBhIHRhcmdldCBTREsgb2YgQVBJIGxldmVsIDMzCi0gICAgICogICAgICAgICBvciBhYm92ZSBhbmQgYXR0ZW1wdHMgdG8gc3RhcnQgYSByZWNvZ25pdGlvbiB3aGVuIHRoZSBkZXRlY3RvciBpcyBub3QgYWJsZSBiYXNlZCBvbgotICAgICAqICAgICAgICAgdGhlIHN0YXRlLiBUaGlzIGNhbiBiZSB0aHJvd24gZXZlbiBpZiB0aGUgc3RhdGUgaGFzIGJlZW4gY2hlY2tlZCBiZWZvcmUgY2FsbGluZyB0aGlzCi0gICAgICogICAgICAgICBtZXRob2QgYmVjYXVzZSB0aGUgY2FsbGVyIHJlY2VpdmVzIHVwZGF0ZXMgdmlhIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjaywgYW5kIHRoZQotICAgICAqICAgICAgICAgc3RhdGUgb2YgdGhlIGRldGVjdG9yIGNhbiBjaGFuZ2UgY29uY3VycmVudGx5IHRvIHRoZSBjYWxsZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KICAgICAgKi8KICAgICBib29sZWFuIHN0YXJ0UmVjb2duaXRpb24oCiAgICAgICAgICAgICBATm9uTnVsbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBhdWRpb1N0cmVhbSwKICAgICAgICAgICAgIEBOb25OdWxsIEF1ZGlvRm9ybWF0IGF1ZGlvRm9ybWF0LAotICAgICAgICAgICAgQE51bGxhYmxlIFBlcnNpc3RhYmxlQnVuZGxlIG9wdGlvbnMpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbjsKKyAgICAgICAgICAgIEBOdWxsYWJsZSBQZXJzaXN0YWJsZUJ1bmRsZSBvcHRpb25zKTsKIAogICAgIC8qKgogICAgICAqIFNldCBjb25maWd1cmF0aW9uIGFuZCBwYXNzIHJlYWQtb25seSBkYXRhIHRvIHNhbmRib3hlZCBkZXRlY3Rpb24gc2VydmljZS4KQEAgLTE2MSwxNyArMTI1LDEwIEBACiAgICAgICogY29tbXVuaWNhdGUgd2l0aCBvdGhlciBwcm9jZXNzZXMuCiAgICAgICogQHBhcmFtIHNoYXJlZE1lbW9yeSBUaGUgdW5yZXN0cmljdGVkIGRhdGEgYmxvYiB0byBwcm92aWRlIHRvIHNhbmRib3hlZCBkZXRlY3Rpb24gc2VydmljZXMuCiAgICAgICogVXNlIHRoaXMgdG8gcHJvdmlkZSBtb2RlbCBkYXRhIG9yIG90aGVyIHN1Y2ggZGF0YSB0byB0aGUgdHJ1c3RlZCBwcm9jZXNzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gVGhyb3duIHdoZW4gYSBjYWxsZXIgaGFzIGEgdGFyZ2V0IFNESyBvZiBBUEkgbGV2ZWwgMzMKLSAgICAgKiAgICAgICAgIG9yIGFib3ZlIGFuZCB0aGUgZGV0ZWN0b3IgaXMgbm90IGFibGUgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZQotICAgICAqICAgICAgICAgdW5kZXJseWluZyBzdGF0ZS4gVGhpcyBjYW4gYmUgdGhyb3duIGV2ZW4gaWYgdGhlIHN0YXRlIGhhcyBiZWVuIGNoZWNrZWQgYmVmb3JlCi0gICAgICogICAgICAgICBjYWxsaW5nIHRoaXMgbWV0aG9kIGJlY2F1c2UgdGhlIGNhbGxlciByZWNlaXZlcyB1cGRhdGVzIHZpYSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssCi0gICAgICogICAgICAgICBhbmQgdGhlIHN0YXRlIG9mIHRoZSBkZXRlY3RvciBjYW4gY2hhbmdlIGNvbmN1cnJlbnRseSB0byB0aGUgY2FsbGVyIGNhbGxpbmcgdGhpcwotICAgICAqICAgICAgICAgbWV0aG9kLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgSG90d29yZERldGVjdG9yIHdhc24ndCBzcGVjaWZpZWQgdG8gdXNlIGEKICAgICAgKiAgICAgICAgIHNhbmRib3hlZCBkZXRlY3Rpb24gc2VydmljZSB3aGVuIGl0IHdhcyBjcmVhdGVkLgogICAgICAqLwotICAgIHZvaWQgdXBkYXRlU3RhdGUoQE51bGxhYmxlIFBlcnNpc3RhYmxlQnVuZGxlIG9wdGlvbnMsIEBOdWxsYWJsZSBTaGFyZWRNZW1vcnkgc2hhcmVkTWVtb3J5KQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uOworICAgIHZvaWQgdXBkYXRlU3RhdGUoQE51bGxhYmxlIFBlcnNpc3RhYmxlQnVuZGxlIG9wdGlvbnMsIEBOdWxsYWJsZSBTaGFyZWRNZW1vcnkgc2hhcmVkTWVtb3J5KTsKIAogICAgIC8qKgogICAgICAqIEludmFsaWRhdGVzIHRoaXMgZGV0ZWN0b3Igc28gdGhhdCBhbnkgZnV0dXJlIGNhbGxzIHRvIHRoaXMgcmVzdWx0CkBAIC0yOTgsMTQgKzI1NSw0IEBACiAgICAgICAgICAqLwogICAgICAgICB2b2lkIG9uSG90d29yZERldGVjdGlvblNlcnZpY2VSZXN0YXJ0ZWQoKTsKICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGxpbmsgSG90d29yZERldGVjdG9yfSBzcGVjaWZpYyBleGNlcHRpb24gdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlIGRldGVjdG9yCi0gICAgICogaXMgaW52YWxpZCBmb3IgdGhlIGdpdmVuIGFjdGlvbi4KLSAgICAgKi8KLSAgICBjbGFzcyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiBleHRlbmRzIEFuZHJvaWRFeGNlcHRpb24gewotICAgICAgICBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3ZvaWNlL1NvZnR3YXJlSG90d29yZERldGVjdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3ZvaWNlL1NvZnR3YXJlSG90d29yZERldGVjdG9yLmphdmEKaW5kZXggNzY3ZmUzNy4uNzc5MDBkNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9Tb2Z0d2FyZUhvdHdvcmREZXRlY3Rvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvU29mdHdhcmVIb3R3b3JkRGV0ZWN0b3IuamF2YQpAQCAtODYsNyArODYsNyBAQAogCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihSRUNPUkRfQVVESU8pCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpIHsKICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiI3N0YXJ0UmVjb2duaXRpb24iKTsKICAgICAgICAgfQpAQCAtMTA5LDcgKzEwOSw3IEBACiAgICAgLyoqIFRPRE86IHN0b3BSZWNvZ25pdGlvbiAqLwogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oUkVDT1JEX0FVRElPKQogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN0b3BSZWNvZ25pdGlvbigpIHRocm93cyBJbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gc3RvcFJlY29nbml0aW9uKCkgewogICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgIFNsb2cuaShUQUcsICIjc3RvcFJlY29nbml0aW9uIik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvdm9pY2UvVmlzdWFsUXVlcnlEZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9WaXN1YWxRdWVyeURldGVjdG9yLmphdmEKaW5kZXggN2RjMDY4Ny4uZDdiZjA3NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9WaXN1YWxRdWVyeURldGVjdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS92b2ljZS9WaXN1YWxRdWVyeURldGVjdG9yLmphdmEKQEAgLTg0LDggKzg0LDcgQEAKICAgICAgKiBAc2VlIEhvdHdvcmREZXRlY3RvciN1cGRhdGVTdGF0ZShQZXJzaXN0YWJsZUJ1bmRsZSwgU2hhcmVkTWVtb3J5KQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKEBOdWxsYWJsZSBQZXJzaXN0YWJsZUJ1bmRsZSBvcHRpb25zLAotICAgICAgICAgICAgQE51bGxhYmxlIFNoYXJlZE1lbW9yeSBzaGFyZWRNZW1vcnkpIHRocm93cwotICAgICAgICAgICAgSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEBOdWxsYWJsZSBTaGFyZWRNZW1vcnkgc2hhcmVkTWVtb3J5KSB7CiAgICAgICAgIG1Jbml0aWFsaXphdGlvbkRlbGVnYXRlLnVwZGF0ZVN0YXRlKG9wdGlvbnMsIHNoYXJlZE1lbW9yeSk7CiAgICAgfQogCkBAIC0xMDQsNyArMTAzLDcgQEAKICAgICAgKiBAc2VlIEhvdHdvcmREZXRlY3RvciNzdGFydFJlY29nbml0aW9uKCkKICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mID0ge0NBTUVSQSwgUkVDT1JEX0FVRElPfSkKLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKCkgdGhyb3dzIEhvdHdvcmREZXRlY3Rvci5JbGxlZ2FsRGV0ZWN0b3JTdGF0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpIHsKICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiI3N0YXJ0UmVjb2duaXRpb24iKTsKICAgICAgICAgfQpAQCAtMTI4LDcgKzEyNyw3IEBACiAgICAgICogQHNlZSBIb3R3b3JkRGV0ZWN0b3Ijc3RvcFJlY29nbml0aW9uKCkKICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKGFsbE9mID0ge0NBTUVSQSwgUkVDT1JEX0FVRElPfSkKLSAgICBwdWJsaWMgYm9vbGVhbiBzdG9wUmVjb2duaXRpb24oKSB0aHJvd3MgSG90d29yZERldGVjdG9yLklsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBzdG9wUmVjb2duaXRpb24oKSB7CiAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgU2xvZy5pKFRBRywgIiNzdG9wUmVjb2duaXRpb24iKTsKICAgICAgICAgfQpAQCAtMjM2LDEzICsyMzUsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdG9wUmVjb2duaXRpb24oKSB0aHJvd3MgSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdG9wUmVjb2duaXRpb24oKSB7CiAgICAgICAgICAgICB0aHJvd0lmRGV0ZWN0b3JJc05vTG9uZ2VyQWN0aXZlKCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFJlY29nbml0aW9uKCkgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigpIHsKICAgICAgICAgICAgIHRocm93SWZEZXRlY3RvcklzTm9Mb25nZXJBY3RpdmUoKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC0yNTEsNyArMjUwLDcgQEAKICAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3RhcnRSZWNvZ25pdGlvbigKICAgICAgICAgICAgICAgICBATm9uTnVsbCBQYXJjZWxGaWxlRGVzY3JpcHRvciBhdWRpb1N0cmVhbSwKICAgICAgICAgICAgICAgICBATm9uTnVsbCBBdWRpb0Zvcm1hdCBhdWRpb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgUGVyc2lzdGFibGVCdW5kbGUgb3B0aW9ucykgdGhyb3dzIElsbGVnYWxEZXRlY3RvclN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBATnVsbGFibGUgUGVyc2lzdGFibGVCdW5kbGUgb3B0aW9ucykgewogICAgICAgICAgICAgLy9Oby1vcCwgbm90IHN1cHBvcnRlZCBieSBWaXN1YWxRdWVyeURldGVjdG9yIGFzIGl0IHNob3VsZCBiZSB0cnVzdGVkLgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvSVJlY29nbml0aW9uU2VydmljZS5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL0lSZWNvZ25pdGlvblNlcnZpY2UuYWlkbAppbmRleCAzMTM0ZGNkLi4xMTQ4ZmUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvSVJlY29nbml0aW9uU2VydmljZS5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9JUmVjb2duaXRpb25TZXJ2aWNlLmFpZGwKQEAgLTc4LDIzICs3OCwxMCBAQAogICAgICAqIGluZm9ybWF0aW9uIHNlZSB7QGxpbmsgI2NoZWNrUmVjb2duaXRpb25TdXBwb3J0fSwgIHtAbGluayAjc3RhcnRMaXN0ZW5pbmd9IGFuZAogICAgICAqIHtAbGluayBSZWNvZ25pemVySW50ZW50fS4KICAgICAgKgotICAgICAqIFByb2dyZXNzIGNhbiBiZSBtb25pdG9yZCBieSBjYWxsaW5nIHtAbGluayAjc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyfSBiZWZvcmUgYSB0cmlnZ2VyLgorICAgICAqIFByb2dyZXNzIHVwZGF0ZXMgY2FuIGJlIHJlY2VpdmVkIHZpYSB7QGxpbmsgI0lNb2RlbERvd25sb2FkTGlzdGVuZXJ9LgogICAgICAqLwotICAgIHZvaWQgdHJpZ2dlck1vZGVsRG93bmxvYWQoaW4gSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgbGlzdGVuZXIgdG8gcmVjZWl2ZWQgZG93bmxvYWQgcHJvZ3Jlc3MgdXBkYXRlcy4gQ2xpZW50cyBzdGlsbCBoYXZlIHRvIGNhbGwKLSAgICAgKiB7QGxpbmsgI3RyaWdnZXJNb2RlbERvd25sb2FkfSB0byB0cmlnZ2VyIGEgbW9kZWwgZG93bmxvYWQuCi0gICAgICovCi0gICAgdm9pZCBzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCisgICAgdm9pZCB0cmlnZ2VyTW9kZWxEb3dubG9hZCgKICAgICAgICAgaW4gSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsCiAgICAgICAgIGluIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICBpbiBJTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgbGlzdGVuZXIgZm9yIG1vZGVsIGRvd25sb2FkIGV2ZW50cyBhdHRhY2hlZCB0byBhIHJlY29nbml0aW9uSW50ZW50IGlmIGFueS4KLSAgICAgKi8KLSAgICB2b2lkIGNsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKAotICAgICAgICBpbiBJbnRlbnQgcmVjb2duaXplckludGVudCwKLSAgICAgICAgaW4gQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL01vZGVsRG93bmxvYWRMaXN0ZW5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL01vZGVsRG93bmxvYWRMaXN0ZW5lci5qYXZhCmluZGV4IDZjMjQzOTkuLmE1OGVjOTBjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvTW9kZWxEb3dubG9hZExpc3RlbmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL01vZGVsRG93bmxvYWRMaXN0ZW5lci5qYXZhCkBAIC0yMiwyMCArMjIsMjcgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBNb2RlbERvd25sb2FkTGlzdGVuZXIgewogICAgIC8qKgotICAgICAqIENhbGxlZCBieSB7QGxpbmsgUmVjb2duaXRpb25TZXJ2aWNlfSB3aGVuIHRoZXJlJ3MgYW4gdXBkYXRlIG9uIHRoZSBkb3dubG9hZCBwcm9ncmVzcy4KKyAgICAgKiBDYWxsZWQgYnkge0BsaW5rIFJlY29nbml0aW9uU2VydmljZX0gb25seSBpZiB0aGUgZG93bmxvYWQgaGFzIHN0YXJ0ZWQgYWZ0ZXIgdGhlIHJlcXVlc3QuCiAgICAgICoKLSAgICAgKiA8cD5SZWNvZ25pdGlvblNlcnZpY2Ugd2lsbCBjYWxsIHRoaXMgemVybyBvciBtb3JlIHRpbWVzIGR1cmluZyB0aGUgZG93bmxvYWQuPC9wPgorICAgICAqIDxwPiBUaGUgbnVtYmVyIG9mIGNhbGxzIHRvIHRoaXMgbWV0aG9kIHZhcmllcyBkZXBlbmRpbmcgb2YgdGhlIHtAbGluayBSZWNvZ25pdGlvblNlcnZpY2V9CisgICAgICogaW1wbGVtZW50YXRpb24uIElmIHRoZSBkb3dubG9hZCBmaW5pc2hlZCBxdWlja2x5IGVub3VnaCwge0BsaW5rICNvblN1Y2Nlc3MoKX0gbWF5IGJlIGNhbGxlZAorICAgICAqIGRpcmVjdGx5LiBJbiBvdGhlciBjYXNlcywgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGR1cmluZyB0aGUgZG93bmxvYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGxldGVkUGVyY2VudCB0aGUgcGVyY2VudGFnZSBvZiBkb3dubG9hZCB0aGF0IGlzIGNvbXBsZXRlZAogICAgICAqLwogICAgIHZvaWQgb25Qcm9ncmVzcyhpbnQgY29tcGxldGVkUGVyY2VudCk7CiAKICAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB7QGxpbmsgUmVjb2duaXRpb25TZXJ2aWNlfSBjb21wbGV0ZWQgdGhlIGRvd25sb2FkIGFuZCBpdCBjYW4gbm93IGJlIHVzZWQgdG8KLSAgICAgKiBzYXRpc2Z5IHJlY29nbml0aW9uIHJlcXVlc3RzLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZDoKKyAgICAgKiA8bGk+IGlmIHRoZSBtb2RlbCBpcyBhbHJlYWR5IGF2YWlsYWJsZTsKKyAgICAgKiA8bGk+IGlmIHRoZSB7QGxpbmsgUmVjb2duaXRpb25TZXJ2aWNlfSBoYXMgc3RhcnRlZCBhbmQgY29tcGxldGVkIHRoZSBkb3dubG9hZC4KKyAgICAgKgorICAgICAqIDxwPiBPbmNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIG1vZGVsIGNhbiBiZSBzYWZlbHkgdXNlZCB0byBzYXRpc2Z5IHJlY29nbml0aW9uIHJlcXVlc3RzLgogICAgICAqLwogICAgIHZvaWQgb25TdWNjZXNzKCk7CiAKICAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB7QGxpbmsgUmVjb2duaXRpb25TZXJ2aWNlfSBzY2hlZHVsZWQgdGhlIGRvd25sb2FkIGJ1dCB3b24ndCBzYXRpc2Z5IGl0CisgICAgICogQ2FsbGVkIHdoZW4ge0BsaW5rIFJlY29nbml0aW9uU2VydmljZX0gc2NoZWR1bGVkIHRoZSBkb3dubG9hZCwgYnV0IHdvbid0IHNhdGlzZnkgaXQKICAgICAgKiBpbW1lZGlhdGVseS4gVGhlcmUgd2lsbCBiZSBubyBmdXJ0aGVyIHVwZGF0ZXMgb24gdGhpcyBsaXN0ZW5lci4KICAgICAgKi8KICAgICB2b2lkIG9uU2NoZWR1bGVkKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvUmVjb2duaXRpb25TZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvUmVjb2duaXRpb25TZXJ2aWNlLmphdmEKaW5kZXggNGVjZWM4Zi4uOTY1NmYzNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1JlY29nbml0aW9uU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9SZWNvZ25pdGlvblNlcnZpY2UuamF2YQpAQCAtMzYsOSArMzYsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLmZ1bmN0aW9uLnBvb2xlZC5Qb29sZWRMYW1iZGE7CiAKQEAgLTkzLDEwICs5MSw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RSSUdHRVJfTU9ERUxfRE9XTkxPQUQgPSA2OwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfTU9ERUxfRE9XTkxPQURfTElTVEVORVIgPSA3OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DTEVBUl9NT0RFTF9ET1dOTE9BRF9MSVNURU5FUiA9IDg7Ci0KICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKQEAgLTEyMCwyMSArMTE0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBcmdzLm1JbnRlbnQsIGNoZWNrQXJncy5jYWxsYmFjaywgY2hlY2tBcmdzLm1BdHRyaWJ1dGlvblNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RSSUdHRVJfTU9ERUxfRE9XTkxPQUQ6Ci0gICAgICAgICAgICAgICAgICAgIFBhaXI8SW50ZW50LCBBdHRyaWJ1dGlvblNvdXJjZT4gcGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFpcjxJbnRlbnQsIEF0dHJpYnV0aW9uU291cmNlPikgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hUcmlnZ2VyTW9kZWxEb3dubG9hZChwYXJhbXMuZmlyc3QsIHBhcmFtcy5zZWNvbmQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfTU9ERUxfRE9XTkxPQURfTElTVEVORVI6Ci0gICAgICAgICAgICAgICAgICAgIE1vZGVsRG93bmxvYWRMaXN0ZW5lckFyZ3MgZExpc3RlbmVyQXJncyA9IChNb2RlbERvd25sb2FkTGlzdGVuZXJBcmdzKSBtc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaFNldE1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkTGlzdGVuZXJBcmdzLm1JbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZExpc3RlbmVyQXJncy5tTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZExpc3RlbmVyQXJncy5tQXR0cmlidXRpb25Tb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19DTEVBUl9NT0RFTF9ET1dOTE9BRF9MSVNURU5FUjoKLSAgICAgICAgICAgICAgICAgICAgUGFpcjxJbnRlbnQsIEF0dHJpYnV0aW9uU291cmNlPiBjbGVhckRsUGFpciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhaXI8SW50ZW50LCBBdHRyaWJ1dGlvblNvdXJjZT4pIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoQ2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIoY2xlYXJEbFBhaXIuZmlyc3QsIGNsZWFyRGxQYWlyLnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgIE1vZGVsRG93bmxvYWRBcmdzIG1vZGVsRG93bmxvYWRBcmdzID0gKE1vZGVsRG93bmxvYWRBcmdzKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaFRyaWdnZXJNb2RlbERvd25sb2FkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsRG93bmxvYWRBcmdzLm1JbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxEb3dubG9hZEFyZ3MubUF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsRG93bmxvYWRBcmdzLm1MaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMzksNTkgKzIyMyw1MiBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoVHJpZ2dlck1vZGVsRG93bmxvYWQoCiAgICAgICAgICAgICBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHsKLSAgICAgICAgUmVjb2duaXRpb25TZXJ2aWNlLnRoaXMub25UcmlnZ2VyTW9kZWxEb3dubG9hZChpbnRlbnQsIGF0dHJpYnV0aW9uU291cmNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hTZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCi0gICAgICAgICAgICBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgSU1vZGVsRG93bmxvYWRMaXN0ZW5lciBsaXN0ZW5lciwKLSAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKSB7Ci0gICAgICAgIFJlY29nbml0aW9uU2VydmljZS50aGlzLnNldE1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBpbnRlbnQsCi0gICAgICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAgICAgbmV3IE1vZGVsRG93bmxvYWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3MoaW50IGNvbXBsZXRlZFBlcmNlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25Qcm9ncmVzcyhjb21wbGV0ZWRQZXJjZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICBJTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICBSZWNvZ25pdGlvblNlcnZpY2UudGhpcy5vblRyaWdnZXJNb2RlbERvd25sb2FkKGludGVudCwgYXR0cmlidXRpb25Tb3VyY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUmVjb2duaXRpb25TZXJ2aWNlLnRoaXMub25UcmlnZ2VyTW9kZWxEb3dubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LAorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IE1vZGVsRG93bmxvYWRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzcyhpbnQgY29tcGxldGVkUGVyY2VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uUHJvZ3Jlc3MoY29tcGxldGVkUGVyY2VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uU3VjY2VzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblN1Y2Nlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2NoZWR1bGVkKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblNjaGVkdWxlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2NoZWR1bGVkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uU2NoZWR1bGVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKGludCBlcnJvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkVycm9yKGVycm9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKGludCBlcnJvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uRXJyb3IoZXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGUucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hDbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgICAgIEludGVudCBpbnRlbnQsIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKSB7Ci0gICAgICAgIFJlY29nbml0aW9uU2VydmljZS50aGlzLmNsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKGludGVudCwgYXR0cmlidXRpb25Tb3VyY2UpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXJ0TGlzdGVuaW5nQXJncyB7CkBAIC0zMjMsMTcgKzMwMCwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9kZWxEb3dubG9hZExpc3RlbmVyQXJncyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9kZWxEb3dubG9hZEFyZ3MgewogICAgICAgICBmaW5hbCBJbnRlbnQgbUludGVudDsKLSAgICAgICAgZmluYWwgSU1vZGVsRG93bmxvYWRMaXN0ZW5lciBtTGlzdGVuZXI7CiAgICAgICAgIGZpbmFsIEF0dHJpYnV0aW9uU291cmNlIG1BdHRyaWJ1dGlvblNvdXJjZTsKKyAgICAgICAgQE51bGxhYmxlIGZpbmFsIElNb2RlbERvd25sb2FkTGlzdGVuZXIgbUxpc3RlbmVyOwogCi0gICAgICAgIHByaXZhdGUgTW9kZWxEb3dubG9hZExpc3RlbmVyQXJncyhJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgICAgIElNb2RlbERvd25sb2FkTGlzdGVuZXIgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHsKLSAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgIHByaXZhdGUgTW9kZWxEb3dubG9hZEFyZ3MoCisgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCwKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICBATnVsbGFibGUgSU1vZGVsRG93bmxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAgICAgdGhpcy5tSW50ZW50ID0gaW50ZW50OworICAgICAgICAgICAgdGhpcy5tQXR0cmlidXRpb25Tb3VyY2UgPSBhdHRyaWJ1dGlvblNvdXJjZTsKICAgICAgICAgICAgIHRoaXMubUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2UgPSBhdHRyaWJ1dGlvblNvdXJjZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDQzLDM4ICs0MjEsMzkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEge0BsaW5rIE1vZGVsRG93bmxvYWRMaXN0ZW5lcn0gdG8gcmVjZWl2ZSBwcm9ncmVzcyB1cGRhdGVzIGFmdGVyCi0gICAgICoge0BsaW5rICNvblRyaWdnZXJNb2RlbERvd25sb2FkfSBjYWxscy4KKyAgICAgKiBSZXF1ZXN0cyB0aGUgZG93bmxvYWQgb2YgdGhlIHJlY29nbml6ZXIgc3VwcG9ydCBmb3Ige0Bjb2RlIHJlY29nbml6ZXJJbnRlbnR9LgogICAgICAqCi0gICAgICogQHBhcmFtIHJlY29nbml6ZXJJbnRlbnQgdGhlIHJlcXVlc3QgdG8gbW9uaXRvciBtb2RlbCBkb3dubG9hZCBwcm9ncmVzcyBmb3IuCi0gICAgICogQHBhcmFtIG1vZGVsRG93bmxvYWRMaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8ga2VlcCB1cGRhdGVkLgorICAgICAqIDxwPiBQcm92aWRlcyB0aGUgY2FsbGluZyB7QGxpbmsgQXR0cmlidXRpb25Tb3VyY2V9IHRvIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHNvIHRoYXQKKyAgICAgKiBwZXJtaXNzaW9ucyBhbmQgYmFuZHdpZHRoIGNvdWxkIGJlIGNvcnJlY3RseSBibGFtZWQuCisgICAgICoKKyAgICAgKiA8cD4gQ2xpZW50IHdpbGwgcmVjZWl2ZSB0aGUgcHJvZ3Jlc3MgdXBkYXRlcyB2aWEgdGhlIGdpdmVuIHtAbGluayBNb2RlbERvd25sb2FkTGlzdGVuZXJ9OgorICAgICAqCisgICAgICogPGxpPiBJZiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBhdmFpbGFibGUsIHtAbGluayBNb2RlbERvd25sb2FkTGlzdGVuZXIjb25TdWNjZXNzKCl9IHdpbGwgYmUKKyAgICAgKiBjYWxsZWQgZGlyZWN0bHkuIFRoZSBtb2RlbCBjYW4gYmUgc2FmZWx5IHVzZWQgYWZ0ZXJ3YXJkcy4KKyAgICAgKgorICAgICAqIDxsaT4gSWYgdGhlIHtAbGluayBSZWNvZ25pdGlvblNlcnZpY2V9IGhhcyBzdGFydGVkIHRoZSBkb3dubG9hZCwKKyAgICAgKiB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyI29uUHJvZ3Jlc3MoaW50KX0gd2lsbCBiZSBjYWxsZWQgYW4gdW5zcGVjaWZpZWQgKHplcm8gb3IgbW9yZSkKKyAgICAgKiBudW1iZXIgb2YgdGltZXMgdW50aWwgdGhlIGRvd25sb2FkIGlzIGNvbXBsZXRlLgorICAgICAqIFdoZW4gdGhlIGRvd25sb2FkIGZpbmlzaGVzLCB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyI29uU3VjY2VzcygpfSB3aWxsIGJlIGNhbGxlZC4KKyAgICAgKiBUaGUgbW9kZWwgY2FuIGJlIHNhZmVseSB1c2VkIGFmdGVyd2FyZHMuCisgICAgICoKKyAgICAgKiA8bGk+IElmIHRoZSB7QGxpbmsgUmVjb2duaXRpb25TZXJ2aWNlfSBoYXMgb25seSBzY2hlZHVsZWQgdGhlIGRvd25sb2FkLCBidXQgd29uJ3Qgc2F0aXNmeSBpdAorICAgICAqIGltbWVkaWF0ZWx5LCB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyI29uU2NoZWR1bGVkKCl9IHdpbGwgYmUgY2FsbGVkLgorICAgICAqIFRoZXJlIHdpbGwgYmUgbm8gZnVydGhlciB1cGRhdGVzIG9uIHRoaXMgbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiA8bGk+IElmIHRoZSByZXF1ZXN0IGZhaWxzIGF0IGFueSB0aW1lIGR1ZSB0byBhIG5ldHdvcmsgb3Igc2NoZWR1bGluZyBlcnJvciwKKyAgICAgKiB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyI29uRXJyb3IoaW50KX0gd2lsbCBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjb2duaXplckludGVudCBjb250YWlucyBwYXJhbWV0ZXJzIGZvciB0aGUgcmVjb2duaXRpb24gdG8gYmUgcGVyZm9ybWVkLiBUaGUgaW50ZW50CisgICAgICogICAgICAgIG1heSBhbHNvIGNvbnRhaW4gb3B0aW9uYWwgZXh0cmFzLCBzZWUge0BsaW5rIFJlY29nbml6ZXJJbnRlbnR9LgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGlvblNvdXJjZSB0aGUgYXR0cmlidXRpb24gc291cmNlIG9mIHRoZSBjYWxsZXIuCisgICAgICogQHBhcmFtIGxpc3RlbmVyIG9uIHdoaWNoIHRvIHJlY2VpdmUgdXBkYXRlcyBhYm91dCB0aGUgbW9kZWwgZG93bmxvYWQgcmVxdWVzdC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCisgICAgcHVibGljIHZvaWQgb25UcmlnZ2VyTW9kZWxEb3dubG9hZCgKICAgICAgICAgICAgIEBOb25OdWxsIEludGVudCByZWNvZ25pemVySW50ZW50LAogICAgICAgICAgICAgQE5vbk51bGwgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICBATm9uTnVsbCBNb2RlbERvd25sb2FkTGlzdGVuZXIgbW9kZWxEb3dubG9hZExpc3RlbmVyKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgVGV4dFV0aWxzLmZvcm1hdFNpbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgIiNzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIgWyVzXSBbJXNdIiwKLSAgICAgICAgICAgICAgICAgICAgcmVjb2duaXplckludGVudCwKLSAgICAgICAgICAgICAgICAgICAgbW9kZWxEb3dubG9hZExpc3RlbmVyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbW9kZWxEb3dubG9hZExpc3RlbmVyLm9uRXJyb3IoU3BlZWNoUmVjb2duaXplci5FUlJPUl9DQU5OT1RfTElTVEVOX1RPX0RPV05MT0FEX0VWRU5UUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSB7QGxpbmsgTW9kZWxEb3dubG9hZExpc3RlbmVyfSBzZXQgdG8gcmVjZWl2ZSBwcm9ncmVzcyB1cGRhdGVzIGZvciB0aGUgZ2l2ZW4KLSAgICAgKiB7QGNvZGUgcmVjb2duaXplckludGVudH0sIGlmIGFueS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWNvZ25pemVySW50ZW50IHRoZSByZXF1ZXN0IHRvIG1vbml0b3IgbW9kZWwgZG93bmxvYWQgcHJvZ3Jlc3MgZm9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKAotICAgICAgICAgICAgQE5vbk51bGwgSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsCi0gICAgICAgICAgICBATm9uTnVsbCBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsIFRleHRVdGlscy5mb3JtYXRTaW1wbGUoCi0gICAgICAgICAgICAgICAgICAgICIjY2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIgWyVzXSIsIHJlY29nbml6ZXJJbnRlbnQpKTsKLSAgICAgICAgfQorICAgICAgICAgICAgQE5vbk51bGwgTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGxpc3RlbmVyLm9uRXJyb3IoU3BlZWNoUmVjb2duaXplci5FUlJPUl9DQU5OT1RfTElTVEVOX1RPX0RPV05MT0FEX0VWRU5UUyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC04MTUsNDEgKzc5NCwxOCBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyTW9kZWxEb3dubG9hZCgKLSAgICAgICAgICAgICAgICBJbnRlbnQgcmVjb2duaXplckludGVudCwgQE5vbk51bGwgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBJbnRlbnQgcmVjb2duaXplckludGVudCwKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICBJTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgICAgICBmaW5hbCBSZWNvZ25pdGlvblNlcnZpY2Ugc2VydmljZSA9IG1TZXJ2aWNlUmVmLmdldCgpOwogICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNlcnZpY2UubUhhbmRsZXIuc2VuZE1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tSGFuZGxlciwgTVNHX1RSSUdHRVJfTU9ERUxfRE9XTkxPQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKHJlY29nbml6ZXJJbnRlbnQsIGF0dHJpYnV0aW9uU291cmNlKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBJbnRlbnQgcmVjb2duaXplckludGVudCwKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSwKLSAgICAgICAgICAgICAgICBJTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGZpbmFsIFJlY29nbml0aW9uU2VydmljZSBzZXJ2aWNlID0gbVNlcnZpY2VSZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5tSGFuZGxlci5zZW5kTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKHNlcnZpY2UubUhhbmRsZXIsIE1TR19TRVRfTU9ERUxfRE9XTkxPQURfTElTVEVORVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb2RlbERvd25sb2FkTGlzdGVuZXJBcmdzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTW9kZWxEb3dubG9hZEFyZ3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2duaXplckludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICBJbnRlbnQgcmVjb2duaXplckludGVudCwKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBmaW5hbCBSZWNvZ25pdGlvblNlcnZpY2Ugc2VydmljZSA9IG1TZXJ2aWNlUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UubUhhbmRsZXIuc2VuZE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihzZXJ2aWNlLm1IYW5kbGVyLCBNU0dfQ0xFQVJfTU9ERUxfRE9XTkxPQURfTElTVEVORVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKHJlY29nbml6ZXJJbnRlbnQsIGF0dHJpYnV0aW9uU291cmNlKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvU3BlZWNoUmVjb2duaXplci5qYXZhCmluZGV4IDc2ZWIwOWUuLmRhY2IyNWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1NwZWVjaFJlY29nbml6ZXIuamF2YQpAQCAtMjk3LDggKzI5Nyw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfVEVNUE9SQVJZX09OX0RFVklDRV9DT01QT05FTlQgPSA1OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ0hFQ0tfUkVDT0dOSVRJT05fU1VQUE9SVCA9IDY7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UUklHR0VSX01PREVMX0RPV05MT0FEID0gNzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9NT0RFTF9ET1dOTE9BRF9MSVNURU5FUiA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DTEVBUl9NT0RFTF9ET1dOTE9BRF9MSVNURU5FUiA9IDk7CiAKICAgICAvKiogVGhlIGFjdHVhbCBSZWNvZ25pdGlvblNlcnZpY2UgZW5kcG9pbnQgKi8KICAgICBwcml2YXRlIElSZWNvZ25pdGlvblNlcnZpY2UgbVNlcnZpY2U7CkBAIC0zNDEsMTkgKzMzOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MubUludGVudCwgYXJncy5tQ2FsbGJhY2tFeGVjdXRvciwgYXJncy5tQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIE1TR19UUklHR0VSX01PREVMX0RPV05MT0FEOgotICAgICAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VyTW9kZWxEb3dubG9hZCgoSW50ZW50KSBtc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX01PREVMX0RPV05MT0FEX0xJU1RFTkVSOgogICAgICAgICAgICAgICAgICAgICBNb2RlbERvd25sb2FkTGlzdGVuZXJBcmdzIG1vZGVsRG93bmxvYWRMaXN0ZW5lckFyZ3MgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNb2RlbERvd25sb2FkTGlzdGVuZXJBcmdzKSBtc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJNb2RlbERvd25sb2FkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsRG93bmxvYWRMaXN0ZW5lckFyZ3MubUludGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbERvd25sb2FkTGlzdGVuZXJBcmdzLm1FeGVjdXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbERvd25sb2FkTGlzdGVuZXJBcmdzLm1Nb2RlbERvd25sb2FkTGlzdGVuZXIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19DTEVBUl9NT0RFTF9ET1dOTE9BRF9MSVNURU5FUjoKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIoKEludGVudCkgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKQEAgLTY1NywxNyArNjQ5LDEzIEBACiAgICAgICogdXNlciBpbnRlcmFjdGlvbiB0byBhcHByb3ZlIHRoZSBkb3dubG9hZC4gQ2FsbGVycyBjYW4gdmVyaWZ5IHRoZSBzdGF0dXMgb2YgdGhlIHJlcXVlc3QgdmlhCiAgICAgICoge0BsaW5rICNjaGVja1JlY29nbml0aW9uU3VwcG9ydChJbnRlbnQsIEV4ZWN1dG9yLCBSZWNvZ25pdGlvblN1cHBvcnRDYWxsYmFjayl9LgogICAgICAqCi0gICAgICogPHA+TGlzdGVuZXJzIHNldCB2aWEKLSAgICAgKiB7QGxpbmsgI3NldE1vZGVsRG93bmxvYWRMaXN0ZW5lcihJbnRlbnQsIEV4ZWN1dG9yLCBNb2RlbERvd25sb2FkTGlzdGVuZXIpfSB3aWxsIHJlY2VpdmUKLSAgICAgKiB1cGRhdGVzIGFib3V0IHRoaXMgZG93bmxvYWQgcmVxdWVzdC48L3A+Ci0gICAgICoKICAgICAgKiBAcGFyYW0gcmVjb2duaXplckludGVudCBjb250YWlucyBwYXJhbWV0ZXJzIGZvciB0aGUgcmVjb2duaXRpb24gdG8gYmUgcGVyZm9ybWVkLiBUaGUgaW50ZW50CiAgICAgICogICAgICAgIG1heSBhbHNvIGNvbnRhaW4gb3B0aW9uYWwgZXh0cmFzLCBzZWUge0BsaW5rIFJlY29nbml6ZXJJbnRlbnR9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRyaWdnZXJNb2RlbERvd25sb2FkKEBOb25OdWxsIEludGVudCByZWNvZ25pemVySW50ZW50KSB7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwocmVjb2duaXplckludGVudCwgImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7CiAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIFNsb2cuaShUQUcsICIjdHJpZ2dlck1vZGVsRG93bmxvYWQgY2FsbGVkIik7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAiI3RyaWdnZXJNb2RlbERvd25sb2FkIHdpdGhvdXQgYSBsaXN0ZW5lciBjYWxsZWQiKTsKICAgICAgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkNvbm5lY3Rpb24gaXMgbm90IGVzdGFibGlzaGVkIHlldCIpOwogICAgICAgICAgICAgfQpAQCAtNjc2LDIzICs2NjQsNDcgQEAKICAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgY29ubmVjdGlvbjogZmlyc3QgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiwgdGhlbiBkaXNwYXRjaC4KICAgICAgICAgICAgIGNvbm5lY3RUb1N5c3RlbVNlcnZpY2UoKTsKICAgICAgICAgfQotICAgICAgICBwdXRNZXNzYWdlKE1lc3NhZ2Uub2J0YWluKG1IYW5kbGVyLCBNU0dfVFJJR0dFUl9NT0RFTF9ET1dOTE9BRCwgcmVjb2duaXplckludGVudCkpOworICAgICAgICBwdXRNZXNzYWdlKE1lc3NhZ2Uub2J0YWluKAorICAgICAgICAgICAgICAgIG1IYW5kbGVyLCBNU0dfVFJJR0dFUl9NT0RFTF9ET1dOTE9BRCwKKyAgICAgICAgICAgICAgICBuZXcgTW9kZWxEb3dubG9hZExpc3RlbmVyQXJncyhyZWNvZ25pemVySW50ZW50LCBudWxsLCBudWxsKSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byBtb2RlbCBkb3dubG9hZCB1cGRhdGVzLiBDbGllbnRzIHdpbGwgaGF2ZSB0byBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZQotICAgICAqIHtAbGluayAjdHJpZ2dlck1vZGVsRG93bmxvYWQoSW50ZW50KX0uCisgICAgICogQXR0ZW1wdHMgdG8gZG93bmxvYWQgdGhlIHN1cHBvcnQgZm9yIHRoZSBnaXZlbiB7QGNvZGUgcmVjb2duaXplckludGVudH0uIFRoaXMgbWlnaHQgdHJpZ2dlcgorICAgICAqIHVzZXIgaW50ZXJhY3Rpb24gdG8gYXBwcm92ZSB0aGUgZG93bmxvYWQuIENhbGxlcnMgY2FuIHZlcmlmeSB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0IHZpYQorICAgICAqIHtAbGluayAjY2hlY2tSZWNvZ25pdGlvblN1cHBvcnQoSW50ZW50LCBFeGVjdXRvciwgUmVjb2duaXRpb25TdXBwb3J0Q2FsbGJhY2spfS4KICAgICAgKgotICAgICAqIEBwYXJhbSByZWNvZ25pemVySW50ZW50IHRoZSByZXF1ZXN0IHRvIG1vbml0b3Igc3VwcG9ydCBmb3IuCisgICAgICogPHA+IFRoZSB1cGRhdGVzIGFib3V0IHRoZSBtb2RlbCBkb3dubG9hZCByZXF1ZXN0IGFyZSByZWNlaXZlZCB2aWEgdGhlIGdpdmVuCisgICAgICoge0BsaW5rIE1vZGVsRG93bmxvYWRMaXN0ZW5lcn06CisgICAgICoKKyAgICAgKiA8bGk+IElmIHRoZSBtb2RlbCBpcyBhbHJlYWR5IGF2YWlsYWJsZSwge0BsaW5rIE1vZGVsRG93bmxvYWRMaXN0ZW5lciNvblN1Y2Nlc3MoKX0gd2lsbCBiZQorICAgICAqIGNhbGxlZCBkaXJlY3RseS4gVGhlIG1vZGVsIGNhbiBiZSBzYWZlbHkgdXNlZCBhZnRlcndhcmRzLgorICAgICAqCisgICAgICogPGxpPiBJZiB0aGUge0BsaW5rIFJlY29nbml0aW9uU2VydmljZX0gaGFzIHN0YXJ0ZWQgdGhlIGRvd25sb2FkLAorICAgICAqIHtAbGluayBNb2RlbERvd25sb2FkTGlzdGVuZXIjb25Qcm9ncmVzcyhpbnQpfSB3aWxsIGJlIGNhbGxlZCBhbiB1bnNwZWNpZmllZCAoemVybyBvciBtb3JlKQorICAgICAqIG51bWJlciBvZiB0aW1lcyB1bnRpbCB0aGUgZG93bmxvYWQgaXMgY29tcGxldGUuCisgICAgICogV2hlbiB0aGUgZG93bmxvYWQgZmluaXNoZXMsIHtAbGluayBNb2RlbERvd25sb2FkTGlzdGVuZXIjb25TdWNjZXNzKCl9IHdpbGwgYmUgY2FsbGVkLgorICAgICAqIFRoZSBtb2RlbCBjYW4gYmUgc2FmZWx5IHVzZWQgYWZ0ZXJ3YXJkcy4KKyAgICAgKgorICAgICAqIDxsaT4gSWYgdGhlIHtAbGluayBSZWNvZ25pdGlvblNlcnZpY2V9IGhhcyBvbmx5IHNjaGVkdWxlZCB0aGUgZG93bmxvYWQsIGJ1dCB3b24ndCBzYXRpc2Z5IGl0CisgICAgICogaW1tZWRpYXRlbHksIHtAbGluayBNb2RlbERvd25sb2FkTGlzdGVuZXIjb25TY2hlZHVsZWQoKX0gd2lsbCBiZSBjYWxsZWQuCisgICAgICogVGhlcmUgd2lsbCBiZSBubyBmdXJ0aGVyIHVwZGF0ZXMgb24gdGhpcyBsaXN0ZW5lci4KKyAgICAgKgorICAgICAqIDxsaT4gSWYgdGhlIHJlcXVlc3QgZmFpbHMgYXQgYW55IHRpbWUgZHVlIHRvIGEgbmV0d29yayBvciBzY2hlZHVsaW5nIGVycm9yLAorICAgICAqIHtAbGluayBNb2RlbERvd25sb2FkTGlzdGVuZXIjb25FcnJvcihpbnQpfSB3aWxsIGJlIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNvZ25pemVySW50ZW50IGNvbnRhaW5zIHBhcmFtZXRlcnMgZm9yIHRoZSByZWNvZ25pdGlvbiB0byBiZSBwZXJmb3JtZWQuIFRoZSBpbnRlbnQKKyAgICAgKiAgICAgICAgbWF5IGFsc28gY29udGFpbiBvcHRpb25hbCBleHRyYXMsIHNlZSB7QGxpbmsgUmVjb2duaXplckludGVudH0uCisgICAgICogQHBhcmFtIGV4ZWN1dG9yIGZvciBkaXNwYXRjaGluZyBsaXN0ZW5lciBjYWxsYmFja3MKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIgb24gd2hpY2ggdG8gcmVjZWl2ZSB1cGRhdGVzIGFib3V0IHRoZSBtb2RlbCBkb3dubG9hZCByZXF1ZXN0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1vZGVsRG93bmxvYWRMaXN0ZW5lcigKKyAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyTW9kZWxEb3dubG9hZCgKICAgICAgICAgICAgIEBOb25OdWxsIEludGVudCByZWNvZ25pemVySW50ZW50LAogICAgICAgICAgICAgQE5vbk51bGwgQENhbGxiYWNrRXhlY3V0b3IgRXhlY3V0b3IgZXhlY3V0b3IsCiAgICAgICAgICAgICBATm9uTnVsbCBNb2RlbERvd25sb2FkTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChyZWNvZ25pemVySW50ZW50LCAiaW50ZW50IG11c3Qgbm90IGJlIG51bGwiKTsKICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgU2xvZy5pKFRBRywgIiNzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIgY2FsbGVkIik7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAiI3RyaWdnZXJNb2RlbERvd25sb2FkIHdpdGggYSBsaXN0ZW5lciBjYWxsZWQiKTsKICAgICAgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkNvbm5lY3Rpb24gaXMgbm90IGVzdGFibGlzaGVkIHlldCIpOwogICAgICAgICAgICAgfQpAQCAtNzAyLDMyICs3MTQsMTEgQEAKICAgICAgICAgICAgIGNvbm5lY3RUb1N5c3RlbVNlcnZpY2UoKTsKICAgICAgICAgfQogICAgICAgICBwdXRNZXNzYWdlKE1lc3NhZ2Uub2J0YWluKAotICAgICAgICAgICAgICAgIG1IYW5kbGVyLCBNU0dfU0VUX01PREVMX0RPV05MT0FEX0xJU1RFTkVSLAorICAgICAgICAgICAgICAgIG1IYW5kbGVyLCBNU0dfVFJJR0dFUl9NT0RFTF9ET1dOTE9BRCwKICAgICAgICAgICAgICAgICBuZXcgTW9kZWxEb3dubG9hZExpc3RlbmVyQXJncyhyZWNvZ25pemVySW50ZW50LCBleGVjdXRvciwgbGlzdGVuZXIpKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBsaXN0ZW5lciBmb3IgbW9kZWwgZG93bmxvYWQgdXBkYXRlcyBpZiBhbnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVjb2duaXplckludGVudCB0aGUgcmVxdWVzdCB0byBtb25pdG9yIHN1cHBvcnQgZm9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKEBOb25OdWxsIEludGVudCByZWNvZ25pemVySW50ZW50KSB7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwocmVjb2duaXplckludGVudCwgImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIFNsb2cuaShUQUcsICIjY2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIgY2FsbGVkIik7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJDb25uZWN0aW9uIGlzIG5vdCBlc3RhYmxpc2hlZCB5ZXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBjb25uZWN0aW9uOiBmaXJzdCBlc3RhYmxpc2ggYSBjb25uZWN0aW9uLCB0aGVuIGRpc3BhdGNoLgotICAgICAgICAgICAgY29ubmVjdFRvU3lzdGVtU2VydmljZSgpOwotICAgICAgICB9Ci0gICAgICAgIHB1dE1lc3NhZ2UoTWVzc2FnZS5vYnRhaW4oCi0gICAgICAgICAgICAgICAgbUhhbmRsZXIsIE1TR19DTEVBUl9NT0RFTF9ET1dOTE9BRF9MSVNURU5FUiwgcmVjb2duaXplckludGVudCkpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFNldHMgYSB0ZW1wb3JhcnkgY29tcG9uZW50IHRvIHBvd2VyIG9uLWRldmljZSBzcGVlY2ggcmVjb2duaXplci4KICAgICAgKgogICAgICAqIDxwPlRoaXMgaXMgb25seSBleHBlY3RlZCB0byBiZSBjYWxsZWQgaW4gdGVzdHMsIHN5c3RlbSB3b3VsZCByZWplY3QgY2FsbHMgZnJvbSBjbGllbnQgYXBwcy4KQEAgLTgzNiw1MSArODI3LDM2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlVHJpZ2dlck1vZGVsRG93bmxvYWQoSW50ZW50IHJlY29nbml6ZXJJbnRlbnQpIHsKLSAgICAgICAgaWYgKCFtYXliZUluaXRpYWxpemVNYW5hZ2VyU2VydmljZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1TZXJ2aWNlLnRyaWdnZXJNb2RlbERvd25sb2FkKHJlY29nbml6ZXJJbnRlbnQsIG1Db250ZXh0LmdldEF0dHJpYnV0aW9uU291cmNlKCkpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiZG93bmxvYWRNb2RlbCgpIGZhaWxlZCIsIGUpOwotICAgICAgICAgICAgbUxpc3RlbmVyLm9uRXJyb3IoRVJST1JfQ0xJRU5UKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRyaWdnZXJNb2RlbERvd25sb2FkKAogICAgICAgICAgICAgSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsCi0gICAgICAgICAgICBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLAorICAgICAgICAgICAgQE51bGxhYmxlIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsCiAgICAgICAgICAgICBATnVsbGFibGUgTW9kZWxEb3dubG9hZExpc3RlbmVyIG1vZGVsRG93bmxvYWRMaXN0ZW5lcikgewogICAgICAgICBpZiAoIW1heWJlSW5pdGlhbGl6ZU1hbmFnZXJTZXJ2aWNlKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW50ZXJuYWxNb2RlbERvd25sb2FkTGlzdGVuZXIgbGlzdGVuZXIgPQotICAgICAgICAgICAgICAgICAgICBtb2RlbERvd25sb2FkTGlzdGVuZXIgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IEludGVybmFsTW9kZWxEb3dubG9hZExpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsRG93bmxvYWRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtU2VydmljZS5zZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgIHJlY29nbml6ZXJJbnRlbnQsIG1Db250ZXh0LmdldEF0dHJpYnV0aW9uU291cmNlKCksIGxpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldE1vZGVsRG93bmxvYWRMaXN0ZW5lcigpIik7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoKSBmYWlsZWQiLCBlKTsKLSAgICAgICAgICAgIGNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBtb2RlbERvd25sb2FkTGlzdGVuZXIub25FcnJvcihFUlJPUl9DTElFTlQpKTsKLSAgICAgICAgfQotICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcihJbnRlbnQgcmVjb2duaXplckludGVudCkgewotICAgICAgICBpZiAoIW1heWJlSW5pdGlhbGl6ZU1hbmFnZXJTZXJ2aWNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gVHJpZ2dlciBtb2RlbCBkb3dubG9hZCB3aXRob3V0IGEgbGlzdGVuZXIuCisgICAgICAgIGlmIChtb2RlbERvd25sb2FkTGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS50cmlnZ2VyTW9kZWxEb3dubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY29nbml6ZXJJbnRlbnQsIG1Db250ZXh0LmdldEF0dHJpYnV0aW9uU291cmNlKCksIG51bGwpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInRyaWdnZXJNb2RlbERvd25sb2FkKCkgd2l0aG91dCBhIGxpc3RlbmVyIik7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInRyaWdnZXJNb2RlbERvd25sb2FkKCkgd2l0aG91dCBhIGxpc3RlbmVyIGZhaWxlZCIsIGUpOworICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkVycm9yKEVSUk9SX0NMSUVOVCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1TZXJ2aWNlLmNsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICByZWNvZ25pemVySW50ZW50LCBtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpKTsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImNsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKCkiKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImNsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKCkgZmFpbGVkIiwgZSk7CisgICAgICAgIC8vIFRyaWdnZXIgbW9kZWwgZG93bmxvYWQgd2l0aCBhIGxpc3RlbmVyLgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2UudHJpZ2dlck1vZGVsRG93bmxvYWQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWNvZ25pemVySW50ZW50LCBtQ29udGV4dC5nZXRBdHRyaWJ1dGlvblNvdXJjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVybmFsTW9kZWxEb3dubG9hZExpc3RlbmVyKGNhbGxiYWNrRXhlY3V0b3IsIG1vZGVsRG93bmxvYWRMaXN0ZW5lcikpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInRyaWdnZXJNb2RlbERvd25sb2FkKCkgd2l0aCBhIGxpc3RlbmVyIik7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInRyaWdnZXJNb2RlbERvd25sb2FkKCkgd2l0aCBhIGxpc3RlbmVyIGZhaWxlZCIsIGUpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBtb2RlbERvd25sb2FkTGlzdGVuZXIub25FcnJvcihFUlJPUl9DTElFTlQpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0RmxhZ3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dEZsYWdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxMWUzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dEZsYWdzLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCisvKioKKyAqIEZsYWdzIGluIHRoZSAidGV4dCIgbmFtZXNwYWNlLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUZXh0RmxhZ3MgeworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgc3BhY2Ugb2YgdGhlICJ0ZXh0IiBmZWF0dXJlLgorICAgICAqCisgICAgICogVGhpcyBuZWVkcyB0byBtb3ZlIHRvIERldmljZUNvbmZpZyBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0UgPSAidGV4dCI7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHdlIHVzZSB0aGUgbmV3IGRlc2lnbiBvZiBjb250ZXh0IG1lbnUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX05FV19DT05URVhUX01FTlUgPQorICAgICAgICAgICAgIlRleHRFZGl0aW5nX19lbmFibGVfbmV3X2NvbnRleHRfbWVudSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUga2V5IG5hbWUgdXNlZCBpbiBhcHAgY29yZSBzZXR0aW5ncyBmb3Ige0BsaW5rICNFTkFCTEVfTkVXX0NPTlRFWFRfTUVOVX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRV9ORVdfQ09OVEVYVF9NRU5VID0gInRleHRfX2VuYWJsZV9uZXdfY29udGV4dF9tZW51IjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBmbGFnIHtAbGluayAjRU5BQkxFX05FV19DT05URVhUX01FTlV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVfTkVXX0NPTlRFWFRfTUVOVV9ERUZBVUxUID0gZmFsc2U7CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1F3ZXJ0eUtleUxpc3RlbmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Rd2VydHlLZXlMaXN0ZW5lci5qYXZhCmluZGV4IGI0YTFlOGMuLmM0Mzg2NGQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1F3ZXJ0eUtleUxpc3RlbmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvUXdlcnR5S2V5TGlzdGVuZXIuamF2YQpAQCAtMzYyLDYgKzM2MiwxNSBAQAogCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0VTQ0FQRSAmJiBldmVudC5oYXNOb01vZGlmaWVycygpKSB7CisgICAgICAgICAgICAvLyBJZiB1c2VyIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbXBvc2luZyB3aXRoIGEgZGVhZCBrZXksIGFuZAorICAgICAgICAgICAgLy8gcHJlc3NlcyBFc2NhcGUsIGNhbmNlbCBpdC4gV2UgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGJlY2F1c2UKKyAgICAgICAgICAgIC8vIHRoZSBFc2NhcGUga2V5IHdpbGwgbm90IHByb2R1Y2UgYSBVbmljb2RlIGNoYXJhY3RlcgorICAgICAgICAgICAgaWYgKGFjdGl2ZVN0YXJ0ID09IHNlbFN0YXJ0ICYmIGFjdGl2ZUVuZCA9PSBzZWxFbmQpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGNvbnRlbnQsIHNlbEVuZCk7CisgICAgICAgICAgICAgICAgY29udGVudC5yZW1vdmVTcGFuKFRleHRLZXlMaXN0ZW5lci5BQ1RJVkUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bih2aWV3LCBjb250ZW50LCBrZXlDb2RlLCBldmVudCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZlYXR1cmVGbGFnVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmVhdHVyZUZsYWdVdGlscy5qYXZhCmluZGV4IDJhZTg4MmMuLjYyMDFiM2EgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmVhdHVyZUZsYWdVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmVhdHVyZUZsYWdVdGlscy5qYXZhCkBAIC0yMjAsOSArMjIwLDkgQEAKICAgICAgICAgREVGQVVMVF9GTEFHUy5wdXQoU0VUVElOR1NfQVBQX0FMTE9XX0RBUktfVEhFTUVfQUNUSVZBVElPTl9BVF9CRURUSU1FLCAidHJ1ZSIpOwogICAgICAgICBERUZBVUxUX0ZMQUdTLnB1dChTRVRUSU5HU19ORUVEX0NPTk5FQ1RFRF9CTEVfREVWSUNFX0ZPUl9CUk9BRENBU1QsICJ0cnVlIik7CiAgICAgICAgIERFRkFVTFRfRkxBR1MucHV0KFNFVFRJTkdTX0FVVE9fVEVYVF9XUkFQUElORywgImZhbHNlIik7Ci0gICAgICAgIERFRkFVTFRfRkxBR1MucHV0KFNFVFRJTkdTX05FV19LRVlCT0FSRF9VSSwgImZhbHNlIik7Ci0gICAgICAgIERFRkFVTFRfRkxBR1MucHV0KFNFVFRJTkdTX05FV19LRVlCT0FSRF9NT0RJRklFUl9LRVksICJmYWxzZSIpOwotICAgICAgICBERUZBVUxUX0ZMQUdTLnB1dChTRVRUSU5HU19ORVdfS0VZQk9BUkRfVFJBQ0tQQUQsICJmYWxzZSIpOworICAgICAgICBERUZBVUxUX0ZMQUdTLnB1dChTRVRUSU5HU19ORVdfS0VZQk9BUkRfVUksICJ0cnVlIik7CisgICAgICAgIERFRkFVTFRfRkxBR1MucHV0KFNFVFRJTkdTX05FV19LRVlCT0FSRF9NT0RJRklFUl9LRVksICJ0cnVlIik7CisgICAgICAgIERFRkFVTFRfRkxBR1MucHV0KFNFVFRJTkdTX05FV19LRVlCT0FSRF9UUkFDS1BBRCwgInRydWUiKTsKICAgICAgICAgREVGQVVMVF9GTEFHUy5wdXQoU0VUVElOR1NfTkVXX0tFWUJPQVJEX1RSQUNLUEFEX0dFU1RVUkUsICJmYWxzZSIpOwogICAgICAgICBERUZBVUxUX0ZMQUdTLnB1dChTRVRUSU5HU19FTkFCTEVfU1BBLCAidHJ1ZSIpOwogICAgICAgICBERUZBVUxUX0ZMQUdTLnB1dChTRVRUSU5HU19FTkFCTEVfU1BBX1BIQVNFMiwgImZhbHNlIik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Nob3Jlb2dyYXBoZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQ2hvcmVvZ3JhcGhlci5qYXZhCmluZGV4IDhjNGU5MGMuLmM5MmIxYjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQ2hvcmVvZ3JhcGhlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQ2hvcmVvZ3JhcGhlci5qYXZhCkBAIC0xOTUsNyArMTk1LDcgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtRGVidWdQcmludE5leHRGcmFtZVRpbWVEZWx0YTsKICAgICBwcml2YXRlIGludCBtRlBTRGl2aXNvciA9IDE7Ci0gICAgcHJpdmF0ZSBEaXNwbGF5RXZlbnRSZWNlaXZlci5Wc3luY0V2ZW50RGF0YSBtTGFzdFZzeW5jRXZlbnREYXRhID0KKyAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlFdmVudFJlY2VpdmVyLlZzeW5jRXZlbnREYXRhIG1MYXN0VnN5bmNFdmVudERhdGEgPQogICAgICAgICAgICAgbmV3IERpc3BsYXlFdmVudFJlY2VpdmVyLlZzeW5jRXZlbnREYXRhKCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBGcmFtZURhdGEgbUZyYW1lRGF0YSA9IG5ldyBGcmFtZURhdGEoKTsKIApAQCAtODU3LDcgKzg1Nyw3IEBACiAgICAgICAgICAgICAgICAgbUZyYW1lU2NoZWR1bGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbUxhc3RGcmFtZVRpbWVOYW5vcyA9IGZyYW1lVGltZU5hbm9zOwogICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVJbnRlcnZhbE5hbm9zID0gZnJhbWVJbnRlcnZhbE5hbm9zOwotICAgICAgICAgICAgICAgIG1MYXN0VnN5bmNFdmVudERhdGEgPSB2c3luY0V2ZW50RGF0YTsKKyAgICAgICAgICAgICAgICBtTGFzdFZzeW5jRXZlbnREYXRhLmNvcHlGcm9tKHZzeW5jRXZlbnREYXRhKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQW5pbWF0aW9uVXRpbHMubG9ja0FuaW1hdGlvbkNsb2NrKGZyYW1lVGltZU5hbm9zIC8gVGltZVV0aWxzLk5BTk9TX1BFUl9NUyk7CkBAIC0xMjQ3LDcgKzEyNDcsNyBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVQZW5kaW5nVnN5bmM7CiAgICAgICAgIHByaXZhdGUgbG9uZyBtVGltZXN0YW1wTmFub3M7CiAgICAgICAgIHByaXZhdGUgaW50IG1GcmFtZTsKLSAgICAgICAgcHJpdmF0ZSBWc3luY0V2ZW50RGF0YSBtTGFzdFZzeW5jRXZlbnREYXRhID0gbmV3IFZzeW5jRXZlbnREYXRhKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgVnN5bmNFdmVudERhdGEgbUxhc3RWc3luY0V2ZW50RGF0YSA9IG5ldyBWc3luY0V2ZW50RGF0YSgpOwogCiAgICAgICAgIEZyYW1lRGlzcGxheUV2ZW50UmVjZWl2ZXIoTG9vcGVyIGxvb3BlciwgaW50IHZzeW5jU291cmNlLCBsb25nIGxheWVySGFuZGxlKSB7CiAgICAgICAgICAgICBzdXBlcihsb29wZXIsIHZzeW5jU291cmNlLCAvKiBldmVudFJlZ2lzdHJhdGlvbiAqLyAwLCBsYXllckhhbmRsZSk7CkBAIC0xMjg3LDcgKzEyODcsNyBAQAogCiAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE5hbm9zID0gdGltZXN0YW1wTmFub3M7CiAgICAgICAgICAgICAgICAgbUZyYW1lID0gZnJhbWU7Ci0gICAgICAgICAgICAgICAgbUxhc3RWc3luY0V2ZW50RGF0YSA9IHZzeW5jRXZlbnREYXRhOworICAgICAgICAgICAgICAgIG1MYXN0VnN5bmNFdmVudERhdGEuY29weUZyb20odnN5bmNFdmVudERhdGEpOwogICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIHRoaXMpOwogICAgICAgICAgICAgICAgIG1zZy5zZXRBc3luY2hyb25vdXModHJ1ZSk7CiAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobXNnLCB0aW1lc3RhbXBOYW5vcyAvIFRpbWVVdGlscy5OQU5PU19QRVJfTVMpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9EaXNwbGF5RXZlbnRSZWNlaXZlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9EaXNwbGF5RXZlbnRSZWNlaXZlci5qYXZhCmluZGV4IGI0Njc1ZTAuLjU0ZGIzNGUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRGlzcGxheUV2ZW50UmVjZWl2ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Rpc3BsYXlFdmVudFJlY2VpdmVyLmphdmEKQEAgLTE0Niw3ICsxNDYsMTIgQEAKICAgICAgICAgbU1lc3NhZ2VRdWV1ZSA9IG51bGw7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFZzeW5jRXZlbnREYXRhIHsKKyAgICAvKioKKyAgICAgKiBDbGFzcyB0byBjYXB0dXJlIGFsbCBpbnB1dHMgcmVxdWlyZWQgZm9yIHN5bmNpbmcgZXZlbnRzIGRhdGEuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVnN5bmNFdmVudERhdGEgewogICAgICAgICAvLyBUaGUgYW1vdW50IG9mIGZyYW1lIHRpbWVsaW5lIGNob2ljZXMuCiAgICAgICAgIC8vIE11c3QgYmUgaW4gc3luYyB3aXRoIFZzeW5jRXZlbnREYXRhOjprRnJhbWVUaW1lbGluZXNMZW5ndGggaW4KICAgICAgICAgLy8gZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvaW5jbHVkZS9ndWkvVnN5bmNFdmVudERhdGEuaC4gSWYgdGhleSBkbyBub3QgbWF0Y2gsIGEgcnVudGltZQpAQCAtMTY0LDYgKzE2OSwxMiBAQAogICAgICAgICAgICAgICAgIHRoaXMuZGVhZGxpbmUgPSBkZWFkbGluZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgdm9pZCBjb3B5RnJvbShGcmFtZVRpbWVsaW5lIG90aGVyKSB7CisgICAgICAgICAgICAgICAgdnN5bmNJZCA9IG90aGVyLnZzeW5jSWQ7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRQcmVzZW50YXRpb25UaW1lID0gb3RoZXIuZXhwZWN0ZWRQcmVzZW50YXRpb25UaW1lOworICAgICAgICAgICAgICAgIGRlYWRsaW5lID0gb3RoZXIuZGVhZGxpbmU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIFRoZSBmcmFtZSB0aW1lbGluZSB2c3luYyBpZCwgdXNlZCB0byBjb3JyZWxhdGUgYSBmcmFtZQogICAgICAgICAgICAgLy8gcHJvZHVjZWQgYnkgSFdVSSB3aXRoIHRoZSB0aW1lbGluZSBkYXRhIHN0b3JlZCBpbiBTdXJmYWNlIEZsaW5nZXIuCiAgICAgICAgICAgICBwdWJsaWMgbG9uZyB2c3luY0lkID0gRnJhbWVJbmZvLklOVkFMSURfVlNZTkNfSUQ7CkBAIC0yMDMsNiArMjE0LDE0IEBACiAgICAgICAgICAgICB0aGlzLmZyYW1lSW50ZXJ2YWwgPSBmcmFtZUludGVydmFsOwogICAgICAgICB9CiAKKyAgICAgICAgdm9pZCBjb3B5RnJvbShWc3luY0V2ZW50RGF0YSBvdGhlcikgeworICAgICAgICAgICAgcHJlZmVycmVkRnJhbWVUaW1lbGluZUluZGV4ID0gb3RoZXIucHJlZmVycmVkRnJhbWVUaW1lbGluZUluZGV4OworICAgICAgICAgICAgZnJhbWVJbnRlcnZhbCA9IG90aGVyLmZyYW1lSW50ZXJ2YWw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lVGltZWxpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZnJhbWVUaW1lbGluZXNbaV0uY29weUZyb20ob3RoZXIuZnJhbWVUaW1lbGluZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgcHVibGljIEZyYW1lVGltZWxpbmUgcHJlZmVycmVkRnJhbWVUaW1lbGluZSgpIHsKICAgICAgICAgICAgIHJldHVybiBmcmFtZVRpbWVsaW5lc1twcmVmZXJyZWRGcmFtZVRpbWVsaW5lSW5kZXhdOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhbmR3cml0aW5nSW5pdGlhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhbmR3cml0aW5nSW5pdGlhdG9yLmphdmEKaW5kZXggZDM4ZWYxZi4uNmI2MDQ0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYW5kd3JpdGluZ0luaXRpYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFuZHdyaXRpbmdJbml0aWF0b3IuamF2YQpAQCAtMTcwLDYgKzE3MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZEJlc3RDYW5kaWRhdGVWaWV3KG1TdGF0ZS5tU3R5bHVzRG93blgsIG1TdGF0ZS5tU3R5bHVzRG93blkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlVmlldyA9PSBnZXRDb25uZWN0ZWRWaWV3KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZVZpZXcuaGFzRm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Rm9jdXNXaXRob3V0UmV2ZWFsKGNhbmRpZGF0ZVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEhhbmR3cml0aW5nKGNhbmRpZGF0ZVZpZXcpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5kaWRhdGVWaWV3LmdldEhhbmR3cml0aW5nRGVsZWdhdG9yQ2FsbGJhY2soKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlbGVnYXRlUGFja2FnZU5hbWUgPQpAQCAtMTgxLDEzICsxODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlVmlldywgZGVsZWdhdGVQYWNrYWdlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlVmlldy5nZXRIYW5kd3JpdGluZ0RlbGVnYXRvckNhbGxiYWNrKCkucnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGVWaWV3LmdldFJldmVhbE9uRm9jdXNIaW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlVmlldy5zZXRSZXZlYWxPbkZvY3VzSGludChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVZpZXcucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVZpZXcuc2V0UmV2ZWFsT25Gb2N1c0hpbnQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlVmlldy5yZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEZvY3VzV2l0aG91dFJldmVhbChjYW5kaWRhdGVWaWV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTIwOCw2ICsyMDUsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBOb3RpZnkgSGFuZHdyaXRpbmdJbml0aWF0b3IgdGhhdCBhIGRlbGVnYXRlIHZpZXcgKHNlZSB7QGxpbmsgVmlldyNpc0hhbmR3cml0aW5nRGVsZWdhdGV9KQorICAgICAqIGdhaW5lZCBmb2N1cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRlbGVnYXRlVmlld0ZvY3VzZWQoQE5vbk51bGwgVmlldyB2aWV3KSB7CisgICAgICAgIGlmICh2aWV3ID09IGdldENvbm5lY3RlZFZpZXcoKSkgeworICAgICAgICAgICAgdHJ5QWNjZXB0U3R5bHVzSGFuZHdyaXRpbmdEZWxlZ2F0aW9uKHZpZXcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogTm90aWZ5IEhhbmR3cml0aW5nSW5pdGlhdG9yIHRoYXQgYSBuZXcgSW5wdXRDb25uZWN0aW9uIGlzIGNyZWF0ZWQuCiAgICAgICogVGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZCBzaG91bGQgZ3VhcmFudGVlIHRoYXQgZWFjaCBvbklucHV0Q29ubmVjdGlvbkNyZWF0ZWQgY2FsbAogICAgICAqIGlzIHBhaXJlZCB3aXRoIGEgb25JbnB1dENvbm5lY3Rpb25DbG9zZWQgY2FsbC4KQEAgLTM4MCw2ICszODcsMTYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVxdWVzdEZvY3VzV2l0aG91dFJldmVhbChWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKHZpZXcuZ2V0UmV2ZWFsT25Gb2N1c0hpbnQoKSkgeworICAgICAgICAgICAgdmlldy5zZXRSZXZlYWxPbkZvY3VzSGludChmYWxzZSk7CisgICAgICAgICAgICB2aWV3LnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgdmlldy5zZXRSZXZlYWxPbkZvY3VzSGludCh0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZpZXcucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBHaXZlbiB0aGUgbG9jYXRpb24gb2YgdGhlIHN0eWx1cyBldmVudCwgcmV0dXJuIHRoZSBiZXN0IGNhbmRpZGF0ZSB2aWV3IHRvIGluaXRpYWxpemUKICAgICAgKiBoYW5kd3JpdGluZyBtb2RlLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93U2Vzc2lvbi5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93U2Vzc2lvbi5haWRsCmluZGV4IDU4MTA2NDIuLjgzZGUyYTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvd1Nlc3Npb24uYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lXaW5kb3dTZXNzaW9uLmFpZGwKQEAgLTExMCwxNiArMTEwLDYgQEAKICAgICAgICAgICAgIGludCByZXF1ZXN0ZWRXaWR0aCwgaW50IHJlcXVlc3RlZEhlaWdodCwgaW50IHZpZXdWaXNpYmlsaXR5LCBpbnQgZmxhZ3MsIGludCBzZXEsCiAgICAgICAgICAgICBpbnQgbGFzdFN5bmNTZXFJZCk7CiAKLSAgICAvKgotICAgICAqIE5vdGlmeSB0aGUgd2luZG93IG1hbmFnZXIgdGhhdCBhbiBhcHBsaWNhdGlvbiBpcyByZWxhdW5jaGluZyBhbmQKLSAgICAgKiB3aW5kb3dzIHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgcmVwbGFjZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXBwVG9rZW4gVGhlIGFwcGxpY2F0aW9uCi0gICAgICogQHBhcmFtIGNoaWxkcmVuT25seSBXaGV0aGVyIHRvIG9ubHkgcHJlcGFyZSBjaGlsZCB3aW5kb3dzIGZvciByZXBsYWNlbWVudAotICAgICAqIChmb3IgZXhhbXBsZSB3aGVuIG1haW4gd2luZG93cyBhcmUgYmVpbmcgcmV1c2VkIHZpYSBwcmVzZXJ2YXRpb24pLgotICAgICAqLwotICAgIG9uZXdheSB2b2lkIHByZXBhcmVUb1JlcGxhY2VXaW5kb3dzKElCaW5kZXIgYXBwVG9rZW4sIGJvb2xlYW4gY2hpbGRyZW5Pbmx5KTsKLQogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhIGNsaWVudCB0byByZXBvcnQgdGhhdCBpdCByYW4gb3V0IG9mIGdyYXBoaWNzIG1lbW9yeS4KICAgICAgKi8KQEAgLTMwNCw3ICsyOTQsNyBAQAogICAgICogYW4gaW5wdXQgY2hhbm5lbCB3aGVyZSB0aGUgY2xpZW50IGNhbiByZWNlaXZlIGlucHV0LgogICAgICovCiAgICAgdm9pZCBncmFudElucHV0Q2hhbm5lbChpbnQgZGlzcGxheUlkLCBpbiBTdXJmYWNlQ29udHJvbCBzdXJmYWNlLCBpbiBJV2luZG93IHdpbmRvdywKLSAgICAgICAgICAgIGluIElCaW5kZXIgaG9zdElucHV0VG9rZW4sIGludCBmbGFncywgaW50IHByaXZhdGVGbGFncywgaW50IHR5cGUsCisgICAgICAgICAgICBpbiBJQmluZGVyIGhvc3RJbnB1dFRva2VuLCBpbnQgZmxhZ3MsIGludCBwcml2YXRlRmxhZ3MsIGludCBpbnB1dEZlYXR1cmVzLCBpbnQgdHlwZSwKICAgICAgICAgICAgIGluIElCaW5kZXIgd2luZG93VG9rZW4sIGluIElCaW5kZXIgZm9jdXNHcmFudFRva2VuLCBTdHJpbmcgaW5wdXRIYW5kbGVOYW1lLAogICAgICAgICAgICAgb3V0IElucHV0Q2hhbm5lbCBvdXRJbnB1dENoYW5uZWwpOwogCkBAIC0zMTIsNyArMzAyLDggQEAKICAgICAgKiBVcGRhdGUgdGhlIGZsYWdzIG9uIGFuIGlucHV0IGNoYW5uZWwgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBzdXJmYWNlLgogICAgICAqLwogICAgIG9uZXdheSB2b2lkIHVwZGF0ZUlucHV0Q2hhbm5lbChpbiBJQmluZGVyIGNoYW5uZWxUb2tlbiwgaW50IGRpc3BsYXlJZCwKLSAgICAgICAgICAgIGluIFN1cmZhY2VDb250cm9sIHN1cmZhY2UsIGludCBmbGFncywgaW50IHByaXZhdGVGbGFncywgaW4gUmVnaW9uIHJlZ2lvbik7CisgICAgICAgICAgICBpbiBTdXJmYWNlQ29udHJvbCBzdXJmYWNlLCBpbnQgZmxhZ3MsIGludCBwcml2YXRlRmxhZ3MsIGludCBpbnB1dEZlYXR1cmVzLAorICAgICAgICAgICAgaW4gUmVnaW9uIHJlZ2lvbik7CiAKICAgICAvKioKICAgICAgKiBUcmFuc2ZlciB3aW5kb3cgZm9jdXMgdG8gYW4gZW1iZWRkZWQgd2luZG93IGlmIHRoZSBjYWxsaW5nIHdpbmRvdyBoYXMgZm9jdXMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lucHV0RGV2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lucHV0RGV2aWNlLmphdmEKaW5kZXggNzIwZjU2OS4uOTIyNWNkOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JbnB1dERldmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSW5wdXREZXZpY2UuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSG9zdFVzaVZlcnNpb247CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dERldmljZUlkZW50aWZpZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXJHbG9iYWw7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5saWdodHMuTGlnaHRzTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmljdS51dGlsLlVMb2NhbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKQEAgLTc0Miw3ICs3NDMsNyBAQAogICAgICAqLwogICAgIEBOdWxsYWJsZQogICAgIHB1YmxpYyBzdGF0aWMgSW5wdXREZXZpY2UgZ2V0RGV2aWNlKGludCBpZCkgewotICAgICAgICByZXR1cm4gSW5wdXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2UoaWQpOworICAgICAgICByZXR1cm4gSW5wdXRNYW5hZ2VyR2xvYmFsLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2UoaWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzUwLDcgKzc1MSw3IEBACiAgICAgICogQHJldHVybiBUaGUgaW5wdXQgZGV2aWNlIGlkcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludFtdIGdldERldmljZUlkcygpIHsKLSAgICAgICAgcmV0dXJuIElucHV0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldElucHV0RGV2aWNlSWRzKCk7CisgICAgICAgIHJldHVybiBJbnB1dE1hbmFnZXJHbG9iYWwuZ2V0SW5zdGFuY2UoKS5nZXRJbnB1dERldmljZUlkcygpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Nb3Rpb25QcmVkaWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTW90aW9uUHJlZGljdG9yLmphdmEKaW5kZXggN2Q0NTJmOS4uMjdhZjMwMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Nb3Rpb25QcmVkaWN0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01vdGlvblByZWRpY3Rvci5qYXZhCkBAIC00OSwxNSArNDksMTcgQEAKIAogICAgIC8vIFBvaW50ZXIgdG8gdGhlIG5hdGl2ZSBvYmplY3QuCiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1QdHI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIC8vIERldmljZS1zcGVjaWZpYyBvdmVycmlkZSB0byBlbmFibGUvZGlzYWJsZSBtb3Rpb24gcHJlZGljdGlvbi4KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzUHJlZGljdGlvbkVuYWJsZWQ7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBuZXcgTW90aW9uUHJlZGljdG9yIGZvciB0aGUgcHJvdmlkZWQge0BsaW5rIENvbnRleHR9LgogICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcHJlZGljdGlvbnMKICAgICAgKi8KICAgICBwdWJsaWMgTW90aW9uUHJlZGljdG9yKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIGZpbmFsIGludCBvZmZzZXROYW5vcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEludGVnZXIoCisgICAgICAgIG1Jc1ByZWRpY3Rpb25FbmFibGVkID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfZW5hYmxlTW90aW9uUHJlZGljdGlvbik7CisgICAgICAgIGZpbmFsIGludCBvZmZzZXROYW5vcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX21vdGlvblByZWRpY3Rpb25PZmZzZXROYW5vcyk7CiAgICAgICAgIG1QdHIgPSBuYXRpdmVJbml0aWFsaXplKG9mZnNldE5hbm9zKTsKICAgICAgICAgUmVnaXN0cnlIb2xkZXIuUkVHSVNUUlkucmVnaXN0ZXJOYXRpdmVBbGxvY2F0aW9uKHRoaXMsIG1QdHIpOwpAQCAtNzMsNyArNzUsNyBAQAogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGluY29uc2lzdGVudCBNb3Rpb25FdmVudCBzdHJlYW0gaXMgc2VudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWNvcmQoQE5vbk51bGwgTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKCFpc1ByZWRpY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgaWYgKCFtSXNQcmVkaWN0aW9uRW5hYmxlZCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZVJlY29yZChtUHRyLCBldmVudCk7CkBAIC05NCwyMSArOTYsMTIgQEAKICAgICAgKi8KICAgICBATnVsbGFibGUKICAgICBwdWJsaWMgTW90aW9uRXZlbnQgcHJlZGljdChsb25nIHByZWRpY3Rpb25UaW1lTmFub3MpIHsKLSAgICAgICAgaWYgKCFpc1ByZWRpY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgaWYgKCFtSXNQcmVkaWN0aW9uRW5hYmxlZCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5hdGl2ZVByZWRpY3QobVB0ciwgcHJlZGljdGlvblRpbWVOYW5vcyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUHJlZGljdGlvbkVuYWJsZWQoKSB7Ci0gICAgICAgIC8vIERldmljZS1zcGVjaWZpYyBvdmVycmlkZQotICAgICAgICBpZiAoIW1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCi0gICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19lbmFibGVNb3Rpb25QcmVkaWN0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIENoZWNrIHdoZXRoZXIgYSBkZXZpY2Ugc3VwcG9ydHMgbW90aW9uIHByZWRpY3Rpb25zIGZvciBhIGdpdmVuIHNvdXJjZSB0eXBlLgogICAgICAqCkBAIC0xMjAsNyArMTEzLDcgQEAKICAgICAgKiBAc2VlIE1vdGlvbkV2ZW50I2dldFNvdXJjZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUHJlZGljdGlvbkF2YWlsYWJsZShpbnQgZGV2aWNlSWQsIGludCBzb3VyY2UpIHsKLSAgICAgICAgcmV0dXJuIGlzUHJlZGljdGlvbkVuYWJsZWQoKSAmJiBuYXRpdmVJc1ByZWRpY3Rpb25BdmFpbGFibGUobVB0ciwgZGV2aWNlSWQsIHNvdXJjZSk7CisgICAgICAgIHJldHVybiBtSXNQcmVkaWN0aW9uRW5hYmxlZCAmJiBuYXRpdmVJc1ByZWRpY3Rpb25BdmFpbGFibGUobVB0ciwgZGV2aWNlSWQsIHNvdXJjZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGxvbmcgbmF0aXZlSW5pdGlhbGl6ZShpbnQgb2Zmc2V0TmFub3MpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQppbmRleCA4MDBmYzk3Li5hZWMzNDg3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQpAQCAtODMyNCw2ICs4MzI0LDEzIEBACiAgICAgICAgICAgICBvbkZvY3VzTG9zdCgpOwogICAgICAgICB9IGVsc2UgaWYgKGhhc1dpbmRvd0ZvY3VzKCkpIHsKICAgICAgICAgICAgIG5vdGlmeUZvY3VzQ2hhbmdlVG9JbWVGb2N1c0NvbnRyb2xsZXIodHJ1ZSAvKiBoYXNGb2N1cyAqLyk7CisKKyAgICAgICAgICAgIGlmIChtSXNIYW5kd3JpdGluZ0RlbGVnYXRlKSB7CisgICAgICAgICAgICAgICAgVmlld1Jvb3RJbXBsIHZpZXdSb290ID0gZ2V0Vmlld1Jvb3RJbXBsKCk7CisgICAgICAgICAgICAgICAgaWYgKHZpZXdSb290ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlld1Jvb3QuZ2V0SGFuZHdyaXRpbmdJbml0aWF0b3IoKS5vbkRlbGVnYXRlVmlld0ZvY3VzZWQodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaW52YWxpZGF0ZSh0cnVlKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0NvbmZpZ3VyYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0NvbmZpZ3VyYXRpb24uamF2YQppbmRleCBjOTZkMjk4Li5kODA4MTlmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Q29uZmlndXJhdGlvbi5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSW5wdXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSW5wdXRNYW5hZ2VyR2xvYmFsOwogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CkBAIC0xMTg4LDcgKzExODksNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbnB1dERldmljZUluZm9WYWxpZChpbnQgaWQsIGludCBheGlzLCBpbnQgc291cmNlKSB7Ci0gICAgICAgIElucHV0RGV2aWNlIGRldmljZSA9IElucHV0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldElucHV0RGV2aWNlKGlkKTsKKyAgICAgICAgSW5wdXREZXZpY2UgZGV2aWNlID0gSW5wdXRNYW5hZ2VyR2xvYmFsLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2UoaWQpOwogICAgICAgICByZXR1cm4gZGV2aWNlICE9IG51bGwgJiYgZGV2aWNlLmdldE1vdGlvblJhbmdlKGF4aXMsIHNvdXJjZSkgIT0gbnVsbDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3RJbXBsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290SW1wbC5qYXZhCmluZGV4IDI0ZGNiNjkuLmZiMjVlN2E2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290SW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3RJbXBsLmphdmEKQEAgLTExNjI2LDcgKzExNjI2LDggQEAKIAogICAgICAgICBtTnVtUGF1c2VkRm9yU3luYysrOwogICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfUEFVU0VEX0ZPUl9TWU5DX1RJTUVPVVQpOwotICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfUEFVU0VEX0ZPUl9TWU5DX1RJTUVPVVQsIDEwMDApOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfUEFVU0VEX0ZPUl9TWU5DX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgMTAwMCAqIEJ1aWxkLkhXX1RJTUVPVVRfTVVMVElQTElFUik7CiAgICAgICAgIHJldHVybiBtQWN0aXZlU3VyZmFjZVN5bmNHcm91cDsKICAgICB9OwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCmluZGV4IDM1ZWQ4OGYuLmNkYTFmM2EgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCkBAIC04NjMsMTAgKzg2Myw4IEBACiAgICAgICogICAgIGFuZHJvaWQ6dmFsdWU9InRydWV8ZmFsc2UiLyZndDsKICAgICAgKiAmbHQ7L2FwcGxpY2F0aW9uJmd0OwogICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KLSAgICAvLyBUT0RPKGIvMjYzOTg0Mjg3KTogTWFrZSB0aGlzIHB1YmxpYyBBUEkuCisgICAgLy8gVE9ETyhiLzI2Mzk4NDI4Nyk6IEFkZCBDVFMgdGVzdHMuCiAgICAgU3RyaW5nIFBST1BFUlRZX0NPTVBBVF9JR05PUkVfUkVRVUVTVEVEX09SSUVOVEFUSU9OID0KICAgICAgICAgICAgICJhbmRyb2lkLndpbmRvdy5QUk9QRVJUWV9DT01QQVRfSUdOT1JFX1JFUVVFU1RFRF9PUklFTlRBVElPTiI7CiAKQEAgLTg5OSw4ICs4OTcsNiBAQAogICAgICAqICAgICBhbmRyb2lkOnZhbHVlPSJmYWxzZSIvJmd0OwogICAgICAqICZsdDsvYXBwbGljYXRpb24mZ3Q7CiAgICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIC8vIFRPRE8oYi8yNjM5ODQyODcpOiBNYWtlIHRoaXMgcHVibGljIEFQSS4KICAgICBTdHJpbmcgUFJPUEVSVFlfQ09NUEFUX0FMTE9XX1NBTkRCT1hJTkdfVklFV19CT1VORFNfQVBJUyA9CkBAIC05MzcsMTAgKzkzMyw4IEBACiAgICAgICogICAgIGFuZHJvaWQ6dmFsdWU9InRydWV8ZmFsc2UiLyZndDsKICAgICAgKiAmbHQ7L2FwcGxpY2F0aW9uJmd0OwogICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KLSAgICAvLyBUT0RPKGIvMjYzOTg0Mjg3KTogTWFrZSB0aGlzIHB1YmxpYyBBUEkuCisgICAgLy8gVE9ETyhiLzI2Mzk4NDI4Nyk6IEFkZCBDVFMgdGVzdHMuCiAgICAgU3RyaW5nIFBST1BFUlRZX0NPTVBBVF9FTkFCTEVfRkFLRV9GT0NVUyA9ICJhbmRyb2lkLndpbmRvdy5QUk9QRVJUWV9DT01QQVRfRU5BQkxFX0ZBS0VfRk9DVVMiOwogCiAgICAgLyoqCkBAIC05NzYsMTAgKzk3MCw4IEBACiAgICAgICogICAgIGFuZHJvaWQ6dmFsdWU9InRydWV8ZmFsc2UiLyZndDsKICAgICAgKiAmbHQ7L2FwcGxpY2F0aW9uJmd0OwogICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KLSAgICAvLyBUT0RPKGIvMjYzOTg0Mjg3KTogTWFrZSB0aGlzIHB1YmxpYyBBUEkuCisgICAgLy8gVE9ETyhiLzI2Mzk4NDI4Nyk6IEFkZCBDVFMgdGVzdHMuCiAgICAgU3RyaW5nIFBST1BFUlRZX0NBTUVSQV9DT01QQVRfQUxMT1dfRk9SQ0VfUk9UQVRJT04gPQogICAgICAgICAgICAgImFuZHJvaWQud2luZG93LlBST1BFUlRZX0NBTUVSQV9DT01QQVRfQUxMT1dfRk9SQ0VfUk9UQVRJT04iOwogCkBAIC0xMDIzLDEwICsxMDE1LDggQEAKICAgICAgKiAgICAgYW5kcm9pZDp2YWx1ZT0idHJ1ZXxmYWxzZSIvJmd0OwogICAgICAqICZsdDsvYXBwbGljYXRpb24mZ3Q7CiAgICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwotICAgIC8vIFRPRE8oYi8yNjM5ODQyODcpOiBNYWtlIHRoaXMgcHVibGljIEFQSS4KKyAgICAvLyBUT0RPKGIvMjYzOTg0Mjg3KTogQWRkIENUUyB0ZXN0cy4KICAgICBTdHJpbmcgUFJPUEVSVFlfQ0FNRVJBX0NPTVBBVF9BTExPV19SRUZSRVNIID0KICAgICAgICAgICAgICJhbmRyb2lkLndpbmRvdy5QUk9QRVJUWV9DQU1FUkFfQ09NUEFUX0FMTE9XX1JFRlJFU0giOwogCkBAIC0xMDczLDE3ICsxMDYzLDI4IEBACiAgICAgICogICAgIGFuZHJvaWQ6dmFsdWU9InRydWV8ZmFsc2UiLyZndDsKICAgICAgKiAmbHQ7L2FwcGxpY2F0aW9uJmd0OwogICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KLSAgICAvLyBUT0RPKGIvMjYzOTg0Mjg3KTogTWFrZSB0aGlzIHB1YmxpYyBBUEkuCisgICAgLy8gVE9ETyhiLzI2Mzk4NDI4Nyk6IEFkZCBDVFMgdGVzdHMuCiAgICAgU3RyaW5nIFBST1BFUlRZX0NBTUVSQV9DT01QQVRfRU5BQkxFX1JFRlJFU0hfVklBX1BBVVNFID0KICAgICAgICAgICAgICJhbmRyb2lkLndpbmRvdy5QUk9QRVJUWV9DQU1FUkFfQ09NUEFUX0VOQUJMRV9SRUZSRVNIX1ZJQV9QQVVTRSI7CiAKICAgICAvKioKICAgICAgKiBBcHBsaWNhdGlvbiBsZXZlbCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLlByb3BlcnR5IFBhY2thZ2VNYW5hZ2VyCiAgICAgICogLlByb3BlcnR5fSBmb3IgYW4gYXBwIHRvIGluZm9ybSB0aGUgc3lzdGVtIHRoYXQgdGhlIGFwcCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKLSAgICAgKiBjb21wYXRpYmlsaXR5IG92ZXJyaWRlIGZvciBvcmllbnRhdGlvbiBzZXQgYnkgdGhlIGRldmljZSBtYW51ZmFjdHVyZXIuCisgICAgICogY29tcGF0aWJpbGl0eSBvdmVycmlkZSBmb3Igb3JpZW50YXRpb24gc2V0IGJ5IHRoZSBkZXZpY2UgbWFudWZhY3R1cmVyLiBXaGVuIHRoZSBvcmllbnRhdGlvbgorICAgICAqIG92ZXJyaWRlIGlzIGFwcGxpZWQgaXQgY2FuOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5SZXBsYWNlIHRoZSBzcGVjaWZpYyBvcmllbnRhdGlvbiByZXF1ZXN0ZWQgYnkgdGhlIGFwcCB3aXRoIGFub3RoZXIgc2VsZWN0ZWQgYnkgdGhlCisgICAgICAgICAgICAgZGV2aWNlIG1hbnVmYWN0dXJlciwgZS5nLiByZXBsYWNlIHVuZGVmaW5lZCByZXF1ZXN0ZWQgYnkgdGhlIGFwcCB3aXRoIHBvcnRyYWl0LgorICAgICAqICAgPGxpPkFsd2F5cyB1c2UgYW4gb3JpZW50YXRpb24gc2VsZWN0ZWQgYnkgdGhlIGRldmljZSBtYW51ZmFjdHVyZXIuCisgICAgICogICA8bGk+RG8gb25lIG9mIHRoZSBhYm92ZSBidXQgb25seSB3aGVuIGNhbWVyYSBjb25uZWN0aW9uIGlzIG9wZW4uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgcHJvcGVydHkgaXMgZGlmZmVyZW50IGZyb20ge0BsaW5rIFBST1BFUlRZX0NPTVBBVF9JR05PUkVfUkVRVUVTVEVEX09SSUVOVEFUSU9OfQorICAgICAqICh3aGljaCBpcyB1c2VkIHRvIGF2b2lkIG9yaWVudGF0aW9uIGxvb3BzIGNhdXNlZCBieSB0aGUgaW5jb3JyZWN0IHVzZSBvZiB7QGxpbmsKKyAgICAgKiBhbmRyb2lkLmFwcC5BY3Rpdml0eSNzZXRSZXF1ZXN0ZWRPcmllbnRhdGlvbn0pIGJlY2F1c2UgdGhpcyBwcm9wZXJ0eSBvdmVycmlkZXMgdGhlIGFwcCB0byBhbgorICAgICAqIG9yaWVudGF0aW9uIHNlbGVjdGVkIGJ5IHRoZSBkZXZpY2UgbWFudWZhY3R1cmVyIHJhdGhlciB0aGFuIGlnbm9yaW5nIG9uZSBvZiBvcmllbnRhdGlvbgorICAgICAqIHJlcXVlc3RzIGNvbWluZyBmcm9tIHRoZSBhcHAgd2hpbGUgcmVzcGVjdGluZyB0aGUgcHJldmlvdXMgb25lLgogICAgICAqCiAgICAgICogPHA+V2l0aCB0aGlzIHByb3BlcnR5IHNldCB0byB7QGNvZGUgdHJ1ZX0gb3IgdW5zZXQsIGRldmljZSBtYW51ZmFjdHVyZXJzIGNhbiBvdmVycmlkZQogICAgICAqIG9yaWVudGF0aW9uIGZvciB0aGUgYXBwIHVzaW5nIHRoZWlyIGRpc2NyZXRpb24gdG8gaW1wcm92ZSBkaXNwbGF5IGNvbXBhdGliaWxpdHkuCkBAIC0xMDk5LDEwICsxMTAwLDggQEAKICAgICAgKiAgICAgYW5kcm9pZDp2YWx1ZT0idHJ1ZXxmYWxzZSIvJmd0OwogICAgICAqICZsdDsvYXBwbGljYXRpb24mZ3Q7CiAgICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwotICAgIC8vIFRPRE8oYi8yNjM5ODQyODcpOiBNYWtlIHRoaXMgcHVibGljIEFQSS4KKyAgICAvLyBUT0RPKGIvMjYzOTg0Mjg3KTogQWRkIENUUyB0ZXN0cy4KICAgICBTdHJpbmcgUFJPUEVSVFlfQ09NUEFUX0FMTE9XX09SSUVOVEFUSU9OX09WRVJSSURFID0KICAgICAgICAgICAgICJhbmRyb2lkLndpbmRvdy5QUk9QRVJUWV9DT01QQVRfQUxMT1dfT1JJRU5UQVRJT05fT1ZFUlJJREUiOwogCkBAIC0xMTQ0LDEwICsxMTQzLDggQEAKICAgICAgKiAgICAgYW5kcm9pZDp2YWx1ZT0idHJ1ZXxmYWxzZSIvJmd0OwogICAgICAqICZsdDsvYXBwbGljYXRpb24mZ3Q7CiAgICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwotICAgIC8vIFRPRE8oYi8yNjM5ODQyODcpOiBNYWtlIHRoaXMgcHVibGljIEFQSS4KKyAgICAvLyBUT0RPKGIvMjYzOTg0Mjg3KTogQWRkIENUUyB0ZXN0cy4KICAgICBTdHJpbmcgUFJPUEVSVFlfQ09NUEFUX0FMTE9XX0RJU1BMQVlfT1JJRU5UQVRJT05fT1ZFUlJJREUgPQogICAgICAgICAgICAgImFuZHJvaWQud2luZG93LlBST1BFUlRZX0NPTVBBVF9BTExPV19ESVNQTEFZX09SSUVOVEFUSU9OX09WRVJSSURFIjsKIApAQCAtMjgxNSw3ICsyODEyLDcgQEAKICAgICAgICAgICoKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19GT1JDRV9IQVJEV0FSRV9BQ0NFTEVSQVRFRCA9IDB4MDAwMDAwMDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19GT1JDRV9IQVJEV0FSRV9BQ0NFTEVSQVRFRCA9IDEgPDwgMTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQnkgZGVmYXVsdCwgd2FsbHBhcGVycyBhcmUgc2VudCBuZXcgb2Zmc2V0cyB3aGVuIHRoZSB3YWxscGFwZXIgaXMgc2Nyb2xsZWQuIFdhbGxwYXBlcnMKQEAgLTI4MjYsNyArMjgyMyw3IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfV0FOVFNfT0ZGU0VUX05PVElGSUNBVElPTlMgPSAweDAwMDAwMDA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfV0FOVFNfT0ZGU0VUX05PVElGSUNBVElPTlMgPSAxIDw8IDI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZW4gc2V0IHtAbGluayBMYXlvdXRQYXJhbXMjVFlQRV9BUFBMSUNBVElPTl9PVkVSTEFZfSB3aW5kb3dzIHdpbGwgc3RheSB2aXNpYmxlLCBldmVuIGlmCkBAIC0yODM1LDcgKzI4MzIsNyBAQAogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihwZXJtaXNzaW9uLlNZU1RFTV9BUFBMSUNBVElPTl9PVkVSTEFZKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfU1lTVEVNX0FQUExJQ0FUSU9OX09WRVJMQVkgPSAweDAwMDAwMDA4OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfU1lTVEVNX0FQUExJQ0FUSU9OX09WRVJMQVkgPSAxIDw8IDM7CiAKICAgICAgICAgLyoqIEluIGEgbXVsdGl1c2VyIHN5c3RlbSBpZiB0aGlzIGZsYWcgaXMgc2V0IGFuZCB0aGUgb3duZXIgaXMgYSBzeXN0ZW0gcHJvY2VzcyB0aGVuIHRoaXMKICAgICAgICAgICogd2luZG93IHdpbGwgYXBwZWFyIG9uIGFsbCB1c2VyIHNjcmVlbnMuIFRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHdpbmRvdwpAQCAtMjg0NSw3ICsyODQyLDcgQEAKICAgICAgICAgICoge0BoaWRlfSAqLwogICAgICAgICBAU3lzdGVtQXBpCiAgICAgICAgIEBSZXF1aXJlc1Blcm1pc3Npb24ocGVybWlzc2lvbi5JTlRFUk5BTF9TWVNURU1fV0lORE9XKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWVNURU1fRkxBR19TSE9XX0ZPUl9BTExfVVNFUlMgPSAweDAwMDAwMDEwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWVNURU1fRkxBR19TSE9XX0ZPUl9BTExfVVNFUlMgPSAxIDw8IDQ7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZsYWcgdG8gYWxsb3cgdGhpcyB3aW5kb3cgdG8gaGF2ZSB1bnJlc3RyaWN0ZWQgZ2VzdHVyZSBleGNsdXNpb24uCkBAIC0yODUzLDcgKzI4NTAsNyBAQAogICAgICAgICAgKiBAc2VlIFZpZXcjc2V0U3lzdGVtR2VzdHVyZUV4Y2x1c2lvblJlY3RzKExpc3QpCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfVU5SRVNUUklDVEVEX0dFU1RVUkVfRVhDTFVTSU9OID0gMHgwMDAwMDAyMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX1VOUkVTVFJJQ1RFRF9HRVNUVVJFX0VYQ0xVU0lPTiA9IDEgPDwgNTsKIAogICAgICAgICAvKioKICAgICAgICAgICogTmV2ZXIgYW5pbWF0ZSBwb3NpdGlvbiBjaGFuZ2VzIG9mIHRoZSB3aW5kb3cuCkBAIC0yODYyLDIwICsyODU5LDIwIEBACiAgICAgICAgICAqIHtAaGlkZX0KICAgICAgICAgICovCiAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19OT19NT1ZFX0FOSU1BVElPTiA9IDB4MDAwMDAwNDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19OT19NT1ZFX0FOSU1BVElPTiA9IDEgPDwgNjsKIAogICAgICAgICAvKiogV2luZG93IGZsYWc6IHNwZWNpYWwgZmxhZyB0byBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgd2luZG93IHRvIGJlCiAgICAgICAgICAqIG9yaWdpbmFsIHNpemUgKFszMjB4NDgwXSB4IGRlbnNpdHkpLiBVc2VkIHRvIGNyZWF0ZSB3aW5kb3cgZm9yIGFwcGxpY2F0aW9ucwogICAgICAgICAgKiBydW5uaW5nIHVuZGVyIGNvbXBhdGliaWxpdHkgbW9kZS4KICAgICAgICAgICoKICAgICAgICAgICoge0BoaWRlfSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfQ09NUEFUSUJMRV9XSU5ET1cgPSAweDAwMDAwMDgwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfQ09NUEFUSUJMRV9XSU5ET1cgPSAxIDw8IDc7CiAKICAgICAgICAgLyoqIFdpbmRvdyBmbGFnOiBhIHNwZWNpYWwgb3B0aW9uIGludGVuZGVkIGZvciBzeXN0ZW0gZGlhbG9ncy4gIFdoZW4KICAgICAgICAgICogdGhpcyBmbGFnIGlzIHNldCwgdGhlIHdpbmRvdyB3aWxsIGRlbWFuZCBmb2N1cyB1bmNvbmRpdGlvbmFsbHkgd2hlbgogICAgICAgICAgKiBpdCBpcyBjcmVhdGVkLgogICAgICAgICAgKiB7QGhpZGV9ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19TWVNURU1fRVJST1IgPSAweDAwMDAwMTAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfU1lTVEVNX0VSUk9SID0gMSA8PCA4OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHZpZXcgaGllcmFyY2h5IG9mIHRoZSB3aW5kb3cgY2FuIG9ubHkgYmUgbWVhc3VyZWQgd2hlbgpAQCAtMjg4NCwxNCArMjg4MSwxNCBAQAogICAgICAgICAgKiB2aWV3cy4gVGhpcyByZWR1Y2VzIHRoZSBjaGFuY2VzIHRvIHBlcmZvcm0gbWVhc3VyZS4KICAgICAgICAgICoge0BoaWRlfQogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX09QVElNSVpFX01FQVNVUkUgPSAweDAwMDAwMjAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfT1BUSU1JWkVfTUVBU1VSRSA9IDEgPDwgOTsKIAogICAgICAgICAvKioKICAgICAgICAgICogRmxhZyB0aGF0IHByZXZlbnRzIHRoZSB3YWxscGFwZXIgYmVoaW5kIHRoZSBjdXJyZW50IHdpbmRvdyBmcm9tIHJlY2VpdmluZyB0b3VjaCBldmVudHMuCiAgICAgICAgICAqCiAgICAgICAgICAqIHtAaGlkZX0KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19ESVNBQkxFX1dBTExQQVBFUl9UT1VDSF9FVkVOVFMgPSAweDAwMDAwODAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfRElTQUJMRV9XQUxMUEFQRVJfVE9VQ0hfRVZFTlRTID0gMSA8PCAxMDsKIAogICAgICAgICAvKioKICAgICAgICAgICogRmxhZyB0byBmb3JjZSB0aGUgc3RhdHVzIGJhciB3aW5kb3cgdG8gYmUgdmlzaWJsZSBhbGwgdGhlIHRpbWUuIElmIHRoZSBiYXIgaXMgaGlkZGVuIHdoZW4KQEAgLTI5MDAsNyArMjg5Nyw3IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIHtAaGlkZX0KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19GT1JDRV9TSE9XX1NUQVRVU19CQVIgPSAweDAwMDAxMDAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfRk9SQ0VfU0hPV19TVEFUVVNfQkFSID0gMSA8PCAxMTsKIAogICAgICAgICAvKioKICAgICAgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3aW5kb3cgZnJhbWUgc2hvdWxkIGJlIHRoZSByZXF1ZXN0ZWQgZnJhbWUgYWRkaW5nIHRoZSBkaXNwbGF5CkBAIC0yOTEwLDcgKzI5MDcsNyBAQAogICAgICAgICAgKgogICAgICAgICAgKiB7QGhpZGV9CiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfTEFZT1VUX1NJWkVfRVhURU5ERURfQllfQ1VUT1VUID0gMHgwMDAwMjAwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX0xBWU9VVF9TSVpFX0VYVEVOREVEX0JZX0NVVE9VVCA9IDEgPDwgMTI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZsYWcgdGhhdCB3aWxsIG1ha2Ugd2luZG93IGlnbm9yZSBhcHAgdmlzaWJpbGl0eSBhbmQgaW5zdGVhZCBkZXBlbmQgcHVyZWx5IG9uIHRoZSBkZWNvcgpAQCAtMjkxOCwzOSArMjkxNSwyOCBAQAogICAgICAgICAgKiBkcmF3aW5nIGFmdGVyIGl0IGxhdW5jaGVzIGFuIGFwcC4KICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19GT1JDRV9ERUNPUl9WSUVXX1ZJU0lCSUxJVFkgPSAweDAwMDA0MDAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3aW5kb3cgaXMgbm90IGV4cGVjdGVkIHRvIGJlIHJlcGxhY2VkIGFjcm9zcwotICAgICAgICAgKiBjb25maWd1cmF0aW9uIGNoYW5nZSB0cmlnZ2VyZWQgYWN0aXZpdHkgcmVsYXVuY2hlcy4gSW4gZ2VuZXJhbCB0aGUgV2luZG93TWFuYWdlcgotICAgICAgICAgKiBleHBlY3RzIFdpbmRvd3MgdG8gYmUgcmVwbGFjZWQgYWZ0ZXIgcmVsYXVuY2gsIGFuZCB0aHVzIGl0IHdpbGwgcHJlc2VydmUgdGhlaXIgc3VyZmFjZXMKLSAgICAgICAgICogdW50aWwgdGhlIHJlcGxhY2VtZW50IGlzIHJlYWR5IHRvIHNob3cgaW4gb3JkZXIgdG8gcHJldmVudCB2aXN1YWwgZ2xpdGNoLiBIb3dldmVyCi0gICAgICAgICAqIHNvbWUgd2luZG93cywgc3VjaCBhcyBQb3B1cFdpbmRvd3MgZXhwZWN0IHRvIGJlIGNsZWFyZWQgYWNyb3NzIGNvbmZpZ3VyYXRpb24gY2hhbmdlLAotICAgICAgICAgKiBhbmQgdGh1cyBzaG91bGQgaGludCB0byB0aGUgV2luZG93TWFuYWdlciB0aGF0IGl0IHNob3VsZCBub3Qgd2FpdCBmb3IgYSByZXBsYWNlbWVudC4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19XSUxMX05PVF9SRVBMQUNFX09OX1JFTEFVTkNIID0gMHgwMDAwODAwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX0ZPUkNFX0RFQ09SX1ZJRVdfVklTSUJJTElUWSA9IDEgPDwgMTM7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGNoaWxkIHdpbmRvdyBzaG91bGQgYWx3YXlzIGJlIGxhaWQtb3V0IGluIHRoZSBwYXJlbnQKICAgICAgICAgICogZnJhbWUgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCB3aW5kb3dpbmcgbW9kZSBjb25maWd1cmF0aW9uLgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX0xBWU9VVF9DSElMRF9XSU5ET1dfSU5fUEFSRU5UX0ZSQU1FID0gMHgwMDAxMDAwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX0xBWU9VVF9DSElMRF9XSU5ET1dfSU5fUEFSRU5UX0ZSQU1FID0gMSA8PCAxNDsKIAogICAgICAgICAvKioKICAgICAgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd2luZG93IGlzIGFsd2F5cyBkcmF3aW5nIHRoZSBzdGF0dXMgYmFyIGJhY2tncm91bmQsIG5vIG1hdHRlcgogICAgICAgICAgKiB3aGF0IHRoZSBvdGhlciBmbGFncyBhcmUuCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfRk9SQ0VfRFJBV19CQVJfQkFDS0dST1VORFMgPSAweDAwMDIwMDAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfRk9SQ0VfRFJBV19CQVJfQkFDS0dST1VORFMgPSAxIDw8IDE1OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3aW5kb3cgbmVlZHMgU3VzdGFpbmVkIFBlcmZvcm1hbmNlIE1vZGUgaWYKICAgICAgICAgICogdGhlIGRldmljZSBzdXBwb3J0cyBpdC4KICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19TVVNUQUlORURfUEVSRk9STUFOQ0VfTU9ERSA9IDB4MDAwNDAwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19TVVNUQUlORURfUEVSRk9STUFOQ0VfTU9ERSA9IDEgPDwgMTY7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCBhbnkgd2luZG93IGFkZGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2Nlc3MgdGhhdCBpcyBvZiB0eXBlCkBAIC0yOTYxLDcgKzI5NDcsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgQFN5c3RlbUFwaQogICAgICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKHBlcm1pc3Npb24uSElERV9OT05fU1lTVEVNX09WRVJMQVlfV0lORE9XUykKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lTVEVNX0ZMQUdfSElERV9OT05fU1lTVEVNX09WRVJMQVlfV0lORE9XUyA9IDB4MDAwODAwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9GTEFHX0hJREVfTk9OX1NZU1RFTV9PVkVSTEFZX1dJTkRPV1MgPSAxIDw8IDE5OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIHdpbmRvdyBpcyB0aGUgcm91bmRlZCBjb3JuZXJzIG92ZXJsYXkgcHJlc2VudCBvbiBzb21lCkBAIC0yOTY5LDcgKzI5NTUsNyBAQAogICAgICAgICAgKiBzY3JlZW4gbWFnbmlmaWNhdGlvbiwgYW5kIG1pcnJvcmluZy4KICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19JU19ST1VOREVEX0NPUk5FUlNfT1ZFUkxBWSA9IDB4MDAxMDAwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19JU19ST1VOREVEX0NPUk5FUlNfT1ZFUkxBWSA9IDEgPDwgMjA7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdpbmRvdyB3aWxsIGJlIGV4Y2x1ZGVkIHdoaWxlIGNvbXB1dGluZyB0aGUgbWFnbmlmaWFibGUgcmVnaW9uCkBAIC0yOTgzLDcgKzI5NjksNyBAQAogICAgICAgICAgKiA8L3A+PHA+CiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfRVhDTFVERV9GUk9NX1NDUkVFTl9NQUdOSUZJQ0FUSU9OID0gMHgwMDIwMDAwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX0VYQ0xVREVfRlJPTV9TQ1JFRU5fTUFHTklGSUNBVElPTiA9IDEgPDwgMjE7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZsYWcgdG8gcHJldmVudCB0aGUgd2luZG93IGZyb20gYmVpbmcgbWFnbmlmaWVkIGJ5IHRoZSBhY2Nlc3NpYmlsaXR5IG1hZ25pZmllci4KQEAgLTI5OTEsNyArMjk3Nyw3IEBACiAgICAgICAgICAqIFRPRE8oYi8xOTA2MjMxNzIpOiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIGFuZCBuZWVkIHRvIGZpbmQgb3V0IGFub3RoZXIgd2F5IGluc3RlYWQuCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfTk9UX01BR05JRklBQkxFID0gMHgwMDQwMDAwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX05PVF9NQUdOSUZJQUJMRSA9IDEgPDwgMjI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc3RhdHVzIGJhciB3aW5kb3cgaXMgaW4gYSBzdGF0ZSBzdWNoIHRoYXQgaXQgZm9yY2VzIHNob3dpbmcKQEAgLTMwMDAsNTQgKzI5ODYsNTQgQEAKICAgICAgICAgICogSXQgb25seSB0YWtlcyBlZmZlY3RzIGlmIHRoaXMgaXMgc2V0IGJ5IHtAbGluayBMYXlvdXRQYXJhbXMjVFlQRV9TVEFUVVNfQkFSfS4KICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19TVEFUVVNfRk9SQ0VfU0hPV19OQVZJR0FUSU9OID0gMHgwMDgwMDAwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX1NUQVRVU19GT1JDRV9TSE9XX05BVklHQVRJT04gPSAxIDw8IDIzOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHdpbmRvdyBpcyBjb2xvciBzcGFjZSBhZ25vc3RpYywgYW5kIHRoZSBjb2xvciBjYW4gYmUKICAgICAgICAgICogaW50ZXJwcmV0ZWQgdG8gYW55IGNvbG9yIHNwYWNlLgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX0NPTE9SX1NQQUNFX0FHTk9TVElDID0gMHgwMTAwMDAwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX0NPTE9SX1NQQUNFX0FHTk9TVElDID0gMSA8PCAyNDsKIAogICAgICAgICAvKioKICAgICAgICAgICogRmxhZyB0byByZXF1ZXN0IGNyZWF0aW9uIG9mIGEgQkxBU1QgKEJ1ZmZlciBhcyBMYXllclN0YXRlKSBMYXllci4KICAgICAgICAgICogSWYgbm90IHNwZWNpZmllZCB0aGUgY2xpZW50IHdpbGwgcmVjZWl2ZSBhIEJ1ZmZlclF1ZXVlIGxheWVyLgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX1VTRV9CTEFTVCA9IDB4MDIwMDAwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19VU0VfQkxBU1QgPSAxIDw8IDI1OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHdpbmRvdyBpcyBjb250cm9sbGluZyB0aGUgYXBwZWFyYW5jZSBvZiBzeXN0ZW0gYmFycy4gU28gd2UKICAgICAgICAgICogZG9uJ3QgbmVlZCB0byBhZGp1c3QgaXQgYnkgcmVhZGluZyBpdHMgc3lzdGVtIFVJIGZsYWdzIGZvciBjb21wYXRpYmlsaXR5LgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX0FQUEVBUkFOQ0VfQ09OVFJPTExFRCA9IDB4MDQwMDAwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19BUFBFQVJBTkNFX0NPTlRST0xMRUQgPSAxIDw8IDI2OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHdpbmRvdyBpcyBjb250cm9sbGluZyB0aGUgYmVoYXZpb3Igb2Ygc3lzdGVtIGJhcnMuIFNvIHdlIGRvbid0CiAgICAgICAgICAqIG5lZWQgdG8gYWRqdXN0IGl0IGJ5IHJlYWRpbmcgaXRzIHdpbmRvdyBmbGFncyBvciBzeXN0ZW0gVUkgZmxhZ3MgZm9yIGNvbXBhdGliaWxpdHkuCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfQkVIQVZJT1JfQ09OVFJPTExFRCA9IDB4MDgwMDAwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19CRUhBVklPUl9DT05UUk9MTEVEID0gMSA8PCAyNzsKIAogICAgICAgICAvKioKICAgICAgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3aW5kb3cgaXMgY29udHJvbGxpbmcgaG93IGl0IGZpdHMgd2luZG93IGluc2V0cyBvbiBpdHMgb3duLgogICAgICAgICAgKiBTbyB3ZSBkb24ndCBuZWVkIHRvIGFkanVzdCBpdHMgYXR0cmlidXRlcyBmb3IgZml0dGluZyB3aW5kb3cgaW5zZXRzLgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX0ZJVF9JTlNFVFNfQ09OVFJPTExFRCA9IDB4MTAwMDAwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19GSVRfSU5TRVRTX0NPTlRST0xMRUQgPSAxIDw8IDI4OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHdpbmRvdyBpcyBhIHRydXN0ZWQgb3ZlcmxheS4KICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19UUlVTVEVEX09WRVJMQVkgPSAweDIwMDAwMDAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfVFJVU1RFRF9PVkVSTEFZID0gMSA8PCAyOTsKIAogICAgICAgICAvKioKICAgICAgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwYXJlbnQgZnJhbWUgb2YgYSB3aW5kb3cgc2hvdWxkIGJlIGluc2V0IGJ5IElNRS4KICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19JTlNFVF9QQVJFTlRfRlJBTUVfQllfSU1FID0gMHg0MDAwMDAwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9GTEFHX0lOU0VUX1BBUkVOVF9GUkFNRV9CWV9JTUUgPSAxIDw8IDMwOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgd2Ugd2FudCB0byBpbnRlcmNlcHQgYW5kIGhhbmRsZSBnbG9iYWwgZHJhZyBhbmQgZHJvcCBmb3IgYWxsIHVzZXJzLgpAQCAtMzA2Miw3ICszMDQ4LDcgQEAKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIEBSZXF1aXJlc1Blcm1pc3Npb24ocGVybWlzc2lvbi5NQU5BR0VfQUNUSVZJVFlfVEFTS1MpCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfRkxBR19JTlRFUkNFUFRfR0xPQkFMX0RSQUdfQU5EX0RST1AgPSAweDgwMDAwMDAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZMQUdfSU5URVJDRVBUX0dMT0JBTF9EUkFHX0FORF9EUk9QID0gMSA8PCAzMTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQW4gaW50ZXJuYWwgYW5ub3RhdGlvbiBmb3IgZmxhZ3MgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIHRvIHtAbGluayAjc29mdElucHV0TW9kZX0uCkBAIC0zMDkzLDcgKzMwNzksNiBAQAogICAgICAgICAgICAgICAgIFBSSVZBVEVfRkxBR19GT1JDRV9TSE9XX1NUQVRVU19CQVIsCiAgICAgICAgICAgICAgICAgUFJJVkFURV9GTEFHX0xBWU9VVF9TSVpFX0VYVEVOREVEX0JZX0NVVE9VVCwKICAgICAgICAgICAgICAgICBQUklWQVRFX0ZMQUdfRk9SQ0VfREVDT1JfVklFV19WSVNJQklMSVRZLAotICAgICAgICAgICAgICAgIFBSSVZBVEVfRkxBR19XSUxMX05PVF9SRVBMQUNFX09OX1JFTEFVTkNILAogICAgICAgICAgICAgICAgIFBSSVZBVEVfRkxBR19MQVlPVVRfQ0hJTERfV0lORE9XX0lOX1BBUkVOVF9GUkFNRSwKICAgICAgICAgICAgICAgICBQUklWQVRFX0ZMQUdfRk9SQ0VfRFJBV19CQVJfQkFDS0dST1VORFMsCiAgICAgICAgICAgICAgICAgUFJJVkFURV9GTEFHX1NVU1RBSU5FRF9QRVJGT1JNQU5DRV9NT0RFLApAQCAtMzE2OSwxMCArMzE1NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHMgPSBQUklWQVRFX0ZMQUdfRk9SQ0VfREVDT1JfVklFV19WSVNJQklMSVRZLAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJGT1JDRV9ERUNPUl9WSUVXX1ZJU0lCSUxJVFkiKSwKICAgICAgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBQUklWQVRFX0ZMQUdfV0lMTF9OT1RfUkVQTEFDRV9PTl9SRUxBVU5DSCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IFBSSVZBVEVfRkxBR19XSUxMX05PVF9SRVBMQUNFX09OX1JFTEFVTkNILAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJXSUxMX05PVF9SRVBMQUNFX09OX1JFTEFVTkNIIiksCi0gICAgICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gUFJJVkFURV9GTEFHX0xBWU9VVF9DSElMRF9XSU5ET1dfSU5fUEFSRU5UX0ZSQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gUFJJVkFURV9GTEFHX0xBWU9VVF9DSElMRF9XSU5ET1dfSU5fUEFSRU5UX0ZSQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJMQVlPVVRfQ0hJTERfV0lORE9XX0lOX1BBUkVOVF9GUkFNRSIpLApAQCAtMzYzNSw5ICszNjE2LDIwIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgcHJlZmVycmVkIHJlZnJlc2ggcmF0ZSBmb3IgdGhlIHdpbmRvdy4KICAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgbXVzdCBiZSBvbmUgb2YgdGhlIHN1cHBvcnRlZCByZWZyZXNoIHJhdGVzIG9idGFpbmVkIGZvciB0aGUgZGlzcGxheShzKSB0aGUgd2luZG93Ci0gICAgICAgICAqIGlzIG9uLiBUaGUgc2VsZWN0ZWQgcmVmcmVzaCByYXRlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZGlzcGxheSdzIGRlZmF1bHQgbW9kZS4KKyAgICAgICAgICogQmVmb3JlIEFQSSAzNCwgdGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUgc3VwcG9ydGVkIHJlZnJlc2ggcmF0ZXMgb2J0YWluZWQKKyAgICAgICAgICogZm9yIHRoZSBkaXNwbGF5KHMpIHRoZSB3aW5kb3cgaXMgb24uIFRoZSBzZWxlY3RlZCByZWZyZXNoIHJhdGUgd2lsbCBiZQorICAgICAgICAgKiBhcHBsaWVkIHRvIHRoZSBkaXNwbGF5J3MgZGVmYXVsdCBtb2RlLgogICAgICAgICAgKiA8cD4KKyAgICAgICAgICogU3RhcnRpbmcgQVBJIDM0LCB0aGlzIHZhbHVlIGlzIG5vdCBsaW1pdGVkIHRvIHRoZSBzdXBwb3J0ZWQgcmVmcmVzaCByYXRlcworICAgICAgICAgKiBvYnRhaW5lZCBmcm9tIHRoZSBkaXNwbGF5KHMpIGZvciB0aGUgd2luZG93OiBpdCBjYW4gYmUgYW55IHJlZnJlc2ggcmF0ZQorICAgICAgICAgKiB0aGUgd2luZG93IGludGVuZHMgdG8gcnVuIGF0LiBBbnkgcmVmcmVzaCByYXRlIGNhbiBiZSBwcm92aWRlZCBhcyB0aGUKKyAgICAgICAgICogcHJlZmVycmVkIHdpbmRvdyByZWZyZXNoIHJhdGUuIFRoZSBPUyB3aWxsIHNlbGVjdCB0aGUgcmVmcmVzaCByYXRlIHRoYXQKKyAgICAgICAgICogYmVzdCBtYXRjaGVzIHRoZSB7QGxpbmsgI3ByZWZlcnJlZFJlZnJlc2hSYXRlfS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFNldHRpbmcgdGhpcyB2YWx1ZSBpcyB0aGUgZXF1aXZhbGVudCBvZiBjYWxsaW5nIHtAbGluayBTdXJmYWNlI3NldEZyYW1lUmF0ZX0gd2l0aCAoCisgICAgICAgICAqICAgICBwcmVmZXJyZWRfZnJhbWVfcmF0ZSwKKyAgICAgICAgICogICAgIHtAbGluayBTdXJmYWNlI0ZSQU1FX1JBVEVfQ09NUEFUSUJJTElUWV9ERUZBVUxUfSwKKyAgICAgICAgICogICAgIHtAbGluayBTdXJmYWNlI0NIQU5HRV9GUkFNRV9SQVRFX09OTFlfSUZfU0VBTUxFU1N9KS4KICAgICAgICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBpbiBmYXZvciBvZiB7QGxpbmsgTGF5b3V0UGFyYW1zI3ByZWZlcnJlZERpc3BsYXlNb2RlSWR9IGZvcgogICAgICAgICAgKiBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHNwZWNpZnkgdGhlIHJlZnJlc2ggcmF0ZSwgYnV0IGRvIG5vdCB3YW50IHRvIHNwZWNpZnkgYQogICAgICAgICAgKiBwcmVmZXJlbmNlIGZvciBhbnkgb3RoZXIgZGlzcGxheU1vZGUgcHJvcGVydGllcyAoZS5nLiwgcmVzb2x1dGlvbikuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd2xlc3NXaW5kb3dNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd2xlc3NXaW5kb3dNYW5hZ2VyLmphdmEKaW5kZXggYjE1N2VhMC4uMDU2MGNhZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dsZXNzV2luZG93TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93bGVzc1dpbmRvd01hbmFnZXIuamF2YQpAQCAtMTM5LDcgKzEzOSw3IEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbVJlYWxXbS51cGRhdGVJbnB1dENoYW5uZWwoc3RhdGUubUlucHV0Q2hhbm5lbFRva2VuLCBzdGF0ZS5tRGlzcGxheUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1TdXJmYWNlQ29udHJvbCwgc3RhdGUubVBhcmFtcy5mbGFncywgc3RhdGUubVBhcmFtcy5wcml2YXRlRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubUlucHV0UmVnaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tUGFyYW1zLmlucHV0RmVhdHVyZXMsIHN0YXRlLm1JbnB1dFJlZ2lvbik7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVwZGF0ZSBzdXJmYWNlIGlucHV0IGNoYW5uZWw6ICIsIGUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE4OSwxMiArMTg5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIG1SZWFsV20uZ3JhbnRJbnB1dENoYW5uZWwoZGlzcGxheUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdXJmYWNlQ29udHJvbChzYywgIldpbmRvd2xlc3NXaW5kb3dNYW5hZ2VyLmFkZFRvRGlzcGxheSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdywgbUhvc3RJbnB1dFRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmZsYWdzLCBhdHRycy5wcml2YXRlRmxhZ3MsIGF0dHJzLnR5cGUsIGF0dHJzLnRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb2N1c0dyYW50VG9rZW4sIGF0dHJzLmdldFRpdGxlKCkudG9TdHJpbmcoKSwgb3V0SW5wdXRDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5mbGFncywgYXR0cnMucHJpdmF0ZUZsYWdzLCBhdHRycy5pbnB1dEZlYXR1cmVzLCBhdHRycy50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLnRva2VuLCBtRm9jdXNHcmFudFRva2VuLCBhdHRycy5nZXRUaXRsZSgpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5wdXRDaGFubmVsKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtUmVhbFdtLmdyYW50SW5wdXRDaGFubmVsKGRpc3BsYXlJZCwgc2MsIHdpbmRvdywgbUhvc3RJbnB1dFRva2VuLCBhdHRycy5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5wcml2YXRlRmxhZ3MsIGF0dHJzLnR5cGUsIGF0dHJzLnRva2VuLCBtRm9jdXNHcmFudFRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFRpdGxlKCkudG9TdHJpbmcoKSwgb3V0SW5wdXRDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5wcml2YXRlRmxhZ3MsIGF0dHJzLmlucHV0RmVhdHVyZXMsIGF0dHJzLnR5cGUsIGF0dHJzLnRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb2N1c0dyYW50VG9rZW4sIGF0dHJzLmdldFRpdGxlKCkudG9TdHJpbmcoKSwgb3V0SW5wdXRDaGFubmVsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBncmFudCBpbnB1dCB0byBzdXJmYWNlOiAiLCBlKTsKQEAgLTM4MSwxNiArMzgyLDE5IEBACiAgICAgICAgICAgICBvdXRNZXJnZWRDb25maWd1cmF0aW9uLnNldENvbmZpZ3VyYXRpb24obUNvbmZpZ3VyYXRpb24sIG1Db25maWd1cmF0aW9uKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgoYXR0ckNoYW5nZXMgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHU19DSEFOR0VEKSAhPSAwCi0gICAgICAgICAgICAgICAgJiYgc3RhdGUubUlucHV0Q2hhbm5lbFRva2VuICE9IG51bGwpIHsKKyAgICAgICAgZmluYWwgaW50IGlucHV0Q2hhbmdlTWFzayA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdTX0NIQU5HRUQKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLklOUFVUX0ZFQVRVUkVTX0NIQU5HRUQ7CisgICAgICAgIGlmICgoYXR0ckNoYW5nZXMgJiBpbnB1dENoYW5nZU1hc2spICE9IDAgJiYgc3RhdGUubUlucHV0Q2hhbm5lbFRva2VuICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYobVJlYWxXbSBpbnN0YW5jZW9mIElXaW5kb3dTZXNzaW9uLlN0dWIpIHsKKyAgICAgICAgICAgICAgICBpZiAobVJlYWxXbSBpbnN0YW5jZW9mIElXaW5kb3dTZXNzaW9uLlN0dWIpIHsKICAgICAgICAgICAgICAgICAgICAgbVJlYWxXbS51cGRhdGVJbnB1dENoYW5uZWwoc3RhdGUubUlucHV0Q2hhbm5lbFRva2VuLCBzdGF0ZS5tRGlzcGxheUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdXJmYWNlQ29udHJvbChzYywgIldpbmRvd2xlc3NXaW5kb3dNYW5hZ2VyLnJlbGF5b3V0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZmxhZ3MsIGF0dHJzLnByaXZhdGVGbGFncywgc3RhdGUubUlucHV0UmVnaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5mbGFncywgYXR0cnMucHJpdmF0ZUZsYWdzLCBhdHRycy5pbnB1dEZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1JbnB1dFJlZ2lvbik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbVJlYWxXbS51cGRhdGVJbnB1dENoYW5uZWwoc3RhdGUubUlucHV0Q2hhbm5lbFRva2VuLCBzdGF0ZS5tRGlzcGxheUlkLCBzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5mbGFncywgYXR0cnMucHJpdmF0ZUZsYWdzLCBzdGF0ZS5tSW5wdXRSZWdpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmZsYWdzLCBhdHRycy5wcml2YXRlRmxhZ3MsIGF0dHJzLmlucHV0RmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubUlucHV0UmVnaW9uKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byB1cGRhdGUgc3VyZmFjZSBpbnB1dCBjaGFubmVsOiAiLCBlKTsKQEAgLTQxNSwxMCArNDE5LDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlVG9SZXBsYWNlV2luZG93cyhhbmRyb2lkLm9zLklCaW5kZXIgYXBwVG9rZW4sIGJvb2xlYW4gY2hpbGRyZW5Pbmx5KSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb3V0T2ZNZW1vcnkoYW5kcm9pZC52aWV3LklXaW5kb3cgd2luZG93KSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC01NjQsMTQgKzU2NCwxNCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZ3JhbnRJbnB1dENoYW5uZWwoaW50IGRpc3BsYXlJZCwgU3VyZmFjZUNvbnRyb2wgc3VyZmFjZSwgSVdpbmRvdyB3aW5kb3csCi0gICAgICAgICAgICBJQmluZGVyIGhvc3RJbnB1dFRva2VuLCBpbnQgZmxhZ3MsIGludCBwcml2YXRlRmxhZ3MsIGludCB0eXBlLAorICAgICAgICAgICAgSUJpbmRlciBob3N0SW5wdXRUb2tlbiwgaW50IGZsYWdzLCBpbnQgcHJpdmF0ZUZsYWdzLCBpbnQgaW5wdXRGZWF0dXJlcywgaW50IHR5cGUsCiAgICAgICAgICAgICBJQmluZGVyIHdpbmRvd1Rva2VuLCBJQmluZGVyIGZvY3VzR3JhbnRUb2tlbiwgU3RyaW5nIGlucHV0SGFuZGxlTmFtZSwKICAgICAgICAgICAgIElucHV0Q2hhbm5lbCBvdXRJbnB1dENoYW5uZWwpIHsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVJbnB1dENoYW5uZWwoSUJpbmRlciBjaGFubmVsVG9rZW4sIGludCBkaXNwbGF5SWQsIFN1cmZhY2VDb250cm9sIHN1cmZhY2UsCi0gICAgICAgICAgICBpbnQgZmxhZ3MsIGludCBwcml2YXRlRmxhZ3MsIFJlZ2lvbiByZWdpb24pIHsKKyAgICAgICAgICAgIGludCBmbGFncywgaW50IHByaXZhdGVGbGFncywgaW50IGlucHV0RmVhdHVyZXMsIFJlZ2lvbiByZWdpb24pIHsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGl0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FZGl0b3IuamF2YQppbmRleCA5ZjlhNzgxLi5kY2U1NDMyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRpdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkaXRvci5qYXZhCkBAIC03NCw2ICs3NCw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlN0YXRpY0xheW91dDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dEZsYWdzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5JbnNlcnRNb2RlVHJhbnNmb3JtYXRpb25NZXRob2Q7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5LZXlMaXN0ZW5lcjsKQEAgLTE2OSw5ICsxNzAsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRWRpdG9yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1VORE8gPSBmYWxzZTsKIAotICAgIC8vIFRPRE8obm9uYSk6IE1ha2UgdGhpcyBjb25maWd1cmFibGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGTEFHX1VTRV9ORVdfQ09OVEVYVF9NRU5VID0gZmFsc2U7Ci0KICAgICAvLyBTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgdGhlIG1hZ25pZmllciB3aGVuIHByZXNzaW5nIHRoZSBpbnNlcnRpb24gb3Igc2VsZWN0aW9uIGhhbmRsZXMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGTEFHX1VTRV9NQUdOSUZJRVIgPSB0cnVlOwogCkBAIC00NzAsNiArNDY4LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElORV9DSEFOR0VfU0xPUF9NSU5fRFAgPSA4OwogICAgIHByaXZhdGUgaW50IG1MaW5lQ2hhbmdlU2xvcE1heDsKICAgICBwcml2YXRlIGludCBtTGluZUNoYW5nZVNsb3BNaW47CisgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VOZXdDb250ZXh0TWVudTsKIAogICAgIHByaXZhdGUgZmluYWwgQWNjZXNzaWJpbGl0eVNtYXJ0QWN0aW9ucyBtQTExeVNtYXJ0QWN0aW9uczsKICAgICBwcml2YXRlIEluc2VydE1vZGVDb250cm9sbGVyIG1JbnNlcnRNb2RlQ29udHJvbGxlcjsKQEAgLTUwMCw2ICs0OTksOSBAQAogICAgICAgICBtTGluZVNsb3BSYXRpbyA9IEFwcEdsb2JhbHMuZ2V0RmxvYXRDb3JlU2V0dGluZygKICAgICAgICAgICAgICAgICBXaWRnZXRGbGFncy5LRVlfTElORV9TTE9QX1JBVElPLAogICAgICAgICAgICAgICAgIFdpZGdldEZsYWdzLkxJTkVfU0xPUF9SQVRJT19ERUZBVUxUKTsKKyAgICAgICAgbVVzZU5ld0NvbnRleHRNZW51ID0gQXBwR2xvYmFscy5nZXRJbnRDb3JlU2V0dGluZygKKyAgICAgICAgICAgICAgICBUZXh0RmxhZ3MuS0VZX0VOQUJMRV9ORVdfQ09OVEVYVF9NRU5VLAorICAgICAgICAgICAgICAgIFRleHRGbGFncy5FTkFCTEVfTkVXX0NPTlRFWFRfTUVOVV9ERUZBVUxUID8gMSA6IDApICE9IDA7CiAgICAgICAgIGlmIChUZXh0Vmlldy5ERUJVR19DVVJTT1IpIHsKICAgICAgICAgICAgIGxvZ0N1cnNvcigiRWRpdG9yIiwgIkN1cnNvciBkcmFnIGZyb20gYW55d2hlcmUgaXMgJXMuIiwKICAgICAgICAgICAgICAgICAgICAgbUZsYWdDdXJzb3JEcmFnRnJvbUFueXdoZXJlRW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwpAQCAtMzE3MSw3ICszMTczLDcgQEAKICAgICAgICAgZmluYWwgaW50IG1lbnVJdGVtT3JkZXJTZWxlY3RBbGw7CiAgICAgICAgIGZpbmFsIGludCBtZW51SXRlbU9yZGVyU2hhcmU7CiAgICAgICAgIGZpbmFsIGludCBtZW51SXRlbU9yZGVyQXV0b2ZpbGw7Ci0gICAgICAgIGlmIChGTEFHX1VTRV9ORVdfQ09OVEVYVF9NRU5VKSB7CisgICAgICAgIGlmIChtVXNlTmV3Q29udGV4dE1lbnUpIHsKICAgICAgICAgICAgIG1lbnVJdGVtT3JkZXJQYXN0ZUFzUGxhaW5UZXh0ID0gNzsKICAgICAgICAgICAgIG1lbnVJdGVtT3JkZXJTZWxlY3RBbGwgPSA4OwogICAgICAgICAgICAgbWVudUl0ZW1PcmRlclNoYXJlID0gOTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKaW5kZXggYzFlYzE2OC4uZDU0YWRkYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5QUklWQVRFX0ZMQUdfTEFZT1VUX0NISUxEX1dJTkRPV19JTl9QQVJFTlRfRlJBTUU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5QUklWQVRFX0ZMQUdfV0lMTF9OT1RfUkVQTEFDRV9PTl9SRUxBVU5DSDsKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKQEAgLTE2NDQsOCArMTY0Myw3IEBACiAgICAgICAgICAgICBwLndpZHRoID0gbUxhc3RXaWR0aCA9IG1XaWR0aDsKICAgICAgICAgfQogCi0gICAgICAgIHAucHJpdmF0ZUZsYWdzID0gUFJJVkFURV9GTEFHX1dJTExfTk9UX1JFUExBQ0VfT05fUkVMQVVOQ0gKLSAgICAgICAgICAgICAgICB8IFBSSVZBVEVfRkxBR19MQVlPVVRfQ0hJTERfV0lORE9XX0lOX1BBUkVOVF9GUkFNRTsKKyAgICAgICAgcC5wcml2YXRlRmxhZ3MgPSBQUklWQVRFX0ZMQUdfTEFZT1VUX0NISUxEX1dJTkRPV19JTl9QQVJFTlRfRlJBTUU7CiAKICAgICAgICAgLy8gVXNlZCBmb3IgZGVidWdnaW5nLgogICAgICAgICBwLnNldFRpdGxlKCJQb3B1cFdpbmRvdzoiICsgSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCmluZGV4IDE2MDBhMTYuLmZkODA5ODEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhCkBAIC00NjIsMTIgKzQ2MiwxMiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfV0FUQ0hFUl9QUklPUklUWSA9IDEwMDsKIAogICAgIC8qKgotICAgICAqIFRoZSBzcGFuIHByaW9yaXR5IG9mIHRoZSB7QGxpbmsgVHJhbnNmb3JtYXRpb25NZXRob2R9IHRoYXQgaXMgc2V0IG9uIHRoZSB0ZXh0LiBJdCBtdXN0IGJlCisgICAgICogVGhlIHNwYW4gcHJpb3JpdHkgb2YgdGhlIHtAbGluayBPZmZzZXRNYXBwaW5nfSB0aGF0IGlzIHNldCBvbiB0aGUgdGV4dC4gSXQgbXVzdCBiZQogICAgICAqIGhpZ2hlciB0aGFuIHRoZSB7QGxpbmsgRHluYW1pY0xheW91dH0ncyB7QGxpbmsgVGV4dFdhdGNoZXJ9LCBzbyB0aGF0IHRoZSB0cmFuc2Zvcm1lZCB0ZXh0IGlzCiAgICAgICogdXBkYXRlZCBiZWZvcmUge0BsaW5rIER5bmFtaWNMYXlvdXQjcmVmbG93KENoYXJTZXF1ZW5jZSwgaW50LCBpbnQsIGludCl9IGJlaW5nIHRyaWdnZXJlZAogICAgICAqIGJ5IHtAbGluayBUZXh0V2F0Y2hlciNvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSwgaW50LCBpbnQsIGludCl9LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFOU0ZPUk1BVElPTl9TUEFOX1BSSU9SSVRZID0gMjAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPRkZTRVRfTUFQUElOR19TUEFOX1BSSU9SSVRZID0gMjAwOwogCiAgICAgLy8gTmV3IHN0YXRlIHVzZWQgdG8gY2hhbmdlIGJhY2tncm91bmQgYmFzZWQgb24gd2hldGhlciB0aGlzIFRleHRWaWV3IGlzIG11bHRpbGluZS4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBNVUxUSUxJTkVfU1RBVEVfU0VUID0geyBSLmF0dHIuc3RhdGVfbXVsdGlsaW5lIH07CkBAIC03MDMzLDkgKzcwMzMsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgaW50IHRleHRMZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICBmaW5hbCBib29sZWFuIGlzT2Zmc2V0TWFwcGluZyA9IG1UcmFuc2Zvcm1lZCBpbnN0YW5jZW9mIE9mZnNldE1hcHBpbmc7CiAKLSAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUgJiYgKCFtQWxsb3dUcmFuc2Zvcm1hdGlvbkxlbmd0aENoYW5nZQotICAgICAgICAgICAgICAgIHx8IHRleHQgaW5zdGFuY2VvZiBPZmZzZXRNYXBwaW5nKSkgeworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZSAmJiAoIW1BbGxvd1RyYW5zZm9ybWF0aW9uTGVuZ3RoQ2hhbmdlIHx8IGlzT2Zmc2V0TWFwcGluZykpIHsKICAgICAgICAgICAgIFNwYW5uYWJsZSBzcCA9IChTcGFubmFibGUpIHRleHQ7CiAKICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgQ2hhbmdlV2F0Y2hlcnMgdGhhdCBtaWdodCBoYXZlIGNvbWUgZnJvbSBvdGhlciBUZXh0Vmlld3MuCkBAIC03MDUzLDggKzcwNTMsOSBAQAogICAgICAgICAgICAgaWYgKG1FZGl0b3IgIT0gbnVsbCkgbUVkaXRvci5hZGRTcGFuV2F0Y2hlcnMoc3ApOwogCiAgICAgICAgICAgICBpZiAobVRyYW5zZm9ybWF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHJpb3JpdHkgPSBpc09mZnNldE1hcHBpbmcgPyBPRkZTRVRfTUFQUElOR19TUEFOX1BSSU9SSVRZIDogMDsKICAgICAgICAgICAgICAgICBzcC5zZXRTcGFuKG1UcmFuc2Zvcm1hdGlvbiwgMCwgdGV4dExlbmd0aCwgU3Bhbm5lZC5TUEFOX0lOQ0xVU0lWRV9JTkNMVVNJVkUKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgKFRSQU5TRk9STUFUSU9OX1NQQU5fUFJJT1JJVFkgPDwgU3Bhbm5lZC5TUEFOX1BSSU9SSVRZX1NISUZUKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB8IChwcmlvcml0eSA8PCBTcGFubmVkLlNQQU5fUFJJT1JJVFlfU0hJRlQpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Nb3ZlbWVudCAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVG9hc3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ub2FzdC5qYXZhCmluZGV4IGNhNTdjODQuLmZjZWVlNGUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ub2FzdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ub2FzdC5qYXZhCkBAIC0xODksNiArMTg5LDkgQEAKIAogICAgIC8qKgogICAgICAqIFNob3cgdGhlIHZpZXcgZm9yIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24uCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdG9hc3RzIGJlaW5nIHNlbnQgZnJvbSB0aGUgYmFja2dyb3VuZCBhcmUgcmF0ZSBsaW1pdGVkLCBzbyBhdm9pZCBzZW5kaW5nIHN1Y2gKKyAgICAgKiB0b2FzdHMgaW4gcXVpY2sgc3VjY2Vzc2lvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaG93KCkgewogICAgICAgICBpZiAoQ29tcGF0aWJpbGl0eS5pc0NoYW5nZUVuYWJsZWQoQ0hBTkdFX1RFWFRfVE9BU1RTX0lOX1RIRV9TWVNURU0pKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvU25hcHNob3REcmF3ZXJVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2luZG93L1NuYXBzaG90RHJhd2VyVXRpbHMuamF2YQppbmRleCAwNzFjMjBmLi41MmUxN2NhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvU25hcHNob3REcmF3ZXJVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9TbmFwc2hvdERyYXdlclV0aWxzLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfVFJBTlNMVUNFTlRfTkFWSUdBVElPTjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfVFJBTlNMVUNFTlRfU1RBVFVTOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19XQVRDSF9PVVRTSURFX1RPVUNIOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuSU5QVVRfRkVBVFVSRV9OT19JTlBVVF9DSEFOTkVMOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuUFJJVkFURV9GTEFHX0ZPUkNFX0RSQVdfQkFSX0JBQ0tHUk9VTkRTOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuUFJJVkFURV9GTEFHX1RSVVNURURfT1ZFUkxBWTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlBSSVZBVEVfRkxBR19VU0VfQkxBU1Q7CkBAIC0yMjMsNiArMjI0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5SR0JBXzg4ODgsCiAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyLlVTQUdFX0hXX1RFWFRVUkUgfCBHcmFwaGljQnVmZmVyLlVTQUdFX0hXX0NPTVBPU0VSCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JhcGhpY0J1ZmZlci5VU0FHRV9TV19XUklURV9SQVJFTFkpOworICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGRyYXcgc25hcHNob3Q6IGZhaWxlZCB0byBhbGxvY2F0ZSBncmFwaGljIGJ1ZmZlciBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVRpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IHRoaXMgb24gSGFyZHdhcmVCdWZmZXIKICAgICAgICAgICAgICAgICBmaW5hbCBDYW52YXMgYyA9IGJhY2tncm91bmQubG9ja0NhbnZhcygpOwogICAgICAgICAgICAgICAgIGRyYXdCYWNrZ3JvdW5kQW5kQmFycyhjLCBmcmFtZSk7CkBAIC00MTAsNiArNDE2LDcgQEAKICAgICAgICAgbGF5b3V0UGFyYW1zLnNldEZpdEluc2V0c0lnbm9yaW5nVmlzaWJpbGl0eShhdHRycy5pc0ZpdEluc2V0c0lnbm9yaW5nVmlzaWJpbGl0eSgpKTsKIAogICAgICAgICBsYXlvdXRQYXJhbXMuc2V0VGl0bGUodGl0bGUpOworICAgICAgICBsYXlvdXRQYXJhbXMuaW5wdXRGZWF0dXJlcyB8PSBJTlBVVF9GRUFUVVJFX05PX0lOUFVUX0NIQU5ORUw7CiAgICAgICAgIHJldHVybiBsYXlvdXRQYXJhbXM7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvU3VyZmFjZVN5bmNHcm91cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2luZG93L1N1cmZhY2VTeW5jR3JvdXAuamF2YQppbmRleCAwNjcyZDYzLi43Zjk5ZmI3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvU3VyZmFjZVN5bmNHcm91cC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9TdXJmYWNlU3luY0dyb3VwLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uVWlUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXJQcm94eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKQEAgLTYyLDcgKzYzLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPVU5UID0gMTAwOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBzQ291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTl9SRUFEWV9USU1FT1VUID0gMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNBQ1RJT05fUkVBRFlfVElNRU9VVCA9IDEwMDAgKiBCdWlsZC5IV19USU1FT1VUX01VTFRJUExJRVI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBTdXBwbGllcjxUcmFuc2FjdGlvbj4gc1RyYW5zYWN0aW9uRmFjdG9yeSA9IFRyYW5zYWN0aW9uOjpuZXc7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9UcmFuc2l0aW9uSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2luZG93L1RyYW5zaXRpb25JbmZvLmphdmEKaW5kZXggYjhiZDcwMy4uNGM0ODI0NjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9UcmFuc2l0aW9uSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9UcmFuc2l0aW9uSW5mby5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5T3B0aW9ucy5BTklNX1RIVU1CTkFJTF9TQ0FMRV9ET1dOOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BY3Rpdml0eU9wdGlvbnMuQU5JTV9USFVNQk5BSUxfU0NBTEVfVVA7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uUk9UQVRJT05fVU5ERUZJTkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuRGlzcGxheS5JTlZBTElEX0RJU1BMQVk7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5ST1RBVElPTl9BTklNQVRJT05fVU5TUEVDSUZJRUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLlRSQU5TSVRfQ0hBTkdFOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5UUkFOU0lUX0NMT1NFOwpAQCAtNTgsNiArNTksNyBAQAogICogQGhpZGUKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zaXRpb25JbmZvIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJUcmFuc2l0aW9uSW5mbyI7CiAKICAgICAvKioKICAgICAgKiBNb2RlcyBhcmUgb25seSBhIHN1Yi1zZXQgb2YgYWxsIHRoZSB0cmFuc2l0LXR5cGVzIHNpbmNlIHRoZXkgYXJlIHBlci1jb250YWluZXIKQEAgLTE4NCw5ICsxODYsNyBAQAogICAgIHByaXZhdGUgZmluYWwgQFRyYW5zaXRpb25UeXBlIGludCBtVHlwZTsKICAgICBwcml2YXRlIGZpbmFsIEBUcmFuc2l0aW9uRmxhZ3MgaW50IG1GbGFnczsKICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDaGFuZ2U+IG1DaGFuZ2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBwcml2YXRlIFN1cmZhY2VDb250cm9sIG1Sb290TGVhc2g7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQb2ludCBtUm9vdE9mZnNldCA9IG5ldyBQb2ludCgpOworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJvb3Q+IG1Sb290cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgcHJpdmF0ZSBBbmltYXRpb25PcHRpb25zIG1PcHRpb25zOwogCkBAIC0yMDAsMTAgKzIwMCw3IEBACiAgICAgICAgIG1UeXBlID0gaW4ucmVhZEludCgpOwogICAgICAgICBtRmxhZ3MgPSBpbi5yZWFkSW50KCk7CiAgICAgICAgIGluLnJlYWRUeXBlZExpc3QobUNoYW5nZXMsIENoYW5nZS5DUkVBVE9SKTsKLSAgICAgICAgbVJvb3RMZWFzaCA9IG5ldyBTdXJmYWNlQ29udHJvbCgpOwotICAgICAgICBtUm9vdExlYXNoLnJlYWRGcm9tUGFyY2VsKGluKTsKLSAgICAgICAgbVJvb3RMZWFzaC5zZXRVbnJlbGVhc2VkV2FybmluZ0NhbGxTaXRlKCJUcmFuc2l0aW9uSW5mbyIpOwotICAgICAgICBtUm9vdE9mZnNldC5yZWFkRnJvbVBhcmNlbChpbik7CisgICAgICAgIGluLnJlYWRUeXBlZExpc3QobVJvb3RzLCBSb290LkNSRUFUT1IpOwogICAgICAgICBtT3B0aW9ucyA9IGluLnJlYWRUeXBlZE9iamVjdChBbmltYXRpb25PcHRpb25zLkNSRUFUT1IpOwogICAgIH0KIApAQCAtMjEzLDggKzIxMCw3IEBACiAgICAgICAgIGRlc3Qud3JpdGVJbnQobVR5cGUpOwogICAgICAgICBkZXN0LndyaXRlSW50KG1GbGFncyk7CiAgICAgICAgIGRlc3Qud3JpdGVUeXBlZExpc3QobUNoYW5nZXMpOwotICAgICAgICBtUm9vdExlYXNoLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOwotICAgICAgICBtUm9vdE9mZnNldC53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgZGVzdC53cml0ZVR5cGVkTGlzdChtUm9vdHMsIGZsYWdzKTsKICAgICAgICAgZGVzdC53cml0ZVR5cGVkT2JqZWN0KG1PcHRpb25zLCBmbGFncyk7CiAgICAgfQogCkBAIC0yMzgsMTAgKzIzNCwxNSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICAvKiogQHNlZSAjZ2V0Um9vdExlYXNoKCkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb290TGVhc2goQE5vbk51bGwgU3VyZmFjZUNvbnRyb2wgbGVhc2gsIGludCBvZmZzZXRMZWZ0LCBpbnQgb2Zmc2V0VG9wKSB7Ci0gICAgICAgIG1Sb290TGVhc2ggPSBsZWFzaDsKLSAgICAgICAgbVJvb3RPZmZzZXQuc2V0KG9mZnNldExlZnQsIG9mZnNldFRvcCk7CisgICAgLyoqIEBzZWUgI2dldFJvb3QgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSb290TGVhc2goaW50IGRpc3BsYXlJZCwgQE5vbk51bGwgU3VyZmFjZUNvbnRyb2wgbGVhc2gsCisgICAgICAgICAgICBpbnQgb2Zmc2V0TGVmdCwgaW50IG9mZnNldFRvcCkgeworICAgICAgICBtUm9vdHMuYWRkKG5ldyBSb290KGRpc3BsYXlJZCwgbGVhc2gsIG9mZnNldExlZnQsIG9mZnNldFRvcCkpOworICAgIH0KKworICAgIC8qKiBAc2VlICNnZXRSb290ICovCisgICAgcHVibGljIHZvaWQgYWRkUm9vdChSb290IG90aGVyKSB7CisgICAgICAgIG1Sb290cy5hZGQob3RoZXIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldEFuaW1hdGlvbk9wdGlvbnMoQW5pbWF0aW9uT3B0aW9ucyBvcHRpb25zKSB7CkBAIC0yNTcsMjMgKzI1OCw1MiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBhbmltYXRpb24gcm9vdHMuIE1vc3QgdHJhbnNpdGlvbnMgc2hvdWxkIGhhdmUgMSwgYnV0IHRoZXJlIG1heSBiZSBtb3JlCisgICAgICogICAgICAgICBpbiBzb21lIGNhc2VzIChzdWNoIGFzIGEgdHJhbnNpdGlvbiBzcGFubmluZyBtdWx0aXBsZSBkaXNwbGF5cykuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSb290Q291bnQoKSB7CisgICAgICAgIHJldHVybiBtUm9vdHMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHRyYW5zaXRpb24tcm9vdCBhdCBhIHNwZWNpZmljIGluZGV4LgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIFJvb3QgZ2V0Um9vdChpbnQgaWR4KSB7CisgICAgICAgIHJldHVybiBtUm9vdHMuZ2V0KGlkeCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHRyYW5zaXRpb24tcm9vdCBhc3NvY2lhdGVkIHdpdGggYGRpc3BsYXlJZGAgb3IgLTEgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZmluZFJvb3RJbmRleChpbnQgZGlzcGxheUlkKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVJvb3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAobVJvb3RzLmdldChpKS5tRGlzcGxheUlkID09IGRpc3BsYXlJZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAcmV0dXJuIGEgc3VyZmFjZWNvbnRyb2wgdGhhdCBjYW4gc2VydmUgYXMgYSBwYXJlbnQgc3VyZmFjZWNvbnRyb2wgZm9yIGFsbCB0aGUgY2hhbmdpbmcKICAgICAgKiBwYXJ0aWNpcGFudHMgdG8gYW5pbWF0ZSB3aXRoaW4uIFRoaXMgd2lsbCBnZW5lcmFsbHkgYmUgcGxhY2VkIGF0IHRoZSBoaWdoZXN0LXotb3JkZXIKICAgICAgKiBzaGFyZWQgYW5jZXN0b3Igb2YgYWxsIHBhcnRpY2lwYW50cy4gV2hpbGUgdGhpcyBpcyBub24tbnVsbCwgaXQncyBwb3NzaWJsZSBmb3IgdGhlIHJvb3RsZWFzaAogICAgICAqIHRvIGJlIGludmFsaWQgaWYgdGhlIHRyYW5zaXRpb24gaXMgYSBuby1vcC4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFJvb3R9IGluc3RlYWQuIFRoaXMgY2FsbCBhc3N1bWVzIHRoZXJlIGlzIG9ubHkgb25lIHJvb3QuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBATm9uTnVsbAogICAgIHB1YmxpYyBTdXJmYWNlQ29udHJvbCBnZXRSb290TGVhc2goKSB7Ci0gICAgICAgIGlmIChtUm9vdExlYXNoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRyeWluZyB0byBnZXQgYSBsZWFzaCB3aGljaCB3YXNuJ3Qgc2V0Iik7CisgICAgICAgIGlmIChtUm9vdHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUcnlpbmcgdG8gZ2V0IGEgcm9vdCBsZWFzaCBmcm9tIGEgbm8tb3AgdHJhbnNpdGlvbi4iKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbVJvb3RMZWFzaDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0aGUgb2Zmc2V0IChyZWxhdGl2ZSB0byB0aGUgc2NyZWVuKSBvZiB0aGUgcm9vdCBsZWFzaC4gKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBQb2ludCBnZXRSb290T2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbVJvb3RPZmZzZXQ7CisgICAgICAgIGlmIChtUm9vdHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKFRBRywgIkFzc3VtaW5nIG9uZSBhbmltYXRpb24gcm9vdCB3aGVuIHRoZXJlIGFyZSBtb3JlLiIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBUaHJvd2FibGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Sb290cy5nZXQoMCkubUxlYXNoOwogICAgIH0KIAogICAgIHB1YmxpYyBBbmltYXRpb25PcHRpb25zIGdldEFuaW1hdGlvbk9wdGlvbnMoKSB7CkBAIC0zMjAsOCArMzUwLDE1IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgie3Q9IiArIHRyYW5zaXRUeXBlVG9TdHJpbmcobVR5cGUpICsgIiBmPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobUZsYWdzKQotICAgICAgICAgICAgICAgICsgIiBybz0iICsgbVJvb3RPZmZzZXQgKyAiIGM9WyIpOworICAgICAgICBzYi5hcHBlbmQoInt0PSIpLmFwcGVuZCh0cmFuc2l0VHlwZVRvU3RyaW5nKG1UeXBlKSkuYXBwZW5kKCIgZj0weCIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKG1GbGFncykpLmFwcGVuZCgiIHI9WyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Sb290cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQobVJvb3RzLmdldChpKS5tRGlzcGxheUlkKS5hcHBlbmQoIkAiKS5hcHBlbmQobVJvb3RzLmdldChpKS5tT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0gYz1bIik7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNoYW5nZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwpAQCAtNDQ4LDggKzQ4NSw4IEBACiAgICAgICAgICAgICAgICAgYy5tU25hcHNob3QgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChtUm9vdExlYXNoICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb290TGVhc2gucmVsZWFzZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Sb290cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgbVJvb3RzLmdldChpKS5tTGVhc2gucmVsZWFzZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NzYsMTAgKzUxMywxMSBAQAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DaGFuZ2VzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBvdXQubUNoYW5nZXMuYWRkKG1DaGFuZ2VzLmdldChpKS5sb2NhbFJlbW90ZUNvcHkoKSk7CiAgICAgICAgIH0KLSAgICAgICAgb3V0Lm1Sb290TGVhc2ggPSBtUm9vdExlYXNoICE9IG51bGwgPyBuZXcgU3VyZmFjZUNvbnRyb2wobVJvb3RMZWFzaCwgImxvY2FsUmVtb3RlIikgOiBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Sb290cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgb3V0Lm1Sb290cy5hZGQobVJvb3RzLmdldChpKS5sb2NhbFJlbW90ZUNvcHkoKSk7CisgICAgICAgIH0KICAgICAgICAgLy8gRG9lc24ndCBoYXZlIGFueSBuYXRpdmUgc3R1ZmYsIHNvIG5vIG5lZWQgZm9yIGFjdHVhbCBjb3B5CiAgICAgICAgIG91dC5tT3B0aW9ucyA9IG1PcHRpb25zOwotICAgICAgICBvdXQubVJvb3RPZmZzZXQuc2V0KG1Sb290T2Zmc2V0KTsKICAgICAgICAgcmV0dXJuIG91dDsKICAgICB9CiAKQEAgLTQ5Niw2ICs1MzQsOCBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIFBvaW50IG1FbmRSZWxPZmZzZXQgPSBuZXcgUG9pbnQoKTsKICAgICAgICAgcHJpdmF0ZSBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ1Rhc2tJbmZvIG1UYXNrSW5mbyA9IG51bGw7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsb3dFbnRlclBpcDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXJ0RGlzcGxheUlkID0gSU5WQUxJRF9ESVNQTEFZOworICAgICAgICBwcml2YXRlIGludCBtRW5kRGlzcGxheUlkID0gSU5WQUxJRF9ESVNQTEFZOwogICAgICAgICBwcml2YXRlIEBTdXJmYWNlLlJvdGF0aW9uIGludCBtU3RhcnRSb3RhdGlvbiA9IFJPVEFUSU9OX1VOREVGSU5FRDsKICAgICAgICAgcHJpdmF0ZSBAU3VyZmFjZS5Sb3RhdGlvbiBpbnQgbUVuZFJvdGF0aW9uID0gUk9UQVRJT05fVU5ERUZJTkVEOwogICAgICAgICAvKioKQEAgLTUyNiw2ICs1NjYsOCBAQAogICAgICAgICAgICAgbUVuZFJlbE9mZnNldC5yZWFkRnJvbVBhcmNlbChpbik7CiAgICAgICAgICAgICBtVGFza0luZm8gPSBpbi5yZWFkVHlwZWRPYmplY3QoQWN0aXZpdHlNYW5hZ2VyLlJ1bm5pbmdUYXNrSW5mby5DUkVBVE9SKTsKICAgICAgICAgICAgIG1BbGxvd0VudGVyUGlwID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgICAgIG1TdGFydERpc3BsYXlJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG1FbmREaXNwbGF5SWQgPSBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICBtU3RhcnRSb3RhdGlvbiA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIG1FbmRSb3RhdGlvbiA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIG1FbmRGaXhlZFJvdGF0aW9uID0gaW4ucmVhZEludCgpOwpAQCAtNTQ2LDYgKzU4OCw4IEBACiAgICAgICAgICAgICBvdXQubUVuZFJlbE9mZnNldC5zZXQobUVuZFJlbE9mZnNldCk7CiAgICAgICAgICAgICBvdXQubVRhc2tJbmZvID0gbVRhc2tJbmZvOwogICAgICAgICAgICAgb3V0Lm1BbGxvd0VudGVyUGlwID0gbUFsbG93RW50ZXJQaXA7CisgICAgICAgICAgICBvdXQubVN0YXJ0RGlzcGxheUlkID0gbVN0YXJ0RGlzcGxheUlkOworICAgICAgICAgICAgb3V0Lm1FbmREaXNwbGF5SWQgPSBtRW5kRGlzcGxheUlkOwogICAgICAgICAgICAgb3V0Lm1TdGFydFJvdGF0aW9uID0gbVN0YXJ0Um90YXRpb247CiAgICAgICAgICAgICBvdXQubUVuZFJvdGF0aW9uID0gbUVuZFJvdGF0aW9uOwogICAgICAgICAgICAgb3V0Lm1FbmRGaXhlZFJvdGF0aW9uID0gbUVuZEZpeGVkUm90YXRpb247CkBAIC02MDgsNiArNjUyLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKiogU2V0cyB0aGUgc3RhcnQgYW5kIGVuZCByb3RhdGlvbiBvZiB0aGlzIGNvbnRhaW5lci4gKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheUlkKGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICAgICAgbVN0YXJ0RGlzcGxheUlkID0gc3RhcnQ7CisgICAgICAgICAgICBtRW5kRGlzcGxheUlkID0gZW5kOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFNldHMgdGhlIHN0YXJ0IGFuZCBlbmQgcm90YXRpb24gb2YgdGhpcyBjb250YWluZXIuICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0aW9uKEBTdXJmYWNlLlJvdGF0aW9uIGludCBzdGFydCwgQFN1cmZhY2UuUm90YXRpb24gaW50IGVuZCkgewogICAgICAgICAgICAgbVN0YXJ0Um90YXRpb24gPSBzdGFydDsKICAgICAgICAgICAgIG1FbmRSb3RhdGlvbiA9IGVuZDsKQEAgLTcyNSw2ICs3NzUsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBtQWxsb3dFbnRlclBpcDsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhcnREaXNwbGF5SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YXJ0RGlzcGxheUlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRFbmREaXNwbGF5SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUVuZERpc3BsYXlJZDsKKyAgICAgICAgfQorCiAgICAgICAgIEBTdXJmYWNlLlJvdGF0aW9uCiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhcnRSb3RhdGlvbigpIHsKICAgICAgICAgICAgIHJldHVybiBtU3RhcnRSb3RhdGlvbjsKQEAgLTc3Niw2ICs4MzQsOCBAQAogICAgICAgICAgICAgbUVuZFJlbE9mZnNldC53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKICAgICAgICAgICAgIGRlc3Qud3JpdGVUeXBlZE9iamVjdChtVGFza0luZm8sIGZsYWdzKTsKICAgICAgICAgICAgIGRlc3Qud3JpdGVCb29sZWFuKG1BbGxvd0VudGVyUGlwKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobVN0YXJ0RGlzcGxheUlkKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUVuZERpc3BsYXlJZCk7CiAgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1TdGFydFJvdGF0aW9uKTsKICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUVuZFJvdGF0aW9uKTsKICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUVuZEZpeGVkUm90YXRpb24pOwpAQCAtODIyLDYgKzg4MiwxMSBAQAogICAgICAgICAgICAgaWYgKG1FbmRSZWxPZmZzZXQueCAhPSAwIHx8IG1FbmRSZWxPZmZzZXQueSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgZW89Iik7IHNiLmFwcGVuZChtRW5kUmVsT2Zmc2V0KTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGQ9Iik7CisgICAgICAgICAgICBpZiAobVN0YXJ0RGlzcGxheUlkICE9IG1FbmREaXNwbGF5SWQpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobVN0YXJ0RGlzcGxheUlkKS5hcHBlbmQoIi0+Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQobUVuZERpc3BsYXlJZCk7CiAgICAgICAgICAgICBpZiAobVN0YXJ0Um90YXRpb24gIT0gbUVuZFJvdGF0aW9uKSB7CiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgcj0iKTsgc2IuYXBwZW5kKG1TdGFydFJvdGF0aW9uKTsKICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi0+Iik7IHNiLmFwcGVuZChtRW5kUm90YXRpb24pOwpAQCAtMTEwOCw0ICsxMTczLDg2IEBACiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhbmltYXRpb24gcm9vdCBpbiBhIHRyYW5zaXRpb24uIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBmb3IgZWFjaCBkaXNwbGF5IHRoYXQgY29udGFpbnMKKyAgICAgKiBwYXJ0aWNpcGFudHMuIEl0IHdpbGwgYmUgcGxhY2VkLCBpbiB6LW9yZGVyLCByaWdodCBhYm92ZSB0aGUgdG9wLW1vc3QgcGFydGljaXBhbnQgYW5kIGF0IHRoZQorICAgICAqIHNhbWUgcG9zaXRpb24gaW4gdGhlIGhpZXJhcmNoeS4gQXMgYSByZXN1bHQsIGlmIGFsbCBwYXJ0aWNpcGFudHMgYXJlIGFuaW1hdGluZyB3aXRoaW4gYQorICAgICAqIHBhcnQgb2YgdGhlIHNjcmVlbiwgdGhlIHJvb3QtbGVhc2ggd2lsbCBvbmx5IGJlIGluIHRoYXQgcGFydCBvZiB0aGUgc2NyZWVuLiBJbiB0aGVzZSBjYXNlcywKKyAgICAgKiBpdCdzIHJlbGF0aXZlIHBvc2l0aW9uIChmcm9tIHRoZSBzY3JlZW4pIGlzIHN0b3JlZCBpbiB7QGxpbmsgUm9vdCNnZXRPZmZzZXR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm9vdCBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtRGlzcGxheUlkOworICAgICAgICBwcml2YXRlIGZpbmFsIFN1cmZhY2VDb250cm9sIG1MZWFzaDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQb2ludCBtT2Zmc2V0ID0gbmV3IFBvaW50KCk7CisKKyAgICAgICAgcHVibGljIFJvb3QoaW50IGRpc3BsYXlJZCwgQE5vbk51bGwgU3VyZmFjZUNvbnRyb2wgbGVhc2gsIGludCBvZmZzZXRMZWZ0LCBpbnQgb2Zmc2V0VG9wKSB7CisgICAgICAgICAgICBtRGlzcGxheUlkID0gZGlzcGxheUlkOworICAgICAgICAgICAgbUxlYXNoID0gbGVhc2g7CisgICAgICAgICAgICBtT2Zmc2V0LnNldChvZmZzZXRMZWZ0LCBvZmZzZXRUb3ApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSb290KFBhcmNlbCBpbikgeworICAgICAgICAgICAgbURpc3BsYXlJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG1MZWFzaCA9IG5ldyBTdXJmYWNlQ29udHJvbCgpOworICAgICAgICAgICAgbUxlYXNoLnJlYWRGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgICAgIG1MZWFzaC5zZXRVbnJlbGVhc2VkV2FybmluZ0NhbGxTaXRlKCJUcmFuc2l0aW9uSW5mby5Sb290Iik7CisgICAgICAgICAgICBtT2Zmc2V0LnJlYWRGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUm9vdCBsb2NhbFJlbW90ZUNvcHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJvb3QobURpc3BsYXlJZCwgbmV3IFN1cmZhY2VDb250cm9sKG1MZWFzaCwgImxvY2FsUmVtb3RlIiksCisgICAgICAgICAgICAgICAgICAgIG1PZmZzZXQueCwgbU9mZnNldC55KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgZGlzcGxheSB0aGlzIHJvb3QgaXMgb24uICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RGlzcGxheUlkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5SWQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogQHJldHVybiB0aGUgcm9vdCdzIGxlYXNoLiBTdXJmYWNlcyBzaG91bGQgYmUgcGFyZW50ZWQgdG8gdGhpcyB3aGlsZSBhbmltYXRpbmcuICovCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHB1YmxpYyBTdXJmYWNlQ29udHJvbCBnZXRMZWFzaCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTGVhc2g7CisgICAgICAgIH0KKworICAgICAgICAvKiogQHJldHVybiB0aGUgb2Zmc2V0IChyZWxhdGl2ZSB0byBpdHMgc2NyZWVuKSBvZiB0aGUgcm9vdCBsZWFzaC4gKi8KKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHVibGljIFBvaW50IGdldE9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtT2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKEBOb25OdWxsIFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobURpc3BsYXlJZCk7CisgICAgICAgICAgICBtTGVhc2gud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgICAgICBtT2Zmc2V0LndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDcmVhdG9yPFJvb3Q+IENSRUFUT1IgPQorICAgICAgICAgICAgICAgIG5ldyBDcmVhdG9yPFJvb3Q+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFJvb3QgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUm9vdChpbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFJvb3RbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSb290W3NpemVdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbURpc3BsYXlJZCArICJAIiArIG1PZmZzZXQgKyAiOiIgKyBtTGVhc2g7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9XaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbi5qYXZhCmluZGV4IGEzMjA5ZjYuLmZhYmIwODkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9XaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9XaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbi5qYXZhCkBAIC0xMzEsNiArMTMxLDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVuc2l0eURwaSB2YWx1ZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIGNvbnRhaW5lci4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uIHNldERlbnNpdHlEcGkoQE5vbk51bGwgV2luZG93Q29udGFpbmVyVG9rZW4gY29udGFpbmVyLAorICAgICAgICAgICAgaW50IGRlbnNpdHlEcGkpIHsKKyAgICAgICAgQ2hhbmdlIGNoZyA9IGdldE9yQ3JlYXRlQ2hhbmdlKGNvbnRhaW5lci5hc0JpbmRlcigpKTsKKyAgICAgICAgY2hnLm1Db25maWd1cmF0aW9uLmRlbnNpdHlEcGkgPSBkZW5zaXR5RHBpOworICAgICAgICBjaGcubUNvbmZpZ1NldE1hc2sgfD0gQWN0aXZpdHlJbmZvLkNPTkZJR19ERU5TSVRZOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBOb3RpZnkge0BsaW5rIGNvbS5hbmRyb2lkLnNlcnZlci53bS5QaW5uZWRUYXNrQ29udHJvbGxlcn0gdGhhdCB0aGUgcGljdHVyZS1pbi1waWN0dXJlIHRhc2sKICAgICAgKiBoYXMgZmluaXNoZWQgdGhlIGVudGVyIGFuaW1hdGlvbiB3aXRoIHRoZSBnaXZlbiBib3VuZHMuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aW5kb3cvV2luZG93SW5mb3NMaXN0ZW5lckZvclRlc3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9XaW5kb3dJbmZvc0xpc3RlbmVyRm9yVGVzdC5qYXZhCmluZGV4IDQyOTE1NmYuLjAxZTU3N2YgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9XaW5kb3dJbmZvc0xpc3RlbmVyRm9yVGVzdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpbmRvdy9XaW5kb3dJbmZvc0xpc3RlbmVyRm9yVGVzdC5qYXZhCkBAIC02MywxMCArNjMsMTcgQEAKICAgICAgICAgQE5vbk51bGwKICAgICAgICAgcHVibGljIGZpbmFsIFJlY3QgYm91bmRzOwogCi0gICAgICAgIFdpbmRvd0luZm8oQE5vbk51bGwgSUJpbmRlciB3aW5kb3dUb2tlbiwgQE5vbk51bGwgU3RyaW5nIG5hbWUsIEBOb25OdWxsIFJlY3QgYm91bmRzKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUcnVlIGlmIHRoZSB3aW5kb3cgaXMgYSB0cnVzdGVkIG92ZXJsYXkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1RydXN0ZWRPdmVybGF5OworCisgICAgICAgIFdpbmRvd0luZm8oQE5vbk51bGwgSUJpbmRlciB3aW5kb3dUb2tlbiwgQE5vbk51bGwgU3RyaW5nIG5hbWUsIEBOb25OdWxsIFJlY3QgYm91bmRzLAorICAgICAgICAgICAgICAgIGludCBpbnB1dENvbmZpZykgewogICAgICAgICAgICAgdGhpcy53aW5kb3dUb2tlbiA9IHdpbmRvd1Rva2VuOwogICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICAgICAgIHRoaXMuYm91bmRzID0gYm91bmRzOworICAgICAgICAgICAgdGhpcy5pc1RydXN0ZWRPdmVybGF5ID0gKGlucHV0Q29uZmlnICYgSW5wdXRDb25maWcuVFJVU1RFRF9PVkVSTEFZKSAhPSAwOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjksNyArMTM2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHZhciBib3VuZHMgPSBuZXcgUmVjdChoYW5kbGUuZnJhbWVMZWZ0LCBoYW5kbGUuZnJhbWVUb3AsIGhhbmRsZS5mcmFtZVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICBoYW5kbGUuZnJhbWVCb3R0b20pOwotICAgICAgICAgICAgd2luZG93SW5mb3MuYWRkKG5ldyBXaW5kb3dJbmZvKGhhbmRsZS5nZXRXaW5kb3dUb2tlbigpLCBoYW5kbGUubmFtZSwgYm91bmRzKSk7CisgICAgICAgICAgICB3aW5kb3dJbmZvcy5hZGQobmV3IFdpbmRvd0luZm8oaGFuZGxlLmdldFdpbmRvd1Rva2VuKCksIGhhbmRsZS5uYW1lLCBib3VuZHMsCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZS5pbnB1dENvbmZpZykpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB3aW5kb3dJbmZvczsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0xvY2FsZUhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVIZWxwZXIuamF2YQppbmRleCA1N2JkM2Y5Li5kNTIxODY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0xvY2FsZUhlbHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlSGVscGVyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CiBpbXBvcnQgYW5kcm9pZC5pY3UudGV4dC5DYXNlTWFwOwogaW1wb3J0IGFuZHJvaWQuaWN1LnRleHQuTGlzdEZvcm1hdHRlcjsKK2ltcG9ydCBhbmRyb2lkLmljdS50ZXh0Lk51bWJlcmluZ1N5c3RlbTsKIGltcG9ydCBhbmRyb2lkLmljdS51dGlsLlVMb2NhbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb2NhbGVMaXN0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC0xNzMsNiArMTc0LDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBudW1iZXJpbmcgc3lzdGVtIHZhbHVlIG9mIGEgbG9jYWxlIGZvciBkaXNwbGF5IGluIHRoZSBwcm92aWRlZCBsb2NhbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgd2hvc2Uga2V5IHZhbHVlIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gZGlzcGxheUxvY2FsZSBUaGUgbG9jYWxlIGluIHdoaWNoIHRvIGRpc3BsYXkgdGhlIGtleSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgb2YgbnVtYmVyaW5nIHN5c3RlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5TnVtYmVyaW5nU3lzdGVtS2V5VmFsdWUoCisgICAgICAgICAgICBMb2NhbGUgbG9jYWxlLCBMb2NhbGUgZGlzcGxheUxvY2FsZSkgeworICAgICAgICBVTG9jYWxlIHVMb2NhbGUgPSBuZXcgVUxvY2FsZS5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0VW5pY29kZUxvY2FsZUtleXdvcmQoIm51IiwgTnVtYmVyaW5nU3lzdGVtLmdldEluc3RhbmNlKGxvY2FsZSkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICByZXR1cm4gdUxvY2FsZS5nZXREaXNwbGF5S2V5d29yZFZhbHVlKCJudW1iZXJzIiwgVUxvY2FsZS5mb3JMb2NhbGUoZGlzcGxheUxvY2FsZSkpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEFkZHMgdGhlIGxpa2VseSBzdWJ0YWdzIGZvciBhIHByb3ZpZGVkIGxvY2FsZSBJRC4KICAgICAgKgogICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIGxvY2FsZSB0byBtYXhpbWl6ZS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyV2l0aFJlZ2lvbi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVQaWNrZXJXaXRoUmVnaW9uLmphdmEKaW5kZXggNjg1YmQ5YS4uNWRmYzBlYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVQaWNrZXJXaXRoUmVnaW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVQaWNrZXJXaXRoUmVnaW9uLmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKICAgICBwcml2YXRlIGludCBtVG9wRGlzdGFuY2UgPSAwOwogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBPbkFjdGlvbkV4cGFuZExpc3RlbmVyIG1PbkFjdGlvbkV4cGFuZExpc3RlbmVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNOdW1iZXJpbmdTeXN0ZW0gPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIE90aGVyIGNsYXNzZXMgY2FuIHJlZ2lzdGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBsb2NhbGUgd2FzIHNlbGVjdGVkLgpAQCAtOTAsNiArOTEsMTggQEAKICAgICAgICAgYm9vbGVhbiBoYXNTcGVjaWZpY1BhY2thZ2VOYW1lKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxlUGlja2VyV2l0aFJlZ2lvbiBjcmVhdGVOdW1iZXJpbmdTeXN0ZW1QaWNrZXIoCisgICAgICAgICAgICBMb2NhbGVTZWxlY3RlZExpc3RlbmVyIGxpc3RlbmVyLCBMb2NhbGVTdG9yZS5Mb2NhbGVJbmZvIHBhcmVudCwKKyAgICAgICAgICAgIGJvb2xlYW4gdHJhbnNsYXRlZE9ubHksIE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIgb25BY3Rpb25FeHBhbmRMaXN0ZW5lciwKKyAgICAgICAgICAgIExvY2FsZUNvbGxlY3RvckJhc2UgbG9jYWxlUGlja2VyQ29sbGVjdG9yKSB7CisgICAgICAgIExvY2FsZVBpY2tlcldpdGhSZWdpb24gbG9jYWxlUGlja2VyID0gbmV3IExvY2FsZVBpY2tlcldpdGhSZWdpb24oKTsKKyAgICAgICAgbG9jYWxlUGlja2VyLnNldE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIob25BY3Rpb25FeHBhbmRMaXN0ZW5lcik7CisgICAgICAgIGxvY2FsZVBpY2tlci5zZXRJc051bWJlcmluZ1N5c3RlbSh0cnVlKTsKKyAgICAgICAgYm9vbGVhbiBzaG91bGRTaG93VGhlTGlzdCA9IGxvY2FsZVBpY2tlci5zZXRMaXN0ZW5lcihsaXN0ZW5lciwgcGFyZW50LAorICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRPbmx5LCBsb2NhbGVQaWNrZXJDb2xsZWN0b3IpOworICAgICAgICByZXR1cm4gc2hvdWxkU2hvd1RoZUxpc3QgPyBsb2NhbGVQaWNrZXIgOiBudWxsOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIExvY2FsZVBpY2tlcldpdGhSZWdpb24gY3JlYXRlQ291bnRyeVBpY2tlcigKICAgICAgICAgICAgIExvY2FsZVNlbGVjdGVkTGlzdGVuZXIgbGlzdGVuZXIsIExvY2FsZVN0b3JlLkxvY2FsZUluZm8gcGFyZW50LAogICAgICAgICAgICAgYm9vbGVhbiB0cmFuc2xhdGVkT25seSwgT25BY3Rpb25FeHBhbmRMaXN0ZW5lciBvbkFjdGlvbkV4cGFuZExpc3RlbmVyLApAQCAtMTI4LDYgKzE0MSwxMCBAQAogICAgICAgICByZXR1cm4gbG9jYWxlUGlja2VyOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBzZXRJc051bWJlcmluZ1N5c3RlbShib29sZWFuIGlzTnVtYmVyaW5nU3lzdGVtKSB7CisgICAgICAgIG1Jc051bWJlcmluZ1N5c3RlbSA9IGlzTnVtYmVyaW5nU3lzdGVtOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxpc3RlbmVyIGFuZCBpbml0aWFsaXplcyB0aGUgbG9jYWxlIGxpc3QuCiAgICAgICoKQEAgLTE4NCw2ICsyMDEsNyBAQAogICAgICAgICBmaW5hbCBib29sZWFuIGhhc1NwZWNpZmljUGFja2FnZU5hbWUgPQogICAgICAgICAgICAgICAgIG1Mb2NhbGVQaWNrZXJDb2xsZWN0b3IgIT0gbnVsbCAmJiBtTG9jYWxlUGlja2VyQ29sbGVjdG9yLmhhc1NwZWNpZmljUGFja2FnZU5hbWUoKTsKICAgICAgICAgbUFkYXB0ZXIgPSBuZXcgU3VnZ2VzdGVkTG9jYWxlQWRhcHRlcihtTG9jYWxlTGlzdCwgY291bnRyeU1vZGUsIGhhc1NwZWNpZmljUGFja2FnZU5hbWUpOworICAgICAgICBtQWRhcHRlci5zZXROdW1iZXJpbmdTeXN0ZW1Nb2RlKG1Jc051bWJlcmluZ1N5c3RlbSk7CiAgICAgICAgIGZpbmFsIExvY2FsZUhlbHBlci5Mb2NhbGVJbmZvQ29tcGFyYXRvciBjb21wID0KICAgICAgICAgICAgICAgICBuZXcgTG9jYWxlSGVscGVyLkxvY2FsZUluZm9Db21wYXJhdG9yKHNvcnRpbmdMb2NhbGUsIGNvdW50cnlNb2RlKTsKICAgICAgICAgbUFkYXB0ZXIuc29ydChjb21wKTsKQEAgLTIxMyw3ICsyMzEsNiBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotCiAgICAgICAgIGlmIChtUGFyZW50TG9jYWxlICE9IG51bGwpIHsKICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkuc2V0VGl0bGUobVBhcmVudExvY2FsZS5nZXRGdWxsTmFtZU5hdGl2ZSgpKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTI1MCwxNiArMjY3LDI4IEBACiAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgcmVzZXR0aW5nIHRoZSBhcHAgbG9jYWxlIHRvIGVxdWFsIHRoZSBzeXN0ZW0gbG9jYWxlLgogICAgICAgICBib29sZWFuIGlzU3lzdGVtTG9jYWxlID0gbG9jYWxlLmlzU3lzdGVtTG9jYWxlKCk7CiAgICAgICAgIGJvb2xlYW4gaXNSZWdpb25Mb2NhbGUgPSBsb2NhbGUuZ2V0UGFyZW50KCkgIT0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBtYXlIYXZlRGlmZmVyZW50TnVtYmVyaW5nU3lzdGVtID0gbG9jYWxlLmhhc051bWJlcmluZ1N5c3RlbXMoKTsKIAotICAgICAgICBpZiAoaXNTeXN0ZW1Mb2NhbGUgfHwgaXNSZWdpb25Mb2NhbGUpIHsKKyAgICAgICAgaWYgKGlzU3lzdGVtTG9jYWxlCisgICAgICAgICAgICAgICAgfHwgKGlzUmVnaW9uTG9jYWxlICYmICFtYXlIYXZlRGlmZmVyZW50TnVtYmVyaW5nU3lzdGVtKQorICAgICAgICAgICAgICAgIHx8IG1Jc051bWJlcmluZ1N5c3RlbSkgewogICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uTG9jYWxlU2VsZWN0ZWQobG9jYWxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVyblRvUGFyZW50RnJhbWUoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvY2FsZVBpY2tlcldpdGhSZWdpb24gc2VsZWN0b3IgPSBMb2NhbGVQaWNrZXJXaXRoUmVnaW9uLmNyZWF0ZUNvdW50cnlQaWNrZXIoCi0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lciwgbG9jYWxlLCBtVHJhbnNsYXRlZE9ubHkgLyogdHJhbnNsYXRlIG9ubHkgKi8sCi0gICAgICAgICAgICAgICAgICAgIG1PbkFjdGlvbkV4cGFuZExpc3RlbmVyLCB0aGlzLm1Mb2NhbGVQaWNrZXJDb2xsZWN0b3IpOworICAgICAgICAgICAgTG9jYWxlUGlja2VyV2l0aFJlZ2lvbiBzZWxlY3RvcjsKKyAgICAgICAgICAgIGlmIChtYXlIYXZlRGlmZmVyZW50TnVtYmVyaW5nU3lzdGVtKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlUGlja2VyV2l0aFJlZ2lvbi5jcmVhdGVOdW1iZXJpbmdTeXN0ZW1QaWNrZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIsIGxvY2FsZSwgbVRyYW5zbGF0ZWRPbmx5IC8qIHRyYW5zbGF0ZSBvbmx5ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgbU9uQWN0aW9uRXhwYW5kTGlzdGVuZXIsIHRoaXMubUxvY2FsZVBpY2tlckNvbGxlY3Rvcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gTG9jYWxlUGlja2VyV2l0aFJlZ2lvbi5jcmVhdGVDb3VudHJ5UGlja2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLCBsb2NhbGUsIG1UcmFuc2xhdGVkT25seSAvKiB0cmFuc2xhdGUgb25seSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PbkFjdGlvbkV4cGFuZExpc3RlbmVyLCB0aGlzLm1Mb2NhbGVQaWNrZXJDb2xsZWN0b3IpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLmJlZ2luVHJhbnNhY3Rpb24oKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRyYW5zaXRpb24oRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU4pCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0xvY2FsZVN0b3JlLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0xvY2FsZVN0b3JlLmphdmEKaW5kZXggOGI0MTgyOS4uYmNiZmRjOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVTdG9yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlU3RvcmUuamF2YQpAQCAtMzksNiArMzksOSBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBMb2NhbGVTdG9yZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJRVJfTEFOR1VBR0UgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSUVSX1JFR0lPTiA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJRVJfTlVNQkVSSU5HID0gMzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgTG9jYWxlSW5mbz4gc0xvY2FsZUNhY2hlID0gbmV3IEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMb2NhbGVTdG9yZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzRnVsbHlJbml0aWFsaXplZCA9IGZhbHNlOwpAQCAtNjgsMTAgKzcxLDEzIEBACiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1GdWxsQ291bnRyeU5hbWVOYXRpdmU7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1MYW5nU2NyaXB0S2V5OwogCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzTnVtYmVyaW5nU3lzdGVtczsKKwogICAgICAgICBwcml2YXRlIExvY2FsZUluZm8oTG9jYWxlIGxvY2FsZSkgewogICAgICAgICAgICAgdGhpcy5tTG9jYWxlID0gbG9jYWxlOwogICAgICAgICAgICAgdGhpcy5tSWQgPSBsb2NhbGUudG9MYW5ndWFnZVRhZygpOwogICAgICAgICAgICAgdGhpcy5tUGFyZW50ID0gZ2V0UGFyZW50KGxvY2FsZSk7CisgICAgICAgICAgICB0aGlzLm1IYXNOdW1iZXJpbmdTeXN0ZW1zID0gZmFsc2U7CiAgICAgICAgICAgICB0aGlzLm1Jc0NoZWNrZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHRoaXMubVN1Z2dlc3Rpb25GbGFncyA9IFNVR0dFU1RJT05fVFlQRV9OT05FOwogICAgICAgICAgICAgdGhpcy5tSXNUcmFuc2xhdGVkID0gZmFsc2U7CkBAIC05Myw2ICs5OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgfQogCisgICAgICAgIC8qKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHNhbWUgbG9jYWxlcyB3aXRoIGRpZmZlcmVudCBudW1iZXJpbmcgc3lzdGVtLiAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOdW1iZXJpbmdTeXN0ZW1zKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IYXNOdW1iZXJpbmdTeXN0ZW1zOworICAgICAgICB9CisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICByZXR1cm4gbUlkOwpAQCAtMTk1LDYgKzIwNiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgU3RyaW5nIGdldE51bWJlcmluZ1N5c3RlbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBMb2NhbGVIZWxwZXIuZ2V0RGlzcGxheU51bWJlcmluZ1N5c3RlbUtleVZhbHVlKG1Mb2NhbGUsIG1Mb2NhbGUpOworICAgICAgICB9CisKICAgICAgICAgU3RyaW5nIGdldENvbnRlbnREZXNjcmlwdGlvbihib29sZWFuIGNvdW50cnlNb2RlKSB7CiAgICAgICAgICAgICBpZiAoY291bnRyeU1vZGUpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RnVsbENvdW50cnlOYW1lSW5VaUxhbmd1YWdlKCk7CkBAIC0zODMsNiArMzk4LDEyIEBACiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0luRGV2ZWxvcGVyTW9kZSA9IFNldHRpbmdzLkdsb2JhbC5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuREVWRUxPUE1FTlRfU0VUVElOR1NfRU5BQkxFRCwgMCkgIT0gMDsKKyAgICAgICAgU2V0PExvY2FsZT4gbnVtYmVyU3lzdGVtTG9jYWxlTGlzdCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgbG9jYWxlSWQgOiBMb2NhbGVQaWNrZXIuZ2V0U3VwcG9ydGVkTG9jYWxlcyhjb250ZXh0KSkgeworICAgICAgICAgICAgaWYgKExvY2FsZS5mb3JMYW5ndWFnZVRhZyhsb2NhbGVJZCkuZ2V0VW5pY29kZUxvY2FsZVR5cGUoIm51IikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG51bWJlclN5c3RlbUxvY2FsZUxpc3QuYWRkKExvY2FsZS5mb3JMYW5ndWFnZVRhZyhsb2NhbGVJZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGZvciAoU3RyaW5nIGxvY2FsZUlkIDogTG9jYWxlUGlja2VyLmdldFN1cHBvcnRlZExvY2FsZXMoY29udGV4dCkpIHsKICAgICAgICAgICAgIGlmIChsb2NhbGVJZC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZm9ybWVkTG9jYWxlRXhjZXB0aW9uKCJCYWQgbG9jYWxlIGVudHJ5IGluIGxvY2FsZV9jb25maWcueG1sIik7CkBAIC00MDMsNiArNDI0LDEyIEBACiAgICAgICAgICAgICBpZiAoc2ltQ291bnRyaWVzLmNvbnRhaW5zKGxpLmdldExvY2FsZSgpLmdldENvdW50cnkoKSkpIHsKICAgICAgICAgICAgICAgICBsaS5tU3VnZ2VzdGlvbkZsYWdzIHw9IExvY2FsZUluZm8uU1VHR0VTVElPTl9UWVBFX1NJTTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bWJlclN5c3RlbUxvY2FsZUxpc3QuZm9yRWFjaChsIC0+IHsKKyAgICAgICAgICAgICAgICBpZiAobGkuZ2V0TG9jYWxlKCkuc3RyaXBFeHRlbnNpb25zKCkuZXF1YWxzKGwuc3RyaXBFeHRlbnNpb25zKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGxpLm1IYXNOdW1iZXJpbmdTeXN0ZW1zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKwogICAgICAgICAgICAgc0xvY2FsZUNhY2hlLnB1dChsaS5nZXRJZCgpLCBsaSk7CiAgICAgICAgICAgICBmaW5hbCBMb2NhbGUgcGFyZW50ID0gbGkuZ2V0UGFyZW50KCk7CiAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKQEAgLTQ0NSwyMCArNDcyLDQzIEBACiAgICAgICAgIHNGdWxseUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGV2ZWwoU2V0PFN0cmluZz4gaWdub3JhYmxlcywgTG9jYWxlSW5mbyBsaSwgYm9vbGVhbiB0cmFuc2xhdGVkT25seSkgewotICAgICAgICBpZiAoaWdub3JhYmxlcy5jb250YWlucyhsaS5nZXRJZCgpKSkgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChsaS5tSXNQc2V1ZG8pIHJldHVybiAyOwotICAgICAgICBpZiAodHJhbnNsYXRlZE9ubHkgJiYgIWxpLmlzVHJhbnNsYXRlZCgpKSByZXR1cm4gMDsKLSAgICAgICAgaWYgKGxpLmdldFBhcmVudCgpICE9IG51bGwpIHJldHVybiAyOwotICAgICAgICByZXR1cm4gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2hhbGxJZ25vcmUoCisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBpZ25vcmFibGVzLCBMb2NhbGVJbmZvIGxpLCBib29sZWFuIHRyYW5zbGF0ZWRPbmx5KSB7CisgICAgICAgIGlmIChpZ25vcmFibGVzLnN0cmVhbSgpLmFueU1hdGNoKHRhZyAtPgorICAgICAgICAgICAgICAgIExvY2FsZS5mb3JMYW5ndWFnZVRhZyh0YWcpLnN0cmlwRXh0ZW5zaW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGxpLmdldExvY2FsZSgpLnN0cmlwRXh0ZW5zaW9ucygpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChsaS5tSXNQc2V1ZG8pIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRyYW5zbGF0ZWRPbmx5ICYmICFsaS5pc1RyYW5zbGF0ZWQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChsaS5nZXRQYXJlbnQoKSAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRMb2NhbGVUaWVyKExvY2FsZUluZm8gcGFyZW50KSB7CisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFRJRVJfTEFOR1VBR0U7CisgICAgICAgIH0gZWxzZSBpZiAocGFyZW50LmdldExvY2FsZSgpLmdldENvdW50cnkoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBUSUVSX1JFR0lPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBUSUVSX05VTUJFUklORzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGxvY2FsZXMgZm9yIGxhbmd1YWdlIG9yIHJlZ2lvbiBzZWxlY3Rpb24uCisgICAgICoKICAgICAgKiBJZiB0aGUgcGFyZW50IGlzIG51bGwsIHRoZW4gaXQgaXMgdGhlIGxhbmd1YWdlIGxpc3QuCisgICAgICoKICAgICAgKiBJZiBpdCBpcyBub3QgbnVsbCwgdGhlbiB0aGUgbGlzdCB3aWxsIGNvbnRhaW4gYWxsIHRoZSBsb2NhbGVzIHRoYXQgYmVsb25nIHRvIHRoYXQgcGFyZW50LgogICAgICAqIEV4YW1wbGU6IGlmIHRoZSBwYXJlbnQgaXMgImFyIiwgdGhlbiB0aGUgcmVnaW9uIGxpc3Qgd2lsbCBjb250YWluIGFsbCBBcmFiaWMgbG9jYWxlcy4KLSAgICAgKiAodGhpcyBpcyBub3QgbGFuZ3VhZ2UgYmFzZWQsIGJ1dCBsYW5ndWFnZS1zY3JpcHQsIHNvIHRoYXQgaXQgd29ya3MgZm9yIHpoLUhhbnQgYW5kIHNvIG9uLgorICAgICAqICh0aGlzIGlzIG5vdCBsYW5ndWFnZSBiYXNlZCwgYnV0IGxhbmd1YWdlLXNjcmlwdCwgc28gdGhhdCBpdCB3b3JrcyBmb3IgemgtSGFudCBhbmQgc28gb24uKQorICAgICAqCisgICAgICogSWYgaXQgaXMgbm90IG51bGwgYW5kIGhhcyBjb3VudHJ5LCB0aGVuIHRoZSBsaXN0IHdpbGwgY29udGFpbiBhbGwgbG9jYWxlcyB3aXRoIHRoYXQgcGFyZW50J3MKKyAgICAgKiBsYW5ndWFnZSBhbmQgY291bnRyeSwgaS5lLiBjb250YWluaW5nIGFsdGVybmF0ZSBudW1iZXJpbmcgc3lzdGVtcy4KKyAgICAgKgorICAgICAqIEV4YW1wbGU6IGlmIHRoZSBwYXJlbnQgaXMgImZmLUFkbG0tQkYiLCB0aGVuIHRoZSBudW1iZXJpbmcgbGlzdCB3aWxsIGNvbnRhaW4gYWxsCisgICAgICogRnVsYSAoQWRsYW0sIEJ1cmtpbmEgRmFzbykgaS5lLiAiZmYtQWRsbS1CRiIgYW5kICJmZi1BZGxtLUJGLXUtbnUtbGF0biIKICAgICAgKi8KICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgIHB1YmxpYyBzdGF0aWMgU2V0PExvY2FsZUluZm8+IGdldExldmVsTG9jYWxlcyhDb250ZXh0IGNvbnRleHQsIFNldDxTdHJpbmc+IGlnbm9yYWJsZXMsCkBAIC00NzgsMjggKzUyOCw0OSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2V0PExvY2FsZUluZm8+IGdldExldmVsTG9jYWxlcyhDb250ZXh0IGNvbnRleHQsIFNldDxTdHJpbmc+IGlnbm9yYWJsZXMsCiAgICAgICAgICAgICBMb2NhbGVJbmZvIHBhcmVudCwgYm9vbGVhbiB0cmFuc2xhdGVkT25seSwgTG9jYWxlTGlzdCBleHBsaWNpdExvY2FsZXMpIHsKLSAgICAgICAgZmlsbENhY2hlKGNvbnRleHQpOwotICAgICAgICBTdHJpbmcgcGFyZW50SWQgPSBwYXJlbnQgPT0gbnVsbCA/IG51bGwgOiBwYXJlbnQuZ2V0SWQoKTsKLSAgICAgICAgSGFzaFNldDxMb2NhbGVJbmZvPiByZXN1bHQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbGxDYWNoZShjb250ZXh0KTsKKyAgICAgICAgfQogICAgICAgICBIYXNoTWFwPFN0cmluZywgTG9jYWxlSW5mbz4gc3VwcG9ydGVkTGNvYWxlSW5mb3MgPQogICAgICAgICAgICAgICAgIGV4cGxpY2l0TG9jYWxlcyA9PSBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICA/IHNMb2NhbGVDYWNoZQogICAgICAgICAgICAgICAgICAgICAgICAgOiBjb252ZXJ0RXhwbGljaXRMb2NhbGVzKGV4cGxpY2l0TG9jYWxlcywgc0xvY2FsZUNhY2hlLnZhbHVlcygpKTsKKyAgICAgICAgcmV0dXJuIGdldFRpZXJMb2NhbGVzKGlnbm9yYWJsZXMsIHBhcmVudCwgdHJhbnNsYXRlZE9ubHksIHN1cHBvcnRlZExjb2FsZUluZm9zKTsKKyAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8TG9jYWxlSW5mbz4gZ2V0VGllckxvY2FsZXMoCisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBpZ25vcmFibGVzLAorICAgICAgICAgICAgTG9jYWxlSW5mbyBwYXJlbnQsCisgICAgICAgICAgICBib29sZWFuIHRyYW5zbGF0ZWRPbmx5LAorICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIExvY2FsZUluZm8+IHN1cHBvcnRlZExjb2FsZUluZm9zKSB7CisKKyAgICAgICAgYm9vbGVhbiBoYXNUYXJnZXRQYXJlbnQgPSBwYXJlbnQgIT0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHBhcmVudElkID0gaGFzVGFyZ2V0UGFyZW50ID8gcGFyZW50LmdldElkKCkgOiBudWxsOworICAgICAgICBIYXNoU2V0PExvY2FsZUluZm8+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgZm9yIChMb2NhbGVTdG9yZS5Mb2NhbGVJbmZvIGxpIDogc3VwcG9ydGVkTGNvYWxlSW5mb3MudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGludCBsZXZlbCA9IGdldExldmVsKGlnbm9yYWJsZXMsIGxpLCB0cmFuc2xhdGVkT25seSk7Ci0gICAgICAgICAgICBpZiAobGV2ZWwgPT0gMikgewotICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeyAvLyByZWdpb24gc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJZC5lcXVhbHMobGkuZ2V0UGFyZW50KCkudG9MYW5ndWFnZVRhZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChsaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBsYW5ndWFnZSBzZWxlY3Rpb24KKyAgICAgICAgICAgIGlmIChpc1NoYWxsSWdub3JlKGlnbm9yYWJsZXMsIGxpLCB0cmFuc2xhdGVkT25seSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaChnZXRMb2NhbGVUaWVyKHBhcmVudCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRJRVJfTEFOR1VBR0U6CiAgICAgICAgICAgICAgICAgICAgIGlmIChsaS5pc1N1Z2dlc3Rpb25PZlR5cGUoTG9jYWxlSW5mby5TVUdHRVNUSU9OX1RZUEVfU0lNKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChsaSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGdldExvY2FsZUluZm8obGkuZ2V0UGFyZW50KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZ2V0TG9jYWxlSW5mbyhsaS5nZXRQYXJlbnQoKSwgc3VwcG9ydGVkTGNvYWxlSW5mb3MpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUSUVSX1JFR0lPTjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudElkLmVxdWFscyhsaS5nZXRQYXJlbnQoKS50b0xhbmd1YWdlVGFnKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGdldExvY2FsZUluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpLmdldExvY2FsZSgpLnN0cmlwRXh0ZW5zaW9ucygpLCBzdXBwb3J0ZWRMY29hbGVJbmZvcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVElFUl9OVU1CRVJJTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuZ2V0TG9jYWxlKCkuc3RyaXBFeHRlbnNpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGxpLmdldExvY2FsZSgpLnN0cmlwRXh0ZW5zaW9ucygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChsaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTUzOCwxOCArNjA5LDIxIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxlTGlzdCBtYXRjaExvY2FsZUZyb21TdXBwb3J0ZWRMb2NhbGVMaXN0KAotICAgICAgICAgICAgTG9jYWxlTGlzdCBleHBsaWNpdExvY2FsZXMsIENvbGxlY3Rpb248TG9jYWxlSW5mbz4gbG9jYWxlaW5mbykgeworICAgICAgICAgICAgTG9jYWxlTGlzdCBleHBsaWNpdExvY2FsZXMsIENvbGxlY3Rpb248TG9jYWxlSW5mbz4gbG9jYWxlSW5mb3MpIHsKKyAgICAgICAgaWYgKGxvY2FsZUluZm9zID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBleHBsaWNpdExvY2FsZXM7CisgICAgICAgIH0KICAgICAgICAgLy9UT0RPOiBBZGRzIGEgZnVuY3Rpb24gZm9yIHVuaWNvZGUgZXh0ZW5zaW9uIGlmIG5lZWRlZC4KICAgICAgICAgTG9jYWxlW10gcmVzdWx0TG9jYWxlcyA9IG5ldyBMb2NhbGVbZXhwbGljaXRMb2NhbGVzLnNpemUoKV07CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwbGljaXRMb2NhbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBMb2NhbGUgbG9jYWxlID0gZXhwbGljaXRMb2NhbGVzLmdldChpKS5zdHJpcEV4dGVuc2lvbnMoKTsKKyAgICAgICAgICAgIExvY2FsZSBsb2NhbGUgPSBleHBsaWNpdExvY2FsZXMuZ2V0KGkpOwogICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsb2NhbGUuZ2V0Q291bnRyeSgpKSkgewotICAgICAgICAgICAgICAgIGZvciAoTG9jYWxlSW5mbyBsb2NhbGVJbmZvIDpsb2NhbGVpbmZvKSB7CisgICAgICAgICAgICAgICAgZm9yIChMb2NhbGVJbmZvIGxvY2FsZUluZm8gOmxvY2FsZUluZm9zKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChMb2NhbGVMaXN0Lm1hdGNoZXNMYW5ndWFnZUFuZFNjcmlwdChsb2NhbGUsIGxvY2FsZUluZm8uZ2V0TG9jYWxlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhsb2NhbGUuZ2V0Q291bnRyeSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZUluZm8uZ2V0TG9jYWxlKCkuZ2V0Q291bnRyeSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TG9jYWxlc1tpXSA9IGxvY2FsZUluZm8uZ2V0TG9jYWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTYyLDE4ICs2MzYsMjMgQEAKIAogICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgcHVibGljIHN0YXRpYyBMb2NhbGVJbmZvIGdldExvY2FsZUluZm8oTG9jYWxlIGxvY2FsZSkgeworICAgICAgICByZXR1cm4gZ2V0TG9jYWxlSW5mbyhsb2NhbGUsIHNMb2NhbGVDYWNoZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxlSW5mbyBnZXRMb2NhbGVJbmZvKAorICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSwgSGFzaE1hcDxTdHJpbmcsIExvY2FsZUluZm8+IGxvY2FsZUluZm9zKSB7CiAgICAgICAgIFN0cmluZyBpZCA9IGxvY2FsZS50b0xhbmd1YWdlVGFnKCk7CiAgICAgICAgIExvY2FsZUluZm8gcmVzdWx0OwotICAgICAgICBpZiAoIXNMb2NhbGVDYWNoZS5jb250YWluc0tleShpZCkpIHsKKyAgICAgICAgaWYgKCFsb2NhbGVJbmZvcy5jb250YWluc0tleShpZCkpIHsKICAgICAgICAgICAgIC8vIExvY2FsZSBwcmVmZXJlbmNlcyBjYW4gbW9kaWZ5IHRoZSBsYW5ndWFnZSB0YWcgdG8gY3VycmVudCBzeXN0ZW0gbGFuZ3VhZ2VzLCBzbyB3ZQogICAgICAgICAgICAgLy8gbmVlZCB0byBjaGVjayB0aGUgaW5wdXQgbG9jYWxlIHdpdGhvdXQgZXh0cmEgdSBleHRlbnNpb24gZXhjZXB0IG51bWJlcmluZyBzeXN0ZW0uCiAgICAgICAgICAgICBMb2NhbGUgZmlsdGVyZWRMb2NhbGUgPSBuZXcgTG9jYWxlLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAuc2V0TG9jYWxlKGxvY2FsZS5zdHJpcEV4dGVuc2lvbnMoKSkKICAgICAgICAgICAgICAgICAgICAgLnNldFVuaWNvZGVMb2NhbGVLZXl3b3JkKCJudSIsIGxvY2FsZS5nZXRVbmljb2RlTG9jYWxlVHlwZSgibnUiKSkKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICBpZiAoc0xvY2FsZUNhY2hlLmNvbnRhaW5zS2V5KGZpbHRlcmVkTG9jYWxlLnRvTGFuZ3VhZ2VUYWcoKSkpIHsKKyAgICAgICAgICAgIGlmIChsb2NhbGVJbmZvcy5jb250YWluc0tleShmaWx0ZXJlZExvY2FsZS50b0xhbmd1YWdlVGFnKCkpKSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IExvY2FsZUluZm8obG9jYWxlKTsKLSAgICAgICAgICAgICAgICBMb2NhbGVJbmZvIGxvY2FsZUluZm8gPSBzTG9jYWxlQ2FjaGUuZ2V0KGZpbHRlcmVkTG9jYWxlLnRvTGFuZ3VhZ2VUYWcoKSk7CisgICAgICAgICAgICAgICAgTG9jYWxlSW5mbyBsb2NhbGVJbmZvID0gbG9jYWxlSW5mb3MuZ2V0KGZpbHRlcmVkTG9jYWxlLnRvTGFuZ3VhZ2VUYWcoKSk7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBsb2NhbGUgaXMgaW5jbHVkZWQgaW4gc3VwcG9ydGVkIGxvY2FsZXMsIHNvIGZvbGxvdyB0aGUgc2V0dGluZ3MKICAgICAgICAgICAgICAgICAvLyBvZiBzdXBwb3J0ZWQgbG9jYWxlcy4KICAgICAgICAgICAgICAgICByZXN1bHQubUlzUHNldWRvID0gbG9jYWxlSW5mby5tSXNQc2V1ZG87CkBAIC01ODIsOSArNjYxLDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0ID0gbmV3IExvY2FsZUluZm8obG9jYWxlKTsKLSAgICAgICAgICAgIHNMb2NhbGVDYWNoZS5wdXQoaWQsIHJlc3VsdCk7CisgICAgICAgICAgICBsb2NhbGVJbmZvcy5wdXQoaWQsIHJlc3VsdCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBzTG9jYWxlQ2FjaGUuZ2V0KGlkKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGxvY2FsZUluZm9zLmdldChpZCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL1N1Z2dlc3RlZExvY2FsZUFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvU3VnZ2VzdGVkTG9jYWxlQWRhcHRlci5qYXZhCmluZGV4IGE2MWE2ZDcuLjA4ZGU0ZGZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL1N1Z2dlc3RlZExvY2FsZUFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL1N1Z2dlc3RlZExvY2FsZUFkYXB0ZXIuamF2YQpAQCAtNjQsNiArNjQsNyBAQAogICAgIHByb3RlY3RlZCBBcnJheUxpc3Q8TG9jYWxlU3RvcmUuTG9jYWxlSW5mbz4gbU9yaWdpbmFsTG9jYWxlT3B0aW9uczsKICAgICBwcm90ZWN0ZWQgaW50IG1TdWdnZXN0aW9uQ291bnQ7CiAgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbUNvdW50cnlNb2RlOworICAgIHByb3RlY3RlZCBib29sZWFuIG1Jc051bWJlcmluZ01vZGU7CiAgICAgcHJvdGVjdGVkIExheW91dEluZmxhdGVyIG1JbmZsYXRlcjsKIAogICAgIHByb3RlY3RlZCBMb2NhbGUgbURpc3BsYXlMb2NhbGUgPSBudWxsOwpAQCAtODksNiArOTAsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcmluZ1N5c3RlbU1vZGUoYm9vbGVhbiBpc051bWJlclN5c3RlbU1vZGUpIHsKKyAgICAgICAgbUlzTnVtYmVyaW5nTW9kZSA9IGlzTnVtYmVyU3lzdGVtTW9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJc0Zvck51bWJlcmluZ1N5c3RlbSgpIHsKKyAgICAgICAgcmV0dXJuIG1Jc051bWJlcmluZ01vZGU7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYXJlQWxsSXRlbXNFbmFibGVkKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMDksNyArMjE4LDYgQEAKICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwgJiYgbUluZmxhdGVyID09IG51bGwpIHsKICAgICAgICAgICAgIG1JbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20ocGFyZW50LmdldENvbnRleHQoKSk7CiAgICAgICAgIH0KLQogICAgICAgICBpbnQgaXRlbVR5cGUgPSBnZXRJdGVtVmlld1R5cGUocG9zaXRpb24pOwogICAgICAgICBWaWV3IGl0ZW1WaWV3ID0gZ2V0TmV3Vmlld0lmTmVlZGVkKGNvbnZlcnRWaWV3LCBwYXJlbnQsIGl0ZW1UeXBlLCBwb3NpdGlvbik7CiAgICAgICAgIHN3aXRjaCAoaXRlbVR5cGUpIHsKQEAgLTIxNywxMyArMjI1LDEzIEBACiAgICAgICAgICAgICBjYXNlIFRZUEVfSEVBREVSX0FMTF9PVEhFUlM6CiAgICAgICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIGl0ZW1WaWV3OwogICAgICAgICAgICAgICAgIGlmIChpdGVtVHlwZSA9PSBUWVBFX0hFQURFUl9TVUdHRVNURUQpIHsKLSAgICAgICAgICAgICAgICAgICBpZiAobUNvdW50cnlNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ291bnRyeU1vZGUgJiYgIW1Jc051bWJlcmluZ01vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRleHRUbyh0ZXh0VmlldywgUi5zdHJpbmcubGFuZ3VhZ2VfcGlja2VyX3JlZ2lvbnNfc2VjdGlvbl9zdWdnZXN0ZWQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGV4dFRvKHRleHRWaWV3LCBSLnN0cmluZy5sYW5ndWFnZV9waWNrZXJfc2VjdGlvbl9zdWdnZXN0ZWQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Db3VudHJ5TW9kZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUNvdW50cnlNb2RlICYmICFtSXNOdW1iZXJpbmdNb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUZXh0VG8odGV4dFZpZXcsIFIuc3RyaW5nLnJlZ2lvbl9waWNrZXJfc2VjdGlvbl9hbGwpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGV4dFRvKHRleHRWaWV3LCBSLnN0cmluZy5sYW5ndWFnZV9waWNrZXJfc2VjdGlvbl9hbGwpOwpAQCAtNDE5LDkgKzQyNywxMSBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRleHRWaWV3KFZpZXcgY29udmVydFZpZXcsIFRleHRWaWV3IHRleHQsIGludCBwb3NpdGlvbikgewogICAgICAgICBMb2NhbGVTdG9yZS5Mb2NhbGVJbmZvIGl0ZW0gPSAoTG9jYWxlU3RvcmUuTG9jYWxlSW5mbykgZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgIHRleHQuc2V0VGV4dChpdGVtLmdldExhYmVsKG1Db3VudHJ5TW9kZSkpOworICAgICAgICB0ZXh0LnNldFRleHQobUlzTnVtYmVyaW5nTW9kZQorICAgICAgICAgICAgICAgID8gaXRlbS5nZXROdW1iZXJpbmdTeXN0ZW0oKSA6IGl0ZW0uZ2V0TGFiZWwobUNvdW50cnlNb2RlKSk7CiAgICAgICAgIHRleHQuc2V0VGV4dExvY2FsZShpdGVtLmdldExvY2FsZSgpKTsKLSAgICAgICAgdGV4dC5zZXRDb250ZW50RGVzY3JpcHRpb24oaXRlbS5nZXRDb250ZW50RGVzY3JpcHRpb24obUNvdW50cnlNb2RlKSk7CisgICAgICAgIHRleHQuc2V0Q29udGVudERlc2NyaXB0aW9uKG1Jc051bWJlcmluZ01vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgID8gaXRlbS5nZXROdW1iZXJpbmdTeXN0ZW0oKSA6IGl0ZW0uZ2V0Q29udGVudERlc2NyaXB0aW9uKG1Db3VudHJ5TW9kZSkpOwogICAgICAgICBpZiAobUNvdW50cnlNb2RlKSB7CiAgICAgICAgICAgICBpbnQgbGF5b3V0RGlyID0gVGV4dFV0aWxzLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoaXRlbS5nZXRQYXJlbnQoKSk7CiAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBSZXNvdXJjZVR5cGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL0R1bXBVdGlscy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvRHVtcFV0aWxzLmphdmEKaW5kZXggYmNlMGQ2MC4uZjZiY2M0NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvRHVtcFV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvRHVtcFV0aWxzLmphdmEKQEAgLTI3LDEyICsyNywxMiBAQAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5BREpfU0NSRUVOX09GRjsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuQURKX1NDUkVFTl9PTjsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQkFDS1VQOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9CT1VORF9UT1BfT1JfRkdTOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9DQUNIRURfQUNUSVZJVFk7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0NBQ0hFRF9FTVBUWTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQk9VTkRfRkdTOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9CT1VORF9UT1A7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0NBQ0hFRDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQ09VTlQ7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0ZHUzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfRlJPWkVOOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9IRUFWWV9XRUlHSFQ7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0hPTUU7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0lNUE9SVEFOVF9CQUNLR1JPVU5EOwpAQCAtNzIsNyArNzIsOCBAQAogICAgICAgICBTVEFURV9OQU1FUyA9IG5ldyBTdHJpbmdbU1RBVEVfQ09VTlRdOwogICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9QRVJTSVNURU5UXSAgICAgICAgICAgICAgID0gIlBlcnNpc3QiOwogICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9UT1BdICAgICAgICAgICAgICAgICAgICAgID0gIlRvcCI7Ci0gICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0JPVU5EX1RPUF9PUl9GR1NdICAgICAgICAgPSAiQlRvcEZncyI7CisgICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0JPVU5EX0ZHU10gICAgICAgICAgICAgICAgPSAiQkZncyI7CisgICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0JPVU5EX1RPUF0gICAgICAgICAgICAgICAgPSAiQlRvcCI7CiAgICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0ZHU10gICAgICAgICAgICAgICAgICAgICAgPSAiRmdzIjsKICAgICAgICAgU1RBVEVfTkFNRVNbU1RBVEVfSU1QT1JUQU5UX0ZPUkVHUk9VTkRdICAgICA9ICJJbXBGZyI7CiAgICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0lNUE9SVEFOVF9CQUNLR1JPVU5EXSAgICAgPSAiSW1wQmciOwpAQCAtODMsMTQgKzg0LDE0IEBACiAgICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0hFQVZZX1dFSUdIVF0gICAgICAgICAgICAgPSAiSGVhdnlXdCI7CiAgICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0hPTUVdICAgICAgICAgICAgICAgICAgICAgPSAiSG9tZSI7CiAgICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0xBU1RfQUNUSVZJVFldICAgICAgICAgICAgPSAiTGFzdEFjdCI7Ci0gICAgICAgIFNUQVRFX05BTUVTW1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV0gICAgICAgICAgPSAiQ2NoQWN0IjsKLSAgICAgICAgU1RBVEVfTkFNRVNbU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVF0gICA9ICJDY2hDQWN0IjsKLSAgICAgICAgU1RBVEVfTkFNRVNbU1RBVEVfQ0FDSEVEX0VNUFRZXSAgICAgICAgICAgICA9ICJDY2hFbXR5IjsKKyAgICAgICAgU1RBVEVfTkFNRVNbU1RBVEVfQ0FDSEVEXSAgICAgICAgICAgICAgICAgICA9ICJDYWNoZWQiOworICAgICAgICBTVEFURV9OQU1FU1tTVEFURV9GUk9aRU5dICAgICAgICAgICAgICAgICAgID0gIkZyb3plbiI7CiAKICAgICAgICAgU1RBVEVfTEFCRUxTID0gbmV3IFN0cmluZ1tTVEFURV9DT1VOVF07CiAgICAgICAgIFNUQVRFX0xBQkVMU1tTVEFURV9QRVJTSVNURU5UXSAgICAgICAgICAgICAgPSAiUGVyc2lzdGVudCI7CiAgICAgICAgIFNUQVRFX0xBQkVMU1tTVEFURV9UT1BdICAgICAgICAgICAgICAgICAgICAgPSAiICAgICAgIFRvcCI7Ci0gICAgICAgIFNUQVRFX0xBQkVMU1tTVEFURV9CT1VORF9UT1BfT1JfRkdTXSAgICAgICAgPSAiQm5kIFRvcEZncyI7CisgICAgICAgIFNUQVRFX0xBQkVMU1tTVEFURV9CT1VORF9GR1NdICAgICAgICAgICAgICAgPSAiICAgQm5kIEZncyI7CisgICAgICAgIFNUQVRFX0xBQkVMU1tTVEFURV9CT1VORF9UT1BdICAgICAgICAgICAgICAgPSAiICAgQm5kIFRvcCI7CiAgICAgICAgIFNUQVRFX0xBQkVMU1tTVEFURV9GR1NdICAgICAgICAgICAgICAgICAgICAgPSAiICAgICAgIEZncyI7CiAgICAgICAgIFNUQVRFX0xBQkVMU1tTVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORF0gICAgPSAiICAgIEltcCBGZyI7CiAgICAgICAgIFNUQVRFX0xBQkVMU1tTVEFURV9JTVBPUlRBTlRfQkFDS0dST1VORF0gICAgPSAiICAgIEltcCBCZyI7CkBAIC0xMDEsMTYgKzEwMiwxNiBAQAogICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfSEVBVllfV0VJR0hUXSAgICAgICAgICAgID0gIiBIZWF2eSBXZ3QiOwogICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfSE9NRV0gICAgICAgICAgICAgICAgICAgID0gIiAgICAoSG9tZSkiOwogICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfTEFTVF9BQ1RJVklUWV0gICAgICAgICAgID0gIihMYXN0IEFjdCkiOwotICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfQ0FDSEVEX0FDVElWSVRZXSAgICAgICAgID0gIiAoQ2NoIEFjdCkiOwotICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVF0gID0gIihDY2ggQ0FjdCkiOwotICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfQ0FDSEVEX0VNUFRZXSAgICAgICAgICAgID0gIihDY2ggRW10eSkiOworICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfQ0FDSEVEXSAgICAgICAgICAgICAgICAgID0gIiAgKENhY2hlZCkiOworICAgICAgICBTVEFURV9MQUJFTFNbU1RBVEVfRlJPWkVOXSAgICAgICAgICAgICAgICAgID0gIiAgICBGcm96ZW4iOwogICAgICAgICBTVEFURV9MQUJFTF9DQUNIRUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gIiAgKENhY2hlZCkiOwogICAgICAgICBTVEFURV9MQUJFTF9UT1RBTCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gIiAgICAgVE9UQUwiOwogCiAgICAgICAgIFNUQVRFX05BTUVTX0NTViA9IG5ldyBTdHJpbmdbU1RBVEVfQ09VTlRdOwogICAgICAgICBTVEFURV9OQU1FU19DU1ZbU1RBVEVfUEVSU0lTVEVOVF0gICAgICAgICAgICAgICA9ICJwZXJzIjsKICAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX1RPUF0gICAgICAgICAgICAgICAgICAgICAgPSAidG9wIjsKLSAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0JPVU5EX1RPUF9PUl9GR1NdICAgICAgICAgPSAiYnRvcGZncyI7CisgICAgICAgIFNUQVRFX05BTUVTX0NTVltTVEFURV9CT1VORF9GR1NdICAgICAgICAgICAgICAgID0gImJmZ3MiOworICAgICAgICBTVEFURV9OQU1FU19DU1ZbU1RBVEVfQk9VTkRfVE9QXSAgICAgICAgICAgICAgICA9ICJidG9wIjsKICAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0ZHU10gICAgICAgICAgICAgICAgICAgICAgPSAiZmdzIjsKICAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0lNUE9SVEFOVF9GT1JFR1JPVU5EXSAgICAgPSAiaW1wZmciOwogICAgICAgICBTVEFURV9OQU1FU19DU1ZbU1RBVEVfSU1QT1JUQU5UX0JBQ0tHUk9VTkRdICAgICA9ICJpbXBiZyI7CkBAIC0xMjEsMTQgKzEyMiwxNCBAQAogICAgICAgICBTVEFURV9OQU1FU19DU1ZbU1RBVEVfSEVBVllfV0VJR0hUXSAgICAgICAgICAgICA9ICJoZWF2eSI7CiAgICAgICAgIFNUQVRFX05BTUVTX0NTVltTVEFURV9IT01FXSAgICAgICAgICAgICAgICAgICAgID0gImhvbWUiOwogICAgICAgICBTVEFURV9OQU1FU19DU1ZbU1RBVEVfTEFTVF9BQ1RJVklUWV0gICAgICAgICAgICA9ICJsYXN0YWN0IjsKLSAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV0gICAgICAgICAgPSAiY2NoLWFjdGl2aXR5IjsKLSAgICAgICAgU1RBVEVfTkFNRVNfQ1NWW1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlRdICAgPSAiY2NoLWFjbGllbnQiOwotICAgICAgICBTVEFURV9OQU1FU19DU1ZbU1RBVEVfQ0FDSEVEX0VNUFRZXSAgICAgICAgICAgICA9ICJjY2gtZW1wdHkiOworICAgICAgICBTVEFURV9OQU1FU19DU1ZbU1RBVEVfQ0FDSEVEXSAgICAgICAgICAgICAgICAgICA9ICJjYWNoZWQiOworICAgICAgICBTVEFURV9OQU1FU19DU1ZbU1RBVEVfRlJPWkVOXSAgICAgICAgICAgICAgICAgICA9ICJmcnpuIjsKIAogICAgICAgICBTVEFURV9UQUdTID0gbmV3IFN0cmluZ1tTVEFURV9DT1VOVF07CiAgICAgICAgIFNUQVRFX1RBR1NbU1RBVEVfUEVSU0lTVEVOVF0gICAgICAgICAgICAgICAgPSAicCI7CiAgICAgICAgIFNUQVRFX1RBR1NbU1RBVEVfVE9QXSAgICAgICAgICAgICAgICAgICAgICAgPSAidCI7Ci0gICAgICAgIFNUQVRFX1RBR1NbU1RBVEVfQk9VTkRfVE9QX09SX0ZHU10gICAgICAgICAgPSAiZCI7CisgICAgICAgIFNUQVRFX1RBR1NbU1RBVEVfQk9VTkRfRkdTXSAgICAgICAgICAgICAgICAgPSAieSI7CisgICAgICAgIFNUQVRFX1RBR1NbU1RBVEVfQk9VTkRfVE9QXSAgICAgICAgICAgICAgICAgPSAieiI7CiAgICAgICAgIFNUQVRFX1RBR1NbU1RBVEVfRkdTXSAgICAgICAgICAgICAgICAgICAgICAgPSAiZyI7CiAgICAgICAgIFNUQVRFX1RBR1NbU1RBVEVfSU1QT1JUQU5UX0ZPUkVHUk9VTkRdICAgICAgPSAiZiI7CiAgICAgICAgIFNUQVRFX1RBR1NbU1RBVEVfSU1QT1JUQU5UX0JBQ0tHUk9VTkRdICAgICAgPSAiYiI7CkBAIC0xMzksMTUgKzE0MCwxNCBAQAogICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0hFQVZZX1dFSUdIVF0gICAgICAgICAgICAgID0gInciOwogICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0hPTUVdICAgICAgICAgICAgICAgICAgICAgID0gImgiOwogICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0xBU1RfQUNUSVZJVFldICAgICAgICAgICAgID0gImwiOwotICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV0gICAgICAgICAgID0gImEiOwotICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlRdICAgID0gImMiOwotICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0NBQ0hFRF9FTVBUWV0gICAgICAgICAgICAgID0gImUiOworICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0NBQ0hFRF0gICAgICAgICAgICAgICAgICAgID0gImEiOworICAgICAgICBTVEFURV9UQUdTW1NUQVRFX0ZST1pFTl0gICAgICAgICAgICAgICAgICAgID0gImUiOwogCiAgICAgICAgIFNUQVRFX1BST1RPX0VOVU1TID0gbmV3IGludFtTVEFURV9DT1VOVF07CiAgICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX1BFUlNJU1RFTlRdID0gUHJvY2Vzc1N0YXRzRW51bXMuUFJPQ0VTU19TVEFURV9QRVJTSVNURU5UOwogICAgICAgICBTVEFURV9QUk9UT19FTlVNU1tTVEFURV9UT1BdID0gUHJvY2Vzc1N0YXRzRW51bXMuUFJPQ0VTU19TVEFURV9UT1A7Ci0gICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX0JPVU5EX1RPUF9PUl9GR1NdID0KLSAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdHNFbnVtcy5QUk9DRVNTX1NUQVRFX0JPVU5EX1RPUF9PUl9GR1M7CisgICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX0JPVU5EX0ZHU10gPSBQcm9jZXNzU3RhdHNFbnVtcy5QUk9DRVNTX1NUQVRFX0JPVU5EX0ZHUzsKKyAgICAgICAgU1RBVEVfUFJPVE9fRU5VTVNbU1RBVEVfQk9VTkRfVE9QXSA9IFByb2Nlc3NTdGF0c0VudW1zLlBST0NFU1NfU1RBVEVfQk9VTkRfVE9QOwogICAgICAgICBTVEFURV9QUk9UT19FTlVNU1tTVEFURV9GR1NdID0gUHJvY2Vzc1N0YXRzRW51bXMuUFJPQ0VTU19TVEFURV9GR1M7CiAgICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX0lNUE9SVEFOVF9GT1JFR1JPVU5EXSA9CiAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRzRW51bXMuUFJPQ0VTU19TVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORDsKQEAgLTE2MSwxMCArMTYxLDggQEAKICAgICAgICAgU1RBVEVfUFJPVE9fRU5VTVNbU1RBVEVfSEVBVllfV0VJR0hUXSA9IFByb2Nlc3NTdGF0c0VudW1zLlBST0NFU1NfU1RBVEVfSEVBVllfV0VJR0hUOwogICAgICAgICBTVEFURV9QUk9UT19FTlVNU1tTVEFURV9IT01FXSA9IFByb2Nlc3NTdGF0c0VudW1zLlBST0NFU1NfU1RBVEVfSE9NRTsKICAgICAgICAgU1RBVEVfUFJPVE9fRU5VTVNbU1RBVEVfTEFTVF9BQ1RJVklUWV0gPSBQcm9jZXNzU3RhdHNFbnVtcy5QUk9DRVNTX1NUQVRFX0xBU1RfQUNUSVZJVFk7Ci0gICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX0NBQ0hFRF9BQ1RJVklUWV0gPSBQcm9jZXNzU3RhdHNFbnVtcy5QUk9DRVNTX1NUQVRFX0NBQ0hFRF9BQ1RJVklUWTsKLSAgICAgICAgU1RBVEVfUFJPVE9fRU5VTVNbU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVF0gPQotICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0c0VudW1zLlBST0NFU1NfU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVDsKLSAgICAgICAgU1RBVEVfUFJPVE9fRU5VTVNbU1RBVEVfQ0FDSEVEX0VNUFRZXSA9IFByb2Nlc3NTdGF0c0VudW1zLlBST0NFU1NfU1RBVEVfQ0FDSEVEX0VNUFRZOworICAgICAgICBTVEFURV9QUk9UT19FTlVNU1tTVEFURV9DQUNIRURdID0gUHJvY2Vzc1N0YXRzRW51bXMuUFJPQ0VTU19TVEFURV9DQUNIRURfQUNUSVZJVFk7CisgICAgICAgIFNUQVRFX1BST1RPX0VOVU1TW1NUQVRFX0ZST1pFTl0gPSBQcm9jZXNzU3RhdHNFbnVtcy5QUk9DRVNTX1NUQVRFX0ZST1pFTjsKIAogICAgICAgICAvLyBSZW1hcCBzdGF0ZXMsIGFzIGRlZmluZWQgYnkgUHJvY2Vzc1N0YXRzLmphdmEsIHRvIGEgcmVkdWNlZCBzdWJzZXQgb2Ygc3RhdGVzIGZvciBkYXRhCiAgICAgICAgIC8vIGFnZ3JlZ2F0aW9uIC8gc2l6ZSByZWR1Y3Rpb24gcHVycG9zZXMuCkBAIC0xNzMsNyArMTcxLDkgQEAKICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdHNFbnVtcy5BR0dSRUdBVEVEX1BST0NFU1NfU1RBVEVfUEVSU0lTVEVOVDsKICAgICAgICAgUFJPQ0VTU19TVEFUU19TVEFURV9UT19BR0dSRUdBVEVEX1NUQVRFW1NUQVRFX1RPUF0gPQogICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0c0VudW1zLkFHR1JFR0FURURfUFJPQ0VTU19TVEFURV9UT1A7Ci0gICAgICAgIFBST0NFU1NfU1RBVFNfU1RBVEVfVE9fQUdHUkVHQVRFRF9TVEFURVtTVEFURV9CT1VORF9UT1BfT1JfRkdTXSA9CisgICAgICAgIFBST0NFU1NfU1RBVFNfU1RBVEVfVE9fQUdHUkVHQVRFRF9TVEFURVtTVEFURV9CT1VORF9GR1NdID0KKyAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdHNFbnVtcy5BR0dSRUdBVEVEX1BST0NFU1NfU1RBVEVfQk9VTkRfVE9QX09SX0ZHUzsKKyAgICAgICAgUFJPQ0VTU19TVEFUU19TVEFURV9UT19BR0dSRUdBVEVEX1NUQVRFW1NUQVRFX0JPVU5EX1RPUF0gPQogICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0c0VudW1zLkFHR1JFR0FURURfUFJPQ0VTU19TVEFURV9CT1VORF9UT1BfT1JfRkdTOwogICAgICAgICBQUk9DRVNTX1NUQVRTX1NUQVRFX1RPX0FHR1JFR0FURURfU1RBVEVbU1RBVEVfRkdTXSA9CiAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRzRW51bXMuQUdHUkVHQVRFRF9QUk9DRVNTX1NUQVRFX0ZHUzsKQEAgLTE5NiwxMSArMTk2LDkgQEAKICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdHNFbnVtcy5BR0dSRUdBVEVEX1BST0NFU1NfU1RBVEVfQ0FDSEVEOwogICAgICAgICBQUk9DRVNTX1NUQVRTX1NUQVRFX1RPX0FHR1JFR0FURURfU1RBVEVbU1RBVEVfTEFTVF9BQ1RJVklUWV0gPQogICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0c0VudW1zLkFHR1JFR0FURURfUFJPQ0VTU19TVEFURV9DQUNIRUQ7Ci0gICAgICAgIFBST0NFU1NfU1RBVFNfU1RBVEVfVE9fQUdHUkVHQVRFRF9TVEFURVtTVEFURV9DQUNIRURfQUNUSVZJVFldID0KKyAgICAgICAgUFJPQ0VTU19TVEFUU19TVEFURV9UT19BR0dSRUdBVEVEX1NUQVRFW1NUQVRFX0NBQ0hFRF0gPQogICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0c0VudW1zLkFHR1JFR0FURURfUFJPQ0VTU19TVEFURV9DQUNIRUQ7Ci0gICAgICAgIFBST0NFU1NfU1RBVFNfU1RBVEVfVE9fQUdHUkVHQVRFRF9TVEFURVtTVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5UXSA9Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRzRW51bXMuQUdHUkVHQVRFRF9QUk9DRVNTX1NUQVRFX0NBQ0hFRDsKLSAgICAgICAgUFJPQ0VTU19TVEFUU19TVEFURV9UT19BR0dSRUdBVEVEX1NUQVRFW1NUQVRFX0NBQ0hFRF9FTVBUWV0gPQorICAgICAgICBQUk9DRVNTX1NUQVRTX1NUQVRFX1RPX0FHR1JFR0FURURfU1RBVEVbU1RBVEVfRlJPWkVOXSA9CiAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRzRW51bXMuQUdHUkVHQVRFRF9QUk9DRVNTX1NUQVRFX0NBQ0hFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL1Byb2Nlc3NTdGF0ZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvUHJvY2Vzc1N0YXRlLmphdmEKaW5kZXggODE4YTUwMy4uZmZmNzc4YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvUHJvY2Vzc1N0YXRlLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvUHJvY2Vzc1N0YXRlLmphdmEKQEAgLTI4LDEwICsyOCw5IEBACiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlBTU19VU1NfTUFYSU1VTTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuUFNTX1VTU19NSU5JTVVNOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9CQUNLVVA7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0JPVU5EX1RPUF9PUl9GR1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0NBQ0hFRF9BQ1RJVklUWTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQ0FDSEVEX0VNUFRZOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9CT1VORF9GR1M7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5wcm9jc3RhdHMuUHJvY2Vzc1N0YXRzLlNUQVRFX0JPVU5EX1RPUDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfQ0FDSEVEOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9DT1VOVDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLnByb2NzdGF0cy5Qcm9jZXNzU3RhdHMuU1RBVEVfRkdTOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAucHJvY3N0YXRzLlByb2Nlc3NTdGF0cy5TVEFURV9IRUFWWV9XRUlHSFQ7CkBAIC04NSw5ICs4NCw5IEBACiAgICAgICAgIFNUQVRFX1BFUlNJU1RFTlQsICAgICAgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfUEVSU0lTVEVOVAogICAgICAgICBTVEFURV9QRVJTSVNURU5ULCAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlRfVUkKICAgICAgICAgU1RBVEVfVE9QLCAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9UT1AKLSAgICAgICAgU1RBVEVfQk9VTkRfVE9QX09SX0ZHUywgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9CT1VORF9UT1AKKyAgICAgICAgU1RBVEVfQk9VTkRfVE9QLCAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9CT1VORF9UT1AKICAgICAgICAgU1RBVEVfRkdTLCAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9GT1JFR1JPVU5EX1NFUlZJQ0UKLSAgICAgICAgU1RBVEVfQk9VTkRfVE9QX09SX0ZHUywgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9CT1VORF9GT1JFR1JPVU5EX1NFUlZJQ0UKKyAgICAgICAgU1RBVEVfQk9VTkRfRkdTLCAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9CT1VORF9GT1JFR1JPVU5EX1NFUlZJQ0UKICAgICAgICAgU1RBVEVfSU1QT1JUQU5UX0ZPUkVHUk9VTkQsICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORAogICAgICAgICBTVEFURV9JTVBPUlRBTlRfQkFDS0dST1VORCwgICAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX0lNUE9SVEFOVF9CQUNLR1JPVU5ECiAgICAgICAgIFNUQVRFX0lNUE9SVEFOVF9CQUNLR1JPVU5ELCAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfVFJBTlNJRU5UX0JBQ0tHUk9VTkQKQEAgLTk4LDEwICs5NywxMCBAQAogICAgICAgICBTVEFURV9IRUFWWV9XRUlHSFQsICAgICAgICAgICAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX0hFQVZZX1dFSUdIVAogICAgICAgICBTVEFURV9IT01FLCAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX0hPTUUKICAgICAgICAgU1RBVEVfTEFTVF9BQ1RJVklUWSwgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9MQVNUX0FDVElWSVRZCi0gICAgICAgIFNUQVRFX0NBQ0hFRF9BQ1RJVklUWSwgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQ0FDSEVEX0FDVElWSVRZCi0gICAgICAgIFNUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlQsICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVAotICAgICAgICBTVEFURV9DQUNIRURfQUNUSVZJVFksICAgICAgICAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX0NBQ0hFRF9SRUNFTlQKLSAgICAgICAgU1RBVEVfQ0FDSEVEX0VNUFRZLCAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9DQUNIRURfRU1QVFkKKyAgICAgICAgU1RBVEVfQ0FDSEVELCAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9DQUNIRURfQUNUSVZJVFkKKyAgICAgICAgU1RBVEVfQ0FDSEVELCAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eU1hbmFnZXIuUFJPQ0VTU19TVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5UCisgICAgICAgIFNUQVRFX0NBQ0hFRCwgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQ0FDSEVEX1JFQ0VOVAorICAgICAgICBTVEFURV9DQUNIRUQsICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX0NBQ0hFRF9FTVBUWQogICAgIH07CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8UHJvY2Vzc1N0YXRlPiBDT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8UHJvY2Vzc1N0YXRlPigpIHsKQEAgLTkyNiw4ICs5MjUsMTEgQEAKICAgICAgICAgICAgICAgICBzY3JlZW5TdGF0ZXMsIG1lbVN0YXRlcywgbmV3IGludFtdIHsgU1RBVEVfUEVSU0lTVEVOVCB9LCBub3csIHRvdGFsVGltZSwgdHJ1ZSk7CiAgICAgICAgIGR1bXBQcm9jZXNzU3VtbWFyeURldGFpbHMocHcsIHByZWZpeCwgRHVtcFV0aWxzLlNUQVRFX0xBQkVMU1tTVEFURV9UT1BdLAogICAgICAgICAgICAgICAgIHNjcmVlblN0YXRlcywgbWVtU3RhdGVzLCBuZXcgaW50W10ge1NUQVRFX1RPUH0sIG5vdywgdG90YWxUaW1lLCB0cnVlKTsKLSAgICAgICAgZHVtcFByb2Nlc3NTdW1tYXJ5RGV0YWlscyhwdywgcHJlZml4LCBEdW1wVXRpbHMuU1RBVEVfTEFCRUxTW1NUQVRFX0JPVU5EX1RPUF9PUl9GR1NdLAotICAgICAgICAgICAgICAgIHNjcmVlblN0YXRlcywgbWVtU3RhdGVzLCBuZXcgaW50W10geyBTVEFURV9CT1VORF9UT1BfT1JfRkdTfSwgbm93LCB0b3RhbFRpbWUsCisgICAgICAgIGR1bXBQcm9jZXNzU3VtbWFyeURldGFpbHMocHcsIHByZWZpeCwgRHVtcFV0aWxzLlNUQVRFX0xBQkVMU1tTVEFURV9CT1VORF9UT1BdLAorICAgICAgICAgICAgICAgIHNjcmVlblN0YXRlcywgbWVtU3RhdGVzLCBuZXcgaW50W10geyBTVEFURV9CT1VORF9UT1AgfSwgbm93LCB0b3RhbFRpbWUsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIGR1bXBQcm9jZXNzU3VtbWFyeURldGFpbHMocHcsIHByZWZpeCwgRHVtcFV0aWxzLlNUQVRFX0xBQkVMU1tTVEFURV9CT1VORF9GR1NdLAorICAgICAgICAgICAgICAgIHNjcmVlblN0YXRlcywgbWVtU3RhdGVzLCBuZXcgaW50W10geyBTVEFURV9CT1VORF9GR1MgfSwgbm93LCB0b3RhbFRpbWUsCiAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICAgIGR1bXBQcm9jZXNzU3VtbWFyeURldGFpbHMocHcsIHByZWZpeCwgRHVtcFV0aWxzLlNUQVRFX0xBQkVMU1tTVEFURV9GR1NdLAogICAgICAgICAgICAgICAgIHNjcmVlblN0YXRlcywgbWVtU3RhdGVzLCBuZXcgaW50W10geyBTVEFURV9GR1N9LCBub3csIHRvdGFsVGltZSwKQEAgLTk1Myw5ICs5NTUsNiBAQAogICAgICAgICAgICAgICAgIHNjcmVlblN0YXRlcywgbWVtU3RhdGVzLCBuZXcgaW50W10ge1NUQVRFX0hPTUV9LCBub3csIHRvdGFsVGltZSwgdHJ1ZSk7CiAgICAgICAgIGR1bXBQcm9jZXNzU3VtbWFyeURldGFpbHMocHcsIHByZWZpeCwgRHVtcFV0aWxzLlNUQVRFX0xBQkVMU1tTVEFURV9MQVNUX0FDVElWSVRZXSwKICAgICAgICAgICAgICAgICBzY3JlZW5TdGF0ZXMsIG1lbVN0YXRlcywgbmV3IGludFtdIHtTVEFURV9MQVNUX0FDVElWSVRZfSwgbm93LCB0b3RhbFRpbWUsIHRydWUpOwotICAgICAgICBkdW1wUHJvY2Vzc1N1bW1hcnlEZXRhaWxzKHB3LCBwcmVmaXgsIER1bXBVdGlscy5TVEFURV9MQUJFTF9DQUNIRUQsCi0gICAgICAgICAgICAgICAgc2NyZWVuU3RhdGVzLCBtZW1TdGF0ZXMsIG5ldyBpbnRbXSB7U1RBVEVfQ0FDSEVEX0FDVElWSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgU1RBVEVfQ0FDSEVEX0FDVElWSVRZX0NMSUVOVCwgU1RBVEVfQ0FDSEVEX0VNUFRZfSwgbm93LCB0b3RhbFRpbWUsIHRydWUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGR1bXBQcm9jZXNzU3RhdGUoUHJpbnRXcml0ZXIgcHcsIFN0cmluZyBwcmVmaXgsCkBAIC0xNTYzLDcgKzE1NjIsMTAgQEAKICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1RPUDoKICAgICAgICAgICAgICAgICAgICAgdG9wTXMgKz0gZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQk9VTkRfVE9QX09SX0ZHUzoKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0JPVU5EX0ZHUzoKKyAgICAgICAgICAgICAgICAgICAgYm91bmRGZ3NNcyArPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9CT1VORF9UT1A6CiAgICAgICAgICAgICAgICAgICAgIGJvdW5kVG9wTXMgKz0gZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRkdTOgpAQCAtMTU4MywxMyArMTU4NSwxMCBAQAogICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUEVSU0lTVEVOVDoKICAgICAgICAgICAgICAgICAgICAgb3RoZXJNcyArPSBkdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DQUNIRURfQUNUSVZJVFk6Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5UOgotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ0FDSEVEX0VNUFRZOgorICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ0FDSEVEOgogICAgICAgICAgICAgICAgICAgICBjYWNoZWRNcyArPSBkdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gKGIvMjYxOTEwODc3KSBBZGQgc3VwcG9ydCBmb3IgdHJhY2tpbmcgYm91bmRGZ3NNcyBhbmQKLSAgICAgICAgICAgICAgICAgICAgLy8gZnJvemVuTXMuCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gKGIvMjYxOTEwODc3KSBBZGQgc3VwcG9ydCBmb3IgdHJhY2tpbmcgZnJvemVuTXMuCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc3RhdHNFdmVudE91dHB1dC53cml0ZSgKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL1Byb2Nlc3NTdGF0cy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvUHJvY2Vzc1N0YXRzLmphdmEKaW5kZXggZjNlZDA5YS4uM2NlMjM0YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvUHJvY2Vzc1N0YXRzLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvUHJvY2Vzc1N0YXRzLmphdmEKQEAgLTgxLDIxICs4MSwyMSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX05PVEhJTkcgPSAtMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9QRVJTSVNURU5UID0gMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9UT1AgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0JPVU5EX1RPUF9PUl9GR1MgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0JPVU5EX1RPUCA9IDI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRkdTID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTVBPUlRBTlRfRk9SRUdST1VORCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU1QT1JUQU5UX0JBQ0tHUk9VTkQgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0JBQ0tVUCA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VSVklDRSA9IDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VSVklDRV9SRVNUQVJUSU5HID0gODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9SRUNFSVZFUiA9IDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSEVBVllfV0VJR0hUID0gMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSE9NRSA9IDExOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0xBU1RfQUNUSVZJVFkgPSAxMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DQUNIRURfQUNUSVZJVFkgPSAxMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DQUNIRURfQUNUSVZJVFlfQ0xJRU5UID0gMTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ0FDSEVEX0VNUFRZID0gMTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09VTlQgPSBTVEFURV9DQUNIRURfRU1QVFkrMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9CT1VORF9GR1MgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lNUE9SVEFOVF9GT1JFR1JPVU5EID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTVBPUlRBTlRfQkFDS0dST1VORCA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQkFDS1VQID0gNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRVJWSUNFID0gODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRVJWSUNFX1JFU1RBUlRJTkcgPSA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1JFQ0VJVkVSID0gMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSEVBVllfV0VJR0hUID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSE9NRSA9IDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0xBU1RfQUNUSVZJVFkgPSAxMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DQUNIRUQgPSAxNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9GUk9aRU4gPSAxNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT1VOVCA9IFNUQVRFX0ZST1pFTiArIDE7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQU1NfU0FNUExFX0NPVU5UID0gMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQU1NfTUlOSU1VTSA9IDE7CkBAIC0xNTQsOSArMTU0LDEwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBTExfU0NSRUVOX0FESiA9IG5ldyBpbnRbXSB7IEFESl9TQ1JFRU5fT0ZGLCBBREpfU0NSRUVOX09OIH07CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIE5PTl9DQUNIRURfUFJPQ19TVEFURVMgPSBuZXcgaW50W10gewotICAgICAgICAgICAgU1RBVEVfUEVSU0lTVEVOVCwgU1RBVEVfVE9QLCBTVEFURV9CT1VORF9UT1BfT1JfRkdTLCBTVEFURV9GR1MsCisgICAgICAgICAgICBTVEFURV9QRVJTSVNURU5ULCBTVEFURV9UT1AsIFNUQVRFX0ZHUywKICAgICAgICAgICAgIFNUQVRFX0lNUE9SVEFOVF9GT1JFR1JPVU5ELCBTVEFURV9JTVBPUlRBTlRfQkFDS0dST1VORCwgU1RBVEVfQkFDS1VQLAotICAgICAgICAgICAgU1RBVEVfU0VSVklDRSwgU1RBVEVfU0VSVklDRV9SRVNUQVJUSU5HLCBTVEFURV9SRUNFSVZFUiwgU1RBVEVfSEVBVllfV0VJR0hUCisgICAgICAgICAgICBTVEFURV9TRVJWSUNFLCBTVEFURV9TRVJWSUNFX1JFU1RBUlRJTkcsIFNUQVRFX1JFQ0VJVkVSLCBTVEFURV9IRUFWWV9XRUlHSFQsCisgICAgICAgICAgICBTVEFURV9CT1VORF9UT1AsIFNUQVRFX0JPVU5EX0ZHUwogICAgIH07CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIEJBQ0tHUk9VTkRfUFJPQ19TVEFURVMgPSBuZXcgaW50W10gewpAQCAtMTY1LDExICsxNjYsMTEgQEAKICAgICB9OwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBBTExfUFJPQ19TVEFURVMgPSBuZXcgaW50W10geyBTVEFURV9QRVJTSVNURU5ULAotICAgICAgICAgICAgU1RBVEVfVE9QLCBTVEFURV9CT1VORF9UT1BfT1JfRkdTLCBTVEFURV9GR1MsIFNUQVRFX0lNUE9SVEFOVF9GT1JFR1JPVU5ELAorICAgICAgICAgICAgU1RBVEVfVE9QLCBTVEFURV9GR1MsIFNUQVRFX0lNUE9SVEFOVF9GT1JFR1JPVU5ELAogICAgICAgICAgICAgU1RBVEVfSU1QT1JUQU5UX0JBQ0tHUk9VTkQsIFNUQVRFX0JBQ0tVUCwKICAgICAgICAgICAgIFNUQVRFX1NFUlZJQ0UsIFNUQVRFX1NFUlZJQ0VfUkVTVEFSVElORywgU1RBVEVfUkVDRUlWRVIsCi0gICAgICAgICAgICBTVEFURV9IRUFWWV9XRUlHSFQsIFNUQVRFX0hPTUUsIFNUQVRFX0xBU1RfQUNUSVZJVFksIFNUQVRFX0NBQ0hFRF9BQ1RJVklUWSwKLSAgICAgICAgICAgIFNUQVRFX0NBQ0hFRF9BQ1RJVklUWV9DTElFTlQsIFNUQVRFX0NBQ0hFRF9FTVBUWQorICAgICAgICAgICAgU1RBVEVfSEVBVllfV0VJR0hULCBTVEFURV9IT01FLCBTVEFURV9MQVNUX0FDVElWSVRZLCBTVEFURV9DQUNIRUQsCisgICAgICAgICAgICBTVEFURV9CT1VORF9UT1AsIFNUQVRFX0JPVU5EX0ZHUywgU1RBVEVfRlJPWkVOCiAgICAgfTsKIAogICAgIC8vIFNob3VsZCByZXBvcnQgcHJvY2VzcyBzdGF0cy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9qYW5rL0ludGVyYWN0aW9uSmFua01vbml0b3IuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9qYW5rL0ludGVyYWN0aW9uSmFua01vbml0b3IuamF2YQppbmRleCA3YWU2M2IxLi45MjhhMDk3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvamFuay9JbnRlcmFjdGlvbkphbmtNb25pdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2phbmsvSW50ZXJhY3Rpb25KYW5rTW9uaXRvci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfREVWSUNFX0NPTkZJRzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuTkFNRVNQQUNFX0lOVEVSQUNUSU9OX0pBTktfTU9OSVRPUjsKIAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5qYW5rLkZyYW1lVHJhY2tlci5SRUFTT05fQ0FOQ0VMX05PUk1BTDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuamFuay5GcmFtZVRyYWNrZXIuUkVBU09OX0NBTkNFTF9USU1FT1VUOwpAQCAtNDQ4LDE3ICs0NDksNyBAQAogICAgICAgICBtRW5hYmxlZCA9IERFRkFVTFRfRU5BQkxFRDsKIAogICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50QXBwbGljYXRpb24oKTsKLSAgICAgICAgaWYgKGNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihSRUFEX0RFVklDRV9DT05GSUcpID09IFBFUk1JU1NJT05fR1JBTlRFRCkgewotICAgICAgICAgICAgLy8gUG9zdCBpbml0aWFsaXphdGlvbiB0byB0aGUgYmFja2dyb3VuZCBpbiBjYXNlIHdlJ3JlIHJ1bm5pbmcgb24gdGhlIG1haW4gdGhyZWFkLgotICAgICAgICAgICAgbVdvcmtlci5nZXRUaHJlYWRIYW5kbGVyKCkucG9zdCgKLSAgICAgICAgICAgICAgICAgICAgKCkgLT4gbVByb3BlcnRpZXNDaGFuZ2VkTGlzdGVuZXIub25Qcm9wZXJ0aWVzQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUNvbmZpZy5OQU1FU1BBQ0VfSU5URVJBQ1RJT05fSkFOS19NT05JVE9SKSkpOwotICAgICAgICAgICAgRGV2aWNlQ29uZmlnLmFkZE9uUHJvcGVydGllc0NoYW5nZWRMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgRGV2aWNlQ29uZmlnLk5BTUVTUEFDRV9JTlRFUkFDVElPTl9KQU5LX01PTklUT1IsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBIYW5kbGVyRXhlY3V0b3IobVdvcmtlci5nZXRUaHJlYWRIYW5kbGVyKCkpLAotICAgICAgICAgICAgICAgICAgICBtUHJvcGVydGllc0NoYW5nZWRMaXN0ZW5lcik7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjb250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oUkVBRF9ERVZJQ0VfQ09ORklHKSAhPSBQRVJNSVNTSU9OX0dSQU5URUQpIHsKICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkluaXRpYWxpemVkIHRoZSBJbnRlcmFjdGlvbkphbmtNb25pdG9yLiIKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoTm8gUkVBRF9ERVZJQ0VfQ09ORklHIHBlcm1pc3Npb24gdG8gY2hhbmdlIGNvbmZpZ3MpIgpAQCAtNDY3LDcgKzQ1OCwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBmcmFtZVRpbWVUaHJlc2hvbGQ9IiArIG1UcmFjZVRocmVzaG9sZEZyYW1lVGltZU1pbGxpcwogICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBwYWNrYWdlPSIgKyBjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKKyAgICAgICAgLy8gUG9zdCBpbml0aWFsaXphdGlvbiB0byB0aGUgYmFja2dyb3VuZCBpbiBjYXNlIHdlJ3JlIHJ1bm5pbmcgb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAgICBtV29ya2VyLmdldFRocmVhZEhhbmRsZXIoKS5wb3N0KAorICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9wZXJ0aWVzQ2hhbmdlZExpc3RlbmVyLm9uUHJvcGVydGllc0NoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKE5BTUVTUEFDRV9JTlRFUkFDVElPTl9KQU5LX01PTklUT1IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUNvbmZpZy5hZGRPblByb3BlcnRpZXNDaGFuZ2VkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVTUEFDRV9JTlRFUkFDVElPTl9KQU5LX01PTklUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYW5kbGVyRXhlY3V0b3IobVdvcmtlci5nZXRUaHJlYWRIYW5kbGVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvcGVydGllc0NoYW5nZWRMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDYW4ndCBnZXQgcHJvcGVydGllczogUkVBRF9ERVZJQ0VfQ09ORklHIGdyYW50ZWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihSRUFEX0RFVklDRV9DT05GSUcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcGFja2FnZT0iICsgY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKaW5kZXggMDc2ZTRlMS4uMTUwNWNjYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCkBAIC0xODUsOCArMTg1LDEzIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVsb2FkU2hhcmVkTGlicmFyaWVzKCkgewogICAgICAgICBMb2cuaShUQUcsICJQcmVsb2FkaW5nIHNoYXJlZCBsaWJyYXJpZXMuLi4iKTsKICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJhbmRyb2lkIik7Ci0gICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiY29tcGlsZXJfcnQiKTsKICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJqbmlncmFwaGljcyIpOworCisgICAgICAgIC8vIFRPRE8oYi8yMDY2NzYxNjcpOiBUaGlzIGxpYnJhcnkgaXMgb25seSB1c2VkIGZvciByZW5kZXJzY3JpcHQgdG9kYXkuIFdoZW4gcmVuZGVyc2NyaXB0IGlzCisgICAgICAgIC8vIHJlbW92ZWQsIHRoaXMgbG9hZCBjYW4gYmUgcmVtb3ZlZCBhcyB3ZWxsLgorICAgICAgICBpZiAoIVN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigiY29uZmlnLmRpc2FibGVfcmVuZGVyc2NyaXB0IiwgZmFsc2UpKSB7CisgICAgICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImNvbXBpbGVyX3J0Iik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgdm9pZCBuYXRpdmVQcmVsb2FkQXBwUHJvY2Vzc0hBTHMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1NjcmVlbnNob3RIZWxwZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1NjcmVlbnNob3RIZWxwZXIuamF2YQppbmRleCAzYTM5M2I2Li42OWQzZDZhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9TY3JlZW5zaG90SGVscGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvU2NyZWVuc2hvdEhlbHBlci5qYXZhCkBAIC0xOTUsNiArMTk1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUuQ1VSUkVOVCkpIHsKICAgICAgICAgICAgICAgICAgICAgbVNjcmVlbnNob3RDb25uZWN0aW9uID0gY29ubjsKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5wb3N0RGVsYXllZChtU2NyZWVuc2hvdFRpbWVvdXQsIHRpbWVvdXRNcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZShjb25uKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIE1lc3NlbmdlciBtZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1TY3JlZW5zaG90U2VydmljZSk7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfRGlzcGxheUV2ZW50UmVjZWl2ZXIuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0Rpc3BsYXlFdmVudFJlY2VpdmVyLmNwcAppbmRleCA3MzkwNTVlLi4wYzNmZjZjIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfRGlzcGxheUV2ZW50UmVjZWl2ZXIuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19EaXNwbGF5RXZlbnRSZWNlaXZlci5jcHAKQEAgLTE2OSwyMSArMTY5LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdEaXNwbGF5RXZlbnRSZWNlaXZlckNsYXNzSW5mby52c3luY0V2ZW50RGF0YUNsYXNzSW5mby5mcmFtZUludGVydmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2c3luY0V2ZW50RGF0YS5mcmFtZUludGVydmFsKTsKIAotICAgICAgICBqb2JqZWN0QXJyYXkgZnJhbWVUaW1lbGluZXNPYmogPSByZWludGVycHJldF9jYXN0PGpvYmplY3RBcnJheT4oCi0gICAgICAgICAgICAgICAgZW52LT5HZXRPYmplY3RGaWVsZCh2c3luY0V2ZW50RGF0YU9iai5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdEaXNwbGF5RXZlbnRSZWNlaXZlckNsYXNzSW5mby52c3luY0V2ZW50RGF0YUNsYXNzSW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWVUaW1lbGluZXMpKTsKKyAgICAgICAgU2NvcGVkTG9jYWxSZWY8am9iamVjdEFycmF5PgorICAgICAgICAgICAgICAgIGZyYW1lVGltZWxpbmVzT2JqKGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGpvYmplY3RBcnJheT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPkdldE9iamVjdEZpZWxkKHZzeW5jRXZlbnREYXRhT2JqLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRGlzcGxheUV2ZW50UmVjZWl2ZXJDbGFzc0luZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudnN5bmNFdmVudERhdGFDbGFzc0luZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJhbWVUaW1lbGluZXMpKSk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVnN5bmNFdmVudERhdGE6OmtGcmFtZVRpbWVsaW5lc0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBWc3luY0V2ZW50RGF0YTo6RnJhbWVUaW1lbGluZSYgZnJhbWVUaW1lbGluZSA9IHZzeW5jRXZlbnREYXRhLmZyYW1lVGltZWxpbmVzW2ldOwotICAgICAgICAgICAgam9iamVjdCBmcmFtZVRpbWVsaW5lT2JqID0gZW52LT5HZXRPYmplY3RBcnJheUVsZW1lbnQoZnJhbWVUaW1lbGluZXNPYmosIGkpOwotICAgICAgICAgICAgZW52LT5TZXRMb25nRmllbGQoZnJhbWVUaW1lbGluZU9iaiwKKyAgICAgICAgICAgIFNjb3BlZExvY2FsUmVmPGpvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgIGZyYW1lVGltZWxpbmVPYmooZW52LCBlbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChmcmFtZVRpbWVsaW5lc09iai5nZXQoKSwgaSkpOworICAgICAgICAgICAgZW52LT5TZXRMb25nRmllbGQoZnJhbWVUaW1lbGluZU9iai5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdEaXNwbGF5RXZlbnRSZWNlaXZlckNsYXNzSW5mby5mcmFtZVRpbWVsaW5lQ2xhc3NJbmZvLnZzeW5jSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVsaW5lLnZzeW5jSWQpOwotICAgICAgICAgICAgZW52LT5TZXRMb25nRmllbGQoZnJhbWVUaW1lbGluZU9iaiwKKyAgICAgICAgICAgIGVudi0+U2V0TG9uZ0ZpZWxkKGZyYW1lVGltZWxpbmVPYmouZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRGlzcGxheUV2ZW50UmVjZWl2ZXJDbGFzc0luZm8uZnJhbWVUaW1lbGluZUNsYXNzSW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhwZWN0ZWRQcmVzZW50YXRpb25UaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUaW1lbGluZS5leHBlY3RlZFByZXNlbnRhdGlvblRpbWUpOwotICAgICAgICAgICAgZW52LT5TZXRMb25nRmllbGQoZnJhbWVUaW1lbGluZU9iaiwKKyAgICAgICAgICAgIGVudi0+U2V0TG9uZ0ZpZWxkKGZyYW1lVGltZWxpbmVPYmouZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRGlzcGxheUV2ZW50UmVjZWl2ZXJDbGFzc0luZm8uZnJhbWVUaW1lbGluZUNsYXNzSW5mby5kZWFkbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lVGltZWxpbmUuZGVhZGxpbmVUaW1lc3RhbXApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9jb21fYW5kcm9pZF9pbnRlcm5hbF9vc19aeWdvdGUuY3BwIGIvY29yZS9qbmkvY29tX2FuZHJvaWRfaW50ZXJuYWxfb3NfWnlnb3RlLmNwcAppbmRleCAxYjgxMmQxLi5kNjJmMWNmIDEwMDY0NAotLS0gYS9jb3JlL2puaS9jb21fYW5kcm9pZF9pbnRlcm5hbF9vc19aeWdvdGUuY3BwCisrKyBiL2NvcmUvam5pL2NvbV9hbmRyb2lkX2ludGVybmFsX29zX1p5Z290ZS5jcHAKQEAgLTE4MDUsMTAgKzE4MDUsMTUgQEAKICAgICBpZiAoIWlzX3N5c3RlbV9zZXJ2ZXIgJiYgZ2V0dWlkKCkgPT0gMCkgewogICAgICAgICBjb25zdCBpbnQgcmMgPSBjcmVhdGVQcm9jZXNzR3JvdXAodWlkLCBnZXRwaWQoKSk7CiAgICAgICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgICAgICBmYWlsX2ZuKHJjID09IC1FUk9GUyA/IENSRUFURV9FUlJPUigiY3JlYXRlUHJvY2Vzc0dyb3VwIGZhaWxlZCwga2VybmVsIG1pc3NpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPTkZJR19DR1JPVVBfQ1BVQUNDVD8iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDUkVBVEVfRVJST1IoImNyZWF0ZVByb2Nlc3NHcm91cCglZCwgJWQpIGZhaWxlZDogJXMiLCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaWQ9ICovIDAsIHN0cmVycm9yKC1yYykpKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSAtRVNSQ0gpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBwcm9jZXNzIGlzIGRlYWQsIHRyZWF0IHRoaXMgYXMgYSBub24tZmF0YWwgZXJyb3IKKyAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlUHJvY2Vzc0dyb3VwKCVkLCAlZCkgZmFpbGVkOiAlcyIsIHVpZCwgLyogcGlkPSAqLyAwLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmFpbF9mbihyYyA9PSAtRVJPRlMgPyBDUkVBVEVfRVJST1IoImNyZWF0ZVByb2Nlc3NHcm91cCBmYWlsZWQsIGtlcm5lbCBtaXNzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09ORklHX0NHUk9VUF9DUFVBQ0NUPyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDUkVBVEVfRVJST1IoImNyZWF0ZVByb2Nlc3NHcm91cCglZCwgJWQpIGZhaWxlZDogJXMiLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGlkPSAqLyAwLCBzdHJlcnJvcigtcmMpKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDQ5NmNjM2EuLjA2ZTkxYzMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtODI0LDYgKzgyNCw5IEBACiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbXBhbmlvbi52aXJ0dWFsLmFjdGlvbi5WSVJUVUFMX0RFVklDRV9SRU1PVkVEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW50ZXJuYWwuaW50ZW50LmFjdGlvbi5GTEFTSF9OT1RJRklDQVRJT05fU1RBUlRfUFJFVklFVyIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmludGVybmFsLmludGVudC5hY3Rpb24uRkxBU0hfTk9USUZJQ0FUSU9OX1NUT1BfUFJFVklFVyIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFkbWluLmFjdGlvbi5ERVZJQ0VfRklOQU5DSU5HX1NUQVRFX0NIQU5HRUQiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFwcC5hZG1pbi5hY3Rpb24uREVWSUNFX1BPTElDWV9TRVRfUkVTVUxUIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hcHAuYWRtaW4uYWN0aW9uLkRFVklDRV9QT0xJQ1lfQ0hBTkdFRCIgLz4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICBSVU5USU1FIFBFUk1JU1NJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CkBAIC0zMTYxLDcgKzMxNjQsNyBAQAogICAgIDwhLS0gQFN5c3RlbUFwaSBAaGlkZSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gY2FsbCBBUElzIHRoYXQgYWxsb3cgaXQgdG8gcXVlcnkgdXNlcnMgb24gdGhlCiAgICAgICAgICBkZXZpY2UuIC0tPgogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlFVRVJZX1VTRVJTIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmV8cm9sZSIgLz4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWR8cm9sZSIgLz4KIAogICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBkYXRhIGJsb2JzIGFjcm9zcyB1c2Vycy4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0JMT0JTX0FDUk9TU19VU0VSUyIKQEAgLTQ0OTIsNyArNDQ5NSw3IEBACiAKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBiZSBhYmxlIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBjcmVkZW50aWFscyBmcm9tIGEgcmVtb3RlCiAgICAgICAgICBkZXZpY2UuCi0gICAgICAgICBAaGlkZSBAU3lzdGVtQXBpIC0tPgorICAgIDxwPlByb3RlY3Rpb24gbGV2ZWw6IHNpZ25hdHVyZXxwcml2aWxlZ2VkfHJvbGUgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUFJPVklERV9SRU1PVEVfQ1JFREVOVElBTFMiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZXxwcml2aWxlZ2VkfHJvbGUiIC8+CiAKQEAgLTUzMDMsMTIgKzUzMDYsMTIgQEAKICAgICAgICAgIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jVVNFX0VYQUNUX0FMQVJNfSBvbmNlIGl0IHRhcmdldHMgQVBJCiAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1RJUkFNSVNVfS4gQWxsIGFwcHMgdXNpbmcgZXhhY3QgYWxhcm1zIGZvciBzZWNvbmRhcnkKICAgICAgICAgIGZlYXR1cmVzICh3aGljaCBzaG91bGQgc3RpbGwgYmUgdXNlciBmYWNpbmcpIHNob3VsZCBjb250aW51ZSB1c2luZyB0aGlzIHBlcm1pc3Npb24uCi0gICAgICAgICA8cD5Qcm90ZWN0aW9uIGxldmVsOiBhcHBvcAorICAgICAgICAgPHA+UHJvdGVjdGlvbiBsZXZlbDogc2lnbmF0dXJlfHByaXZpbGVnZWR8YXBwb3AKICAgICAgLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0NIRURVTEVfRVhBQ1RfQUxBUk0iCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9zY2hlZHVsZV9leGFjdF9hbGFybSIKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19zY2hlZHVsZV9leGFjdF9hbGFybSIKLSAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9Im5vcm1hbHxhcHBvcCIvPgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlfHByaXZpbGVnZWR8YXBwb3AiLz4KIAogICAgIDwhLS0gQWxsb3dzIGFwcHMgdG8gdXNlIGV4YWN0IGFsYXJtcyBqdXN0IGxpa2Ugd2l0aCB7QGxpbmsKICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNTQ0hFRFVMRV9FWEFDVF9BTEFSTX0gYnV0IHdpdGhvdXQgbmVlZGluZyB0byByZXF1ZXN0IHRoaXMKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbWluaXJlc29sdmVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbWluaXJlc29sdmVyLnhtbAppbmRleCBkMDdhZDg5Li4xYWQzYWNkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L21pbmlyZXNvbHZlci54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9taW5pcmVzb2x2ZXIueG1sCkBAIC01Niw2ICs1Niw3IEBACiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjE2ZHAiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2ljb24iCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJAc3RyaW5nL2NvbmZpZ19oZWFkbGluZUZvbnRGYW1pbHkiCiAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNHNwIgogICAgICAgICAgICAgYW5kcm9pZDpsaW5lSGVpZ2h0PSIzMnNwIgogICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl9leHBhbmRfYnV0dG9uLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX2V4cGFuZF9idXR0b24ueG1sCmluZGV4IGU3NTI0MzEuLjhlYWUwNjQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX2V4cGFuZF9idXR0b24ueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX2V4cGFuZF9idXR0b24ueG1sCkBAIC0xOSwyMyArMTksMjggQEAKICAgICBhbmRyb2lkOmlkPSJAK2lkL2V4cGFuZF9idXR0b24iCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL25vdGlmaWNhdGlvbl9oZWFkZXJfaGVpZ2h0IgogICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxlbmQiCiAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvZXhwYW5kX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uX2NvbGxhcHNlZCIKLSAgICBhbmRyb2lkOnBhZGRpbmc9IjE2ZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nSG9yaXpvbnRhbD0iMTZkcCIKICAgICA+CiAKICAgICA8TGluZWFyTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXhwYW5kX2J1dHRvbl9waWxsIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25fZXhwYW5kX2J1dHRvbl9waWxsX2hlaWdodCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX2V4cGFuZF9idXR0b25fcGlsbF9oZWlnaHQiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCiAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2V4cGFuZF9idXR0b25fcGlsbF9iZyIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKICAgICAgICAgPgogCiAgICAgICAgIDxUZXh0VmlldwogICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9leHBhbmRfYnV0dG9uX251bWJlciIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25fZXhwYW5kX2J1dHRvbl9waWxsX2hlaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25fZXhwYW5kX2J1dHRvbl9waWxsX2hlaWdodCIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5EZXZpY2VEZWZhdWx0Lk5vdGlmaWNhdGlvbi5JbmZvIgogICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdTdGFydD0iOGRwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfYmFzZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9iYXNlLnhtbAppbmRleCBmZDc4N2Y2Li4xNmE4YmI3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9iYXNlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9iYXNlLnhtbApAQCAtNzksNyArNzksOCBAQAogICAgICAgICAgICAgPE5vdGlmaWNhdGlvblRvcExpbmVWaWV3CiAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub3RpZmljYXRpb25fdG9wX2xpbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25faGVhZGVybGVzc19saW5lX2hlaWdodCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL25vdGlmaWNhdGlvbl9oZWFkZXJsZXNzX2xpbmVfaGVpZ2h0IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpcENoaWxkcmVuPSJmYWxzZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuRGV2aWNlRGVmYXVsdC5Ob3RpZmljYXRpb24iCiAgICAgICAgICAgICAgICAgPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfY2FsbC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9jYWxsLnhtbAppbmRleCAxYjNiZDI2Li43NmJjYzk2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9jYWxsLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9jYWxsLnhtbApAQCAtMjksNyArMjksOCBAQAogICAgIDxMaW5lYXJMYXlvdXQKICAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ijg4ZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iODhkcCIKICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICAgICAgPgogCkBAIC00MSw2ICs0Miw3IEBACiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5TdGFydD0iQGRpbWVuL2NvbnZlcnNhdGlvbl9jb250ZW50X3N0YXJ0IgogICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNjhkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iQGRpbWVuL25vdGlmaWNhdGlvbl9oZWFkZXJsZXNzX21hcmdpbl90d29saW5lIgogICAgICAgICAgICAgPgogCiAgICAgICAgICAgICA8aW5jbHVkZQpAQCAtNDksNyArNTEsMTAgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAvPgogCi0gICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvbm90aWZpY2F0aW9uX3RlbXBsYXRlX3RleHQiIC8+CisgICAgICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvbm90aWZpY2F0aW9uX3RlbXBsYXRlX3RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25fdGV4dF9oZWlnaHQiCisgICAgICAgICAgICAgICAgLz4KIAogICAgICAgICA8L0xpbmVhckxheW91dD4KIApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfbWVkaWEueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfbWVkaWEueG1sCmluZGV4IDk1ZGRjMmUuLmRmMzJkMzAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX3RlbXBsYXRlX21hdGVyaWFsX21lZGlhLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9tZWRpYS54bWwKQEAgLTE5LDcgKzE5LDggQEAKICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQiCiAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX21pbl9oZWlnaHQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9ub3RpZmljYXRpb25fbWluX2hlaWdodCIKICAgICBhbmRyb2lkOnRhZz0ibWVkaWEiCiAgICAgPgogCkBAIC03Nyw3ICs3OCw4IEBACiAgICAgICAgICAgICA8Tm90aWZpY2F0aW9uVG9wTGluZVZpZXcKICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvbl90b3BfbGluZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL25vdGlmaWNhdGlvbl9oZWFkZXJsZXNzX2xpbmVfaGVpZ2h0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX2hlYWRlcmxlc3NfbGluZV9oZWlnaHQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwQ2hpbGRyZW49ImZhbHNlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5EZXZpY2VEZWZhdWx0Lk5vdGlmaWNhdGlvbiIKICAgICAgICAgICAgICAgICA+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9tZXNzYWdpbmcueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9ub3RpZmljYXRpb25fdGVtcGxhdGVfbWF0ZXJpYWxfbWVzc2FnaW5nLnhtbAppbmRleCBiZWYxZDBiLi4zZTgyYmQxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl90ZW1wbGF0ZV9tYXRlcmlhbF9tZXNzYWdpbmcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX3RlbXBsYXRlX21hdGVyaWFsX21lc3NhZ2luZy54bWwKQEAgLTEwMiw3ICsxMDIsOCBAQAogICAgICAgICAgICAgICAgICAgICA8Tm90aWZpY2F0aW9uVG9wTGluZVZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZpY2F0aW9uX3RvcF9saW5lIgogICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL25vdGlmaWNhdGlvbl9oZWFkZXJsZXNzX2xpbmVfaGVpZ2h0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL25vdGlmaWNhdGlvbl9oZWFkZXJsZXNzX2xpbmVfaGVpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IkBkaW1lbi9ub3RpZmljYXRpb25fY29udGVudF9tYXJnaW5fc3RhcnQiCiAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaXBDaGlsZHJlbj0iZmFsc2UiCiAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuRGV2aWNlRGVmYXVsdC5Ob3RpZmljYXRpb24iCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2FycmF5cy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKaW5kZXggYjM1NDgxZC4uOTdlNzUzZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbApAQCAtMjI3LDYgKzIyNywxMiBAQAogICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iZGV2aWNlX3N0YXRlX25vdGlmaWNhdGlvbl90aGVybWFsX2NvbnRlbnRzIj4KICAgICAgICAgPGl0ZW0+QHN0cmluZy9jb25jdXJyZW50X2Rpc3BsYXlfbm90aWZpY2F0aW9uX3RoZXJtYWxfY29udGVudDwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KKyAgICA8c3RyaW5nLWFycmF5IG5hbWU9ImRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fcG93ZXJfc2F2ZV90aXRsZXMiPgorICAgICAgICA8aXRlbT5Ac3RyaW5nL2NvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fcG93ZXJfc2F2ZV90aXRsZTwvaXRlbT4KKyAgICA8L3N0cmluZy1hcnJheT4KKyAgICA8c3RyaW5nLWFycmF5IG5hbWU9ImRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fcG93ZXJfc2F2ZV9jb250ZW50cyI+CisgICAgICAgIDxpdGVtPkBzdHJpbmcvY29uY3VycmVudF9kaXNwbGF5X25vdGlmaWNhdGlvbl9wb3dlcl9zYXZlX2NvbnRlbnQ8L2l0ZW0+CisgICAgPC9zdHJpbmctYXJyYXk+CiAKICAgICA8IS0tIENlcnRpZmljYXRlIGRpZ2VzdHMgZm9yIHRydXN0ZWQgYXBwcyB0aGF0IHdpbGwgYmUgYWxsb3dlZCB0byBvYnRhaW4gdGhlIGtub3duU2lnbmVyIG9mIHRoZQogICAgICAgICAgZGVtbyBkZXZpY2UgcHJvdmlzaW9uaW5nIHBlcm1pc3Npb25zLiAtLT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAppbmRleCA0ZDI3NDdhLi4yMjBhMTkzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCkBAIC03MTEsMjAgKzcxMSwyMiBAQAogICAgICAgICAgbW9kZS4gLS0+CiAgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX3VuZm9sZFRyYW5zaXRpb25IYWxmRm9sZGVkVGltZW91dCI+MTAwMDwvaW50ZWdlcj4KIAorICAgIDwhLS0gVGltZW91dCBmb3IgcmVjZWl2aW5nIHRoZSBrZXlndWFyZCBkcmF3biBldmVudCBmcm9tIFN5c3RlbSBVSS4gIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19rZXlndWFyZERyYXduVGltZW91dCI+MTAwMDwvaW50ZWdlcj4KKwogICAgIDwhLS0gSW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0cyBoYXZpbmcgbW9yZSB0aGFuIG9uZSBpbnRlcm5hbCBkaXNwbGF5IG9uIGF0IHRoZSBzYW1lCiAgICAgICAgICB0aW1lLiBPbmx5IGFwcGxpY2FibGUgdG8gZGV2aWNlcyB3aXRoIG1vcmUgdGhhbiBvbmUgaW50ZXJuYWwgZGlzcGxheS4gSWYgdGhpcyBvcHRpb24gaXMKICAgICAgICAgIHNldCB0byBmYWxzZSwgRGlzcGxheU1hbmFnZXIgd2lsbCBtYWtlIGFkZGl0aW9uYWwgZWZmb3J0IHRvIGVuc3VyZSBubyBtb3JlIHRoYW4gMSBpbnRlcm5hbAogICAgICAgICAgZGlzcGxheSBpcyBwb3dlcmVkIG9uIGF0IHRoZSBzYW1lIHRpbWUuIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19zdXBwb3J0c0NvbmN1cnJlbnRJbnRlcm5hbERpc3BsYXlzIj50cnVlPC9ib29sPgogCi0gICAgPCEtLSBNYXAgb2YgRGV2aWNlU3RhdGUgdG8gcm90YXRpb24gbG9jayBzZXR0aW5nLiBFYWNoIGVudHJ5IG11c3QgYmUgaW4gdGhlIGZvcm1hdAotICAgICAgICAgImtleTp2YWx1ZSIsIGZvciBleGFtcGxlOiAiMDoxIi4KLSAgICAgICAgICBUaGUga2V5cyBhcmUgZGV2aWNlIHN0YXRlcywgYW5kIHRoZSB2YWx1ZXMgYXJlIG9uZSBvZgotICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmcuCi0gICAgICAgICAgQW55IGRldmljZSBzdGF0ZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgc2V0IGhlcmUgd2lsbCBiZSB0cmVhdGVkIGFzCi0gICAgICAgICAgREVWSUNFX1NUQVRFX1JPVEFUSU9OX0xPQ0tfSUdOT1JFRCBtZWFuaW5nIGl0IHdpbGwgbm90IGhhdmUgaXRzIG93biByb3RhdGlvbiBsb2NrIHNldHRpbmcuCi0gICAgICAgICAgSWYgdGhpcyBtYXAgaXMgbWlzc2luZywgdGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQgYW5kIG9ubHkgb25lIGdsb2JhbCByb3RhdGlvbiBsb2NrIHNldHRpbmcKLSAgICAgICAgICAgd2lsbCBhcHBseSwgcmVnYXJkbGVzcyBvZiBkZXZpY2Ugc3RhdGUuIC0tPgorICAgIDwhLS0gTWFwIG9mIGRldmljZSBwb3N0dXJlIHRvIHJvdGF0aW9uIGxvY2sgc2V0dGluZy4gRWFjaCBlbnRyeSBtdXN0IGJlIGluIHRoZSBmb3JtYXQKKyAgICAgICAgICJrZXk6dmFsdWUiLCBvciAia2V5OnZhbHVlOmZhbGxiYWNrX2tleSIgZm9yIGV4YW1wbGU6ICIwOjEiIG9yICIyOjA6MSIuIFRoZSBrZXlzIGFyZSBvbmUgb2YKKyAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja0tleSwgYW5kIHRoZSB2YWx1ZXMgYXJlIG9uZSBvZgorICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZy4KKyAgICAgICAgIFRoZSBmYWxsYmFjayBpcyBhIGtleSB0byBhIGRldmljZSBwb3N0dXJlIHRoYXQgY2FuIGJlIHNwZWNpZmllZCB3aGVuIHRoZSB2YWx1ZSBpcworICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFVklDRV9TVEFURV9ST1RBVElPTl9MT0NLX0lHTk9SRUQuCisgICAgIC0tPgogICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iY29uZmlnX3BlckRldmljZVN0YXRlUm90YXRpb25Mb2NrRGVmYXVsdHMiIC8+CiAKICAgICA8IS0tIERvY2sgYmVoYXZpb3IgLS0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKaW5kZXggNWJiODZkYy4uODBiZjc5NSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgPGRpbWVuIG5hbWU9Im5vdGlmaWNhdGlvbl9oZWFkZXJsZXNzX21hcmdpbl90d29saW5lIj4yMGRwPC9kaW1lbj4KIAogICAgIDwhLS0gVGhlIGhlaWdodCBvZiBlYWNoIG9mIHRoZSAxIG9yIDIgbGluZXMgaW4gdGhlIGhlYWRlcmxlc3Mgbm90aWZpY2F0aW9uIHRlbXBsYXRlIC0tPgotICAgIDxkaW1lbiBuYW1lPSJub3RpZmljYXRpb25faGVhZGVybGVzc19saW5lX2hlaWdodCI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im5vdGlmaWNhdGlvbl9oZWFkZXJsZXNzX2xpbmVfaGVpZ2h0Ij4yNHNwPC9kaW1lbj4KIAogICAgIDwhLS0gdmVydGljYWwgbWFyZ2luIGZvciB0aGUgaGVhZGVybGVzcyBub3RpZmljYXRpb24gY29udGVudCAtLT4KICAgICA8ZGltZW4gbmFtZT0ibm90aWZpY2F0aW9uX2hlYWRlcmxlc3NfbWluX2hlaWdodCI+NTZkcDwvZGltZW4+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCAzMDc0OTA2Li42YWZkYWU1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTMyNyw2ICszMjcsNyBAQAogICAgICAgICA8aXRlbT5Ac3RyaW5nL3dmY1NwbkZvcm1hdF93aWZpX2NhbGxpbmdfd29faHlwaGVuPC9pdGVtPgogICAgICAgICA8aXRlbT5Ac3RyaW5nL3dmY1NwbkZvcm1hdF92b3dpZmk8L2l0ZW0+CiAgICAgICAgIDxpdGVtPkBzdHJpbmcvd2ZjU3BuRm9ybWF0X3Nwbl93aWZpX2NhbGxpbmdfdm9faHlwaGVuPC9pdGVtPgorICAgICAgICA8aXRlbT5Ac3RyaW5nL3dmY1NwbkZvcm1hdF93aWZpX2NhbGw8L2l0ZW0+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKICAgICA8IS0tIFNwbiBkdXJpbmcgV2ktRmkgQ2FsbGluZzogIjxvcGVyYXRvcj4iIC0tPgpAQCAtMzUzLDYgKzM1NCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJ3ZmNTcG5Gb3JtYXRfd2lmaV9jYWxsaW5nX3dvX2h5cGhlbiI+V2lGaSBDYWxsaW5nPC9zdHJpbmc+CiAgICAgPCEtLSBTcG4gZHVyaW5nIFdpLUZpIENhbGxpbmc6ICJWb1dpZmkiIC0tPgogICAgIDxzdHJpbmcgbmFtZT0id2ZjU3BuRm9ybWF0X3Zvd2lmaSI+Vm9XaWZpPC9zdHJpbmc+CisgICAgPCEtLSBTcG4gZHVyaW5nIFdpX0ZpIENhbGxpbmc6ICJXaUZpIENhbGwiICh3aXRob3V0IGh5cGhlbikuICBUaGlzIHN0cmluZyBpcyBzaG93biBpbiB0aGUgY2FsbCBiYW5uZXIgZm9yIGNhbGxzIHdoaWNoIHRha2UgcGxhY2Ugb3ZlciBhIFdpRmkgbmV0d29yay4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ3ZmNTcG5Gb3JtYXRfd2lmaV9jYWxsIj5XaUZpIENhbGw8L3N0cmluZz4KIAogICAgIDwhLS0gV0ZDLCBzdW1tYXJ5IGZvciBEaXNhYmxlZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9IndpZmlfY2FsbGluZ19vZmZfc3VtbWFyeSI+T2ZmPC9zdHJpbmc+CkBAIC02MjY0LDYgKzYyNjcsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fdGhlcm1hbF90aXRsZSI+RGV2aWNlIGlzIHRvbyB3YXJtPC9zdHJpbmc+CiAgICAgPCEtLSBDb250ZW50IG9mIGNvbmN1cnJlbnQgZGlzcGxheSB0aGVybWFsIG5vdGlmaWNhdGlvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjb25jdXJyZW50X2Rpc3BsYXlfbm90aWZpY2F0aW9uX3RoZXJtYWxfY29udGVudCI+RHVhbCBTY3JlZW4gaXMgdW5hdmFpbGFibGUgYmVjYXVzZSB5b3VyIHBob25lIGlzIGdldHRpbmcgdG9vIHdhcm08L3N0cmluZz4KKyAgICA8IS0tIFRpdGxlIG9mIGNvbmN1cnJlbnQgZGlzcGxheSBwb3dlciBzYXZlciBub3RpZmljYXRpb24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY29uY3VycmVudF9kaXNwbGF5X25vdGlmaWNhdGlvbl9wb3dlcl9zYXZlX3RpdGxlIj5EdWFsIFNjcmVlbiBpcyB1bmF2YWlsYWJsZTwvc3RyaW5nPgorICAgIDwhLS0gQ29udGVudCBvZiBjb25jdXJyZW50IGRpc3BsYXkgcG93ZXIgc2F2ZXIgbm90aWZpY2F0aW9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fcG93ZXJfc2F2ZV9jb250ZW50Ij5EdWFsIFNjcmVlbiBpcyB1bmF2YWlsYWJsZSBiZWNhdXNlIEJhdHRlcnkgU2F2ZXIgaXMgb24uIFlvdSBjYW4gdHVybiB0aGlzIG9mZiBpbiBTZXR0aW5ncy48L3N0cmluZz4KKyAgICA8IS0tIFRleHQgb2YgcG93ZXIgc2F2ZXIgbm90aWZpY2F0aW9uIHNldHRpbmdzIGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3NldHRpbmdzX2J1dHRvbiI+R28gdG8gU2V0dGluZ3M8L3N0cmluZz4KICAgICA8IS0tIFRleHQgb2YgZGV2aWNlIHN0YXRlIG5vdGlmaWNhdGlvbiB0dXJuIG9mZiBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iZGV2aWNlX3N0YXRlX25vdGlmaWNhdGlvbl90dXJuX29mZl9idXR0b24iPlR1cm4gb2ZmPC9zdHJpbmc+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCmluZGV4IGExNTgzM2QuLjFjYjU2ZTAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbApAQCAtMTkzOSw2ICsxOTM5LDcgQEAKICAgPGphdmEtc3ltYm9sIHR5cGU9ImJvb2wiIG5hbWU9ImNvbmZpZ19hbGxvd1RoZWF0ZXJNb2RlV2FrZUZyb21Eb2NrIiAvPgogICA8amF2YS1zeW1ib2wgdHlwZT0iYm9vbCIgbmFtZT0iY29uZmlnX2FsbG93VGhlYXRlck1vZGVXYWtlRnJvbVdpbmRvd0xheW91dCIgLz4KICAgPGphdmEtc3ltYm9sIHR5cGU9ImJvb2wiIG5hbWU9ImNvbmZpZ19rZWVwRHJlYW1pbmdXaGVuVW5kb2NraW5nIiAvPgorICA8amF2YS1zeW1ib2wgdHlwZT0iaW50ZWdlciIgbmFtZT0iY29uZmlnX2tleWd1YXJkRHJhd25UaW1lb3V0IiAvPgogICA8amF2YS1zeW1ib2wgdHlwZT0iYm9vbCIgbmFtZT0iY29uZmlnX2dvVG9TbGVlcE9uQnV0dG9uUHJlc3NUaGVhdGVyTW9kZSIgLz4KICAgPGphdmEtc3ltYm9sIHR5cGU9ImJvb2wiIG5hbWU9ImNvbmZpZ19zdXBwb3J0TG9uZ1ByZXNzUG93ZXJXaGVuTm9uSW50ZXJhY3RpdmUiIC8+CiAgIDxqYXZhLXN5bWJvbCB0eXBlPSJib29sIiBuYW1lPSJjb25maWdfd2ltYXhFbmFibGVkIiAvPgpAQCAtNDkzMCwxMiArNDkzMSwxNyBAQAogICA8amF2YS1zeW1ib2wgdHlwZT0iYXJyYXkiIG5hbWU9ImRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fYWN0aXZlX2NvbnRlbnRzIi8+CiAgIDxqYXZhLXN5bWJvbCB0eXBlPSJhcnJheSIgbmFtZT0iZGV2aWNlX3N0YXRlX25vdGlmaWNhdGlvbl90aGVybWFsX3RpdGxlcyIvPgogICA8amF2YS1zeW1ib2wgdHlwZT0iYXJyYXkiIG5hbWU9ImRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fdGhlcm1hbF9jb250ZW50cyIvPgorICA8amF2YS1zeW1ib2wgdHlwZT0iYXJyYXkiIG5hbWU9ImRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fcG93ZXJfc2F2ZV90aXRsZXMiLz4KKyAgPGphdmEtc3ltYm9sIHR5cGU9ImFycmF5IiBuYW1lPSJkZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfY29udGVudHMiLz4KICAgPGphdmEtc3ltYm9sIHR5cGU9InN0cmluZyIgbmFtZT0iY29uY3VycmVudF9kaXNwbGF5X25vdGlmaWNhdGlvbl9uYW1lIi8+CiAgIDxqYXZhLXN5bWJvbCB0eXBlPSJzdHJpbmciIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fYWN0aXZlX3RpdGxlIi8+CiAgIDxqYXZhLXN5bWJvbCB0eXBlPSJzdHJpbmciIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fYWN0aXZlX2NvbnRlbnQiLz4KICAgPGphdmEtc3ltYm9sIHR5cGU9InN0cmluZyIgbmFtZT0iY29uY3VycmVudF9kaXNwbGF5X25vdGlmaWNhdGlvbl90aGVybWFsX3RpdGxlIi8+CiAgIDxqYXZhLXN5bWJvbCB0eXBlPSJzdHJpbmciIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fdGhlcm1hbF9jb250ZW50Ii8+CisgIDxqYXZhLXN5bWJvbCB0eXBlPSJzdHJpbmciIG5hbWU9ImNvbmN1cnJlbnRfZGlzcGxheV9ub3RpZmljYXRpb25fcG93ZXJfc2F2ZV90aXRsZSIvPgorICA8amF2YS1zeW1ib2wgdHlwZT0ic3RyaW5nIiBuYW1lPSJjb25jdXJyZW50X2Rpc3BsYXlfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfY29udGVudCIvPgogICA8amF2YS1zeW1ib2wgdHlwZT0ic3RyaW5nIiBuYW1lPSJkZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3R1cm5fb2ZmX2J1dHRvbiIvPgorICA8amF2YS1zeW1ib2wgdHlwZT0ic3RyaW5nIiBuYW1lPSJkZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3NldHRpbmdzX2J1dHRvbiIvPgogICA8amF2YS1zeW1ib2wgdHlwZT0iYm9vbCIgbmFtZT0iY29uZmlnX2luZGVwZW5kZW50TG9ja3NjcmVlbkxpdmVXYWxscGFwZXIiLz4KICAgPGphdmEtc3ltYm9sIHR5cGU9ImludGVnZXIiIG5hbWU9ImNvbmZpZ19kZXZpY2VTdGF0ZUNvbmN1cnJlbnRSZWFyRGlzcGxheSIgLz4KICAgPGphdmEtc3ltYm9sIHR5cGU9InN0cmluZyIgbmFtZT0iY29uZmlnX3JlYXJEaXNwbGF5UGh5c2ljYWxBZGRyZXNzIiAvPgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYXBwL2JhY2t1cC9CYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hcHAvYmFja3VwL0JhY2t1cFJlc3RvcmVFdmVudExvZ2dlclRlc3QuamF2YQppbmRleCBiMTc2MzA3Li42ZTFjNTgwIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hcHAvYmFja3VwL0JhY2t1cFJlc3RvcmVFdmVudExvZ2dlclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hcHAvYmFja3VwL0JhY2t1cFJlc3RvcmVFdmVudExvZ2dlclRlc3QuamF2YQpAQCAtMjMsNyArMjMsNiBAQAogCiBpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuZmFpbDsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLmJhY2t1cC5CYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXIuQmFja3VwUmVzdG9yZURhdGFUeXBlOwogaW1wb3J0IGFuZHJvaWQuYXBwLmJhY2t1cC5CYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXIuRGF0YVR5cGVSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdDsKQEAgLTc4LDcgKzc3LDcgQEAKIAogICAgICAgICBtTG9nZ2VyLmxvZ0l0ZW1zQmFja2VkVXAoREFUQV9UWVBFXzEsIC8qIGNvdW50ICovIDUpOwogICAgICAgICBtTG9nZ2VyLmxvZ0l0ZW1zQmFja3VwRmFpbGVkKERBVEFfVFlQRV8xLCAvKiBjb3VudCAqLyA1LCBFUlJPUl8xKTsKLSAgICAgICAgbUxvZ2dlci5sb2dCYWNrdXBNZXRhRGF0YShEQVRBX1RZUEVfMSwgLyogbWV0YWRhdGEgKi8gIm1ldGFkYXRhIik7CisgICAgICAgIG1Mb2dnZXIubG9nQmFja3VwTWV0YWRhdGEoREFUQV9UWVBFXzEsIC8qIG1ldGFkYXRhICovICJtZXRhZGF0YSIpOwogCiAgICAgICAgIGFzc2VydFRoYXQoZ2V0UmVzdWx0Rm9yRGF0YVR5cGVJZlByZXNlbnQobUxvZ2dlciwgREFUQV9UWVBFXzEpKS5pc0VxdWFsVG8oT3B0aW9uYWwuZW1wdHkoKSk7CiAgICAgfQpAQCAtOTEsNyArOTAsNyBAQAogICAgICAgICAgICAgU3RyaW5nIGRhdGFUeXBlID0gREFUQV9UWVBFXzEgKyBpOwogICAgICAgICAgICAgbUxvZ2dlci5sb2dJdGVtc0JhY2tlZFVwKGRhdGFUeXBlLCAvKiBjb3VudCAqLyA1KTsKICAgICAgICAgICAgIG1Mb2dnZXIubG9nSXRlbXNCYWNrdXBGYWlsZWQoZGF0YVR5cGUsIC8qIGNvdW50ICovIDUsIC8qIGVycm9yICovIG51bGwpOwotICAgICAgICAgICAgbUxvZ2dlci5sb2dCYWNrdXBNZXRhRGF0YShkYXRhVHlwZSwgTUVUQURBVEFfMSk7CisgICAgICAgICAgICBtTG9nZ2VyLmxvZ0JhY2t1cE1ldGFkYXRhKGRhdGFUeXBlLCBNRVRBREFUQV8xKTsKIAogICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRSZXN1bHRGb3JEYXRhVHlwZUlmUHJlc2VudChtTG9nZ2VyLCBkYXRhVHlwZSkpLmlzTm90RXF1YWxUbygKICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwuZW1wdHkoKSk7CkBAIC0xMjcsOCArMTI2LDggQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nQmFja3VwTWV0YWRhdGFfcmVwZWF0ZWRDYWxsc19yZWNvcmRzTGF0ZXN0TWV0YWRhdGFIYXNoKCkgewogICAgICAgICBtTG9nZ2VyID0gbmV3IEJhY2t1cFJlc3RvcmVFdmVudExvZ2dlcihCQUNLVVApOwogCi0gICAgICAgIG1Mb2dnZXIubG9nQmFja3VwTWV0YURhdGEoREFUQV9UWVBFXzEsIE1FVEFEQVRBXzEpOwotICAgICAgICBtTG9nZ2VyLmxvZ0JhY2t1cE1ldGFEYXRhKERBVEFfVFlQRV8xLCBNRVRBREFUQV8yKTsKKyAgICAgICAgbUxvZ2dlci5sb2dCYWNrdXBNZXRhZGF0YShEQVRBX1RZUEVfMSwgTUVUQURBVEFfMSk7CisgICAgICAgIG1Mb2dnZXIubG9nQmFja3VwTWV0YWRhdGEoREFUQV9UWVBFXzEsIE1FVEFEQVRBXzIpOwogCiAgICAgICAgIGJ5dGVbXSByZWNvcmRlZEhhc2ggPSBnZXRSZXN1bHRGb3JEYXRhVHlwZShtTG9nZ2VyLCBEQVRBX1RZUEVfMSkuZ2V0TWV0YWRhdGFIYXNoKCk7CiAgICAgICAgIGJ5dGVbXSBleHBlY3RlZEhhc2ggPSBnZXRNZXRhRGF0YUhhc2goTUVUQURBVEFfMik7CkBAIC0zMTUsNyArMzE0LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBEYXRhVHlwZVJlc3VsdCBnZXRSZXN1bHRGb3JEYXRhVHlwZSgKLSAgICAgICAgICAgIEJhY2t1cFJlc3RvcmVFdmVudExvZ2dlciBsb2dnZXIsIEBCYWNrdXBSZXN0b3JlRGF0YVR5cGUgU3RyaW5nIGRhdGFUeXBlKSB7CisgICAgICAgICAgICBCYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXIgbG9nZ2VyLCBTdHJpbmcgZGF0YVR5cGUpIHsKICAgICAgICAgT3B0aW9uYWw8RGF0YVR5cGVSZXN1bHQ+IHJlc3VsdCA9IGdldFJlc3VsdEZvckRhdGFUeXBlSWZQcmVzZW50KGxvZ2dlciwgZGF0YVR5cGUpOwogICAgICAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgZmFpbCgiRmFpbGVkIHRvIGZpbmQgcmVzdWx0IGZvciBkYXRhIHR5cGU6ICIgKyBkYXRhVHlwZSk7CkBAIC0zMjQsNyArMzIzLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBPcHRpb25hbDxEYXRhVHlwZVJlc3VsdD4gZ2V0UmVzdWx0Rm9yRGF0YVR5cGVJZlByZXNlbnQoCi0gICAgICAgICAgICBCYWNrdXBSZXN0b3JlRXZlbnRMb2dnZXIgbG9nZ2VyLCBAQmFja3VwUmVzdG9yZURhdGFUeXBlIFN0cmluZyBkYXRhVHlwZSkgeworICAgICAgICAgICAgQmFja3VwUmVzdG9yZUV2ZW50TG9nZ2VyIGxvZ2dlciwgU3RyaW5nIGRhdGFUeXBlKSB7CiAgICAgICAgIExpc3Q8RGF0YVR5cGVSZXN1bHQ+IHJlc3VsdExpc3QgPSBsb2dnZXIuZ2V0TG9nZ2luZ1Jlc3VsdHMoKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdExpc3Quc3RyZWFtKCkKICAgICAgICAgICAgICAgICAuZmlsdGVyKGRhdGFUeXBlUmVzdWx0IC0+IGRhdGFUeXBlUmVzdWx0LmdldERhdGFUeXBlKCkuZXF1YWxzKGRhdGFUeXBlKSkKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvRGVsZXRlUmFuZ2VHZXN0dXJlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9EZWxldGVSYW5nZUdlc3R1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiOTExZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvRGVsZXRlUmFuZ2VHZXN0dXJlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BcGlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitAUHJlc3VibWl0CitAU21hbGxUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQEFwaVRlc3QoYXBpcyA9IHsiYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkRlbGV0ZVJhbmdlR2VzdHVyZS5CdWlsZGVyI3NldEdyYW51bGFyaXR5IiwKKyAgICAiYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkRlbGV0ZVJhbmdlR2VzdHVyZS5CdWlsZGVyI3NldERlbGV0aW9uU3RhcnRBcmVhIiwKKyAgICAiYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkRlbGV0ZVJhbmdlR2VzdHVyZS5CdWlsZGVyI3NldERlbGV0aW9uRW5kQXJlYSIsCisgICAgImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5EZWxldGVSYW5nZUdlc3R1cmUuQnVpbGRlciNzZXRGYWxsYmFja1RleHQiLAorICAgICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRGVsZXRlUmFuZ2VHZXN0dXJlLkJ1aWxkZXIjYnVpbGQifSkKK3B1YmxpYyBjbGFzcyBEZWxldGVSYW5nZUdlc3R1cmVUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0RiBERUxFVElPTl9TVEFSVF9SRUNUQU5HTEUgPSBuZXcgUmVjdEYoMSwgMiwgMywgNCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdEYgREVMRVRJT05fRU5EX1JFQ1RBTkdMRSA9IG5ldyBSZWN0RigwLCAyLCAzLCA0KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMTEJBQ0tfVEVYVCA9ICJmYWxsYmFja190ZXN0IjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXIoKSB7CisgICAgICAgIERlbGV0ZVJhbmdlR2VzdHVyZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRGVsZXRlUmFuZ2VHZXN0dXJlLkJ1aWxkZXIoKTsKKyAgICAgICAgRGVsZXRlUmFuZ2VHZXN0dXJlIGdlc3R1cmUgPSBidWlsZGVyLnNldEdyYW51bGFyaXR5KEhhbmR3cml0aW5nR2VzdHVyZS5HUkFOVUxBUklUWV9XT1JEKQorICAgICAgICAgICAgICAgIC5zZXREZWxldGlvblN0YXJ0QXJlYShERUxFVElPTl9TVEFSVF9SRUNUQU5HTEUpCisgICAgICAgICAgICAgICAgLnNldERlbGV0aW9uRW5kQXJlYShERUxFVElPTl9FTkRfUkVDVEFOR0xFKQorICAgICAgICAgICAgICAgIC5zZXRGYWxsYmFja1RleHQoRkFMTEJBQ0tfVEVYVCkuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXN0dXJlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhhbmR3cml0aW5nR2VzdHVyZS5HUkFOVUxBUklUWV9XT1JELCBnZXN0dXJlLmdldEdyYW51bGFyaXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoREVMRVRJT05fU1RBUlRfUkVDVEFOR0xFLCBnZXN0dXJlLmdldERlbGV0aW9uU3RhcnRBcmVhKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoREVMRVRJT05fRU5EX1JFQ1RBTkdMRSwgZ2VzdHVyZS5nZXREZWxldGlvbkVuZEFyZWEoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGQUxMQkFDS19URVhULCBnZXN0dXJlLmdldEZhbGxiYWNrVGV4dCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0luc2VydEdlc3R1cmVUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0luc2VydEdlc3R1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhNzI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5zZXJ0R2VzdHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnRGOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwaVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BQcmVzdWJtaXQKK0BTbWFsbFRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAQXBpVGVzdChhcGlzID0geyJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5zZXJ0R2VzdHVyZS5CdWlsZGVyI3NldEluc2VydGlvblBvaW50IiwKKyAgICAiYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkluc2VydEdlc3R1cmUuQnVpbGRlciNzZXRUZXh0VG9JbnNlcnQiLAorICAgICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5zZXJ0R2VzdHVyZS5CdWlsZGVyI3NldEZhbGxiYWNrVGV4dCIsCisgICAgImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnNlcnRHZXN0dXJlLkJ1aWxkZXIjYnVpbGQifSkKK3B1YmxpYyBjbGFzcyBJbnNlcnRHZXN0dXJlVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUG9pbnRGIElOU0VSVElPTl9QT0lOVCA9IG5ldyBQb2ludEYoMSwgMik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTExCQUNLX1RFWFQgPSAiZmFsbGJhY2tfdGV4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVE9fSU5TRVJUID0gInRleHQiOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlcigpIHsKKyAgICAgICAgSW5zZXJ0R2VzdHVyZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW5zZXJ0R2VzdHVyZS5CdWlsZGVyKCk7CisgICAgICAgIEluc2VydEdlc3R1cmUgZ2VzdHVyZSA9IGJ1aWxkZXIuc2V0SW5zZXJ0aW9uUG9pbnQoSU5TRVJUSU9OX1BPSU5UKQorICAgICAgICAgICAgICAgIC5zZXRUZXh0VG9JbnNlcnQoVEVYVF9UT19JTlNFUlQpCisgICAgICAgICAgICAgICAgLnNldEZhbGxiYWNrVGV4dChGQUxMQkFDS19URVhUKS5idWlsZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGdlc3R1cmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoSU5TRVJUSU9OX1BPSU5ULCBnZXN0dXJlLmdldEluc2VydGlvblBvaW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRkFMTEJBQ0tfVEVYVCwgZ2VzdHVyZS5nZXRGYWxsYmFja1RleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhURVhUX1RPX0lOU0VSVCwgZ2VzdHVyZS5nZXRUZXh0VG9JbnNlcnQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnNlcnRNb2RlR2VzdHVyZVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5zZXJ0TW9kZUdlc3R1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkZGJhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5zZXJ0TW9kZUdlc3R1cmVUZXN0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50RjsKK2ltcG9ydCBhbmRyb2lkLm9zLkNhbmNlbGxhdGlvblNpZ25hbDsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXQ0OworCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udXRpbC5BcGlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitAUHJlc3VibWl0CitAU21hbGxUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorQEFwaVRlc3QoYXBpcyA9IHsiYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkluc2VydE1vZGVHZXN0dXJlLkJ1aWxkZXIjc2V0SW5zZXJ0aW9uUG9pbnQiLAorICAgICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5zZXJ0TW9kZUdlc3R1cmUuQnVpbGRlciNzZXRDYW5jZWxsYXRpb25TaWduYWwiLAorICAgICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5zZXJ0TW9kZUdlc3R1cmUuQnVpbGRlciNzZXRGYWxsYmFja1RleHQiLAorICAgICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5zZXJ0TW9kZUdlc3R1cmUuQnVpbGRlciNidWlsZCJ9KQorcHVibGljIGNsYXNzIEluc2VydE1vZGVHZXN0dXJlVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUG9pbnRGIElOU0VSVElPTl9QT0lOVCA9IG5ldyBQb2ludEYoMSwgMik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTExCQUNLX1RFWFQgPSAiZmFsbGJhY2tfdGV4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FuY2VsbGF0aW9uU2lnbmFsIENBTkNFTExBVElPTl9TSUdOQUwgPSBuZXcgQ2FuY2VsbGF0aW9uU2lnbmFsKCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyKCkgeworICAgICAgICBJbnNlcnRNb2RlR2VzdHVyZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW5zZXJ0TW9kZUdlc3R1cmUuQnVpbGRlcigpOworICAgICAgICBJbnNlcnRNb2RlR2VzdHVyZSBnZXN0dXJlID0gYnVpbGRlci5zZXRJbnNlcnRpb25Qb2ludChJTlNFUlRJT05fUE9JTlQpCisgICAgICAgICAgICAgICAgLnNldENhbmNlbGxhdGlvblNpZ25hbChDQU5DRUxMQVRJT05fU0lHTkFMKQorICAgICAgICAgICAgICAgIC5zZXRGYWxsYmFja1RleHQoRkFMTEJBQ0tfVEVYVCkuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXN0dXJlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKElOU0VSVElPTl9QT0lOVCwgZ2VzdHVyZS5nZXRJbnNlcnRpb25Qb2ludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZBTExCQUNLX1RFWFQsIGdlc3R1cmUuZ2V0RmFsbGJhY2tUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ0FOQ0VMTEFUSU9OX1NJR05BTCwgZ2VzdHVyZS5nZXRDYW5jZWxsYXRpb25TaWduYWwoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9TZWxlY3RHZXN0dXJlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9TZWxlY3RHZXN0dXJlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWIwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL1NlbGVjdEdlc3R1cmVUZXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwaVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BQcmVzdWJtaXQKK0BTbWFsbFRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAQXBpVGVzdChhcGlzID0geyJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuU2VsZWN0R2VzdHVyZS5CdWlsZGVyI3NldEdyYW51bGFyaXR5IiwKKyAgICAiYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLlNlbGVjdEdlc3R1cmUuQnVpbGRlciNzZXRTZWxlY3Rpb25BcmVhIiwKKyAgICAiYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLlNlbGVjdEdlc3R1cmUuQnVpbGRlciNzZXRGYWxsYmFja1RleHQiLAorICAgICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuU2VsZWN0R2VzdHVyZS5CdWlsZGVyI2J1aWxkIn0pCitwdWJsaWMgY2xhc3MgU2VsZWN0R2VzdHVyZVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlY3RGIFNFTEVDVElPTl9SRUNUQU5HTEUgPSBuZXcgUmVjdEYoMSwgMiwgMywgNCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTExCQUNLX1RFWFQgPSAiZmFsbGJhY2tfdGV4dCI7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyKCkgeworICAgICAgICBTZWxlY3RHZXN0dXJlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTZWxlY3RHZXN0dXJlLkJ1aWxkZXIoKTsKKyAgICAgICAgU2VsZWN0R2VzdHVyZSBnZXN0dXJlID0gYnVpbGRlci5zZXRHcmFudWxhcml0eShIYW5kd3JpdGluZ0dlc3R1cmUuR1JBTlVMQVJJVFlfV09SRCkKKyAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uQXJlYShTRUxFQ1RJT05fUkVDVEFOR0xFKQorICAgICAgICAgICAgICAgIC5zZXRGYWxsYmFja1RleHQoRkFMTEJBQ0tfVEVYVCkuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXN0dXJlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhhbmR3cml0aW5nR2VzdHVyZS5HUkFOVUxBUklUWV9XT1JELCBnZXN0dXJlLmdldEdyYW51bGFyaXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0VMRUNUSU9OX1JFQ1RBTkdMRSwgZ2VzdHVyZS5nZXRTZWxlY3Rpb25BcmVhKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRkFMTEJBQ0tfVEVYVCwgZ2VzdHVyZS5nZXRGYWxsYmFja1RleHQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9TZWxlY3RSYW5nZUdlc3R1cmVUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL1NlbGVjdFJhbmdlR2VzdHVyZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjYzYTRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9TZWxlY3RSYW5nZUdlc3R1cmVUZXN0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLkFwaVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK0BQcmVzdWJtaXQKK0BTbWFsbFRlc3QKK0BSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCitAQXBpVGVzdChhcGlzID0geyJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuU2VsZWN0UmFuZ2VHZXN0dXJlLkJ1aWxkZXIjc2V0R3JhbnVsYXJpdHkiLAorICAgICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuU2VsZWN0UmFuZ2VHZXN0dXJlLkJ1aWxkZXIjc2V0U2VsZWN0aW9uU3RhcnRBcmVhIiwKKyAgICAiYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLlNlbGVjdFJhbmdlR2VzdHVyZS5CdWlsZGVyI3NldFNlbGVjdGlvbkVuZEFyZWEiLAorICAgICJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuU2VsZWN0UmFuZ2VHZXN0dXJlLkJ1aWxkZXIjc2V0RmFsbGJhY2tUZXh0IiwKKyAgICAiYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLlNlbGVjdFJhbmdlR2VzdHVyZS5CdWlsZGVyI2J1aWxkIn0pCitwdWJsaWMgY2xhc3MgU2VsZWN0UmFuZ2VHZXN0dXJlVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdEYgU0VMRUNUSU9OX1NUQVJUX1JFQ1RBTkdMRSA9IG5ldyBSZWN0RigxLCAyLCAzLCA0KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0RiBTRUxFQ1RJT05fRU5EX1JFQ1RBTkdMRSA9IG5ldyBSZWN0RigwLCAyLCAzLCA0KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMTEJBQ0tfVEVYVCA9ICJmYWxsYmFja190ZXh0IjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXIoKSB7CisgICAgICAgIFNlbGVjdFJhbmdlR2VzdHVyZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU2VsZWN0UmFuZ2VHZXN0dXJlLkJ1aWxkZXIoKTsKKyAgICAgICAgU2VsZWN0UmFuZ2VHZXN0dXJlIGdlc3R1cmUgPSBidWlsZGVyLnNldEdyYW51bGFyaXR5KEhhbmR3cml0aW5nR2VzdHVyZS5HUkFOVUxBUklUWV9XT1JEKQorICAgICAgICAgICAgICAgIC5zZXRTZWxlY3Rpb25TdGFydEFyZWEoU0VMRUNUSU9OX1NUQVJUX1JFQ1RBTkdMRSkKKyAgICAgICAgICAgICAgICAuc2V0U2VsZWN0aW9uRW5kQXJlYShTRUxFQ1RJT05fRU5EX1JFQ1RBTkdMRSkKKyAgICAgICAgICAgICAgICAuc2V0RmFsbGJhY2tUZXh0KEZBTExCQUNLX1RFWFQpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ2VzdHVyZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhIYW5kd3JpdGluZ0dlc3R1cmUuR1JBTlVMQVJJVFlfV09SRCwgZ2VzdHVyZS5nZXRHcmFudWxhcml0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNFTEVDVElPTl9TVEFSVF9SRUNUQU5HTEUsIGdlc3R1cmUuZ2V0U2VsZWN0aW9uU3RhcnRBcmVhKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0VMRUNUSU9OX0VORF9SRUNUQU5HTEUsIGdlc3R1cmUuZ2V0U2VsZWN0aW9uRW5kQXJlYSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZBTExCQUNLX1RFWFQsIGdlc3R1cmUuZ2V0RmFsbGJhY2tUZXh0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ZpZXcvc3R5bHVzL0hhbmR3cml0aW5nSW5pdGlhdG9yVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9zdHlsdXMvSGFuZHdyaXRpbmdJbml0aWF0b3JUZXN0LmphdmEKaW5kZXggYTNkZWM4NC4uZmNjYjE3NyAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9zdHlsdXMvSGFuZHdyaXRpbmdJbml0aWF0b3JUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9zdHlsdXMvSGFuZHdyaXRpbmdJbml0aWF0b3JUZXN0LmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnJlc2V0OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnNweTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CkBAIC0yMjQsNyArMjI1LDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIG9uVG91Y2hFdmVudF9zdGFydEhhbmR3cml0aW5nX2RlbGVnYXRlKCkgeworICAgIHB1YmxpYyB2b2lkIG9uVG91Y2hFdmVudF90cnlBY2NlcHREZWxlZ2F0aW9uX2RlbGVnYXRvckNhbGxiYWNrQ3JlYXRlc0lucHV0Q29ubmVjdGlvbigpIHsKICAgICAgICAgVmlldyBkZWxlZ2F0ZVZpZXcgPSBuZXcgVmlldyhtQ29udGV4dCk7CiAgICAgICAgIGRlbGVnYXRlVmlldy5zZXRJc0hhbmR3cml0aW5nRGVsZWdhdGUodHJ1ZSk7CiAKQEAgLTI0NSw2ICsyNDYsMjkgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG9uVG91Y2hFdmVudF90cnlBY2NlcHREZWxlZ2F0aW9uX2RlbGVnYXRvckNhbGxiYWNrRm9jdXNlc0RlbGVnYXRlKCkgeworICAgICAgICBWaWV3IGRlbGVnYXRlVmlldyA9IG5ldyBWaWV3KG1Db250ZXh0KTsKKyAgICAgICAgZGVsZWdhdGVWaWV3LnNldElzSGFuZHdyaXRpbmdEZWxlZ2F0ZSh0cnVlKTsKKyAgICAgICAgbUhhbmR3cml0aW5nSW5pdGlhdG9yLm9uSW5wdXRDb25uZWN0aW9uQ3JlYXRlZChkZWxlZ2F0ZVZpZXcpOworICAgICAgICByZXNldChtSGFuZHdyaXRpbmdJbml0aWF0b3IpOworCisgICAgICAgIG1UZXN0VmlldzEuc2V0SGFuZHdyaXRpbmdEZWxlZ2F0b3JDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAoKSAtPiBtSGFuZHdyaXRpbmdJbml0aWF0b3Iub25EZWxlZ2F0ZVZpZXdGb2N1c2VkKGRlbGVnYXRlVmlldykpOworCisgICAgICAgIGZpbmFsIGludCB4MSA9IChzSHdBcmVhMS5sZWZ0ICsgc0h3QXJlYTEucmlnaHQpIC8gMjsKKyAgICAgICAgZmluYWwgaW50IHkxID0gKHNId0FyZWExLnRvcCArIHNId0FyZWExLmJvdHRvbSkgLyAyOworICAgICAgICBNb3Rpb25FdmVudCBzdHlsdXNFdmVudDEgPSBjcmVhdGVTdHlsdXNFdmVudChBQ1RJT05fRE9XTiwgeDEsIHkxLCAwKTsKKyAgICAgICAgbUhhbmR3cml0aW5nSW5pdGlhdG9yLm9uVG91Y2hFdmVudChzdHlsdXNFdmVudDEpOworCisgICAgICAgIGZpbmFsIGludCB4MiA9IHgxICsgbUhhbmR3cml0aW5nU2xvcCAqIDI7CisgICAgICAgIGZpbmFsIGludCB5MiA9IHkxOworICAgICAgICBNb3Rpb25FdmVudCBzdHlsdXNFdmVudDIgPSBjcmVhdGVTdHlsdXNFdmVudChBQ1RJT05fTU9WRSwgeDIsIHkyLCAwKTsKKyAgICAgICAgbUhhbmR3cml0aW5nSW5pdGlhdG9yLm9uVG91Y2hFdmVudChzdHlsdXNFdmVudDIpOworCisgICAgICAgIHZlcmlmeShtSGFuZHdyaXRpbmdJbml0aWF0b3IsIHRpbWVzKDEpKS50cnlBY2NlcHRTdHlsdXNIYW5kd3JpdGluZ0RlbGVnYXRpb24oZGVsZWdhdGVWaWV3KTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIG9uVG91Y2hFdmVudF9ub3RTdGFydEhhbmR3cml0aW5nX3doZW5IYW5kd3JpdGluZ05vdEF2YWlsYWJsZSgpIHsKICAgICAgICAgZmluYWwgUmVjdCByZWN0ID0gbmV3IFJlY3QoNjAwLCA2MDAsIDkwMCwgOTAwKTsKICAgICAgICAgZmluYWwgVmlldyB0ZXN0VmlldyA9IGNyZWF0ZVZpZXcocmVjdCwgdHJ1ZSAvKiBhdXRvSGFuZHdyaXRpbmdFbmFibGVkICovLApAQCAtMzM3LDYgKzM2MSwyNyBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgb25Ub3VjaEV2ZW50X2ZvY3VzVmlld19pbnB1dENvbm5lY3Rpb25BbHJlYWR5QnVpbHRfc3R5bHVzTW92ZU9uY2Vfd2l0aGluSFdBcmVhKCkgeworICAgICAgICBtSGFuZHdyaXRpbmdJbml0aWF0b3Iub25JbnB1dENvbm5lY3Rpb25DcmVhdGVkKG1UZXN0VmlldzEpOworCisgICAgICAgIGZpbmFsIGludCB4MSA9IChzSHdBcmVhMS5sZWZ0ICsgc0h3QXJlYTEucmlnaHQpIC8gMjsKKyAgICAgICAgZmluYWwgaW50IHkxID0gKHNId0FyZWExLnRvcCArIHNId0FyZWExLmJvdHRvbSkgLyAyOworICAgICAgICBNb3Rpb25FdmVudCBzdHlsdXNFdmVudDEgPSBjcmVhdGVTdHlsdXNFdmVudChBQ1RJT05fRE9XTiwgeDEsIHkxLCAwKTsKKyAgICAgICAgbUhhbmR3cml0aW5nSW5pdGlhdG9yLm9uVG91Y2hFdmVudChzdHlsdXNFdmVudDEpOworCisgICAgICAgIGZpbmFsIGludCB4MiA9IHgxICsgbUhhbmR3cml0aW5nU2xvcCAqIDI7CisgICAgICAgIGZpbmFsIGludCB5MiA9IHkxOworCisgICAgICAgIE1vdGlvbkV2ZW50IHN0eWx1c0V2ZW50MiA9IGNyZWF0ZVN0eWx1c0V2ZW50KEFDVElPTl9NT1ZFLCB4MiwgeTIsIDApOworICAgICAgICBtSGFuZHdyaXRpbmdJbml0aWF0b3Iub25Ub3VjaEV2ZW50KHN0eWx1c0V2ZW50Mik7CisKKyAgICAgICAgLy8gVmlldyBoYXMgaW5wdXQgY29ubmVjdGlvbiBidXQgbm90IGZvY3VzLCBzbyBIYW5kd3JpdGluZ0luaXRpYXRvciB3aWxsIHJlcXVlc3QgZm9jdXMKKyAgICAgICAgLy8gYmVmb3JlIHN0YXJ0aW5nIGhhbmR3cml0aW5nLgorICAgICAgICB2ZXJpZnkobVRlc3RWaWV3MSkucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIHZlcmlmeShtSGFuZHdyaXRpbmdJbml0aWF0b3IpLnN0YXJ0SGFuZHdyaXRpbmcobVRlc3RWaWV3MSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBvblRvdWNoRXZlbnRfZm9jdXNWaWV3X3N0eWx1c01vdmVPbmNlX3dpdGhpbkV4dGVuZGVkSFdBcmVhKCkgewogICAgICAgICBmaW5hbCBpbnQgeDEgPSBzSHdBcmVhMS5sZWZ0IC0gSFdfQk9VTkRTX09GRlNFVFNfTEVGVF9QWCAvIDI7CiAgICAgICAgIGZpbmFsIGludCB5MSA9IHNId0FyZWExLnRvcCAtIEhXX0JPVU5EU19PRkZTRVRTX1RPUF9QWCAvIDI7CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL3Byb2NzdGF0cy9Qcm9jZXNzU3RhdHNUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL3Byb2NzdGF0cy9Qcm9jZXNzU3RhdHNUZXN0LmphdmEKaW5kZXggMzViMzI2Ny4uNjE4OTkxNCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9wcm9jc3RhdHMvUHJvY2Vzc1N0YXRzVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvcHJvY3N0YXRzL1Byb2Nlc3NTdGF0c1Rlc3QuamF2YQpAQCAtMjMsNiArMjMsOCBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2NrczsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKKwogaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkZyYW1ld29ya1N0YXRzTG9nOwpAQCAtMTI4LDYgKzEzMCwzNCBAQAogICAgIH0KIAogICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVtcEJvdW5kRmdzRHVyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvY2Vzc1N0YXRzIHByb2Nlc3NTdGF0cyA9IG5ldyBQcm9jZXNzU3RhdHMoKTsKKyAgICAgICAgUHJvY2Vzc1N0YXRlIHByb2Nlc3NTdGF0ZSA9CisgICAgICAgICAgICAgICAgcHJvY2Vzc1N0YXRzLmdldFByb2Nlc3NTdGF0ZUxvY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQUF8xX1BBQ0tBR0VfTkFNRSwgQVBQXzFfVUlELCBBUFBfMV9WRVJTSU9OLCBBUFBfMV9QUk9DRVNTX05BTUUpOworICAgICAgICBwcm9jZXNzU3RhdGUuc2V0U3RhdGUoQWN0aXZpdHlNYW5hZ2VyLlBST0NFU1NfU1RBVEVfQk9VTkRfRk9SRUdST1VORF9TRVJWSUNFLAorICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0cy5BREpfTUVNX0ZBQ1RPUl9OT1JNQUwsIE5PV19NUywgLyogcGtnTGlzdCAqLyBudWxsKTsKKyAgICAgICAgcHJvY2Vzc1N0YXRlLmNvbW1pdFN0YXRlVGltZShOT1dfTVMgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKERVUkFUSU9OX1NFQ1MpKTsKKyAgICAgICAgcHJvY2Vzc1N0YXRzLmR1bXBQcm9jZXNzU3RhdGUoRnJhbWV3b3JrU3RhdHNMb2cuUFJPQ0VTU19TVEFURSwgbVN0YXRzRXZlbnRPdXRwdXQpOworICAgICAgICB2ZXJpZnkobVN0YXRzRXZlbnRPdXRwdXQpCisgICAgICAgICAgICAgICAgLndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoRnJhbWV3b3JrU3RhdHNMb2cuUFJPQ0VTU19TVEFURSksCisgICAgICAgICAgICAgICAgICAgICAgICBlcShBUFBfMV9VSUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoQVBQXzFfUFJPQ0VTU19OQU1FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFueUludCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYW55SW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICBlcSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBlcSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxKERVUkFUSU9OX1NFQ1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBlcSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoMCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVtcFByb2Nlc3NBc3NvY2lhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9jZXNzU3RhdHMgcHJvY2Vzc1N0YXRzID0gbmV3IFByb2Nlc3NTdGF0cygpOwogICAgICAgICBBc3NvY2lhdGlvblN0YXRlIGFzc29jaWF0aW9uU3RhdGUgPQpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvY29tLmFuZHJvaWQuZW1lcmdlbmN5LnhtbCBiL2RhdGEvZXRjL2NvbS5hbmRyb2lkLmVtZXJnZW5jeS54bWwKaW5kZXggMmQ2YWUyZS4uMTljNTJhNiAxMDA2NDQKLS0tIGEvZGF0YS9ldGMvY29tLmFuZHJvaWQuZW1lcmdlbmN5LnhtbAorKysgYi9kYXRhL2V0Yy9jb20uYW5kcm9pZC5lbWVyZ2VuY3kueG1sCkBAIC0yMCw2ICsyMCw3IEBACiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DQUxMX1BSSVZJTEVHRUQiLz4KICAgICAgICAgPHBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9VU0VSUyIvPgogICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QUklWSUxFR0VEX1BIT05FX1NUQVRFIi8+CisgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TQ0hFRFVMRV9FWEFDVF9BTEFSTSIvPgogICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU1RBUlRfQUNUSVZJVElFU19GUk9NX0JBQ0tHUk9VTkQiLz4KICAgICAgICAgPCEtLSBSZXF1aXJlZCB0byB1cGRhdGUgZW1lcmdlbmN5IGdlc3R1cmUgc2V0dGluZ3MgLS0+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiLz4KZGlmZiAtLWdpdCBhL2RhdGEvZXRjL3ByaXZhcHAtcGVybWlzc2lvbnMtcGxhdGZvcm0ueG1sIGIvZGF0YS9ldGMvcHJpdmFwcC1wZXJtaXNzaW9ucy1wbGF0Zm9ybS54bWwKaW5kZXggZTI4Nzg2Ny4uMGZhZjYyZSAxMDA2NDQKLS0tIGEvZGF0YS9ldGMvcHJpdmFwcC1wZXJtaXNzaW9ucy1wbGF0Zm9ybS54bWwKKysrIGIvZGF0YS9ldGMvcHJpdmFwcC1wZXJtaXNzaW9ucy1wbGF0Zm9ybS54bWwKQEAgLTI3NSw2ICsyNzUsNyBAQAogICAgICAgICA8IS0tIFBlcm1pc3Npb24gcmVxdWlyZWQgdG8gdGVzdCBvblBlcm1pc3Npb25zQ2hhbmdlZExpc3RlbmVyIC0tPgogICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uT0JTRVJWRV9HUkFOVF9SRVZPS0VfUEVSTUlTU0lPTlMiLz4KICAgICAgICAgPHBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSQUNUX0FDUk9TU19VU0VSUyIvPgorICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUVVFUllfVVNFUlMiLz4KICAgICAgICAgPHBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkxPQ0FMX01BQ19BRERSRVNTIi8+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfQUNDRVNTSUJJTElUWSIvPgogICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX0RFVklDRV9BRE1JTlMiLz4KQEAgLTMyMCw2ICszMjEsNyBAQAogICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVHSVNURVJfQ09OTkVDVElPTl9NQU5BR0VSIi8+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUdJU1RFUl9TSU1fU1VCU0NSSVBUSU9OIi8+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRVRSSUVWRV9XSU5ET1dfQ09OVEVOVCIvPgorICAgICAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0NIRURVTEVfRVhBQ1RfQUxBUk0iLz4KICAgICAgICAgPHBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9BTFdBWVNfRklOSVNIIi8+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRVRfQU5JTUFUSU9OX1NDQUxFIi8+CiAgICAgICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRVRfREVCVUdfQVBQIi8+CmRpZmYgLS1naXQgYS9kYXRhL2V0Yy9zZXJ2aWNlcy5jb3JlLnByb3RvbG9nLmpzb24gYi9kYXRhL2V0Yy9zZXJ2aWNlcy5jb3JlLnByb3RvbG9nLmpzb24KaW5kZXggZmZjNWZmMi4uNTU0OWY4OCAxMDA2NDQKLS0tIGEvZGF0YS9ldGMvc2VydmljZXMuY29yZS5wcm90b2xvZy5qc29uCisrKyBiL2RhdGEvZXRjL3NlcnZpY2VzLmNvcmUucHJvdG9sb2cuanNvbgpAQCAtMjU5LDEyICsyNTksNiBAQAogICAgICAgImdyb3VwIjogIldNX0RFQlVHX0JPT1QiLAogICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YSIKICAgICB9LAotICAgICItMTg3ODgzOTk1NiI6IHsKLSAgICAgICJtZXNzYWdlIjogIk1hcmtpbmcgYXBwIHRva2VuICVzIHdpdGggcmVwbGFjaW5nIHdpbmRvd3MuIiwKLSAgICAgICJsZXZlbCI6ICJERUJVRyIsCi0gICAgICAiZ3JvdXAiOiAiV01fREVCVUdfQUREX1JFTU9WRSIsCi0gICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9BY3Rpdml0eVJlY29yZC5qYXZhIgotICAgIH0sCiAgICAgIi0xODcyMjg4Njg1IjogewogICAgICAgIm1lc3NhZ2UiOiAiYXBwbHlBbmltYXRpb246IGFuaW09JXMgbmV4dEFwcFRyYW5zaXRpb249JXMgdHJhbnNpdD0lcyBpc0VudHJhbmNlPSViIENhbGxlcnM9JXMiLAogICAgICAgImxldmVsIjogIlZFUkJPU0UiLApAQCAtNDYzLDEyICs0NTcsNiBAQAogICAgICAgImdyb3VwIjogIldNX0RFQlVHX0FERF9SRU1PVkUiLAogICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvVGFzay5qYXZhIgogICAgIH0sCi0gICAgIi0xNjk4ODE1Njg4IjogewotICAgICAgIm1lc3NhZ2UiOiAiUmVzZXR0aW5nIGFwcCB0b2tlbiAlcyBvZiByZXBsYWNpbmcgd2luZG93IG1hcmtzLiIsCi0gICAgICAibGV2ZWwiOiAiREVCVUciLAotICAgICAgImdyb3VwIjogIldNX0RFQlVHX0FERF9SRU1PVkUiLAotICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvQWN0aXZpdHlSZWNvcmQuamF2YSIKLSAgICB9LAogICAgICItMTY3OTQxMTk5MyI6IHsKICAgICAgICJtZXNzYWdlIjogInNldFZyMmREaXNwbGF5SWQgY2FsbGVkIGZvcjogJWQiLAogICAgICAgImxldmVsIjogIkRFQlVHIiwKQEAgLTQ4MSwxMiArNDY5LDYgQEAKICAgICAgICJncm91cCI6ICJXTV9FUlJPUiIsCiAgICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhIgogICAgIH0sCi0gICAgIi0xNjYxNzA0NTgwIjogewotICAgICAgIm1lc3NhZ2UiOiAiQXR0ZW1wdGVkIHRvIHNldCByZXBsYWNpbmcgd2luZG93IG9uIG5vbi1leGlzdGluZyBhcHAgdG9rZW4gJXMiLAotICAgICAgImxldmVsIjogIldBUk4iLAotICAgICAgImdyb3VwIjogIldNX0VSUk9SIiwKLSAgICAgICJhdCI6ICJjb21cL2FuZHJvaWRcL3NlcnZlclwvd21cL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEiCi0gICAgfSwKICAgICAiLTE2NDczMzIxOTgiOiB7CiAgICAgICAibWVzc2FnZSI6ICJyZW1vdmUgUmVjZW50VGFzayAlcyB3aGVuIGZpbmlzaGluZyB1c2VyICVkIiwKICAgICAgICJsZXZlbCI6ICJJTkZPIiwKQEAgLTYxMywxMiArNTk1LDYgQEAKICAgICAgICJncm91cCI6ICJXTV9FUlJPUiIsCiAgICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhIgogICAgIH0sCi0gICAgIi0xNTE1MTUxNTAzIjogewotICAgICAgIm1lc3NhZ2UiOiAiPj4+IE9QRU4gVFJBTlNBQ1RJT04gcmVtb3ZlUmVwbGFjZWRXaW5kb3dzIiwKLSAgICAgICJsZXZlbCI6ICJJTkZPIiwKLSAgICAgICJncm91cCI6ICJXTV9TSE9XX1RSQU5TQUNUSU9OUyIsCi0gICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9Sb290V2luZG93Q29udGFpbmVyLmphdmEiCi0gICAgfSwKICAgICAiLTE1MDE1NjQwNTUiOiB7CiAgICAgICAibWVzc2FnZSI6ICJPcmdhbml6ZWQgVGFza0ZyYWdtZW50IGlzIG5vdCByZWFkeT0gJXMiLAogICAgICAgImxldmVsIjogIlZFUkJPU0UiLApAQCAtNjkxLDEyICs2NjcsNiBAQAogICAgICAgImdyb3VwIjogIldNX0RFQlVHX1RBU0tTIiwKICAgICAgICJhdCI6ICJjb21cL2FuZHJvaWRcL3NlcnZlclwvd21cL0FjdGl2aXR5VGFza01hbmFnZXJTZXJ2aWNlLmphdmEiCiAgICAgfSwKLSAgICAiLTE0NzE5NDYxOTIiOiB7Ci0gICAgICAibWVzc2FnZSI6ICJNYXJraW5nIGFwcCB0b2tlbiAlcyB3aXRoIHJlcGxhY2luZyBjaGlsZCB3aW5kb3dzLiIsCi0gICAgICAibGV2ZWwiOiAiREVCVUciLAotICAgICAgImdyb3VwIjogIldNX0RFQlVHX0FERF9SRU1PVkUiLAotICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvQWN0aXZpdHlSZWNvcmQuamF2YSIKLSAgICB9LAogICAgICItMTQ3MTUxODEwOSI6IHsKICAgICAgICJtZXNzYWdlIjogIlNldCBhbmltYXRpbmdFeGl0OiByZWFzb249b25BcHBWaXNpYmlsaXR5Q2hhbmdlZCB3aW49JXMiLAogICAgICAgImxldmVsIjogIkRFQlVHIiwKQEAgLTkxOSwxMiArODg5LDYgQEAKICAgICAgICJncm91cCI6ICJXTV9ERUJVR19CQUNLX1BSRVZJRVciLAogICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvQmFja05hdmlnYXRpb25Db250cm9sbGVyLmphdmEiCiAgICAgfSwKLSAgICAiLTEyNzA3MzE2ODkiOiB7Ci0gICAgICAibWVzc2FnZSI6ICJBdHRlbXB0ZWQgdG8gc2V0IHJlcGxhY2luZyB3aW5kb3cgb24gYXBwIHRva2VuIHdpdGggbm8gY29udGVudCAlcyIsCi0gICAgICAibGV2ZWwiOiAiV0FSTiIsCi0gICAgICAiZ3JvdXAiOiAiV01fRVJST1IiLAotICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YSIKLSAgICB9LAogICAgICItMTI2MzMxNjAxMCI6IHsKICAgICAgICJtZXNzYWdlIjogIkNvbXB1dGVkIHJvdGF0aW9uPSVzICglZCkgZm9yIGRpc3BsYXkgaWQ9JWQgYmFzZWQgb24gbGFzdE9yaWVudGF0aW9uPSVzICglZCkgYW5kIG9sZFJvdGF0aW9uPSVzICglZCkiLAogICAgICAgImxldmVsIjogIlZFUkJPU0UiLApAQCAtMTQxNywxMiArMTM4MSw2IEBACiAgICAgICAiZ3JvdXAiOiAiV01fREVCVUdfT1JJRU5UQVRJT04iLAogICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvRGlzcGxheVJvdGF0aW9uQ29tcGF0UG9saWN5LmphdmEiCiAgICAgfSwKLSAgICAiLTc5OTAwMzA0NSI6IHsKLSAgICAgICJtZXNzYWdlIjogIlNldCBhbmltYXRpbmdFeGl0OiByZWFzb249cmVtb3ZlXC9yZXBsYWNlV2luZG93IHdpbj0lcyIsCi0gICAgICAibGV2ZWwiOiAiVkVSQk9TRSIsCi0gICAgICAiZ3JvdXAiOiAiV01fREVCVUdfQU5JTSIsCi0gICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9XaW5kb3dTdGF0ZS5qYXZhIgotICAgIH0sCiAgICAgIi03ODc2NjQ3MjciOiB7CiAgICAgICAibWVzc2FnZSI6ICJDYW5ub3QgbGF1bmNoIGRyZWFtIGFjdGl2aXR5IGR1ZSB0byBpbnZhbGlkIHN0YXRlLiBkcmVhbSBjb21wb25lbnQ6ICVzIHBhY2thZ2VOYW1lOiAlcyIsCiAgICAgICAibGV2ZWwiOiAiRVJST1IiLApAQCAtMTQ1Myw2ICsxNDExLDEyIEBACiAgICAgICAiZ3JvdXAiOiAiV01fREVCVUdfV0lORE9XX1RSQU5TSVRJT05TIiwKICAgICAgICJhdCI6ICJjb21cL2FuZHJvaWRcL3NlcnZlclwvd21cL1RyYW5zaXRpb24uamF2YSIKICAgICB9LAorICAgICItNzc4MzQ3NDYzIjogeworICAgICAgIm1lc3NhZ2UiOiAiUmVtb3ZlICVzOiBtU3VyZmFjZUNvbnRyb2xsZXI9JXMgbUFuaW1hdGluZ0V4aXQ9JWIgbVJlbW92ZU9uRXhpdD0lYiBtSGFzU3VyZmFjZT0lYiBzdXJmYWNlU2hvd2luZz0lYiBhbmltYXRpbmc9JWIgYXBwLWFuaW1hdGlvbj0lYiBtRGlzcGxheUZyb3plbj0lYiBjYWxsZXJzPSVzIiwKKyAgICAgICJsZXZlbCI6ICJWRVJCT1NFIiwKKyAgICAgICJncm91cCI6ICJXTV9ERUJVR19BUFBfVFJBTlNJVElPTlMiLAorICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvV2luZG93U3RhdGUuamF2YSIKKyAgICB9LAogICAgICItNzc1MDA0ODY5IjogewogICAgICAgIm1lc3NhZ2UiOiAiTm90IGEgbWF0Y2g6ICVzIiwKICAgICAgICJsZXZlbCI6ICJERUJVRyIsCkBAIC0xOTYzLDEyICsxOTI3LDYgQEAKICAgICAgICJncm91cCI6ICJXTV9FUlJPUiIsCiAgICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhIgogICAgIH0sCi0gICAgIi0zMjA0MTk2NDUiOiB7Ci0gICAgICAibWVzc2FnZSI6ICJSZW1vdmluZyByZXBsYWNlZCB3aW5kb3c6ICVzIiwKLSAgICAgICJsZXZlbCI6ICJERUJVRyIsCi0gICAgICAiZ3JvdXAiOiAiV01fREVCVUdfQUREX1JFTU9WRSIsCi0gICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9XaW5kb3dTdGF0ZS5qYXZhIgotICAgIH0sCiAgICAgIi0zMTk2ODkyMDMiOiB7CiAgICAgICAibWVzc2FnZSI6ICJSZXBhcmVudGluZyB0byBvcmlnaW5hbCBwYXJlbnQ6ICVzIGZvciAlcyIsCiAgICAgICAibGV2ZWwiOiAiSU5GTyIsCkBAIC0yMzM1LDEyICsyMjkzLDYgQEAKICAgICAgICJncm91cCI6ICJXTV9ERUJVR19SRU1PVEVfQU5JTUFUSU9OUyIsCiAgICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9SZW1vdGVBbmltYXRpb25Db250cm9sbGVyLmphdmEiCiAgICAgfSwKLSAgICAiMzgyNjc0MzMiOiB7Ci0gICAgICAibWVzc2FnZSI6ICJBdHRlbXB0ZWQgdG8gcmVzZXQgcmVwbGFjaW5nIHdpbmRvdyBvbiBub24tZXhpc3RpbmcgYXBwIHRva2VuICVzIiwKLSAgICAgICJsZXZlbCI6ICJXQVJOIiwKLSAgICAgICJncm91cCI6ICJXTV9FUlJPUiIsCi0gICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhIgotICAgIH0sCiAgICAgIjQ1Mjg1NDE5IjogewogICAgICAgIm1lc3NhZ2UiOiAic3RhcnRpbmdXaW5kb3cgd2FzIHNldCBidXQgc3RhcnRpbmdTdXJmYWNlPT1udWxsLCBjb3VsZG4ndCByZW1vdmUiLAogICAgICAgImxldmVsIjogIlZFUkJPU0UiLApAQCAtMjk4OSwxMiArMjk0MSw2IEBACiAgICAgICAiZ3JvdXAiOiAiV01fREVCVUdfUkVNT1RFX0FOSU1BVElPTlMiLAogICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvUmVtb3RlQW5pbWF0aW9uQ29udHJvbGxlci5qYXZhIgogICAgIH0sCi0gICAgIjU5NDI2MDY1NCI6IHsKLSAgICAgICJtZXNzYWdlIjogIlJlbW92ZSAlczogbVN1cmZhY2VDb250cm9sbGVyPSVzIG1BbmltYXRpbmdFeGl0PSViIG1SZW1vdmVPbkV4aXQ9JWIgbUhhc1N1cmZhY2U9JWIgc3VyZmFjZVNob3dpbmc9JWIgYW5pbWF0aW5nPSViIGFwcC1hbmltYXRpb249JWIgbVdpbGxSZXBsYWNlV2luZG93PSViIG1EaXNwbGF5RnJvemVuPSViIGNhbGxlcnM9JXMiLAotICAgICAgImxldmVsIjogIlZFUkJPU0UiLAotICAgICAgImdyb3VwIjogIldNX0RFQlVHX0FQUF9UUkFOU0lUSU9OUyIsCi0gICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9XaW5kb3dTdGF0ZS5qYXZhIgotICAgIH0sCiAgICAgIjYwMDE0MDY3MyI6IHsKICAgICAgICJtZXNzYWdlIjogImNoZWNrQm9vdEFuaW1hdGlvbkNvbXBsZXRlOiBXYWl0aW5nIGZvciBhbmltIGNvbXBsZXRlIiwKICAgICAgICJsZXZlbCI6ICJJTkZPIiwKQEAgLTM4MjksMTIgKzM3NzUsNiBAQAogICAgICAgImdyb3VwIjogIldNX0VSUk9SIiwKICAgICAgICJhdCI6ICJjb21cL2FuZHJvaWRcL3NlcnZlclwvd21cL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEiCiAgICAgfSwKLSAgICAiMTQyMzU5Mjk2MSI6IHsKLSAgICAgICJtZXNzYWdlIjogIjw8PCBDTE9TRSBUUkFOU0FDVElPTiByZW1vdmVSZXBsYWNlZFdpbmRvd3MiLAotICAgICAgImxldmVsIjogIklORk8iLAotICAgICAgImdyb3VwIjogIldNX1NIT1dfVFJBTlNBQ1RJT05TIiwKLSAgICAgICJhdCI6ICJjb21cL2FuZHJvaWRcL3NlcnZlclwvd21cL1Jvb3RXaW5kb3dDb250YWluZXIuamF2YSIKLSAgICB9LAogICAgICIxNDMwMzM2ODgyIjogewogICAgICAgIm1lc3NhZ2UiOiAiZmluZEZvY3VzZWRXaW5kb3c6IGZvY3VzZWRBcHAgd2luZG93cyBub3QgZm9jdXNhYmxlIHVzaW5nIG5ldyBmb2N1cyBAICVzIiwKICAgICAgICJsZXZlbCI6ICJWRVJCT1NFIiwKQEAgLTM5MDEsMTIgKzM4NDEsNiBAQAogICAgICAgImdyb3VwIjogIldNX0RFQlVHX0FERF9SRU1PVkUiLAogICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvV2luZG93U3RhdGUuamF2YSIKICAgICB9LAotICAgICIxNTE1MTYxMjM5IjogewotICAgICAgIm1lc3NhZ2UiOiAicmVtb3ZlRGVhZFdpbmRvd3M6ICVzIiwKLSAgICAgICJsZXZlbCI6ICJXQVJOIiwKLSAgICAgICJncm91cCI6ICJXTV9ERUJVR19BRERfUkVNT1ZFIiwKLSAgICAgICJhdCI6ICJjb21cL2FuZHJvaWRcL3NlcnZlclwvd21cL0FjdGl2aXR5UmVjb3JkLmphdmEiCi0gICAgfSwKICAgICAiMTUxODQ5NTQ0NiI6IHsKICAgICAgICJtZXNzYWdlIjogInJlbW92ZVdpbmRvd1Rva2VuOiBBdHRlbXB0ZWQgdG8gcmVtb3ZlIG5vbi1leGlzdGluZyB0b2tlbjogJXMiLAogICAgICAgImxldmVsIjogIldBUk4iLApAQCAtNDI3MywxMiArNDIwNyw2IEBACiAgICAgICAiZ3JvdXAiOiAiV01fREVCVUdfV0lORE9XX09SR0FOSVpFUiIsCiAgICAgICAiYXQiOiAiY29tXC9hbmRyb2lkXC9zZXJ2ZXJcL3dtXC9UYXNrT3JnYW5pemVyQ29udHJvbGxlci5qYXZhIgogICAgIH0sCi0gICAgIjE5MjE4MjExOTkiOiB7Ci0gICAgICAibWVzc2FnZSI6ICJQcmVzZXJ2aW5nICVzIHVudGlsIHRoZSBuZXcgb25lIGlzIGFkZGVkIiwKLSAgICAgICJsZXZlbCI6ICJWRVJCT1NFIiwKLSAgICAgICJncm91cCI6ICJXTV9ERUJVR19BRERfUkVNT1ZFIiwKLSAgICAgICJhdCI6ICJjb21cL2FuZHJvaWRcL3NlcnZlclwvd21cL1dpbmRvd1N0YXRlLmphdmEiCi0gICAgfSwKICAgICAiMTkyODMyNTEyOCI6IHsKICAgICAgICJtZXNzYWdlIjogIlJ1biBzaG93SW1lUnVubmVyIiwKICAgICAgICJsZXZlbCI6ICJERUJVRyIsCkBAIC00NDg5LDEyICs0NDE3LDYgQEAKICAgICAgICJncm91cCI6ICJXTV9ERUJVR19BUFBfVFJBTlNJVElPTlMiLAogICAgICAgImF0IjogImNvbVwvYW5kcm9pZFwvc2VydmVyXC93bVwvQXBwVHJhbnNpdGlvbkNvbnRyb2xsZXIuamF2YSIKICAgICB9LAotICAgICIyMTE0MTQ5OTI2IjogewotICAgICAgIm1lc3NhZ2UiOiAiTm90IHJlbW92aW5nICVzIGJlY2F1c2UgYXBwIGRpZWQgd2hpbGUgaXQncyB2aXNpYmxlIiwKLSAgICAgICJsZXZlbCI6ICJWRVJCT1NFIiwKLSAgICAgICJncm91cCI6ICJXTV9ERUJVR19BRERfUkVNT1ZFIiwKLSAgICAgICJhdCI6ICJjb21cL2FuZHJvaWRcL3NlcnZlclwvd21cL1dpbmRvd1N0YXRlLmphdmEiCi0gICAgfSwKICAgICAiMjExNzY5NjQxMyI6IHsKICAgICAgICJtZXNzYWdlIjogIm1vdmVUYXNrVG9Gcm9udDogbW92aW5nIHRhc2tJZD0lZCIsCiAgICAgICAibGV2ZWwiOiAiREVCVUciLApkaWZmIC0tZ2l0IGEvZGF0YS9mb250cy9mb250cy54bWwgYi9kYXRhL2ZvbnRzL2ZvbnRzLnhtbAppbmRleCA4ZTJhNTljLi5lN2RkYzg4IDEwMDY0NAotLS0gYS9kYXRhL2ZvbnRzL2ZvbnRzLnhtbAorKysgYi9kYXRhL2ZvbnRzL2ZvbnRzLnhtbApAQCAtMjU1LDkgKzI1NSwxMiBAQAogICAgIDwvZmFtaWx5PgogCiAgICAgPGZhbWlseSBuYW1lPSJjdXJzaXZlIj4KLSAgICAgICAgPGZvbnQgd2VpZ2h0PSI0MDAiIHN0eWxlPSJub3JtYWwiIHBvc3RTY3JpcHROYW1lPSJEYW5jaW5nU2NyaXB0Ij5EYW5jaW5nU2NyaXB0LVJlZ3VsYXIudHRmCi0gICAgICAgIDwvZm9udD4KLSAgICAgICAgPGZvbnQgd2VpZ2h0PSI3MDAiIHN0eWxlPSJub3JtYWwiPkRhbmNpbmdTY3JpcHQtQm9sZC50dGY8L2ZvbnQ+CisgICAgICA8Zm9udCB3ZWlnaHQ9IjQwMCIgc3R5bGU9Im5vcm1hbCI+RGFuY2luZ1NjcmlwdC1SZWd1bGFyLnR0ZgorICAgICAgICA8YXhpcyB0YWc9IndnaHQiIHN0eWxldmFsdWU9IjQwMCIgLz4KKyAgICAgIDwvZm9udD4KKyAgICAgIDxmb250IHdlaWdodD0iNzAwIiBzdHlsZT0ibm9ybWFsIj5EYW5jaW5nU2NyaXB0LVJlZ3VsYXIudHRmCisgICAgICAgIDxheGlzIHRhZz0id2dodCIgc3R5bGV2YWx1ZT0iNzAwIiAvPgorICAgICAgPC9mb250PgogICAgIDwvZmFtaWx5PgogCiAgICAgPGZhbWlseSBuYW1lPSJzYW5zLXNlcmlmLXNtYWxsY2FwcyI+CmRpZmYgLS1naXQgYS9kYXRhL2tleWJvYXJkcy9HZW5lcmljLmtjbSBiL2RhdGEva2V5Ym9hcmRzL0dlbmVyaWMua2NtCmluZGV4IGZlNmVlZWIuLjEwNDg3NDIgMTAwNjQ0Ci0tLSBhL2RhdGEva2V5Ym9hcmRzL0dlbmVyaWMua2NtCisrKyBiL2RhdGEva2V5Ym9hcmRzL0dlbmVyaWMua2NtCkBAIC00Miw5ICs0MiwxMCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJwotICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCi0gICAgc2hpZnQrYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNycKICAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKKyAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU3JworICAgIHNoaWZ0K2FsdCwgY2Fwc2xvY2srYWx0OiAgICAgICAgICAgICdcdTAwYzcnCisgICAgc2hpZnQrY2Fwc2xvY2srYWx0OiAgICAgICAgICAgICAgICAgJ1x1MDBlNycKIH0KIAoga2V5IEQgewpAQCAtNTgsOCArNTksOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJwotICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDEnCiAgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCisgICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMScKIH0KIAoga2V5IEYgewpAQCAtODcsOCArODgsOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJwotICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDInCiAgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCisgICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMicKIH0KIAoga2V5IEogewpAQCAtMTIzLDggKzEyNCw4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCi0gICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMycKICAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKKyAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAzJwogfQogCiBrZXkgTyB7CkBAIC0xNTksOCArMTYwLDggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKLSAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGRmJwogICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJworICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGYnCiB9CiAKIGtleSBUIHsKQEAgLTE3NCw4ICsxNzUsOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJwotICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDgnCiAgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCisgICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwOCcKIH0KIAoga2V5IFYgewpkaWZmIC0tZ2l0IGEvZGF0YS9rZXlib2FyZHMvVmVuZG9yXzAwNGNfUHJvZHVjdF8wMjY1LmlkYyBiL2RhdGEva2V5Ym9hcmRzL1ZlbmRvcl8wMDRjX1Byb2R1Y3RfMDI2NS5pZGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlYTRkYgotLS0gL2Rldi9udWxsCisrKyBiL2RhdGEva2V5Ym9hcmRzL1ZlbmRvcl8wMDRjX1Byb2R1Y3RfMDI2NS5pZGMKQEAgLTAsMCArMSwzNCBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwcGxlIE1hZ2ljIFRyYWNrcGFkIDIgKEJsdWV0b290aCkgY29uZmlndXJhdGlvbiBmaWxlCisjCisjIFdIRU4gTU9ESUZZSU5HLCBhbHNvIGNoYW5nZSB0aGUgVVNCIGZpbGUgKFZlbmRvcl8wNWFjX1Byb2R1Y3RfMDI2NS5pZGMpCisjCisKK2dlc3R1cmVQcm9wLlByZXNzdXJlX0NhbGlicmF0aW9uX09mZnNldCA9IDMwCitnZXN0dXJlUHJvcC5QYWxtX1ByZXNzdXJlID0gMjUwLjAKK2dlc3R1cmVQcm9wLlBhbG1fV2lkdGggPSAyMC4wCitnZXN0dXJlUHJvcC5NdWx0aXBsZV9QYWxtX1dpZHRoID0gMjAuMAorCisjIEVuYWJsZSBTdGF0aW9uYXJ5IFdpZ2dsZSBGaWx0ZXIKK2dlc3R1cmVQcm9wLlN0YXRpb25hcnlfV2lnZ2xlX0ZpbHRlcl9FbmFibGVkID0gMQorZ2VzdHVyZVByb3AuRmluZ2VyX01vdmluZ19FbmVyZ3kgPSAwLjAwMDgKK2dlc3R1cmVQcm9wLkZpbmdlcl9Nb3ZpbmdfSHlzdGVyZXNpcyA9IDAuMDAwNAorCisjIEF2b2lkIGFjY2lkZW50YWwgc2Nyb2xsL21vdmUgb24gZmluZ2VyIGxpZnQKK2dlc3R1cmVQcm9wLk1heF9TdGF0aW9uYXJ5X01vdmVfU3BlZWQgPSA0NworZ2VzdHVyZVByb3AuTWF4X1N0YXRpb25hcnlfTW92ZV9TcGVlZF9IeXN0ZXJlc2lzID0gMQorZ2VzdHVyZVByb3AuTWF4X1N0YXRpb25hcnlfTW92ZV9TdXBwcmVzc19EaXN0YW5jZSA9IDAuMgpkaWZmIC0tZ2l0IGEvZGF0YS9rZXlib2FyZHMvVmVuZG9yXzAzZjZfUHJvZHVjdF9hMDAxLmlkYyBiL2RhdGEva2V5Ym9hcmRzL1ZlbmRvcl8wM2Y2X1Byb2R1Y3RfYTAwMS5pZGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiNGVlMwotLS0gL2Rldi9udWxsCisrKyBiL2RhdGEva2V5Ym9hcmRzL1ZlbmRvcl8wM2Y2X1Byb2R1Y3RfYTAwMS5pZGMKQEAgLTAsMCArMSwyMiBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEJyeWRnZSBUb3VjaHBhZAorIworCisjIFJlcG9ydHMgZnJvbSB0aGlzIHRvdWNocGFkIHNvbWV0aW1lcyBnZXQgYnVuY2hlZCB0b2dldGhlciBkdWUgdG8gQmx1ZXRvb3RoCisjIGJhdGNoaW5nLCBsZWFkaW5nIHRvIGJhZCB0aW1lc3RhbXBzIHRoYXQgbWVzcyB1cCBmaW5nZXIgdmVsb2NpdHkgY2FsY3VsYXRpb25zLgorIyBUbyBmaXggdGhpcywgc2V0IGEgZmFrZSBkZWx0YSB1c2luZyB0aGUgdG91Y2hwYWQncyBrbm93biByZXBvcnQgcmF0ZS4KK2dlc3R1cmVQcm9wLkZha2VfVGltZXN0YW1wX0RlbHRhID0gMC4wMTAKZGlmZiAtLWdpdCBhL2RhdGEva2V5Ym9hcmRzL1ZlbmRvcl8wNDZkX1Byb2R1Y3RfNDAxMS5pZGMgYi9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDQ2ZF9Qcm9kdWN0XzQwMTEuaWRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMjM4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDQ2ZF9Qcm9kdWN0XzQwMTEuaWRjCkBAIC0wLDAgKzEsMzIgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBMb2dpdGVjaCBXaXJlbGVzcyBUb3VjaHBhZAorIworCitnZXN0dXJlUHJvcC5Ub3VjaHBhZF9TdGFja19WZXJzaW9uID0gMQorZ2VzdHVyZVByb3AuSUlSX2IwID0gMQorZ2VzdHVyZVByb3AuSUlSX2IxID0gMAorZ2VzdHVyZVByb3AuSUlSX2IyID0gMAorZ2VzdHVyZVByb3AuSUlSX2IzID0gMAorZ2VzdHVyZVByb3AuSUlSX2ExID0gMAorZ2VzdHVyZVByb3AuSUlSX2EyID0gMAorZ2VzdHVyZVByb3AuUHJlc3N1cmVfQ2FsaWJyYXRpb25fT2Zmc2V0ID0gLTMxMy4yNDA3NDE3OTI1OTQKK2dlc3R1cmVQcm9wLlByZXNzdXJlX0NhbGlicmF0aW9uX1Nsb3BlID0gNC4zOTY3ODA2MjQzNjc1MgorZ2VzdHVyZVByb3AuTWF4X0FsbG93ZWRfUHJlc3N1cmVfQ2hhbmdlX1Blcl9TZWMgPSAxMDAwMDAuMAorZ2VzdHVyZVByb3AuTWF4X0h5c3RlcmVzaXNfUHJlc3N1cmVfUGVyX1NlYyA9IDEwMDAwMC4wCitnZXN0dXJlUHJvcC5QYWxtX1ByZXNzdXJlID0gMTAwMDAwLjAKK2dlc3R1cmVQcm9wLlR3b19GaW5nZXJfVmVydGljYWxfQ2xvc2VfRGlzdGFuY2VfVGhyZXNoID0gMzUuMAorZ2VzdHVyZVByb3AuRmxpbmdfQnVmZmVyX1N1cHByZXNzX1plcm9fTGVuZ3RoX1Njcm9sbHMgPSAwCmRpZmYgLS1naXQgYS9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDQ2ZF9Qcm9kdWN0XzQxMDEuaWRjIGIvZGF0YS9rZXlib2FyZHMvVmVuZG9yXzA0NmRfUHJvZHVjdF80MTAxLmlkYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UyNTMwCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9rZXlib2FyZHMvVmVuZG9yXzA0NmRfUHJvZHVjdF80MTAxLmlkYwpAQCAtMCwwICsxLDMxIEBACisjIENvcHlyaWdodCAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgTG9naXRlY2ggVDY1MAorIworCitnZXN0dXJlUHJvcC5Ub3VjaHBhZF9TdGFja19WZXJzaW9uID0gMQorZ2VzdHVyZVByb3AuSUlSX2IwID0gMQorZ2VzdHVyZVByb3AuSUlSX2IxID0gMAorZ2VzdHVyZVByb3AuSUlSX2IyID0gMAorZ2VzdHVyZVByb3AuSUlSX2IzID0gMAorZ2VzdHVyZVByb3AuSUlSX2ExID0gMAorZ2VzdHVyZVByb3AuSUlSX2EyID0gMAorZ2VzdHVyZVByb3AuUHJlc3N1cmVfQ2FsaWJyYXRpb25fT2Zmc2V0ID0gLTAuNDM5Mjg4MzUxNzUwMDY4CitnZXN0dXJlUHJvcC5QcmVzc3VyZV9DYWxpYnJhdGlvbl9TbG9wZSA9IDMuMDU5OTg1NTM1MjMzMzUKK2dlc3R1cmVQcm9wLk1heF9BbGxvd2VkX1ByZXNzdXJlX0NoYW5nZV9QZXJfU2VjID0gMTAwMDAwLjAKK2dlc3R1cmVQcm9wLk1heF9IeXN0ZXJlc2lzX1ByZXNzdXJlX1Blcl9TZWMgPSAxMDAwMDAuMAorZ2VzdHVyZVByb3AuVHdvX0Zpbmdlcl9WZXJ0aWNhbF9DbG9zZV9EaXN0YW5jZV9UaHJlc2ggPSAzNS4wCitnZXN0dXJlUHJvcC5GbGluZ19CdWZmZXJfU3VwcHJlc3NfWmVyb19MZW5ndGhfU2Nyb2xscyA9IDAKZGlmZiAtLWdpdCBhL2RhdGEva2V5Ym9hcmRzL1ZlbmRvcl8wNDZkX1Byb2R1Y3RfNDEwMi5pZGMgYi9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDQ2ZF9Qcm9kdWN0XzQxMDIuaWRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzM2EyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDQ2ZF9Qcm9kdWN0XzQxMDIuaWRjCkBAIC0wLDAgKzEsMjQgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBMb2dpdGVjaCBUSzgyMAorIworCitnZXN0dXJlUHJvcC5Ub3VjaHBhZF9TdGFja19WZXJzaW9uID0gMgorIyBQcmVzc3VyZSBqdW1wcyBhcm91bmQgYSBsb3Qgb24gdGhpcyB0b3VjaHBhZCwgc28gYWxsb3cgdGhhdDoKK2dlc3R1cmVQcm9wLk1heF9BbGxvd2VkX1ByZXNzdXJlX0NoYW5nZV9QZXJfU2VjID0gMTAwMDAwLjAKK2dlc3R1cmVQcm9wLk1heF9IeXN0ZXJlc2lzX1ByZXNzdXJlX1Blcl9TZWMgPSAxMDAwMDAuMAorZ2VzdHVyZVByb3AuUHJlc3N1cmVfQ2FsaWJyYXRpb25fT2Zmc2V0ID0gLTE4LjgwNzg0MzUKK2dlc3R1cmVQcm9wLlByZXNzdXJlX0NhbGlicmF0aW9uX1Nsb3BlID0gMi40NjYyMDgxMzcKZGlmZiAtLWdpdCBhL2RhdGEva2V5Ym9hcmRzL1ZlbmRvcl8wNDZkX1Byb2R1Y3RfYjAwYy5pZGMgYi9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDQ2ZF9Qcm9kdWN0X2IwMGMuaWRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTk3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDQ2ZF9Qcm9kdWN0X2IwMGMuaWRjCkBAIC0wLDAgKzEsMzEgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBMb2dpdGVjaCBUNjUxCisjCisKK2dlc3R1cmVQcm9wLlRvdWNocGFkX1N0YWNrX1ZlcnNpb24gPSAxCitnZXN0dXJlUHJvcC5JSVJfYjAgPSAxCitnZXN0dXJlUHJvcC5JSVJfYjEgPSAwCitnZXN0dXJlUHJvcC5JSVJfYjIgPSAwCitnZXN0dXJlUHJvcC5JSVJfYjMgPSAwCitnZXN0dXJlUHJvcC5JSVJfYTEgPSAwCitnZXN0dXJlUHJvcC5JSVJfYTIgPSAwCitnZXN0dXJlUHJvcC5QcmVzc3VyZV9DYWxpYnJhdGlvbl9PZmZzZXQgPSAtNC40NjUyMDQ0NzE3NzA3MworZ2VzdHVyZVByb3AuUHJlc3N1cmVfQ2FsaWJyYXRpb25fU2xvcGUgPSAzLjIxMDcxNzE5MzMyNjQ0CitnZXN0dXJlUHJvcC5NYXhfQWxsb3dlZF9QcmVzc3VyZV9DaGFuZ2VfUGVyX1NlYyA9IDEwMDAwMC4wCitnZXN0dXJlUHJvcC5NYXhfSHlzdGVyZXNpc19QcmVzc3VyZV9QZXJfU2VjID0gMTAwMDAwLjAKK2dlc3R1cmVQcm9wLlR3b19GaW5nZXJfVmVydGljYWxfQ2xvc2VfRGlzdGFuY2VfVGhyZXNoID0gMzUuMAorZ2VzdHVyZVByb3AuRmxpbmdfQnVmZmVyX1N1cHByZXNzX1plcm9fTGVuZ3RoX1Njcm9sbHMgPSAwCmRpZmYgLS1naXQgYS9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDVhY19Qcm9kdWN0XzAyNjUuaWRjIGIvZGF0YS9rZXlib2FyZHMvVmVuZG9yXzA1YWNfUHJvZHVjdF8wMjY1LmlkYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjBkMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9rZXlib2FyZHMvVmVuZG9yXzA1YWNfUHJvZHVjdF8wMjY1LmlkYwpAQCAtMCwwICsxLDM0IEBACisjIENvcHlyaWdodCAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBwbGUgTWFnaWMgVHJhY2twYWQgMiAoVVNCKSBjb25maWd1cmF0aW9uIGZpbGUKKyMKKyMgV0hFTiBNT0RJRllJTkcsIGFsc28gY2hhbmdlIHRoZSBCbHVldG9vdGggZmlsZSAoVmVuZG9yXzAwNGNfUHJvZHVjdF8wMjY1LmlkYykKKyMKKworZ2VzdHVyZVByb3AuUHJlc3N1cmVfQ2FsaWJyYXRpb25fT2Zmc2V0ID0gMzAKK2dlc3R1cmVQcm9wLlBhbG1fUHJlc3N1cmUgPSAyNTAuMAorZ2VzdHVyZVByb3AuUGFsbV9XaWR0aCA9IDIwLjAKK2dlc3R1cmVQcm9wLk11bHRpcGxlX1BhbG1fV2lkdGggPSAyMC4wCisKKyMgRW5hYmxlIFN0YXRpb25hcnkgV2lnZ2xlIEZpbHRlcgorZ2VzdHVyZVByb3AuU3RhdGlvbmFyeV9XaWdnbGVfRmlsdGVyX0VuYWJsZWQgPSAxCitnZXN0dXJlUHJvcC5GaW5nZXJfTW92aW5nX0VuZXJneSA9IDAuMDAwOAorZ2VzdHVyZVByb3AuRmluZ2VyX01vdmluZ19IeXN0ZXJlc2lzID0gMC4wMDA0CisKKyMgQXZvaWQgYWNjaWRlbnRhbCBzY3JvbGwvbW92ZSBvbiBmaW5nZXIgbGlmdAorZ2VzdHVyZVByb3AuTWF4X1N0YXRpb25hcnlfTW92ZV9TcGVlZCA9IDQ3CitnZXN0dXJlUHJvcC5NYXhfU3RhdGlvbmFyeV9Nb3ZlX1NwZWVkX0h5c3RlcmVzaXMgPSAxCitnZXN0dXJlUHJvcC5NYXhfU3RhdGlvbmFyeV9Nb3ZlX1N1cHByZXNzX0Rpc3RhbmNlID0gMC4yCmRpZmYgLS1naXQgYS9kYXRhL2tleWJvYXJkcy9WZW5kb3JfMDVhY19Qcm9kdWN0XzAzMGUuaWRjIGIvZGF0YS9rZXlib2FyZHMvVmVuZG9yXzA1YWNfUHJvZHVjdF8wMzBlLmlkYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2EyZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9rZXlib2FyZHMvVmVuZG9yXzA1YWNfUHJvZHVjdF8wMzBlLmlkYwpAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBwbGUgTWFnaWMgVHJhY2twYWQKKyMKKworZ2VzdHVyZVByb3AuVG91Y2hwYWRfU3RhY2tfVmVyc2lvbiA9IDEKKyMgV2UgYXJlIHVzaW5nIHJhdyB0b3VjaCBtYWpvciB2YWx1ZSBhcyBwcmVzc3VyZSB2YWx1ZSwgc28gc2V0IHRoZSBQYWxtCisjIHByZXNzdXJlIHRocmVzaG9sZCBoaWdoLgorZ2VzdHVyZVByb3AuUGFsbV9QcmVzc3VyZSA9IDEwMDAKK2dlc3R1cmVQcm9wLkNvbXB1dGVfU3VyZmFjZV9BcmVhX2Zyb21fUHJlc3N1cmUgPSAwCitnZXN0dXJlUHJvcC5JSVJfYjAgPSAxCitnZXN0dXJlUHJvcC5JSVJfYjEgPSAwCitnZXN0dXJlUHJvcC5JSVJfYjIgPSAwCitnZXN0dXJlUHJvcC5JSVJfYjMgPSAwCitnZXN0dXJlUHJvcC5JSVJfYTEgPSAwCitnZXN0dXJlUHJvcC5JSVJfYTIgPSAwCisjIE5PVEU6IGJpYXMgb24gWC1heGlzIGlzIHVuY2FsaWJyYXRlZAorZ2VzdHVyZVByb3AuVG91Y2hwYWRfRGV2aWNlX091dHB1dF9CaWFzX29uX1gtQXhpcyA9IC0yODMuMzIyNjAyNTI2NjYwNworZ2VzdHVyZVByb3AuVG91Y2hwYWRfRGV2aWNlX091dHB1dF9CaWFzX29uX1ktQXhpcyA9IC0yODMuMzIyNjAyNTI2NjYwNworZ2VzdHVyZVByb3AuTWF4X0FsbG93ZWRfUHJlc3N1cmVfQ2hhbmdlX1Blcl9TZWMgPSAxMDAwMDAuMAorZ2VzdHVyZVByb3AuTWF4X0h5c3RlcmVzaXNfUHJlc3N1cmVfUGVyX1NlYyA9IDEwMDAwMC4wCisjIERydW1yb2xsIHN1cHByZXNzaW9uIGNhdXNlcyBqYW5reSBtb3ZlbWVudCBvbiB0aGlzIHRvdWNocGFkLgorZ2VzdHVyZVByb3AuRHJ1bXJvbGxfU3VwcHJlc3Npb25fRW5hYmxlID0gMAorZ2VzdHVyZVByb3AuVHdvX0Zpbmdlcl9WZXJ0aWNhbF9DbG9zZV9EaXN0YW5jZV9UaHJlc2ggPSAzNS4wCitnZXN0dXJlUHJvcC5GbGluZ19CdWZmZXJfU3VwcHJlc3NfWmVyb19MZW5ndGhfU2Nyb2xscyA9IDAKZGlmZiAtLWdpdCBhL2RhdGEva2V5Ym9hcmRzL1ZpcnR1YWwua2NtIGIvZGF0YS9rZXlib2FyZHMvVmlydHVhbC5rY20KaW5kZXggNTMzMDhlMy4uMDZiODIzNyAxMDA2NDQKLS0tIGEvZGF0YS9rZXlib2FyZHMvVmlydHVhbC5rY20KKysrIGIvZGF0YS9rZXlib2FyZHMvVmlydHVhbC5rY20KQEAgLTM5LDkgKzM5LDEwIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCi0gICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKLSAgICBzaGlmdCthbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM3JwogICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJworICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCisgICAgc2hpZnQrYWx0LCBjYXBzbG9jaythbHQ6ICAgICAgICAgICAgJ1x1MDBjNycKKyAgICBzaGlmdCtjYXBzbG9jaythbHQ6ICAgICAgICAgICAgICAgICAnXHUwMGU3JwogfQogCiBrZXkgRCB7CkBAIC01NSw4ICs1Niw4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCi0gICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMScKICAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKKyAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAxJwogfQogCiBrZXkgRiB7CkBAIC04NCw4ICs4NSw4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCi0gICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMicKICAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKKyAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMicKIH0KIAoga2V5IEogewpAQCAtMTIwLDggKzEyMSw4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCi0gICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMycKICAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKKyAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAzJwogfQogCiBrZXkgTyB7CkBAIC0xNTYsOCArMTU3LDggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKLSAgICBhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGRmJwogICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJworICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGYnCiB9CiAKIGtleSBUIHsKQEAgLTE3MSw4ICsxNzIsOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJwotICAgIGFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDgnCiAgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCisgICAgYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwOCcKIH0KIAoga2V5IFYgewpkaWZmIC0tZ2l0IGEva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L2tleXN0b3JlMi9BbmRyb2lkS2V5U3RvcmVLZXlQYWlyR2VuZXJhdG9yU3BpLmphdmEgYi9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkva2V5c3RvcmUyL0FuZHJvaWRLZXlTdG9yZUtleVBhaXJHZW5lcmF0b3JTcGkuamF2YQppbmRleCBjMWY2YzI5Li5jM2IwZjliIDEwMDY0NAotLS0gYS9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkva2V5c3RvcmUyL0FuZHJvaWRLZXlTdG9yZUtleVBhaXJHZW5lcmF0b3JTcGkuamF2YQorKysgYi9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkva2V5c3RvcmUyL0FuZHJvaWRLZXlTdG9yZUtleVBhaXJHZW5lcmF0b3JTcGkuamF2YQpAQCAtODA4LDkgKzgwOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgS2V5bWFzdGVyRGVmcy5LTV9UQUdfQVRURVNUQVRJT05fSURfQlJBTkQsCiAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybVJlcG9ydGVkQnJhbmQuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkKICAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGxhdGZvcm1SZXBvcnRlZERldmljZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBpc1Byb3BlcnR5RW1wdHlPclVua25vd24oQnVpbGQuREVWSUNFX0ZPUl9BVFRFU1RBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBCdWlsZC5ERVZJQ0UgOiBCdWlsZC5ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OOwogICAgICAgICAgICAgICAgIHBhcmFtcy5hZGQoS2V5U3RvcmUyUGFyYW1ldGVyVXRpbHMubWFrZUJ5dGVzKAogICAgICAgICAgICAgICAgICAgICAgICAgS2V5bWFzdGVyRGVmcy5LTV9UQUdfQVRURVNUQVRJT05fSURfREVWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGQuREVWSUNFLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpCisgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybVJlcG9ydGVkRGV2aWNlLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpCiAgICAgICAgICAgICAgICAgKSk7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBsYXRmb3JtUmVwb3J0ZWRQcm9kdWN0ID0KICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJvcGVydHlFbXB0eU9yVW5rbm93bihCdWlsZC5QUk9EVUNUX0ZPUl9BVFRFU1RBVElPTikKQEAgLTgxOSw5ICs4MjIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEtleW1hc3RlckRlZnMuS01fVEFHX0FUVEVTVEFUSU9OX0lEX1BST0RVQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybVJlcG9ydGVkUHJvZHVjdC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KQogICAgICAgICAgICAgICAgICkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwbGF0Zm9ybVJlcG9ydGVkTWFudWZhY3R1cmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJvcGVydHlFbXB0eU9yVW5rbm93bihCdWlsZC5NQU5VRkFDVFVSRVJfRk9SX0FUVEVTVEFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJ1aWxkLk1BTlVGQUNUVVJFUiA6IEJ1aWxkLk1BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT047CiAgICAgICAgICAgICAgICAgcGFyYW1zLmFkZChLZXlTdG9yZTJQYXJhbWV0ZXJVdGlscy5tYWtlQnl0ZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBLZXltYXN0ZXJEZWZzLktNX1RBR19BVFRFU1RBVElPTl9JRF9NQU5VRkFDVFVSRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICBCdWlsZC5NQU5VRkFDVFVSRVIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtUmVwb3J0ZWRNYW51ZmFjdHVyZXIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkKICAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGxhdGZvcm1SZXBvcnRlZE1vZGVsID0KICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJvcGVydHlFbXB0eU9yVW5rbm93bihCdWlsZC5NT0RFTF9GT1JfQVRURVNUQVRJT04pCmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvT1dORVJTIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL09XTkVSUwppbmRleCA0YjEyNTkwLi44NTJlZGVmIDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvT1dORVJTCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9PV05FUlMKQEAgLTEsNCArMSw0IEBACiB4dXRhbkBnb29nbGUuY29tCiAKICMgR2l2ZSBzdWJtb2R1bGUgb3duZXJzIGluIHNoZWxsIHJlc291cmNlIGFwcHJvdmFsCi1wZXItZmlsZSByZXMqLyovKi54bWwgPSBod3dhbmdAZ29vZ2xlLmNvbSwgbGJpbGxAZ29vZ2xlLmNvbSwgbWFkeW1AZ29vZ2xlLmNvbQorcGVyLWZpbGUgcmVzKi8qLyoueG1sID0gaHd3YW5nQGdvb2dsZS5jb20sIGpvcmdlZ2lsQGdvb2dsZS5jb20sIGxiaWxsQGdvb2dsZS5jb20sIG1hZHltQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9yZXMvbGF5b3V0L2J1YmJsZV9tYW5hZ2VfbWVudS54bWwgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvcmVzL2xheW91dC9idWJibGVfbWFuYWdlX21lbnUueG1sCmluZGV4IDI5OGFkMzAuLjhkMWRhMGY3IDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvcmVzL2xheW91dC9idWJibGVfbWFuYWdlX21lbnUueG1sCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9yZXMvbGF5b3V0L2J1YmJsZV9tYW5hZ2VfbWVudS54bWwKQEAgLTYzLDExICs2MywxMSBAQAogICAgICAgICAgICAgYW5kcm9pZDp0aW50PSJAY29sb3IvYnViYmxlc19pY29uX3RpbnQiLz4KIAogICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnViYmxlX21hbmFnZV9tZW51X2RvbnRfYnViYmxlX3RleHQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5TdGFydD0iMTZkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkAqYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5EZXZpY2VEZWZhdWx0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1YmJsZXNfZG9udF9idWJibGVfY29udmVyc2F0aW9uIiAvPgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkRldmljZURlZmF1bHQiIC8+CiAKICAgICA8L0xpbmVhckxheW91dD4KIApkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCAzMDgyOTYyLi45ZjZjZjc5IDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMTQ2LDYgKzE0Niw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJidWJibGVzX2FwcF9zZXR0aW5ncyI+PHhsaWZmOmcgaWQ9Im5vdGlmaWNhdGlvbl90aXRsZSIgZXhhbXBsZT0iQW5kcm9pZCBNZXNzYWdlcyI+JTEkczwveGxpZmY6Zz4gc2V0dGluZ3M8L3N0cmluZz4KICAgICA8IS0tIFRleHQgdXNlZCBmb3IgdGhlIGJ1YmJsZSBkaXNtaXNzIGFyZWEuIEJ1YmJsZXMgZHJhZ2dlZCB0bywgb3IgZmx1bmcgdG93YXJkcywgdGhpcyBhcmVhIHdpbGwgZ28gYXdheS4gW0NIQVIgTElNSVQ9MzBdIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iYnViYmxlX2Rpc21pc3NfdGV4dCI+RGlzbWlzcyBidWJibGU8L3N0cmluZz4KKyAgICA8IS0tIEJ1dHRvbiB0ZXh0IHRvIHN0b3AgYW4gYXBwIGZyb20gYnViYmxpbmcgW0NIQVIgTElNSVQ9NjBdLS0+CisgICAgPHN0cmluZyBuYW1lPSJidWJibGVzX2RvbnRfYnViYmxlIj5Eb25cdTIwMTl0IGJ1YmJsZTwvc3RyaW5nPgogICAgIDwhLS0gQnV0dG9uIHRleHQgdG8gc3RvcCBhIGNvbnZlcnNhdGlvbiBmcm9tIGJ1YmJsaW5nIFtDSEFSIExJTUlUPTYwXS0tPgogICAgIDxzdHJpbmcgbmFtZT0iYnViYmxlc19kb250X2J1YmJsZV9jb252ZXJzYXRpb24iPkRvblx1MjAxOXQgYnViYmxlIGNvbnZlcnNhdGlvbjwvc3RyaW5nPgogICAgIDwhLS0gVGl0bGUgdGV4dCBmb3IgdGhlIGJ1YmJsZXMgZmVhdHVyZSBlZHVjYXRpb24gY2xpbmcgc2hvd24gd2hlbiBhIGJ1YmJsZSBpcyBvbiBzY3JlZW4gZm9yIHRoZSBmaXJzdCB0aW1lLiBbQ0hBUiBMSU1JVD02MF0tLT4KZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvYnViYmxlcy9CdWJibGVDb250cm9sbGVyLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2J1YmJsZXMvQnViYmxlQ29udHJvbGxlci5qYXZhCmluZGV4IGVmNTM4MzkuLjQ4ZmU2NWQgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvYnViYmxlcy9CdWJibGVDb250cm9sbGVyLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9idWJibGVzL0J1YmJsZUNvbnRyb2xsZXIuamF2YQpAQCAtMTAyOCwxOSArMTAyOCwyMSBAQAogICAgICAqIHRoZSBidWJibGUgb3IgYnViYmxlIHN0YWNrLgogICAgICAqCiAgICAgICogU29tZSBub3RlczoKLSAgICAgKiAgICAtIE9ubHkgb25lIGFwcCBidWJibGUgaXMgc3VwcG9ydGVkIGF0IGEgdGltZQorICAgICAqICAgIC0gT25seSBvbmUgYXBwIGJ1YmJsZSBpcyBzdXBwb3J0ZWQgYXQgYSB0aW1lLCByZWdhcmRsZXNzIG9mIHVzZXJzLiBNdWx0aS11c2VycyBzdXBwb3J0IGlzCisgICAgICogICAgICB0cmFja2VkIGluIGIvMjczNTMzMjM1LgogICAgICAqICAgIC0gQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIGEgZGlmZmVyZW50IGludGVudCB0aGFuIHRoZSBleGlzdGluZyBhcHAgYnViYmxlIHdpbGwgZG8gbm90aGluZwogICAgICAqCiAgICAgICogQHBhcmFtIGludGVudCB0aGUgaW50ZW50IHRvIGRpc3BsYXkgaW4gdGhlIGJ1YmJsZSBleHBhbmRlZCB2aWV3LgorICAgICAqIEBwYXJhbSB1c2VyIHRoZSB7QGxpbmsgVXNlckhhbmRsZX0gb2YgdGhlIHVzZXIgdG8gc3RhcnQgdGhpcyBhY3Rpdml0eSBmb3IuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd09ySGlkZUFwcEJ1YmJsZShJbnRlbnQgaW50ZW50KSB7CisgICAgcHVibGljIHZvaWQgc2hvd09ySGlkZUFwcEJ1YmJsZShJbnRlbnQgaW50ZW50LCBVc2VySGFuZGxlIHVzZXIpIHsKICAgICAgICAgaWYgKGludGVudCA9PSBudWxsIHx8IGludGVudC5nZXRQYWNrYWdlKCkgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLncoVEFHLCAiQXBwIGJ1YmJsZSBmYWlsZWQgdG8gc2hvdywgaW52YWxpZCBpbnRlbnQ6ICIgKyBpbnRlbnQKICAgICAgICAgICAgICAgICAgICAgKyAoKGludGVudCAhPSBudWxsKSA/ICIgd2l0aCBwYWNrYWdlOiAiICsgaW50ZW50LmdldFBhY2thZ2UoKSA6ICIgIikpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlckZvclVzZXIobUNvbnRleHQsIG1DdXJyZW50VXNlcklkKTsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlckZvclVzZXIobUNvbnRleHQsIHVzZXIuZ2V0SWRlbnRpZmllcigpKTsKICAgICAgICAgaWYgKCFpc1Jlc2l6YWJsZUFjdGl2aXR5KGludGVudCwgcGFja2FnZU1hbmFnZXIsIEtFWV9BUFBfQlVCQkxFKSkgcmV0dXJuOwogCiAgICAgICAgIEJ1YmJsZSBleGlzdGluZ0FwcEJ1YmJsZSA9IG1CdWJibGVEYXRhLmdldEJ1YmJsZUluU3RhY2tXaXRoS2V5KEtFWV9BUFBfQlVCQkxFKTsKQEAgLTEwNjEsNyArMTA2Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBBcHAgYnViYmxlIGRvZXMgbm90IGV4aXN0LCBsZXRzIGFkZCBhbmQgZXhwYW5kIGl0Ci0gICAgICAgICAgICBCdWJibGUgYiA9IG5ldyBCdWJibGUoaW50ZW50LCBVc2VySGFuZGxlLm9mKG1DdXJyZW50VXNlcklkKSwgbU1haW5FeGVjdXRvcik7CisgICAgICAgICAgICBCdWJibGUgYiA9IG5ldyBCdWJibGUoaW50ZW50LCB1c2VyLCBtTWFpbkV4ZWN1dG9yKTsKICAgICAgICAgICAgIGIuc2V0U2hvdWxkQXV0b0V4cGFuZCh0cnVlKTsKICAgICAgICAgICAgIGluZmxhdGVBbmRBZGQoYiwgLyogc3VwcHJlc3NGbHlvdXQ9ICovIHRydWUsIC8qIHNob3dJblNoYWRlPSAqLyBmYWxzZSk7CiAgICAgICAgIH0KQEAgLTE4NjksMTAgKzE4NzEsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3dPckhpZGVBcHBCdWJibGUoSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgbU1haW5FeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBCdWJibGVDb250cm9sbGVyLnRoaXMuc2hvd09ySGlkZUFwcEJ1YmJsZShpbnRlbnQpOwotICAgICAgICAgICAgfSk7CisgICAgICAgIHB1YmxpYyB2b2lkIHNob3dPckhpZGVBcHBCdWJibGUoSW50ZW50IGludGVudCwgVXNlckhhbmRsZSB1c2VyKSB7CisgICAgICAgICAgICBtTWFpbkV4ZWN1dG9yLmV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgICgpIC0+IEJ1YmJsZUNvbnRyb2xsZXIudGhpcy5zaG93T3JIaWRlQXBwQnViYmxlKGludGVudCwgdXNlcikpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2J1YmJsZXMvQnViYmxlRXhwYW5kZWRWaWV3LmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2J1YmJsZXMvQnViYmxlRXhwYW5kZWRWaWV3LmphdmEKaW5kZXggZWNkZGJkYS4uOWNjZDZlYiAxMDA2NDQKLS0tIGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9idWJibGVzL0J1YmJsZUV4cGFuZGVkVmlldy5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvYnViYmxlcy9CdWJibGVFeHBhbmRlZFZpZXcuamF2YQpAQCAtMjI5LDYgKzIyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TGF1bmNoZWRGcm9tQnViYmxlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldFBlbmRpbmdJbnRlbnRCYWNrZ3JvdW5kQWN0aXZpdHlTdGFydE1vZGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ERV9CQUNLR1JPVU5EX0FDVElWSVRZX1NUQVJUX0FMTE9XRUQpOworICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldFBlbmRpbmdJbnRlbnRCYWNrZ3JvdW5kQWN0aXZpdHlMYXVuY2hBbGxvd2VkQnlQZXJtaXNzaW9uKHRydWUpOwogCiAgICAgICAgICAgICAgICAgICAgIEludGVudCBmaWxsSW5JbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IGZsYWdzIHRvIG1ha2UgYmVoYXZpb3VyIG1hdGNoIGRvY3VtZW50TGF1bmNoTW9kZT1hbHdheXMuCkBAIC0yMzYsMTIgKzIzNywxNyBAQAogICAgICAgICAgICAgICAgICAgICBmaWxsSW5JbnRlbnQuYWRkRmxhZ3MoRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobUJ1YmJsZS5pc0FwcEJ1YmJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShtQ29udGV4dCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmNyZWF0ZUNvbnRleHRBc1VzZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1YmJsZS5nZXRVc2VyKCksIENvbnRleHQuQ09OVEVYVF9SRVNUUklDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGkgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXF1ZXN0Q29kZT0gKi8gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1YmJsZS5nZXRBcHBCdWJibGVJbnRlbnQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRGbGFncyhGTEFHX0FDVElWSVRZX05FV19ET0NVTUVOVCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoRkxBR19BQ1RJVklUWV9NVUxUSVBMRV9UQVNLKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudC5GTEFHX0lNTVVUQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wdGlvbnM9ICovIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVRhc2tWaWV3LnN0YXJ0QWN0aXZpdHkocGksIC8qIGZpbGxJbkludGVudD0gKi8gbnVsbCwgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoQm91bmRzKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbUlzT3ZlcmZsb3cgJiYgbUJ1YmJsZS5oYXNNZXRhZGF0YVNob3J0Y3V0SWQoKSkgewpkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9idWJibGVzL0J1YmJsZVN0YWNrVmlldy5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9idWJibGVzL0J1YmJsZVN0YWNrVmlldy5qYXZhCmluZGV4IDBiOTQ3YzguLmRlYjRmZDUgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvYnViYmxlcy9CdWJibGVTdGFja1ZpZXcuamF2YQorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2J1YmJsZXMvQnViYmxlU3RhY2tWaWV3LmphdmEKQEAgLTg0NCw2ICs4NDQsOCBAQAogICAgIHByaXZhdGUgRGlzbWlzc1ZpZXcgbURpc21pc3NWaWV3OwogCiAgICAgcHJpdmF0ZSBWaWV3R3JvdXAgbU1hbmFnZU1lbnU7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtTWFuYWdlRG9udEJ1YmJsZVRleHQ7CisgICAgcHJpdmF0ZSBWaWV3R3JvdXAgbU1hbmFnZVNldHRpbmdzVmlldzsKICAgICBwcml2YXRlIEltYWdlVmlldyBtTWFuYWdlU2V0dGluZ3NJY29uOwogICAgIHByaXZhdGUgVGV4dFZpZXcgbU1hbmFnZVNldHRpbmdzVGV4dDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmdNYW5hZ2UgPSBmYWxzZTsKQEAgLTEyMTcsNyArMTIxOSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBtVW5idWJibGVDb252ZXJzYXRpb25DYWxsYmFjay5hY2NlcHQobUJ1YmJsZURhdGEuZ2V0U2VsZWN0ZWRCdWJibGUoKS5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgbU1hbmFnZU1lbnUuZmluZFZpZXdCeUlkKFIuaWQuYnViYmxlX21hbmFnZV9tZW51X3NldHRpbmdzX2NvbnRhaW5lcikuc2V0T25DbGlja0xpc3RlbmVyKAorICAgICAgICBtTWFuYWdlRG9udEJ1YmJsZVRleHQgPSBtTWFuYWdlTWVudQorICAgICAgICAgICAgICAgIC5maW5kVmlld0J5SWQoUi5pZC5idWJibGVfbWFuYWdlX21lbnVfZG9udF9idWJibGVfdGV4dCk7CisKKyAgICAgICAgbU1hbmFnZVNldHRpbmdzVmlldyA9IG1NYW5hZ2VNZW51LmZpbmRWaWV3QnlJZChSLmlkLmJ1YmJsZV9tYW5hZ2VfbWVudV9zZXR0aW5nc19jb250YWluZXIpOworICAgICAgICBtTWFuYWdlU2V0dGluZ3NWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcigKICAgICAgICAgICAgICAgICB2aWV3IC0+IHsKICAgICAgICAgICAgICAgICAgICAgc2hvd01hbmFnZU1lbnUoZmFsc2UgLyogc2hvdyAqLyk7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ1YmJsZVZpZXdQcm92aWRlciBidWJibGUgPSBtQnViYmxlRGF0YS5nZXRTZWxlY3RlZEJ1YmJsZSgpOwpAQCAtMjg2OCwxMCArMjg3NCwxOSBAQAogICAgICAgICAvLyBuYW1lIGFuZCBpY29uLgogICAgICAgICBpZiAoc2hvdykgewogICAgICAgICAgICAgZmluYWwgQnViYmxlIGJ1YmJsZSA9IG1CdWJibGVEYXRhLmdldEJ1YmJsZUluU3RhY2tXaXRoS2V5KG1FeHBhbmRlZEJ1YmJsZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBpZiAoYnViYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChidWJibGUgIT0gbnVsbCAmJiAhYnViYmxlLmlzQXBwQnViYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTZXR1cCBvcHRpb25zIGZvciBub24gYXBwIGJ1YmJsZXMKKyAgICAgICAgICAgICAgICBtTWFuYWdlRG9udEJ1YmJsZVRleHQuc2V0VGV4dChSLnN0cmluZy5idWJibGVzX2RvbnRfYnViYmxlX2NvbnZlcnNhdGlvbik7CiAgICAgICAgICAgICAgICAgbU1hbmFnZVNldHRpbmdzSWNvbi5zZXRJbWFnZUJpdG1hcChidWJibGUuZ2V0UmF3QXBwQmFkZ2UoKSk7CiAgICAgICAgICAgICAgICAgbU1hbmFnZVNldHRpbmdzVGV4dC5zZXRUZXh0KGdldFJlc291cmNlcygpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmJ1YmJsZXNfYXBwX3NldHRpbmdzLCBidWJibGUuZ2V0QXBwTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgbU1hbmFnZVNldHRpbmdzVmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTZXR1cCBvcHRpb25zIGZvciBhcHAgYnViYmxlcworICAgICAgICAgICAgICAgIG1NYW5hZ2VEb250QnViYmxlVGV4dC5zZXRUZXh0KFIuc3RyaW5nLmJ1YmJsZXNfZG9udF9idWJibGUpOworICAgICAgICAgICAgICAgIC8vIEFwcCBidWJibGVzIGFyZSBub3Qgbm90aWZpY2F0aW9uIGJhc2VkCisgICAgICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3Qgc2hvdyB0aGUgb3B0aW9uIHRvIGdvIHRvIG5vdGlmaWNhdGlvbiBzZXR0aW5ncworICAgICAgICAgICAgICAgIG1NYW5hZ2VTZXR0aW5nc1ZpZXcuc2V0VmlzaWJpbGl0eShHT05FKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yOTM2LDYgKzI5NTEsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIG1hbmFnZSBtZW51IG5vdGlmaWNhdGlvbiBzZXR0aW5ncyBhY3Rpb24gaXMgYXZhaWxhYmxlIGFuZCB2aXNpYmxlCisgICAgICogVXNlZCBmb3IgdGVzdGluZworICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBib29sZWFuIGlzTWFuYWdlTWVudVNldHRpbmdzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NYW5hZ2VTZXR0aW5nc1ZpZXcgIT0gbnVsbCAmJiBtTWFuYWdlU2V0dGluZ3NWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWSVNJQkxFOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVFeHBhbmRlZEJ1YmJsZSgpIHsKICAgICAgICAgaWYgKERFQlVHX0JVQkJMRV9TVEFDS19WSUVXKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZEJ1YmJsZSgpIik7CmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2J1YmJsZXMvQnViYmxlcy5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9idWJibGVzL0J1YmJsZXMuamF2YQppbmRleCA0YzBhOTNmLi41NTU1YmVjIDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2J1YmJsZXMvQnViYmxlcy5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvYnViYmxlcy9CdWJibGVzLmphdmEKQEAgLTEyOSwxMiArMTI5LDE0IEBACiAgICAgICogdGhlIGJ1YmJsZSBvciBidWJibGUgc3RhY2suCiAgICAgICoKICAgICAgKiBTb21lIG5vdGVzOgotICAgICAqICAgIC0gT25seSBvbmUgYXBwIGJ1YmJsZSBpcyBzdXBwb3J0ZWQgYXQgYSB0aW1lCisgICAgICogICAgLSBPbmx5IG9uZSBhcHAgYnViYmxlIGlzIHN1cHBvcnRlZCBhdCBhIHRpbWUsIHJlZ2FyZGxlc3Mgb2YgdXNlcnMuIE11bHRpLXVzZXJzIHN1cHBvcnQgaXMKKyAgICAgKiAgICAgIHRyYWNrZWQgaW4gYi8yNzM1MzMyMzUuCiAgICAgICogICAgLSBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggYSBkaWZmZXJlbnQgaW50ZW50IHRoYW4gdGhlIGV4aXN0aW5nIGFwcCBidWJibGUgd2lsbCBkbyBub3RoaW5nCiAgICAgICoKICAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdG8gZGlzcGxheSBpbiB0aGUgYnViYmxlIGV4cGFuZGVkIHZpZXcuCisgICAgICogQHBhcmFtIHVzZXIgdGhlIHtAbGluayBVc2VySGFuZGxlfSBvZiB0aGUgdXNlciB0byBzdGFydCB0aGlzIGFjdGl2aXR5IGZvci4KICAgICAgKi8KLSAgICB2b2lkIHNob3dPckhpZGVBcHBCdWJibGUoSW50ZW50IGludGVudCk7CisgICAgdm9pZCBzaG93T3JIaWRlQXBwQnViYmxlKEludGVudCBpbnRlbnQsIFVzZXJIYW5kbGUgdXNlcik7CiAKICAgICAvKiogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQge0Bjb2RlIHRhc2tJZH0gY29ycmVzcG9uZHMgdG8gYXBwIGJ1YmJsZSdzIHRhc2tJZC4gKi8KICAgICBib29sZWFuIGlzQXBwQnViYmxlVGFza0lkKGludCB0YXNrSWQpOwpkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9jb21tb24vVGFibGV0b3BNb2RlQ29udHJvbGxlci5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9jb21tb24vVGFibGV0b3BNb2RlQ29udHJvbGxlci5qYXZhCmluZGV4IGJmMjI2MjgzLi5jYjFhNmU3IDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2NvbW1vbi9UYWJsZXRvcE1vZGVDb250cm9sbGVyLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9jb21tb24vVGFibGV0b3BNb2RlQ29udHJvbGxlci5qYXZhCkBAIC0yMiwxMCArMjIsMTIgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLkRldmljZVBvc3R1cmVDb250cm9sbGVyLkRFVklDRV9QT1NUVVJFX1VOS05PV047CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLndtLnNoZWxsLnByb3RvbG9nLlNoZWxsUHJvdG9Mb2dHcm91cC5XTV9TSEVMTF9GT0xEQUJMRTsKIAoraW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5JbnREZWY7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKIApAQCAtMzQsNiArMzYsOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLmNvbW1vbi5hbm5vdGF0aW9ucy5TaGVsbE1haW5UaHJlYWQ7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuc3lzdWkuU2hlbGxJbml0OwogCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CkBAIC00OSw4ICs1MywzNCBAQAogcHVibGljIGNsYXNzIFRhYmxldG9wTW9kZUNvbnRyb2xsZXIgaW1wbGVtZW50cwogICAgICAgICBEZXZpY2VQb3N0dXJlQ29udHJvbGxlci5PbkRldmljZVBvc3R1cmVDaGFuZ2VkTGlzdGVuZXIsCiAgICAgICAgIERpc3BsYXlDb250cm9sbGVyLk9uRGlzcGxheXNDaGFuZ2VkTGlzdGVuZXIgeworICAgIC8qKgorICAgICAqIFdoZW4ge0Bjb2RlIHRydWV9LCBmbG9hdGluZyB3aW5kb3dzIGxpa2UgUGlQIHdvdWxkIGF1dG8gbW92ZSB0byB0aGUgcG9zaXRpb24KKyAgICAgKiBzcGVjaWZpZWQgYnkge0BsaW5rICNQUkVGRVJfVE9QX0hBTEZfSU5fVEFCTEVUT1B9IHdoZW4gaW4gdGFibGV0b3AgbW9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEVOQUJMRV9NT1ZFX0ZMT0FUSU5HX1dJTkRPV19JTl9UQUJMRVRPUCA9CisgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgICJwZXJzaXN0LndtLmRlYnVnLmVuYWJsZV9tb3ZlX2Zsb2F0aW5nX3dpbmRvd19pbl90YWJsZXRvcCIsIGZhbHNlKTsKKworICAgIC8qKgorICAgICAqIFByZWZlciB0aGUge0BsaW5rICNQUkVGRVJSRURfVEFCTEVUT1BfSEFMRl9UT1B9IGlmIHRoaXMgZmxhZyBpcyBlbmFibGVkLAorICAgICAqIHtAbGluayAjUFJFRkVSUkVEX1RBQkxFVE9QX0hBTEZfQk9UVE9NfSBvdGhlcndpc2UuCisgICAgICogU2VlIGFsc28ge0BsaW5rICNnZXRQcmVmZXJyZWRIYWxmSW5UYWJsZXRvcE1vZGUoKX0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJfVE9QX0hBTEZfSU5fVEFCTEVUT1AgPQorICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJwZXJzaXN0LndtLmRlYnVnLnByZWZlcl90b3BfaGFsZl9pbl90YWJsZXRvcCIsIHRydWUpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUQUJMRVRPUF9NT0RFX0RFTEFZX01JTExJUyA9IDFfMDAwOwogCisgICAgQEludERlZihwcmVmaXggPSB7IlBSRUZFUlJFRF9UQUJMRVRPUF9IQUxGXyJ9LCB2YWx1ZSA9IHsKKyAgICAgICAgICAgIFBSRUZFUlJFRF9UQUJMRVRPUF9IQUxGX1RPUCwKKyAgICAgICAgICAgIFBSRUZFUlJFRF9UQUJMRVRPUF9IQUxGX0JPVFRPTQorICAgIH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZWZlcnJlZFRhYmxldG9wSGFsZiB7fQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFRkVSUkVEX1RBQkxFVE9QX0hBTEZfVE9QID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVGRVJSRURfVEFCTEVUT1BfSEFMRl9CT1RUT00gPSAxOworCiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogCiAgICAgcHJpdmF0ZSBmaW5hbCBEZXZpY2VQb3N0dXJlQ29udHJvbGxlciBtRGV2aWNlUG9zdHVyZUNvbnRyb2xsZXI7CkBAIC0xMzIsNiArMTYyLDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBmbG9hdGluZyB3aW5kb3dzIGxpa2UgUGlQIHdvdWxkIGF1dG8gbW92ZSB0byB0aGUgcG9zaXRpb24KKyAgICAgKiBzcGVjaWZpZWQgYnkge0BsaW5rICNnZXRQcmVmZXJyZWRIYWxmSW5UYWJsZXRvcE1vZGUoKX0gd2hlbiBpbiB0YWJsZXRvcCBtb2RlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZU1vdmVGbG9hdGluZ1dpbmRvd0luVGFibGV0b3AoKSB7CisgICAgICAgIHJldHVybiBFTkFCTEVfTU9WRV9GTE9BVElOR19XSU5ET1dfSU5fVEFCTEVUT1A7CisgICAgfQorCisgICAgLyoqIEByZXR1cm4gUHJlZmVycmVkIGhhbGYgZm9yIGZsb2F0aW5nIHdpbmRvd3MgbGlrZSBQaVAgd2hlbiBpbiB0YWJsZXRvcCBtb2RlLiAqLworICAgIEBQcmVmZXJyZWRUYWJsZXRvcEhhbGYKKyAgICBwdWJsaWMgaW50IGdldFByZWZlcnJlZEhhbGZJblRhYmxldG9wTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIFBSRUZFUl9UT1BfSEFMRl9JTl9UQUJMRVRPUAorICAgICAgICAgICAgICAgID8gUFJFRkVSUkVEX1RBQkxFVE9QX0hBTEZfVE9QCisgICAgICAgICAgICAgICAgOiBQUkVGRVJSRURfVEFCTEVUT1BfSEFMRl9CT1RUT007CisgICAgfQorCiAgICAgLyoqIFJlZ2lzdGVyIHtAbGluayBPblRhYmxldG9wTW9kZUNoYW5nZWRMaXN0ZW5lcn0gdG8gbGlzdGVuIGZvciB0YWJsZXRvcCBtb2RlIGNoYW5nZS4gKi8KICAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck9uVGFibGV0b3BNb2RlQ2hhbmdlZExpc3RlbmVyKAogICAgICAgICAgICAgQE5vbk51bGwgT25UYWJsZXRvcE1vZGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvZGFnZ2VyL1dNU2hlbGxNb2R1bGUuamF2YSBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvZGFnZ2VyL1dNU2hlbGxNb2R1bGUuamF2YQppbmRleCBiYTBmMDczLi43YTgzZDEwIDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2RhZ2dlci9XTVNoZWxsTW9kdWxlLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9kYWdnZXIvV01TaGVsbE1vZHVsZS5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlNoZWxsRXhlY3V0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlN5bmNUcmFuc2FjdGlvblF1ZXVlOwogaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLmNvbW1vbi5TeXN0ZW1XaW5kb3dzOworaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLmNvbW1vbi5UYWJsZXRvcE1vZGVDb250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLmNvbW1vbi5UYXNrU3RhY2tMaXN0ZW5lckltcGw7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRyYW5zYWN0aW9uUG9vbDsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5jb21tb24uYW5ub3RhdGlvbnMuU2hlbGxCYWNrZ3JvdW5kVGhyZWFkOwpAQCAtMzU3LDYgKzM1OCw3IEBACiAgICAgICAgICAgICBUYXNrU3RhY2tMaXN0ZW5lckltcGwgdGFza1N0YWNrTGlzdGVuZXIsCiAgICAgICAgICAgICBQaXBQYXJhbXNDaGFuZ2VkRm9yd2FyZGVyIHBpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIsCiAgICAgICAgICAgICBEaXNwbGF5SW5zZXRzQ29udHJvbGxlciBkaXNwbGF5SW5zZXRzQ29udHJvbGxlciwKKyAgICAgICAgICAgIFRhYmxldG9wTW9kZUNvbnRyb2xsZXIgcGlwVGFibGV0b3BDb250cm9sbGVyLAogICAgICAgICAgICAgT3B0aW9uYWw8T25lSGFuZGVkQ29udHJvbGxlcj4gb25lSGFuZGVkQ29udHJvbGxlciwKICAgICAgICAgICAgIEBTaGVsbE1haW5UaHJlYWQgU2hlbGxFeGVjdXRvciBtYWluRXhlY3V0b3IpIHsKICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoUGlwQ29udHJvbGxlci5jcmVhdGUoCkBAIC0zNjYsNyArMzY4LDcgQEAKICAgICAgICAgICAgICAgICBwaXBNb3Rpb25IZWxwZXIsIHBpcE1lZGlhQ29udHJvbGxlciwgcGhvbmVQaXBNZW51Q29udHJvbGxlciwgcGlwVGFza09yZ2FuaXplciwKICAgICAgICAgICAgICAgICBwaXBUcmFuc2l0aW9uU3RhdGUsIHBpcFRvdWNoSGFuZGxlciwgcGlwVHJhbnNpdGlvbkNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgd2luZG93TWFuYWdlclNoZWxsV3JhcHBlciwgdGFza1N0YWNrTGlzdGVuZXIsIHBpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIsCi0gICAgICAgICAgICAgICAgZGlzcGxheUluc2V0c0NvbnRyb2xsZXIsIG9uZUhhbmRlZENvbnRyb2xsZXIsIG1haW5FeGVjdXRvcikpOworICAgICAgICAgICAgICAgIGRpc3BsYXlJbnNldHNDb250cm9sbGVyLCBwaXBUYWJsZXRvcENvbnRyb2xsZXIsIG9uZUhhbmRlZENvbnRyb2xsZXIsIG1haW5FeGVjdXRvcikpOwogICAgIH0KIAogICAgIEBXTVNpbmdsZXRvbgpkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9kZXNrdG9wbW9kZS9EZXNrdG9wVGFza3NDb250cm9sbGVyLmt0IGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9kZXNrdG9wbW9kZS9EZXNrdG9wVGFza3NDb250cm9sbGVyLmt0CmluZGV4IDczYTc0MDMuLjMxYzVlMzMgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvZGVza3RvcG1vZGUvRGVza3RvcFRhc2tzQ29udHJvbGxlci5rdAorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2Rlc2t0b3Btb2RlL0Rlc2t0b3BUYXNrc0NvbnRyb2xsZXIua3QKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLldpbmRvd2luZ01vZGUKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dAogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcgoraW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllcwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlQ29udHJvbAogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLlRSQU5TSVRfQ0hBTkdFCiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuVFJBTlNJVF9OT05FCkBAIC0zMiw2ICszMyw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuVFJBTlNJVF9UT19GUk9OVAogaW1wb3J0IGFuZHJvaWQud2luZG93LlRyYW5zaXRpb25JbmZvCiBpbXBvcnQgYW5kcm9pZC53aW5kb3cuVHJhbnNpdGlvblJlcXVlc3RJbmZvCitpbXBvcnQgYW5kcm9pZC53aW5kb3cuV2luZG93Q29udGFpbmVyVG9rZW4KIGltcG9ydCBhbmRyb2lkLndpbmRvdy5XaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbgogaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uQmluZGVyVGhyZWFkCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucHJvdG9sb2cuY29tbW9uLlByb3RvTG9nCkBAIC0xMTUsMTAgKzExNyw3IEBACiAgICAgICAgIHZhbCB3Y3QgPSBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbigpCiAgICAgICAgIC8vIEJyaW5nIG90aGVyIGFwcHMgdG8gZnJvbnQgZmlyc3QKICAgICAgICAgYnJpbmdEZXNrdG9wQXBwc1RvRnJvbnQod2N0KQotCi0gICAgICAgIHdjdC5zZXRXaW5kb3dpbmdNb2RlKHRhc2suZ2V0VG9rZW4oKSwgV0lORE9XSU5HX01PREVfRlJFRUZPUk0pCi0gICAgICAgIHdjdC5yZW9yZGVyKHRhc2suZ2V0VG9rZW4oKSwgdHJ1ZSAvKiBvblRvcCAqLykKLQorICAgICAgICBhZGRNb3ZlVG9EZXNrdG9wQ2hhbmdlcyh3Y3QsIHRhc2sudG9rZW4pCiAgICAgICAgIGlmIChUcmFuc2l0aW9ucy5FTkFCTEVfU0hFTExfVFJBTlNJVElPTlMpIHsKICAgICAgICAgICAgIHRyYW5zaXRpb25zLnN0YXJ0VHJhbnNpdGlvbihUUkFOU0lUX0NIQU5HRSwgd2N0LCBudWxsIC8qIGhhbmRsZXIgKi8pCiAgICAgICAgIH0gZWxzZSB7CkBAIC0xMzYsOCArMTM1LDcgQEAKICAgICAgICAgUHJvdG9Mb2cudihXTV9TSEVMTF9ERVNLVE9QX01PREUsICJtb3ZlVG9GdWxsc2NyZWVuOiAlZCIsIHRhc2sudGFza0lkKQogCiAgICAgICAgIHZhbCB3Y3QgPSBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbigpCi0gICAgICAgIHdjdC5zZXRXaW5kb3dpbmdNb2RlKHRhc2suZ2V0VG9rZW4oKSwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTikKLSAgICAgICAgd2N0LnNldEJvdW5kcyh0YXNrLmdldFRva2VuKCksIG51bGwpCisgICAgICAgIGFkZE1vdmVUb0Z1bGxzY3JlZW5DaGFuZ2VzKHdjdCwgdGFzay50b2tlbikKICAgICAgICAgaWYgKFRyYW5zaXRpb25zLkVOQUJMRV9TSEVMTF9UUkFOU0lUSU9OUykgewogICAgICAgICAgICAgdHJhbnNpdGlvbnMuc3RhcnRUcmFuc2l0aW9uKFRSQU5TSVRfQ0hBTkdFLCB3Y3QsIG51bGwgLyogaGFuZGxlciAqLykKICAgICAgICAgfSBlbHNlIHsKQEAgLTIzNCw4ICsyMzIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIiB0YXNrSWQ9JWQiLAogICAgICAgICAgICAgICAgICAgICB0YXNrLnRhc2tJZAogICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICByZXR1cm4gV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24oKS5hcHBseSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpbmRvd2luZ01vZGUodGFzay50b2tlbiwgV0lORE9XSU5HX01PREVfRlJFRUZPUk0pCisgICAgICAgICAgICAgICAgcmV0dXJuIFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uKCkuYWxzbyB7IHdjdCAtPgorICAgICAgICAgICAgICAgICAgICBhZGRNb3ZlVG9EZXNrdG9wQ2hhbmdlcyh3Y3QsIHRhc2sudG9rZW4pCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNTEsMTUgKzI0OSw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIiB0YXNrSWQ9JWQiLAogICAgICAgICAgICAgICAgICAgICB0YXNrLnRhc2tJZAogICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICByZXR1cm4gV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24oKS5hcHBseSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpbmRvd2luZ01vZGUodGFzay50b2tlbiwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTikKLSAgICAgICAgICAgICAgICAgICAgc2V0Qm91bmRzKHRhc2sudG9rZW4sIG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uKCkuYWxzbyB7IHdjdCAtPgorICAgICAgICAgICAgICAgICAgICBhZGRNb3ZlVG9GdWxsc2NyZWVuQ2hhbmdlcyh3Y3QsIHRhc2sudG9rZW4pCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsCiAgICAgfQogCisgICAgcHJpdmF0ZSBmdW4gYWRkTW92ZVRvRGVza3RvcENoYW5nZXMoCisgICAgICAgIHdjdDogV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24sCisgICAgICAgIHRva2VuOiBXaW5kb3dDb250YWluZXJUb2tlbgorICAgICkgeworICAgICAgICB3Y3Quc2V0V2luZG93aW5nTW9kZSh0b2tlbiwgV0lORE9XSU5HX01PREVfRlJFRUZPUk0pCisgICAgICAgIHdjdC5yZW9yZGVyKHRva2VuLCB0cnVlIC8qIG9uVG9wICovKQorICAgICAgICBpZiAoaXNEZXNrdG9wRGVuc2l0eU92ZXJyaWRlU2V0KCkpIHsKKyAgICAgICAgICAgIHdjdC5zZXREZW5zaXR5RHBpKHRva2VuLCBnZXREZXNrdG9wRGVuc2l0eURwaSgpKQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gYWRkTW92ZVRvRnVsbHNjcmVlbkNoYW5nZXMoCisgICAgICAgIHdjdDogV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24sCisgICAgICAgIHRva2VuOiBXaW5kb3dDb250YWluZXJUb2tlbgorICAgICkgeworICAgICAgICB3Y3Quc2V0V2luZG93aW5nTW9kZSh0b2tlbiwgV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTikKKyAgICAgICAgd2N0LnNldEJvdW5kcyh0b2tlbiwgbnVsbCkKKyAgICAgICAgaWYgKGlzRGVza3RvcERlbnNpdHlPdmVycmlkZVNldCgpKSB7CisgICAgICAgICAgICB3Y3Quc2V0RGVuc2l0eURwaSh0b2tlbiwgZ2V0RnVsbHNjcmVlbkRlbnNpdHlEcGkoKSkKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuIGdldEZ1bGxzY3JlZW5EZW5zaXR5RHBpKCk6IEludCB7CisgICAgICAgIHJldHVybiBjb250ZXh0LnJlc291cmNlcy5kaXNwbGF5TWV0cmljcy5kZW5zaXR5RHBpCisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gZ2V0RGVza3RvcERlbnNpdHlEcGkoKTogSW50IHsKKyAgICAgICAgcmV0dXJuIERFU0tUT1BfREVOU0lUWV9PVkVSUklERQorICAgIH0KKwogICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBleHRlcm5hbCBpbnRlcmZhY2UgdG8gcGFzcyB0byBhbm90aGVyIHByb2Nlc3MuICovCiAgICAgcHJpdmF0ZSBmdW4gY3JlYXRlRXh0ZXJuYWxJbnRlcmZhY2UoKTogRXh0ZXJuYWxJbnRlcmZhY2VCaW5kZXIgewogICAgICAgICByZXR1cm4gSURlc2t0b3BNb2RlSW1wbCh0aGlzKQpAQCAtMzE4LDQgKzM0NSwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFswXQogICAgICAgICB9CiAgICAgfQorCisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIHByaXZhdGUgdmFsIERFU0tUT1BfREVOU0lUWV9PVkVSUklERSA9CisgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgicGVyc2lzdC53bS5kZWJ1Zy5kZXNrdG9wX21vZGVfZGVuc2l0eSIsIDApCisgICAgICAgIHByaXZhdGUgdmFsIERFU0tUT1BfREVOU0lUWV9BTExPV0VEX1JBTkdFID0gKDEwMC4uMTAwMCkKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2sgaWYgZGVza3RvcCBkZW5zaXR5IG92ZXJyaWRlIGlzIGVuYWJsZWQKKyAgICAgICAgICovCisgICAgICAgIEBKdm1TdGF0aWMKKyAgICAgICAgZnVuIGlzRGVza3RvcERlbnNpdHlPdmVycmlkZVNldCgpOiBCb29sZWFuIHsKKyAgICAgICAgICAgIHJldHVybiBERVNLVE9QX0RFTlNJVFlfT1ZFUlJJREUgaW4gREVTS1RPUF9ERU5TSVRZX0FMTE9XRURfUkFOR0UKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvZnVsbHNjcmVlbi9GdWxsc2NyZWVuVGFza0xpc3RlbmVyLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2Z1bGxzY3JlZW4vRnVsbHNjcmVlblRhc2tMaXN0ZW5lci5qYXZhCmluZGV4IGQwOTRjMjIuLjk5ODcyOGQ2IDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL2Z1bGxzY3JlZW4vRnVsbHNjcmVlblRhc2tMaXN0ZW5lci5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvZnVsbHNjcmVlbi9GdWxsc2NyZWVuVGFza0xpc3RlbmVyLmphdmEKQEAgLTEyOSw2ICsxMjksNyBAQAogICAgIHB1YmxpYyB2b2lkIG9uVGFza0luZm9DaGFuZ2VkKFJ1bm5pbmdUYXNrSW5mbyB0YXNrSW5mbykgewogICAgICAgICBmaW5hbCBTdGF0ZSBzdGF0ZSA9IG1UYXNrcy5nZXQodGFza0luZm8udGFza0lkKTsKICAgICAgICAgZmluYWwgUG9pbnQgb2xkUG9zaXRpb25JblBhcmVudCA9IHN0YXRlLm1UYXNrSW5mby5wb3NpdGlvbkluUGFyZW50OworICAgICAgICBib29sZWFuIG9sZFZpc2libGUgPSBzdGF0ZS5tVGFza0luZm8uaXNWaXNpYmxlOwogCiAgICAgICAgIGlmIChtV2luZG93RGVjb3JWaWV3TW9kZWxPcHRpb25hbC5pc1ByZXNlbnQoKSkgewogICAgICAgICAgICAgbVdpbmRvd0RlY29yVmlld01vZGVsT3B0aW9uYWwuZ2V0KCkub25UYXNrSW5mb0NoYW5nZWQodGFza0luZm8pOwpAQCAtMTM4LDEyICsxMzksMTggQEAKICAgICAgICAgdXBkYXRlUmVjZW50c0ZvclZpc2libGVGdWxsc2NyZWVuVGFzayh0YXNrSW5mbyk7CiAKICAgICAgICAgZmluYWwgUG9pbnQgcG9zaXRpb25JblBhcmVudCA9IHN0YXRlLm1UYXNrSW5mby5wb3NpdGlvbkluUGFyZW50OwotICAgICAgICBpZiAoIW9sZFBvc2l0aW9uSW5QYXJlbnQuZXF1YWxzKHN0YXRlLm1UYXNrSW5mby5wb3NpdGlvbkluUGFyZW50KSkgeworICAgICAgICBib29sZWFuIHBvc2l0aW9uSW5QYXJlbnRDaGFuZ2VkID0gIW9sZFBvc2l0aW9uSW5QYXJlbnQuZXF1YWxzKHBvc2l0aW9uSW5QYXJlbnQpOworICAgICAgICBib29sZWFuIGJlY2FtZVZpc2libGUgPSAhb2xkVmlzaWJsZSAmJiBzdGF0ZS5tVGFza0luZm8uaXNWaXNpYmxlOworCisgICAgICAgIGlmIChiZWNhbWVWaXNpYmxlIHx8IHBvc2l0aW9uSW5QYXJlbnRDaGFuZ2VkKSB7CiAgICAgICAgICAgICBtU3luY1F1ZXVlLnJ1bkluU3luYyh0IC0+IHsKICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLm1MZWFzaC5pc1ZhbGlkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGFzayB2YW5pc2hlZCBiZWZvcmUgc3luYyBjb21wbGV0aW9uCiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJlY2FtZVZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdC5zaG93KHN0YXRlLm1MZWFzaCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHQuc2V0UG9zaXRpb24oc3RhdGUubUxlYXNoLCBwb3NpdGlvbkluUGFyZW50LngsIHBvc2l0aW9uSW5QYXJlbnQueSk7CiAgICAgICAgICAgICB9KTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9waXAvUGlwQm91bmRzU3RhdGUuamF2YSBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvcGlwL1BpcEJvdW5kc1N0YXRlLmphdmEKaW5kZXggZjY2NDgwOC4uZjA4NzQyZCAxMDA2NDQKLS0tIGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9waXAvUGlwQm91bmRzU3RhdGUuamF2YQorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9QaXBCb3VuZHNTdGF0ZS5qYXZhCkBAIC00Myw3ICs0Myw5IEBACiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CkBAIC0xMTMsNiArMTE1LDEyIEBACiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuVmlldyNzZXRQcmVmZXJLZWVwQ2xlYXJSZWN0cwogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgU2V0PFJlY3Q+IG1VbnJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhcyA9IG5ldyBBcnJheVNldDw+KCk7CisgICAgLyoqCisgICAgICogQWRkaXRpb25hbCB0byB7QGxpbmsgI21VbnJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhc30sIGFsbG93IHRoZSBjYWxsZXIgdG8gYXBwZW5kIG5hbWVkIGJvdW5kcworICAgICAqIGFzIHVucmVzdHJpY3RlZCBrZWVwIGNsZWFyIGFyZWEuIFZhbHVlcyBpbiB0aGlzIG1hcCB3b3VsZCBiZSBhcHBlbmRlZCB0bworICAgICAqIHtAbGluayAjZ2V0VW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYXMoKX0gYW5kIHRoaXMgaXMgbWVhbnQgZm9yIGludGVybmFsIHVzYWdlIG9ubHkuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBSZWN0PiBtTmFtZWRVbnJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgIHByaXZhdGUgQE51bGxhYmxlIFJ1bm5hYmxlIG1Pbk1pbmltYWxTaXplQ2hhbmdlQ2FsbGJhY2s7CiAgICAgcHJpdmF0ZSBATnVsbGFibGUgVHJpQ29uc3VtZXI8Qm9vbGVhbiwgSW50ZWdlciwgQm9vbGVhbj4gbU9uU2hlbGZWaXNpYmlsaXR5Q2hhbmdlQ2FsbGJhY2s7CkBAIC0zNzgsNiArMzg2LDE2IEBACiAgICAgICAgIG1VbnJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhcy5hZGRBbGwodW5yZXN0cmljdGVkQXJlYXMpOwogICAgIH0KIAorICAgIC8qKiBBZGQgYSBuYW1lZCB1bnJlc3RyaWN0ZWQga2VlcCBjbGVhciBhcmVhLiAqLworICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYShATm9uTnVsbCBTdHJpbmcgbmFtZSwgUmVjdCB1bnJlc3RyaWN0ZWRBcmVhKSB7CisgICAgICAgIG1OYW1lZFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzLnB1dChuYW1lLCB1bnJlc3RyaWN0ZWRBcmVhKTsKKyAgICB9CisKKyAgICAvKiogUmVtb3ZlIGEgbmFtZWQgdW5yZXN0cmljdGVkIGtlZXAgY2xlYXIgYXJlYS4gKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOYW1lZFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWEoQE5vbk51bGwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbU5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYXMucmVtb3ZlKG5hbWUpOworICAgIH0KKwogICAgIEBOb25OdWxsCiAgICAgcHVibGljIFNldDxSZWN0PiBnZXRSZXN0cmljdGVkS2VlcENsZWFyQXJlYXMoKSB7CiAgICAgICAgIHJldHVybiBtUmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzOwpAQCAtMzg1LDcgKzQwMywxMCBAQAogCiAgICAgQE5vbk51bGwKICAgICBwdWJsaWMgU2V0PFJlY3Q+IGdldFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzKCkgewotICAgICAgICByZXR1cm4gbVVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzOworICAgICAgICBpZiAobU5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYXMuaXNFbXB0eSgpKSByZXR1cm4gbVVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzOworICAgICAgICBmaW5hbCBTZXQ8UmVjdD4gdW5yZXN0cmljdGVkQXJlYXMgPSBuZXcgQXJyYXlTZXQ8PihtVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYXMpOworICAgICAgICB1bnJlc3RyaWN0ZWRBcmVhcy5hZGRBbGwobU5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYXMudmFsdWVzKCkpOworICAgICAgICByZXR1cm4gdW5yZXN0cmljdGVkQXJlYXM7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9QaXBUcmFuc2l0aW9uLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9QaXBUcmFuc2l0aW9uLmphdmEKaW5kZXggODdjZjY1NS4uNDViYjczYiAxMDA2NDQKLS0tIGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9waXAvUGlwVHJhbnNpdGlvbi5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvcGlwL1BpcFRyYW5zaXRpb24uamF2YQpAQCAtNDg5LDEwICs0ODksMTEgQEAKICAgICAgICAgLy8gUmVwYXJlbnQgdGhlIHBpcCBsZWFzaCB0byB0aGUgcm9vdCB3aXRoIG1heCBsYXllciBzbyB0aGF0IHdlIGNhbiBhbmltYXRlIGl0IG91dHNpZGUgb2YKICAgICAgICAgLy8gcGFyZW50IGNyb3AsIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGNvdmVyZWQgYnkgb3RoZXIgd2luZG93cy4KICAgICAgICAgZmluYWwgU3VyZmFjZUNvbnRyb2wgcGlwTGVhc2ggPSBwaXBDaGFuZ2UuZ2V0TGVhc2goKTsKLSAgICAgICAgc3RhcnRUcmFuc2FjdGlvbi5yZXBhcmVudChwaXBMZWFzaCwgaW5mby5nZXRSb290TGVhc2goKSk7CisgICAgICAgIGZpbmFsIGludCByb290SWR4ID0gVHJhbnNpdGlvblV0aWwucm9vdEluZGV4Rm9yKHBpcENoYW5nZSwgaW5mbyk7CisgICAgICAgIHN0YXJ0VHJhbnNhY3Rpb24ucmVwYXJlbnQocGlwTGVhc2gsIGluZm8uZ2V0Um9vdChyb290SWR4KS5nZXRMZWFzaCgpKTsKICAgICAgICAgc3RhcnRUcmFuc2FjdGlvbi5zZXRMYXllcihwaXBMZWFzaCwgSW50ZWdlci5NQVhfVkFMVUUpOwogICAgICAgICAvLyBOb3RlOiBiZWNhdXNlIG9mIHRoaXMsIHRoZSBib3VuZHMgdG8gYW5pbWF0ZSBzaG91bGQgYmUgdHJhbnNsYXRlZCB0byB0aGUgcm9vdCBjb29yZGluYXRlLgotICAgICAgICBmaW5hbCBQb2ludCBvZmZzZXQgPSBpbmZvLmdldFJvb3RPZmZzZXQoKTsKKyAgICAgICAgZmluYWwgUG9pbnQgb2Zmc2V0ID0gaW5mby5nZXRSb290KHJvb3RJZHgpLmdldE9mZnNldCgpOwogICAgICAgICBmaW5hbCBSZWN0IGN1cnJlbnRCb3VuZHMgPSBtUGlwQm91bmRzU3RhdGUuZ2V0Qm91bmRzKCk7CiAgICAgICAgIGN1cnJlbnRCb3VuZHMub2Zmc2V0KC1vZmZzZXQueCwgLW9mZnNldC55KTsKICAgICAgICAgc3RhcnRUcmFuc2FjdGlvbi5zZXRQb3NpdGlvbihwaXBMZWFzaCwgY3VycmVudEJvdW5kcy5sZWZ0LCBjdXJyZW50Qm91bmRzLnRvcCk7CmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9waG9uZS9QaXBDb250cm9sbGVyLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9waG9uZS9QaXBDb250cm9sbGVyLmphdmEKaW5kZXggZGI2ZWYxZC4uZWEyNTU5YSAxMDA2NDQKLS0tIGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9waXAvcGhvbmUvUGlwQ29udHJvbGxlci5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvcGlwL3Bob25lL1BpcENvbnRyb2xsZXIuamF2YQpAQCAtNDMsNiArNDMsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKQEAgLTcxLDYgKzcyLDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5jb21tb24uUmVtb3RlQ2FsbGFibGU7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlNoZWxsRXhlY3V0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlNpbmdsZUluc3RhbmNlUmVtb3RlTGlzdGVuZXI7CitpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhYmxldG9wTW9kZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhc2tTdGFja0xpc3RlbmVyQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhc2tTdGFja0xpc3RlbmVySW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5vbmVoYW5kZWQuT25lSGFuZGVkQ29udHJvbGxlcjsKQEAgLTEwMiw3ICsxMDQsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLnRyYW5zaXRpb24uVHJhbnNpdGlvbnM7CiAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKQEAgLTExNyw2ICsxMTgsOCBAQAogICAgICAgICBVc2VyQ2hhbmdlTGlzdGVuZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGlwQ29udHJvbGxlciI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIRVJfS0VFUF9DTEVBUl9BUkVBX1RBRyA9ICJob3RzZWF0IjsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUElQX0tFRVBfQ0xFQVJfQVJFQVNfREVMQVkgPQogICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5nZXRMb25nKCJwZXJzaXN0LndtLmRlYnVnLnBpcF9rZWVwX2NsZWFyX2FyZWFzX2RlbGF5IiwgMjAwKTsKIApAQCAtMTQ3LDYgKzE1MCw3IEBACiAgICAgcHJpdmF0ZSBUYXNrU3RhY2tMaXN0ZW5lckltcGwgbVRhc2tTdGFja0xpc3RlbmVyOwogICAgIHByaXZhdGUgUGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlciBtUGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlcjsKICAgICBwcml2YXRlIERpc3BsYXlJbnNldHNDb250cm9sbGVyIG1EaXNwbGF5SW5zZXRzQ29udHJvbGxlcjsKKyAgICBwcml2YXRlIFRhYmxldG9wTW9kZUNvbnRyb2xsZXIgbVRhYmxldG9wTW9kZUNvbnRyb2xsZXI7CiAgICAgcHJpdmF0ZSBPcHRpb25hbDxPbmVIYW5kZWRDb250cm9sbGVyPiBtT25lSGFuZGVkQ29udHJvbGxlcjsKICAgICBwcml2YXRlIGZpbmFsIFNoZWxsQ29tbWFuZEhhbmRsZXIgbVNoZWxsQ29tbWFuZEhhbmRsZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBTaGVsbENvbnRyb2xsZXIgbVNoZWxsQ29udHJvbGxlcjsKQEAgLTQwMyw2ICs0MDcsNyBAQAogICAgICAgICAgICAgVGFza1N0YWNrTGlzdGVuZXJJbXBsIHRhc2tTdGFja0xpc3RlbmVyLAogICAgICAgICAgICAgUGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlciBwaXBQYXJhbXNDaGFuZ2VkRm9yd2FyZGVyLAogICAgICAgICAgICAgRGlzcGxheUluc2V0c0NvbnRyb2xsZXIgZGlzcGxheUluc2V0c0NvbnRyb2xsZXIsCisgICAgICAgICAgICBUYWJsZXRvcE1vZGVDb250cm9sbGVyIHBpcFRhYmxldG9wQ29udHJvbGxlciwKICAgICAgICAgICAgIE9wdGlvbmFsPE9uZUhhbmRlZENvbnRyb2xsZXI+IG9uZUhhbmRlZENvbnRyb2xsZXIsCiAgICAgICAgICAgICBTaGVsbEV4ZWN1dG9yIG1haW5FeGVjdXRvcikgewogICAgICAgICBpZiAoIWNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKEZFQVRVUkVfUElDVFVSRV9JTl9QSUNUVVJFKSkgewpAQCAtNDE3LDcgKzQyMiw3IEBACiAgICAgICAgICAgICAgICAgcGlwRGlzcGxheUxheW91dFN0YXRlLCBwaXBNb3Rpb25IZWxwZXIsIHBpcE1lZGlhQ29udHJvbGxlciwgcGhvbmVQaXBNZW51Q29udHJvbGxlciwKICAgICAgICAgICAgICAgICBwaXBUYXNrT3JnYW5pemVyLCBwaXBUcmFuc2l0aW9uU3RhdGUsIHBpcFRvdWNoSGFuZGxlciwgcGlwVHJhbnNpdGlvbkNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgd2luZG93TWFuYWdlclNoZWxsV3JhcHBlciwgdGFza1N0YWNrTGlzdGVuZXIsIHBpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIsCi0gICAgICAgICAgICAgICAgZGlzcGxheUluc2V0c0NvbnRyb2xsZXIsIG9uZUhhbmRlZENvbnRyb2xsZXIsIG1haW5FeGVjdXRvcikKKyAgICAgICAgICAgICAgICBkaXNwbGF5SW5zZXRzQ29udHJvbGxlciwgcGlwVGFibGV0b3BDb250cm9sbGVyLCBvbmVIYW5kZWRDb250cm9sbGVyLCBtYWluRXhlY3V0b3IpCiAgICAgICAgICAgICAgICAgLm1JbXBsOwogICAgIH0KIApAQCAtNDQ0LDYgKzQ0OSw3IEBACiAgICAgICAgICAgICBUYXNrU3RhY2tMaXN0ZW5lckltcGwgdGFza1N0YWNrTGlzdGVuZXIsCiAgICAgICAgICAgICBQaXBQYXJhbXNDaGFuZ2VkRm9yd2FyZGVyIHBpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIsCiAgICAgICAgICAgICBEaXNwbGF5SW5zZXRzQ29udHJvbGxlciBkaXNwbGF5SW5zZXRzQ29udHJvbGxlciwKKyAgICAgICAgICAgIFRhYmxldG9wTW9kZUNvbnRyb2xsZXIgdGFibGV0b3BNb2RlQ29udHJvbGxlciwKICAgICAgICAgICAgIE9wdGlvbmFsPE9uZUhhbmRlZENvbnRyb2xsZXI+IG9uZUhhbmRlZENvbnRyb2xsZXIsCiAgICAgICAgICAgICBTaGVsbEV4ZWN1dG9yIG1haW5FeGVjdXRvcgogICAgICkgewpAQCAtNDc3LDYgKzQ4Myw3IEBACiAgICAgICAgICAgICAgICAgLmdldEludGVnZXIoUi5pbnRlZ2VyLmNvbmZpZ19waXBFbnRlckFuaW1hdGlvbkR1cmF0aW9uKTsKICAgICAgICAgbVBpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIgPSBwaXBQYXJhbXNDaGFuZ2VkRm9yd2FyZGVyOwogICAgICAgICBtRGlzcGxheUluc2V0c0NvbnRyb2xsZXIgPSBkaXNwbGF5SW5zZXRzQ29udHJvbGxlcjsKKyAgICAgICAgbVRhYmxldG9wTW9kZUNvbnRyb2xsZXIgPSB0YWJsZXRvcE1vZGVDb250cm9sbGVyOwogCiAgICAgICAgIHNoZWxsSW5pdC5hZGRJbml0Q2FsbGJhY2sodGhpczo6b25Jbml0LCB0aGlzKTsKICAgICB9CkBAIC02NTksNiArNjY2LDQyIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KTsKIAorICAgICAgICBtVGFibGV0b3BNb2RlQ29udHJvbGxlci5yZWdpc3Rlck9uVGFibGV0b3BNb2RlQ2hhbmdlZExpc3RlbmVyKChpc0luVGFibGV0b3BNb2RlKSAtPiB7CisgICAgICAgICAgICBpZiAoIW1UYWJsZXRvcE1vZGVDb250cm9sbGVyLmVuYWJsZU1vdmVGbG9hdGluZ1dpbmRvd0luVGFibGV0b3AoKSkgcmV0dXJuOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRhZyA9ICJ0YWJsZXRvcC1tb2RlIjsKKyAgICAgICAgICAgIGlmICghaXNJblRhYmxldG9wTW9kZSkgeworICAgICAgICAgICAgICAgIG1QaXBCb3VuZHNTdGF0ZS5yZW1vdmVOYW1lZFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWEodGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRvIHByZXBhcmUgZm9yIHRoZSBlbnRyeSBib3VuZHMuCisgICAgICAgICAgICBmaW5hbCBSZWN0IGRpc3BsYXlCb3VuZHMgPSBtUGlwQm91bmRzU3RhdGUuZ2V0RGlzcGxheUJvdW5kcygpOworICAgICAgICAgICAgaWYgKG1UYWJsZXRvcE1vZGVDb250cm9sbGVyLmdldFByZWZlcnJlZEhhbGZJblRhYmxldG9wTW9kZSgpCisgICAgICAgICAgICAgICAgICAgID09IFRhYmxldG9wTW9kZUNvbnRyb2xsZXIuUFJFRkVSUkVEX1RBQkxFVE9QX0hBTEZfVE9QKSB7CisgICAgICAgICAgICAgICAgLy8gUHJlZmVyIHRvcCwgYXZvaWQgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSBkaXNwbGF5LgorICAgICAgICAgICAgICAgIG1QaXBCb3VuZHNTdGF0ZS5hZGROYW1lZFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWEodGFnLCBuZXcgUmVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlCb3VuZHMubGVmdCwgZGlzcGxheUJvdW5kcy5jZW50ZXJZKCksCisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Qm91bmRzLnJpZ2h0LCBkaXNwbGF5Qm91bmRzLmJvdHRvbSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBQcmVmZXIgYm90dG9tLCBhdm9pZCB0aGUgdG9wIGhhbGYgb2YgdGhlIGRpc3BsYXkuCisgICAgICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLmFkZE5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYSh0YWcsIG5ldyBSZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUJvdW5kcy5sZWZ0LCBkaXNwbGF5Qm91bmRzLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlCb3VuZHMucmlnaHQsIGRpc3BsYXlCb3VuZHMuY2VudGVyWSgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRyeSB0byBtb3ZlIHRoZSBQaVAgd2luZG93IGlmIHdlIGhhdmUgZW50ZXJlZCBQaVAgbW9kZS4KKyAgICAgICAgICAgIGlmIChtUGlwVHJhbnNpdGlvblN0YXRlLmhhc0VudGVyZWRQaXAoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgcGlwQm91bmRzID0gbVBpcEJvdW5kc1N0YXRlLmdldEJvdW5kcygpOworICAgICAgICAgICAgICAgIGZpbmFsIFBvaW50IGVkZ2VJbnNldHMgPSBtUGlwU2l6ZVNwZWNIYW5kbGVyLmdldFNjcmVlbkVkZ2VJbnNldHMoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHBpcEJvdW5kcy5oZWlnaHQoKSArIDIgKiBlZGdlSW5zZXRzLnkpID4gKGRpc3BsYXlCb3VuZHMuaGVpZ2h0KCkgLyAyKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBQaVAgYm91bmRzIGlzIHRvbyBiaWcgdG8gZml0IGVpdGhlciBoYWxmLCBiYWlsIGVhcmx5LgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1NYWluRXhlY3V0b3IucmVtb3ZlQ2FsbGJhY2tzKG1Nb3ZlUGlwSW5SZXNwb25zZVRvS2VlcENsZWFyQXJlYXNDaGFuZ2VDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgbU1haW5FeGVjdXRvci5leGVjdXRlKG1Nb3ZlUGlwSW5SZXNwb25zZVRvS2VlcENsZWFyQXJlYXNDaGFuZ2VDYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCiAgICAgICAgIG1PbmVIYW5kZWRDb250cm9sbGVyLmlmUHJlc2VudChjb250cm9sbGVyIC0+IHsKICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJUcmFuc2l0aW9uQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgIG5ldyBPbmVIYW5kZWRUcmFuc2l0aW9uQ2FsbGJhY2soKSB7CkBAIC04OTIsMTIgKzkzNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAwLCBtUGlwQm91bmRzU3RhdGUuZ2V0RGlzcGxheUJvdW5kcygpLmJvdHRvbSAtIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLmdldERpc3BsYXlCb3VuZHMoKS5yaWdodCwKICAgICAgICAgICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLmdldERpc3BsYXlCb3VuZHMoKS5ib3R0b20pOwotICAgICAgICAgICAgU2V0PFJlY3Q+IHJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhcyA9IG5ldyBIYXNoU2V0PD4oCi0gICAgICAgICAgICAgICAgICAgIG1QaXBCb3VuZHNTdGF0ZS5nZXRSZXN0cmljdGVkS2VlcENsZWFyQXJlYXMoKSk7Ci0gICAgICAgICAgICByZXN0cmljdGVkS2VlcENsZWFyQXJlYXMuYWRkKHJlY3QpOwotICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLnNldEtlZXBDbGVhckFyZWFzKHJlc3RyaWN0ZWRLZWVwQ2xlYXJBcmVhcywKLSAgICAgICAgICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLmdldFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWFzKCkpOworICAgICAgICAgICAgbVBpcEJvdW5kc1N0YXRlLmFkZE5hbWVkVW5yZXN0cmljdGVkS2VlcENsZWFyQXJlYShMQVVOQ0hFUl9LRUVQX0NMRUFSX0FSRUFfVEFHLCByZWN0KTsKICAgICAgICAgICAgIHVwZGF0ZVBpcFBvc2l0aW9uRm9yS2VlcENsZWFyQXJlYXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QaXBCb3VuZHNTdGF0ZS5yZW1vdmVOYW1lZFVucmVzdHJpY3RlZEtlZXBDbGVhckFyZWEoTEFVTkNIRVJfS0VFUF9DTEVBUl9BUkVBX1RBRyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvc3BsaXRzY3JlZW4vU3BsaXRTY3JlZW5UcmFuc2l0aW9ucy5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9zcGxpdHNjcmVlbi9TcGxpdFNjcmVlblRyYW5zaXRpb25zLmphdmEKaW5kZXggZTFjMDg5NS4uZTA5YzNjOSAxMDA2NDQKLS0tIGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9zcGxpdHNjcmVlbi9TcGxpdFNjcmVlblRyYW5zaXRpb25zLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9zcGxpdHNjcmVlbi9TcGxpdFNjcmVlblRyYW5zaXRpb25zLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VDb250cm9sOwpAQCAtMTI4LDYgKzEyOSw3IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgbW9kZSA9IGluZm8uZ2V0Q2hhbmdlcygpLmdldChpKS5nZXRNb2RlKCk7CiAKICAgICAgICAgICAgIGlmIChtb2RlID09IFRSQU5TSVRfQ0hBTkdFKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJvb3RJZHggPSBUcmFuc2l0aW9uVXRpbC5yb290SW5kZXhGb3IoY2hhbmdlLCBpbmZvKTsKICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLmdldFBhcmVudCgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSByZXBhcmVudGVkLCBzbyB3ZSB3YW50IHRoZSBwYXJlbnQgdG8gYmUgaW1tZWRpYXRlbHkgdmlzaWJsZQogICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmFuc2l0aW9uSW5mby5DaGFuZ2UgcGFyZW50Q2hhbmdlID0gaW5mby5nZXRDaGFuZ2UoY2hhbmdlLmdldFBhcmVudCgpKTsKQEAgLTEzNSw3ICsxMzcsNyBAQAogICAgICAgICAgICAgICAgICAgICB0LnNldEFscGhhKHBhcmVudENoYW5nZS5nZXRMZWFzaCgpLCAxLmYpOwogICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBhbmltYXRlIHRoaXMgbGF5ZXIgb3V0c2lkZSB0aGUgcGFyZW50IChzaW5jZSwgZm9yIGV4YW1wbGUsIHRoaXMgaXMKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGhvbWUgdGFzayBhbmltYXRpbmcgZnJvbSBmdWxsc2NyZWVuIHRvIHBhcnQtc2NyZWVuKS4KLSAgICAgICAgICAgICAgICAgICAgdC5yZXBhcmVudChsZWFzaCwgaW5mby5nZXRSb290TGVhc2goKSk7CisgICAgICAgICAgICAgICAgICAgIHQucmVwYXJlbnQobGVhc2gsIGluZm8uZ2V0Um9vdChyb290SWR4KS5nZXRMZWFzaCgpKTsKICAgICAgICAgICAgICAgICAgICAgdC5zZXRMYXllcihsZWFzaCwgaW5mby5nZXRDaGFuZ2VzKCkuc2l6ZSgpIC0gaSk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBmaW5pc2ggcmVwYXJlbnQvcmVwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICBtRmluaXNoVHJhbnNhY3Rpb24ucmVwYXJlbnQobGVhc2gsIHBhcmVudENoYW5nZS5nZXRMZWFzaCgpKTsKQEAgLTE0NSw4ICsxNDcsOSBAQAogICAgICAgICAgICAgICAgIC8vIFRPRE8oc2hlbGwtdHJhbnNpdGlvbnMpOiBzY3JlZW5zaG90IGhlcmUKICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHN0YXJ0Qm91bmRzID0gbmV3IFJlY3QoY2hhbmdlLmdldFN0YXJ0QWJzQm91bmRzKCkpOwogICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgZW5kQm91bmRzID0gbmV3IFJlY3QoY2hhbmdlLmdldEVuZEFic0JvdW5kcygpKTsKLSAgICAgICAgICAgICAgICBzdGFydEJvdW5kcy5vZmZzZXQoLWluZm8uZ2V0Um9vdE9mZnNldCgpLngsIC1pbmZvLmdldFJvb3RPZmZzZXQoKS55KTsKLSAgICAgICAgICAgICAgICBlbmRCb3VuZHMub2Zmc2V0KC1pbmZvLmdldFJvb3RPZmZzZXQoKS54LCAtaW5mby5nZXRSb290T2Zmc2V0KCkueSk7CisgICAgICAgICAgICAgICAgZmluYWwgUG9pbnQgcm9vdE9mZnNldCA9IGluZm8uZ2V0Um9vdChyb290SWR4KS5nZXRPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICBzdGFydEJvdW5kcy5vZmZzZXQoLXJvb3RPZmZzZXQueCwgLXJvb3RPZmZzZXQueSk7CisgICAgICAgICAgICAgICAgZW5kQm91bmRzLm9mZnNldCgtcm9vdE9mZnNldC54LCAtcm9vdE9mZnNldC55KTsKICAgICAgICAgICAgICAgICBzdGFydEV4YW1wbGVSZXNpemVBbmltYXRpb24obGVhc2gsIHN0YXJ0Qm91bmRzLCBlbmRCb3VuZHMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYm9vbGVhbiBpc1Jvb3RPclNwbGl0U2lkZVJvb3QgPSBjaGFuZ2UuZ2V0UGFyZW50KCkgPT0gbnVsbApkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9zcGxpdHNjcmVlbi9TdGFnZUNvb3JkaW5hdG9yLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3NwbGl0c2NyZWVuL1N0YWdlQ29vcmRpbmF0b3IuamF2YQppbmRleCBhNTU0NmU1Li5hMWVhZjg1IDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3NwbGl0c2NyZWVuL1N0YWdlQ29vcmRpbmF0b3IuamF2YQorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3NwbGl0c2NyZWVuL1N0YWdlQ29vcmRpbmF0b3IuamF2YQpAQCAtMjU5LDM3ICsyNTksNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CiAKLSAgICBwcml2YXRlIGZpbmFsIFNwbGl0U2NyZWVuVHJhbnNpdGlvbnMuVHJhbnNpdGlvbkZpbmlzaGVkQ2FsbGJhY2sKLSAgICAgICAgICAgIG1SZWNlbnRUcmFuc2l0aW9uRmluaXNoZWRDYWxsYmFjayA9Ci0gICAgICAgICAgICBuZXcgU3BsaXRTY3JlZW5UcmFuc2l0aW9ucy5UcmFuc2l0aW9uRmluaXNoZWRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uIGZpbmlzaFdjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uIGZpbmlzaFQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlY2VudCB0cmFuc2l0aW9uIGlzIGZpbmlzaGVkIGJ5IHJldHVybmluZyB0byB0aGUgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAvLyBzcGxpdCwgc28gd2UKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHJlc3RvcmUgdGhlIGRpdmlkZXIgYmFyLgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbmlzaFdjdC5nZXRIaWVyYXJjaHlPcHMoKS5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24uSGllcmFyY2h5T3Agb3AgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hXY3QuZ2V0SGllcmFyY2h5T3BzKCkuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUJpbmRlciBjb250YWluZXIgPSBvcC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcC5nZXRUeXBlKCkgPT0gSElFUkFSQ0hZX09QX1RZUEVfUkVPUkRFUiAmJiBvcC5nZXRUb1RvcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtTWFpblN0YWdlLmNvbnRhaW5zQ29udGFpbmVyKGNvbnRhaW5lcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVNpZGVTdGFnZS5jb250YWluc0NvbnRhaW5lcihjb250YWluZXIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN1cmZhY2VCb3VuZHMobVNwbGl0TGF5b3V0LCBmaW5pc2hULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYXBwbHlSZXNpemluZ09mZnNldCAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGl2aWRlclZpc2liaWxpdHkodHJ1ZSwgZmluaXNoVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGlzbWlzcyB0aGUgc3BsaXQgc2NyZWVuIGlmIGl0J3Mgbm90IHJldHVybmluZyB0byBzcGxpdC4KLSAgICAgICAgICAgICAgICAgICAgcHJlcGFyZUV4aXRTcGxpdFNjcmVlbihTVEFHRV9UWVBFX1VOREVGSU5FRCwgZmluaXNoV2N0KTsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3BsaXRzVmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldERpdmlkZXJWaXNpYmlsaXR5KGZhbHNlLCBmaW5pc2hUKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nRXhpdChFWElUX1JFQVNPTl9VTktOT1dOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCiAgICAgcHJvdGVjdGVkIFN0YWdlQ29vcmRpbmF0b3IoQ29udGV4dCBjb250ZXh0LCBpbnQgZGlzcGxheUlkLCBTeW5jVHJhbnNhY3Rpb25RdWV1ZSBzeW5jUXVldWUsCiAgICAgICAgICAgICBTaGVsbFRhc2tPcmdhbml6ZXIgdGFza09yZ2FuaXplciwgRGlzcGxheUNvbnRyb2xsZXIgZGlzcGxheUNvbnRyb2xsZXIsCiAgICAgICAgICAgICBEaXNwbGF5SW1lQ29udHJvbGxlciBkaXNwbGF5SW1lQ29udHJvbGxlciwKQEAgLTM4OCw2ICszNTcsMTEgQEAKICAgICAgICAgcmV0dXJuIG1NYWluU3RhZ2UuaXNBY3RpdmUoKTsKICAgICB9CiAKKyAgICAvKiogQ2hlY2tzIGlmIGB0cmFuc2l0aW9uYCBpcyBhIHBlbmRpbmcgZW50ZXItc3BsaXQgdHJhbnNpdGlvbi4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BlbmRpbmdFbnRlcihJQmluZGVyIHRyYW5zaXRpb24pIHsKKyAgICAgICAgcmV0dXJuIG1TcGxpdFRyYW5zaXRpb25zLmlzUGVuZGluZ0VudGVyKHRyYW5zaXRpb24pOworICAgIH0KKwogICAgIEBTdGFnZVR5cGUKICAgICBpbnQgZ2V0U3RhZ2VPZlRhc2soaW50IHRhc2tJZCkgewogICAgICAgICBpZiAobU1haW5TdGFnZS5jb250YWluc1Rhc2sodGFza0lkKSkgewpAQCAtMjI2NCwxMSArMjIzOCwxNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNPcGVuaW5nICYmIGluRnVsbHNjcmVlbikgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpdml0eVR5cGUgPSB0cmlnZ2VyVGFzay5nZXRBY3Rpdml0eVR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHlUeXBlID09IEFDVElWSVRZX1RZUEVfSE9NRQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgYWN0aXZpdHlUeXBlID09IEFDVElWSVRZX1RZUEVfUkVDRU5UUykgewotICAgICAgICAgICAgICAgICAgICAvLyBFbnRlciBvdmVydmlldyBwYW5lbCwgc28gc3RhcnQgcmVjZW50IHRyYW5zaXRpb24uCi0gICAgICAgICAgICAgICAgICAgIG1TcGxpdFRyYW5zaXRpb25zLnNldFJlY2VudFRyYW5zaXRpb24odHJhbnNpdGlvbiwgcmVxdWVzdC5nZXRSZW1vdGVUcmFuc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlY2VudFRyYW5zaXRpb25GaW5pc2hlZENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZpdHlUeXBlID09IEFDVElWSVRZX1RZUEVfSE9NRSB8fCBhY3Rpdml0eVR5cGUgPT0gQUNUSVZJVFlfVFlQRV9SRUNFTlRTKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldFJlbW90ZVRyYW5zaXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydGluZyByZWNlbnRzL2hvbWUsIHNvIGRvbid0IGhhbmRsZSB0aGlzIGFuZCBsZXQgaXQgZmFsbC10aHJvdWdoIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVtb3RlIGhhbmRsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHVzZSB0aGUgb2xkIHN0dWZmIGZvciBub24tcmVtb3RlIGFuaW1hdGlvbnMsIG90aGVyd2lzZSB3ZSBkb24ndAorICAgICAgICAgICAgICAgICAgICAvLyBleGl0IHNwbGl0LXNjcmVlbi4KKyAgICAgICAgICAgICAgICAgICAgbVNwbGl0VHJhbnNpdGlvbnMuc2V0UmVjZW50VHJhbnNpdGlvbih0cmFuc2l0aW9uLCBudWxsIC8qIHJlbW90ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzOjpvblJlY2VudHNJblNwbGl0QW5pbWF0aW9uRmluaXNoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yMzk4LDcgKzIzNzcsNyBAQAogICAgICAgICAgICAgc2hvdWxkQW5pbWF0ZSA9IHN0YXJ0UGVuZGluZ0VudGVyQW5pbWF0aW9uKAogICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLCBpbmZvLCBzdGFydFRyYW5zYWN0aW9uLCBmaW5pc2hUcmFuc2FjdGlvbik7CiAgICAgICAgIH0gZWxzZSBpZiAobVNwbGl0VHJhbnNpdGlvbnMuaXNQZW5kaW5nUmVjZW50KHRyYW5zaXRpb24pKSB7Ci0gICAgICAgICAgICBzaG91bGRBbmltYXRlID0gc3RhcnRQZW5kaW5nUmVjZW50QW5pbWF0aW9uKHRyYW5zaXRpb24sIGluZm8sIHN0YXJ0VHJhbnNhY3Rpb24pOworICAgICAgICAgICAgb25SZWNlbnRzSW5TcGxpdEFuaW1hdGlvblN0YXJ0KHN0YXJ0VHJhbnNhY3Rpb24pOwogICAgICAgICB9IGVsc2UgaWYgKG1TcGxpdFRyYW5zaXRpb25zLmlzUGVuZGluZ0Rpc21pc3ModHJhbnNpdGlvbikpIHsKICAgICAgICAgICAgIHNob3VsZEFuaW1hdGUgPSBzdGFydFBlbmRpbmdEaXNtaXNzQW5pbWF0aW9uKAogICAgICAgICAgICAgICAgICAgICBtU3BsaXRUcmFuc2l0aW9ucy5tUGVuZGluZ0Rpc21pc3MsIGluZm8sIHN0YXJ0VHJhbnNhY3Rpb24sIGZpbmlzaFRyYW5zYWN0aW9uKTsKQEAgLTI2NTMsMTAgKzI2MzIsMzUgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0UGVuZGluZ1JlY2VudEFuaW1hdGlvbihATm9uTnVsbCBJQmluZGVyIHRyYW5zaXRpb24sCi0gICAgICAgICAgICBATm9uTnVsbCBUcmFuc2l0aW9uSW5mbyBpbmZvLCBATm9uTnVsbCBTdXJmYWNlQ29udHJvbC5UcmFuc2FjdGlvbiB0KSB7CisgICAgLyoqIENhbGwgdGhpcyB3aGVuIHN0YXJ0aW5nIHRoZSBvcGVuLXJlY2VudHMgYW5pbWF0aW9uIHdoaWxlIHNwbGl0LXNjcmVlbiBpcyBhY3RpdmUuICovCisgICAgcHVibGljIHZvaWQgb25SZWNlbnRzSW5TcGxpdEFuaW1hdGlvblN0YXJ0KEBOb25OdWxsIFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uIHQpIHsKICAgICAgICAgc2V0RGl2aWRlclZpc2liaWxpdHkoZmFsc2UsIHQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogQ2FsbCB0aGlzIHdoZW4gdGhlIHJlY2VudHMgYW5pbWF0aW9uIGR1cmluZyBzcGxpdC1zY3JlZW4gZmluaXNoZXMuICovCisgICAgcHVibGljIHZvaWQgb25SZWNlbnRzSW5TcGxpdEFuaW1hdGlvbkZpbmlzaChXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbiBmaW5pc2hXY3QsCisgICAgICAgICAgICBTdXJmYWNlQ29udHJvbC5UcmFuc2FjdGlvbiBmaW5pc2hUKSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSByZWNlbnQgdHJhbnNpdGlvbiBpcyBmaW5pc2hlZCBieSByZXR1cm5pbmcgdG8gdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gc3BsaXQsIHNvIHdlIGNhbiByZXN0b3JlIHRoZSBkaXZpZGVyIGJhci4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5pc2hXY3QuZ2V0SGllcmFyY2h5T3BzKCkuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGZpbmFsIFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uLkhpZXJhcmNoeU9wIG9wID0KKyAgICAgICAgICAgICAgICAgICAgZmluaXNoV2N0LmdldEhpZXJhcmNoeU9wcygpLmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIElCaW5kZXIgY29udGFpbmVyID0gb3AuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICBpZiAob3AuZ2V0VHlwZSgpID09IEhJRVJBUkNIWV9PUF9UWVBFX1JFT1JERVIgJiYgb3AuZ2V0VG9Ub3AoKQorICAgICAgICAgICAgICAgICAgICAmJiAobU1haW5TdGFnZS5jb250YWluc0NvbnRhaW5lcihjb250YWluZXIpCisgICAgICAgICAgICAgICAgICAgIHx8IG1TaWRlU3RhZ2UuY29udGFpbnNDb250YWluZXIoY29udGFpbmVyKSkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVTdXJmYWNlQm91bmRzKG1TcGxpdExheW91dCwgZmluaXNoVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFwcGx5UmVzaXppbmdPZmZzZXQgKi8pOworICAgICAgICAgICAgICAgIHNldERpdmlkZXJWaXNpYmlsaXR5KHRydWUsIGZpbmlzaFQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERpc21pc3MgdGhlIHNwbGl0IHNjcmVlbiBpZiBpdCdzIG5vdCByZXR1cm5pbmcgdG8gc3BsaXQuCisgICAgICAgIHByZXBhcmVFeGl0U3BsaXRTY3JlZW4oU1RBR0VfVFlQRV9VTkRFRklORUQsIGZpbmlzaFdjdCk7CisgICAgICAgIHNldFNwbGl0c1Zpc2libGUoZmFsc2UpOworICAgICAgICBzZXREaXZpZGVyVmlzaWJpbGl0eShmYWxzZSwgZmluaXNoVCk7CisgICAgICAgIGxvZ0V4aXQoRVhJVF9SRUFTT05fVU5LTk9XTik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFkZERpdmlkZXJCYXJUb1RyYW5zaXRpb24oQE5vbk51bGwgVHJhbnNpdGlvbkluZm8gaW5mbywKZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvdHJhbnNpdGlvbi9EZWZhdWx0TWl4ZWRIYW5kbGVyLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3RyYW5zaXRpb24vRGVmYXVsdE1peGVkSGFuZGxlci5qYXZhCmluZGV4IDc1MTEyYjYuLmQwOTQ4OTIgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvdHJhbnNpdGlvbi9EZWZhdWx0TWl4ZWRIYW5kbGVyLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC90cmFuc2l0aW9uL0RlZmF1bHRNaXhlZEhhbmRsZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLldpbmRvd0NvbmZpZ3VyYXRpb24uQUNUSVZJVFlfVFlQRV9IT01FOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5XaW5kb3dDb25maWd1cmF0aW9uLkFDVElWSVRZX1RZUEVfUkVDRU5UUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuV2luZG93Q29uZmlndXJhdGlvbi5XSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5UUkFOU0lUX0NIQU5HRTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuVFJBTlNJVF9UT19CQUNLOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpbmRvdy5UcmFuc2l0aW9uSW5mby5GTEFHX0lTX1dBTExQQVBFUjsKQEAgLTI1LDYgKzI2LDcgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLnNwbGl0LlNwbGl0U2NyZWVuQ29uc3RhbnRzLkZMQUdfSVNfRElWSURFUl9CQVI7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLndtLnNoZWxsLnNwbGl0c2NyZWVuLlNwbGl0U2NyZWVuLlNUQUdFX1RZUEVfVU5ERUZJTkVEOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC53bS5zaGVsbC5zcGxpdHNjcmVlbi5TcGxpdFNjcmVlbkNvbnRyb2xsZXIuRVhJVF9SRUFTT05fQ0hJTERfVEFTS19FTlRFUl9QSVA7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLndtLnNoZWxsLnV0aWwuVHJhbnNpdGlvblV0aWwuaXNPcGVuaW5nVHlwZTsKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKQEAgLTY4LDE0ICs3MCwyMCBAQAogICAgICAgICAvKiogUGlwIHdhcyBlbnRlcmVkIHdoaWxlIGhhbmRsaW5nIGFuIGludGVudCB3aXRoIGl0cyBvd24gcmVtb3RlVHJhbnNpdGlvbi4gKi8KICAgICAgICAgc3RhdGljIGZpbmFsIGludCBUWVBFX09QVElPTlNfUkVNT1RFX0FORF9QSVBfQ0hBTkdFID0gMzsKIAorICAgICAgICAvKiogUmVjZW50cyB0cmFuc2l0aW9uIHdoaWxlIHNwbGl0LXNjcmVlbiBhY3RpdmUuICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SRUNFTlRTX0RVUklOR19TUExJVCA9IDQ7CisKICAgICAgICAgLyoqIFRoZSBkZWZhdWx0IGFuaW1hdGlvbiBmb3IgdGhpcyBtaXhlZCB0cmFuc2l0aW9uLiAqLwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFOSU1fVFlQRV9ERUZBVUxUID0gMDsKIAogICAgICAgICAvKiogRm9yIEVOVEVSX1BJUF9GUk9NX1NQTElULCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgdG8taG9tZSBhbmltYXRpb24uICovCiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5JTV9UWVBFX0dPSU5HX0hPTUUgPSAxOwogCisgICAgICAgIC8qKiBGb3IgUkVDRU5UU19EVVJJTkdfU1BMSVQsIGlzIHNldCB3aGVuIHRoaXMgdHVybnMgaW50byBhIHBhaXItPnBhaXIgdGFzayBzd2l0Y2guICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5JTV9UWVBFX1BBSVJfVE9fUEFJUiA9IDE7CisKICAgICAgICAgZmluYWwgaW50IG1UeXBlOwotICAgICAgICBpbnQgbUFuaW1UeXBlID0gMDsKKyAgICAgICAgaW50IG1BbmltVHlwZSA9IEFOSU1fVFlQRV9ERUZBVUxUOwogICAgICAgICBmaW5hbCBJQmluZGVyIG1UcmFuc2l0aW9uOwogCiAgICAgICAgIFRyYW5zaXRpb25zLlRyYW5zaXRpb25IYW5kbGVyIG1MZWZ0b3ZlcnNIYW5kbGVyID0gbnVsbDsKQEAgLTE2Nyw2ICsxNzUsMjcgQEAKICAgICAgICAgICAgIG1peGVkLm1MZWZ0b3ZlcnNIYW5kbGVyID0gaGFuZGxlci5maXJzdDsKICAgICAgICAgICAgIG1BY3RpdmVUcmFuc2l0aW9ucy5hZGQobWl4ZWQpOwogICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2Vjb25kOworICAgICAgICB9IGVsc2UgaWYgKG1TcGxpdEhhbmRsZXIuaXNTcGxpdEFjdGl2ZSgpCisgICAgICAgICAgICAgICAgJiYgaXNPcGVuaW5nVHlwZShyZXF1ZXN0LmdldFR5cGUoKSkKKyAgICAgICAgICAgICAgICAmJiByZXF1ZXN0LmdldFRyaWdnZXJUYXNrKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHJlcXVlc3QuZ2V0VHJpZ2dlclRhc2soKS5nZXRXaW5kb3dpbmdNb2RlKCkgPT0gV0lORE9XSU5HX01PREVfRlVMTFNDUkVFTgorICAgICAgICAgICAgICAgICYmIChyZXF1ZXN0LmdldFRyaWdnZXJUYXNrKCkuZ2V0QWN0aXZpdHlUeXBlKCkgPT0gQUNUSVZJVFlfVFlQRV9IT01FCisgICAgICAgICAgICAgICAgICAgICAgICB8fCByZXF1ZXN0LmdldFRyaWdnZXJUYXNrKCkuZ2V0QWN0aXZpdHlUeXBlKCkgPT0gQUNUSVZJVFlfVFlQRV9SRUNFTlRTKQorICAgICAgICAgICAgICAgICYmIHJlcXVlc3QuZ2V0UmVtb3RlVHJhbnNpdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFByb3RvTG9nLnYoU2hlbGxQcm90b0xvZ0dyb3VwLldNX1NIRUxMX1RSQU5TSVRJT05TLCAiIEdvdCBhIHJlY2VudHMgcmVxdWVzdCB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICsgIlNwbGl0LVNjcmVlbiBpcyBhY3RpdmUsIHNvIHRyZWF0IGl0IGFzIE1peGVkLiIpOworICAgICAgICAgICAgUGFpcjxUcmFuc2l0aW9ucy5UcmFuc2l0aW9uSGFuZGxlciwgV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24+IGhhbmRsZXIgPQorICAgICAgICAgICAgICAgICAgICBtUGxheWVyLmRpc3BhdGNoUmVxdWVzdCh0cmFuc2l0aW9uLCByZXF1ZXN0LCB0aGlzKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoVHJhbnNpdGlvbnMuVEFHLCAiICAgTm8gaGFuZGxlciBmb3IgcmVtb3RlPyBUaGlzIGlzIHVuZXhwZWN0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIHRoZXJlIHNob3VsZCBhdC1sZWFzdCBiZSBSZW1vdGVIYW5kbGVyLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgTWl4ZWRUcmFuc2l0aW9uIG1peGVkID0gbmV3IE1peGVkVHJhbnNpdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTWl4ZWRUcmFuc2l0aW9uLlRZUEVfUkVDRU5UU19EVVJJTkdfU1BMSVQsIHRyYW5zaXRpb24pOworICAgICAgICAgICAgbWl4ZWQubUxlZnRvdmVyc0hhbmRsZXIgPSBoYW5kbGVyLmZpcnN0OworICAgICAgICAgICAgbUFjdGl2ZVRyYW5zaXRpb25zLmFkZChtaXhlZCk7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlci5zZWNvbmQ7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMTc5LDcgKzIwOCw5IEBACiAgICAgICAgICAgICAgICAgb3V0LmdldENoYW5nZXMoKS5hZGQoaW5mby5nZXRDaGFuZ2VzKCkuZ2V0KGkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBvdXQuc2V0Um9vdExlYXNoKGluZm8uZ2V0Um9vdExlYXNoKCksIGluZm8uZ2V0Um9vdE9mZnNldCgpLngsIGluZm8uZ2V0Um9vdE9mZnNldCgpLnkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZm8uZ2V0Um9vdENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgb3V0LmFkZFJvb3QoaW5mby5nZXRSb290KGkpKTsKKyAgICAgICAgfQogICAgICAgICBvdXQuc2V0QW5pbWF0aW9uT3B0aW9ucyhpbmZvLmdldEFuaW1hdGlvbk9wdGlvbnMoKSk7CiAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgfQpAQCAtMjE0LDYgKzI0NSw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAobWl4ZWQubVR5cGUgPT0gTWl4ZWRUcmFuc2l0aW9uLlRZUEVfT1BUSU9OU19SRU1PVEVfQU5EX1BJUF9DSEFOR0UpIHsKICAgICAgICAgICAgIHJldHVybiBhbmltYXRlT3BlbkludGVudFdpdGhSZW1vdGVBbmRQaXAobWl4ZWQsIGluZm8sIHN0YXJ0VHJhbnNhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgIGZpbmlzaFRyYW5zYWN0aW9uLCBmaW5pc2hDYWxsYmFjayk7CisgICAgICAgIH0gZWxzZSBpZiAobWl4ZWQubVR5cGUgPT0gTWl4ZWRUcmFuc2l0aW9uLlRZUEVfUkVDRU5UU19EVVJJTkdfU1BMSVQpIHsKKyAgICAgICAgICAgIHJldHVybiBhbmltYXRlUmVjZW50c0R1cmluZ1NwbGl0KG1peGVkLCBpbmZvLCBzdGFydFRyYW5zYWN0aW9uLCBmaW5pc2hUcmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoQ2FsbGJhY2spOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUFjdGl2ZVRyYW5zaXRpb25zLnJlbW92ZShtaXhlZCk7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTdGFydGluZyBtaXhlZCBhbmltYXRpb24gd2l0aG91dCBhIGtub3duIG1peGVkIHR5cGU/ICIKQEAgLTQzOSwxMiArNDczLDQwIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIHByaXZhdGUgYm9vbGVhbiBhbmltYXRlUmVjZW50c0R1cmluZ1NwbGl0KEBOb25OdWxsIGZpbmFsIE1peGVkVHJhbnNpdGlvbiBtaXhlZCwKKyAgICAgICAgICAgIEBOb25OdWxsIFRyYW5zaXRpb25JbmZvIGluZm8sCisgICAgICAgICAgICBATm9uTnVsbCBTdXJmYWNlQ29udHJvbC5UcmFuc2FjdGlvbiBzdGFydFRyYW5zYWN0aW9uLAorICAgICAgICAgICAgQE5vbk51bGwgU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gZmluaXNoVHJhbnNhY3Rpb24sCisgICAgICAgICAgICBATm9uTnVsbCBUcmFuc2l0aW9ucy5UcmFuc2l0aW9uRmluaXNoQ2FsbGJhY2sgZmluaXNoQ2FsbGJhY2spIHsKKyAgICAgICAgLy8gU3BsaXQtc2NyZWVuIGlzIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgcmVjZW50cyB0cmFuc2l0aW9uIGZpbmlzaGluZyAoYW5kIG1lcmdpbmcpLCBzbworICAgICAgICAvLyBqdXN0IHdyYXAgZmluaXNoIGFuZCBzdGFydCByZWNlbnRzIGFuaW1hdGlvbiBkaXJlY3RseS4KKyAgICAgICAgVHJhbnNpdGlvbnMuVHJhbnNpdGlvbkZpbmlzaENhbGxiYWNrIGZpbmlzaENCID0gKHdjdCwgd2N0Q0IpIC0+IHsKKyAgICAgICAgICAgIG1peGVkLm1JbkZsaWdodFN1YkFuaW1hdGlvbnMgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVRyYW5zaXRpb25zLnJlbW92ZShtaXhlZCk7CisgICAgICAgICAgICAvLyBJZiBwYWlyLXRvLXBhaXIgc3dpdGNoaW5nLCB0aGUgcG9zdC1yZWNlbnRzIGNsZWFuLXVwIGlzbid0IG5lZWRlZC4KKyAgICAgICAgICAgIGlmIChtaXhlZC5tQW5pbVR5cGUgIT0gTWl4ZWRUcmFuc2l0aW9uLkFOSU1fVFlQRV9QQUlSX1RPX1BBSVIpIHsKKyAgICAgICAgICAgICAgICB3Y3QgPSB3Y3QgIT0gbnVsbCA/IHdjdCA6IG5ldyBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIG1TcGxpdEhhbmRsZXIub25SZWNlbnRzSW5TcGxpdEFuaW1hdGlvbkZpbmlzaCh3Y3QsIGZpbmlzaFRyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TcGxpdEhhbmRsZXIub25UcmFuc2l0aW9uQW5pbWF0aW9uQ29tcGxldGUoKTsKKyAgICAgICAgICAgIGZpbmlzaENhbGxiYWNrLm9uVHJhbnNpdGlvbkZpbmlzaGVkKHdjdCwgd2N0Q0IpOworICAgICAgICB9OworICAgICAgICBtaXhlZC5tSW5GbGlnaHRTdWJBbmltYXRpb25zID0gMTsKKyAgICAgICAgbVNwbGl0SGFuZGxlci5vblJlY2VudHNJblNwbGl0QW5pbWF0aW9uU3RhcnQoc3RhcnRUcmFuc2FjdGlvbik7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFuZGxlZCA9IG1peGVkLm1MZWZ0b3ZlcnNIYW5kbGVyLnN0YXJ0QW5pbWF0aW9uKG1peGVkLm1UcmFuc2l0aW9uLCBpbmZvLAorICAgICAgICAgICAgICAgIHN0YXJ0VHJhbnNhY3Rpb24sIGZpbmlzaFRyYW5zYWN0aW9uLCBmaW5pc2hDQik7CisgICAgICAgIGlmICghaGFuZGxlZCkgeworICAgICAgICAgICAgbUFjdGl2ZVRyYW5zaXRpb25zLnJlbW92ZShtaXhlZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbWVyZ2VBbmltYXRpb24oQE5vbk51bGwgSUJpbmRlciB0cmFuc2l0aW9uLCBATm9uTnVsbCBUcmFuc2l0aW9uSW5mbyBpbmZvLAogICAgICAgICAgICAgQE5vbk51bGwgU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gdCwgQE5vbk51bGwgSUJpbmRlciBtZXJnZVRhcmdldCwKICAgICAgICAgICAgIEBOb25OdWxsIFRyYW5zaXRpb25zLlRyYW5zaXRpb25GaW5pc2hDYWxsYmFjayBmaW5pc2hDYWxsYmFjaykgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1BY3RpdmVUcmFuc2l0aW9ucy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFuc2l0aW9ucy5nZXQoaSkgIT0gbWVyZ2VUYXJnZXQpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFuc2l0aW9ucy5nZXQoaSkubVRyYW5zaXRpb24gIT0gbWVyZ2VUYXJnZXQpIGNvbnRpbnVlOwogICAgICAgICAgICAgTWl4ZWRUcmFuc2l0aW9uIG1peGVkID0gbUFjdGl2ZVRyYW5zaXRpb25zLmdldChpKTsKICAgICAgICAgICAgIGlmIChtaXhlZC5tSW5GbGlnaHRTdWJBbmltYXRpb25zIDw9IDApIHsKICAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IGRvbmUsIHNvIG5vIG5lZWQgdG8gZW5kIGl0LgpAQCAtNDcyLDYgKzUzNCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBtaXhlZC5tTGVmdG92ZXJzSGFuZGxlci5tZXJnZUFuaW1hdGlvbih0cmFuc2l0aW9uLCBpbmZvLCB0LCBtZXJnZVRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtaXhlZC5tVHlwZSA9PSBNaXhlZFRyYW5zaXRpb24uVFlQRV9SRUNFTlRTX0RVUklOR19TUExJVCkgeworICAgICAgICAgICAgICAgIGlmIChtU3BsaXRIYW5kbGVyLmlzUGVuZGluZ0VudGVyKHRyYW5zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlY2VudHMgLT4gZW50ZXItc3BsaXQgbWVhbnMgdGhhdCB3ZSBhcmUgc3dpdGNoaW5nIGZyb20gb25lIHBhaXIgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYW5vdGhlciBwYWlyLgorICAgICAgICAgICAgICAgICAgICBtaXhlZC5tQW5pbVR5cGUgPSBNaXhlZFRyYW5zaXRpb24uQU5JTV9UWVBFX1BBSVJfVE9fUEFJUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWl4ZWQubUxlZnRvdmVyc0hhbmRsZXIubWVyZ2VBbmltYXRpb24odHJhbnNpdGlvbiwgaW5mbywgdCwgbWVyZ2VUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hDYWxsYmFjayk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlBsYXlpbmcgYSBtaXhlZCB0cmFuc2l0aW9uIHdpdGggdW5rbm93biB0eXBlPyAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIG1peGVkLm1UeXBlKTsKQEAgLTQ5MSw2ICs1NjEsOCBAQAogICAgICAgICBpZiAobWl4ZWQgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgICBpZiAobWl4ZWQubVR5cGUgPT0gTWl4ZWRUcmFuc2l0aW9uLlRZUEVfRU5URVJfUElQX0ZST01fU1BMSVQpIHsKICAgICAgICAgICAgIG1QaXBIYW5kbGVyLm9uVHJhbnNpdGlvbkNvbnN1bWVkKHRyYW5zaXRpb24sIGFib3J0ZWQsIGZpbmlzaFQpOworICAgICAgICB9IGVsc2UgaWYgKG1peGVkLm1UeXBlID09IE1peGVkVHJhbnNpdGlvbi5UWVBFX1JFQ0VOVFNfRFVSSU5HX1NQTElUKSB7CisgICAgICAgICAgICBtaXhlZC5tTGVmdG92ZXJzSGFuZGxlci5vblRyYW5zaXRpb25Db25zdW1lZCh0cmFuc2l0aW9uLCBhYm9ydGVkLCBmaW5pc2hUKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvdHJhbnNpdGlvbi9EZWZhdWx0VHJhbnNpdGlvbkhhbmRsZXIuamF2YSBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvdHJhbnNpdGlvbi9EZWZhdWx0VHJhbnNpdGlvbkhhbmRsZXIuamF2YQppbmRleCBmNjZjMjZiLi42M2M3OTY5IDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3RyYW5zaXRpb24vRGVmYXVsdFRyYW5zaXRpb25IYW5kbGVyLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC90cmFuc2l0aW9uL0RlZmF1bHRUcmFuc2l0aW9uSGFuZGxlci5qYXZhCkBAIC0zODMsOSArMzgzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBObyBkZWZhdWx0IGFuaW1hdGlvbiBmb3IgdGhpcywgc28ganVzdCB1cGRhdGUgYm91bmRzL3Bvc2l0aW9uLgorICAgICAgICAgICAgICAgIGZpbmFsIGludCByb290SWR4ID0gVHJhbnNpdGlvblV0aWwucm9vdEluZGV4Rm9yKGNoYW5nZSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgc3RhcnRUcmFuc2FjdGlvbi5zZXRQb3NpdGlvbihjaGFuZ2UuZ2V0TGVhc2goKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZS5nZXRFbmRBYnNCb3VuZHMoKS5sZWZ0IC0gaW5mby5nZXRSb290T2Zmc2V0KCkueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZS5nZXRFbmRBYnNCb3VuZHMoKS50b3AgLSBpbmZvLmdldFJvb3RPZmZzZXQoKS55KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZS5nZXRFbmRBYnNCb3VuZHMoKS5sZWZ0IC0gaW5mby5nZXRSb290KHJvb3RJZHgpLmdldE9mZnNldCgpLngsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuZ2V0RW5kQWJzQm91bmRzKCkudG9wIC0gaW5mby5nZXRSb290KHJvb3RJZHgpLmdldE9mZnNldCgpLnkpOwogICAgICAgICAgICAgICAgIC8vIFNlYW1sZXNzIGRpc3BsYXkgdHJhbnNpdGlvbiBkb2Vzbid0IG5lZWQgdG8gYW5pbWF0ZS4KICAgICAgICAgICAgICAgICBpZiAoaXNTZWFtbGVzc0Rpc3BsYXlDaGFuZ2UpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIGlmIChpc1Rhc2sgfHwgKGNoYW5nZS5oYXNGbGFncyhGTEFHX0lOX1RBU0tfV0lUSF9FTUJFRERFRF9BQ1RJVklUWSkKQEAgLTQ3NCw4ICs0NzUsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3JGb3JUcmFuc2l0aW9uICE9IDApIHsKLSAgICAgICAgICAgIGFkZEJhY2tncm91bmRUb1RyYW5zaXRpb24oaW5mby5nZXRSb290TGVhc2goKSwgYmFja2dyb3VuZENvbG9yRm9yVHJhbnNpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRUcmFuc2FjdGlvbiwgZmluaXNoVHJhbnNhY3Rpb24pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvLmdldFJvb3RDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBhZGRCYWNrZ3JvdW5kVG9UcmFuc2l0aW9uKGluZm8uZ2V0Um9vdChpKS5nZXRMZWFzaCgpLCBiYWNrZ3JvdW5kQ29sb3JGb3JUcmFuc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUcmFuc2FjdGlvbiwgZmluaXNoVHJhbnNhY3Rpb24pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHBvc3RTdGFydFRyYW5zYWN0aW9uQ2FsbGJhY2tzLnNpemUoKSA+IDApIHsKQEAgLTUyMCw4ICs1MjMsMTAgQEAKICAgICBwcml2YXRlIHZvaWQgc3RhcnRSb3RhdGlvbkFuaW1hdGlvbihTdXJmYWNlQ29udHJvbC5UcmFuc2FjdGlvbiBzdGFydFRyYW5zYWN0aW9uLAogICAgICAgICAgICAgVHJhbnNpdGlvbkluZm8uQ2hhbmdlIGNoYW5nZSwgVHJhbnNpdGlvbkluZm8gaW5mbywgaW50IGFuaW1IaW50LAogICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yPiBhbmltYXRpb25zLCBSdW5uYWJsZSBvbkFuaW1GaW5pc2gpIHsKKyAgICAgICAgZmluYWwgaW50IHJvb3RJZHggPSBUcmFuc2l0aW9uVXRpbC5yb290SW5kZXhGb3IoY2hhbmdlLCBpbmZvKTsKICAgICAgICAgZmluYWwgU2NyZWVuUm90YXRpb25BbmltYXRpb24gYW5pbSA9IG5ldyBTY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbihtQ29udGV4dCwgbVN1cmZhY2VTZXNzaW9uLAotICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvblBvb2wsIHN0YXJ0VHJhbnNhY3Rpb24sIGNoYW5nZSwgaW5mby5nZXRSb290TGVhc2goKSwgYW5pbUhpbnQpOworICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvblBvb2wsIHN0YXJ0VHJhbnNhY3Rpb24sIGNoYW5nZSwgaW5mby5nZXRSb290KHJvb3RJZHgpLmdldExlYXNoKCksCisgICAgICAgICAgICAgICAgYW5pbUhpbnQpOwogICAgICAgICAvLyBUaGUgcm90YXRpb24gYW5pbWF0aW9uIG1heSBjb25zaXN0IG9mIDMgYW5pbWF0aW9uczogZmFkZS1vdXQgc2NyZWVuc2hvdCwgZmFkZS1pbiByZWFsCiAgICAgICAgIC8vIGNvbnRlbnQsIGFuZCBiYWNrZ3JvdW5kIGNvbG9yLiBUaGUgaXRlbSBvZiAiYW5pbUdyb3VwIiB3aWxsIGJlIHJlbW92ZWQgaWYgdGhlIHN1YgogICAgICAgICAvLyBhbmltYXRpb24gaXMgZmluaXNoZWQuIFRoZW4gaWYgdGhlIGxpc3QgYmVjb21lcyBlbXB0eSwgdGhlIHJvdGF0aW9uIGFuaW1hdGlvbiBpcyBkb25lLgpkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC90cmFuc2l0aW9uL1RyYW5zaXRpb25zLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3RyYW5zaXRpb24vVHJhbnNpdGlvbnMuamF2YQppbmRleCAyN2I4MmMwLi4wMzliZGU5IDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3RyYW5zaXRpb24vVHJhbnNpdGlvbnMuamF2YQorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3RyYW5zaXRpb24vVHJhbnNpdGlvbnMuamF2YQpAQCAtNzUsNiArNzUsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLnByb3RvbG9nLlNoZWxsUHJvdG9Mb2dHcm91cDsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5zeXN1aS5TaGVsbENvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuc3lzdWkuU2hlbGxJbml0OworaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLnV0aWwuVHJhbnNpdGlvblV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC00MTUsOCArNDE2LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldHVwQW5pbUhpZXJhcmNoeShATm9uTnVsbCBUcmFuc2l0aW9uSW5mbyBpbmZvLAogICAgICAgICAgICAgQE5vbk51bGwgU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gdCwgQE5vbk51bGwgU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gZmluaXNoVCkgewogICAgICAgICBib29sZWFuIGlzT3BlbmluZyA9IGlzT3BlbmluZ1R5cGUoaW5mby5nZXRUeXBlKCkpOwotICAgICAgICBpZiAoaW5mby5nZXRSb290TGVhc2goKS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHQuc2hvdyhpbmZvLmdldFJvb3RMZWFzaCgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvLmdldFJvb3RDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgIHQuc2hvdyhpbmZvLmdldFJvb3QoaSkuZ2V0TGVhc2goKSk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgaW50IG51bUNoYW5nZXMgPSBpbmZvLmdldENoYW5nZXMoKS5zaXplKCk7CiAgICAgICAgIC8vIFB1dCBhbmltYXRpbmcgc3R1ZmYgYWJvdmUgdGhpcyBsaW5lIGFuZCBwdXQgc3RhdGljIHN0dWZmIGJlbG93IGl0LgpAQCAtNDM0LDEwICs0MzUsMTIgQEAKIAogICAgICAgICAgICAgYm9vbGVhbiBoYXNQYXJlbnQgPSBjaGFuZ2UuZ2V0UGFyZW50KCkgIT0gbnVsbDsKIAorICAgICAgICAgICAgZmluYWwgaW50IHJvb3RJZHggPSBUcmFuc2l0aW9uVXRpbC5yb290SW5kZXhGb3IoY2hhbmdlLCBpbmZvKTsKICAgICAgICAgICAgIGlmICghaGFzUGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgdC5yZXBhcmVudChsZWFzaCwgaW5mby5nZXRSb290TGVhc2goKSk7Ci0gICAgICAgICAgICAgICAgdC5zZXRQb3NpdGlvbihsZWFzaCwgY2hhbmdlLmdldFN0YXJ0QWJzQm91bmRzKCkubGVmdCAtIGluZm8uZ2V0Um9vdE9mZnNldCgpLngsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuZ2V0U3RhcnRBYnNCb3VuZHMoKS50b3AgLSBpbmZvLmdldFJvb3RPZmZzZXQoKS55KTsKKyAgICAgICAgICAgICAgICB0LnJlcGFyZW50KGxlYXNoLCBpbmZvLmdldFJvb3Qocm9vdElkeCkuZ2V0TGVhc2goKSk7CisgICAgICAgICAgICAgICAgdC5zZXRQb3NpdGlvbihsZWFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZS5nZXRTdGFydEFic0JvdW5kcygpLmxlZnQgLSBpbmZvLmdldFJvb3Qocm9vdElkeCkuZ2V0T2Zmc2V0KCkueCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZS5nZXRTdGFydEFic0JvdW5kcygpLnRvcCAtIGluZm8uZ2V0Um9vdChyb290SWR4KS5nZXRPZmZzZXQoKS55KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIGludCBsYXllcjsKICAgICAgICAgICAgIC8vIFB1dCBhbGwgdGhlIE9QRU4vU0hPVyBvbiB0b3AKQEAgLTUzMiwxMiArNTM1LDYgQEAKIAogICAgICAgICBpZiAoaW5mby5nZXRUeXBlKCkgPT0gVFJBTlNJVF9TTEVFUCkgewogICAgICAgICAgICAgaWYgKGFjdGl2ZUlkeCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIWluZm8uZ2V0Um9vdExlYXNoKCkuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNoZWxsIGhhcyBzb21lIGRlYnVnIHNldHRpbmdzIHdoaWNoIG1ha2VzIGNhbGxpbmcgYmluZGVycyB3aXRoIGludmFsaWQKLSAgICAgICAgICAgICAgICAgICAgLy8gc3VyZmFjZXMgY3Jhc2gsIHNvIHJlcGxhY2UgaXQgd2l0aCBhICJyZWFsIiBvbmUuCi0gICAgICAgICAgICAgICAgICAgIGluZm8uc2V0Um9vdExlYXNoKG5ldyBTdXJmYWNlQ29udHJvbC5CdWlsZGVyKCkuc2V0TmFtZSgiSW52YWxpZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRhaW5lckxheWVyKCkuYnVpbGQoKSwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIFNsZWVwIHN0YXJ0cyBhIHByb2Nlc3Mgb2YgZm9yY2luZyBhbGwgcHJpb3IgdHJhbnNpdGlvbnMgdG8gZmluaXNoIGltbWVkaWF0ZWx5CiAgICAgICAgICAgICAgICAgZmluaXNoRm9yU2xlZXAobnVsbCAvKiBmb3JjZUZpbmlzaCAqLyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtNTQ2LDEwICs1NDMsMTAgQEAKIAogICAgICAgICAvLyBBbGxvdyB0byBub3RpZnkga2V5Z3VhcmQgdW4tb2NjbHVkaW5nIHN0YXRlIHRvIEtleWd1YXJkU2VydmljZSwgd2hpY2ggY2FuIGhhcHBlbiB3aGlsZQogICAgICAgICAvLyBzY3JlZW4tb2ZmLCBzbyB0aGVyZSBtaWdodCBubyB2aXNpYmlsaXR5IGNoYW5nZSBpbnZvbHZlZC4KLSAgICAgICAgaWYgKCFpbmZvLmdldFJvb3RMZWFzaCgpLmlzVmFsaWQoKSAmJiBpbmZvLmdldFR5cGUoKSAhPSBUUkFOU0lUX0tFWUdVQVJEX1VOT0NDTFVERSkgewotICAgICAgICAgICAgLy8gSW52YWxpZCByb290LWxlYXNoIGltcGxpZXMgdGhhdCB0aGUgdHJhbnNpdGlvbiBpcyBlbXB0eS9uby1vcCwgc28ganVzdCBkbworICAgICAgICBpZiAoaW5mby5nZXRSb290Q291bnQoKSA9PSAwICYmIGluZm8uZ2V0VHlwZSgpICE9IFRSQU5TSVRfS0VZR1VBUkRfVU5PQ0NMVURFKSB7CisgICAgICAgICAgICAvLyBObyByb290LWxlYXNoZXMgaW1wbGllcyB0aGF0IHRoZSB0cmFuc2l0aW9uIGlzIGVtcHR5L25vLW9wLCBzbyBqdXN0IGRvCiAgICAgICAgICAgICAvLyBob3VzZWtlZXBpbmcgYW5kIHJldHVybi4KLSAgICAgICAgICAgIFByb3RvTG9nLnYoU2hlbGxQcm90b0xvZ0dyb3VwLldNX1NIRUxMX1RSQU5TSVRJT05TLCAiSW52YWxpZCByb290IGxlYXNoICglcyk6ICVzIiwKKyAgICAgICAgICAgIFByb3RvTG9nLnYoU2hlbGxQcm90b0xvZ0dyb3VwLldNX1NIRUxMX1RSQU5TSVRJT05TLCAiTm8gdHJhbnNpdGlvbiByb290cyAoJXMpOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Ub2tlbiwgaW5mbyk7CiAgICAgICAgICAgICBvbkFib3J0KGFjdGl2ZSk7CiAgICAgICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3V0aWwvVHJhbnNpdGlvblV0aWwuamF2YSBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvdXRpbC9UcmFuc2l0aW9uVXRpbC5qYXZhCmluZGV4IDhjNmUxZTcuLjc1OTVjOTYgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvdXRpbC9UcmFuc2l0aW9uVXRpbC5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvdXRpbC9UcmFuc2l0aW9uVXRpbC5qYXZhCkBAIC0xMzksMTEgKzEzOSwxMiBAQAogICAgICAgICAvLyBjaGFuZ2VzIHNob3VsZCBiZSBvcmRlcmVkIHRvcC10by1ib3R0b20gaW4gegogICAgICAgICBmaW5hbCBpbnQgbW9kZSA9IGNoYW5nZS5nZXRNb2RlKCk7CiAKLSAgICAgICAgdC5yZXBhcmVudChsZWFzaCwgaW5mby5nZXRSb290TGVhc2goKSk7CisgICAgICAgIGZpbmFsIGludCByb290SWR4ID0gVHJhbnNpdGlvblV0aWwucm9vdEluZGV4Rm9yKGNoYW5nZSwgaW5mbyk7CisgICAgICAgIHQucmVwYXJlbnQobGVhc2gsIGluZm8uZ2V0Um9vdChyb290SWR4KS5nZXRMZWFzaCgpKTsKICAgICAgICAgZmluYWwgUmVjdCBhYnNCb3VuZHMgPQogICAgICAgICAgICAgICAgIChtb2RlID09IFRSQU5TSVRfT1BFTikgPyBjaGFuZ2UuZ2V0RW5kQWJzQm91bmRzKCkgOiBjaGFuZ2UuZ2V0U3RhcnRBYnNCb3VuZHMoKTsKLSAgICAgICAgdC5zZXRQb3NpdGlvbihsZWFzaCwgYWJzQm91bmRzLmxlZnQgLSBpbmZvLmdldFJvb3RPZmZzZXQoKS54LAotICAgICAgICAgICAgICAgIGFic0JvdW5kcy50b3AgLSBpbmZvLmdldFJvb3RPZmZzZXQoKS55KTsKKyAgICAgICAgdC5zZXRQb3NpdGlvbihsZWFzaCwgYWJzQm91bmRzLmxlZnQgLSBpbmZvLmdldFJvb3Qocm9vdElkeCkuZ2V0T2Zmc2V0KCkueCwKKyAgICAgICAgICAgICAgICBhYnNCb3VuZHMudG9wIC0gaW5mby5nZXRSb290KHJvb3RJZHgpLmdldE9mZnNldCgpLnkpOwogCiAgICAgICAgIC8vIFB1dCBhbGwgdGhlIE9QRU4vU0hPVyBvbiB0b3AKICAgICAgICAgaWYgKFRyYW5zaXRpb25VdGlsLmlzT3BlbmluZ1R5cGUobW9kZSkpIHsKQEAgLTE3OSwxMiArMTgwLDEzIEBACiAgICAgICAgICAgICAvLyBtYWtpbmcgbGVhc2hlcyBtZWFucyB3ZSBoYXZlIHRvIGhhbmRsZSB0aGVtIHNwZWNpYWxseS4KICAgICAgICAgICAgIHJldHVybiBjaGFuZ2UuZ2V0TGVhc2goKTsKICAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgcm9vdElkeCA9IFRyYW5zaXRpb25VdGlsLnJvb3RJbmRleEZvcihjaGFuZ2UsIGluZm8pOwogICAgICAgICBTdXJmYWNlQ29udHJvbCBsZWFzaFN1cmZhY2UgPSBuZXcgU3VyZmFjZUNvbnRyb2wuQnVpbGRlcigpCiAgICAgICAgICAgICAgICAgLnNldE5hbWUoY2hhbmdlLmdldExlYXNoKCkudG9TdHJpbmcoKSArICJfdHJhbnNpdGlvbi1sZWFzaCIpCiAgICAgICAgICAgICAgICAgLnNldENvbnRhaW5lckxheWVyKCkKICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIHRoZSBzdXJmYWNlIHZpc2libGUgdG8gcmVzcGVjdCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgb3JpZ2luYWwgc3VyZmFjZS4KICAgICAgICAgICAgICAgICAuc2V0SGlkZGVuKGZhbHNlKQotICAgICAgICAgICAgICAgIC5zZXRQYXJlbnQoaW5mby5nZXRSb290TGVhc2goKSkKKyAgICAgICAgICAgICAgICAuc2V0UGFyZW50KGluZm8uZ2V0Um9vdChyb290SWR4KS5nZXRMZWFzaCgpKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICAvLyBDb3BpZWQgVHJhbnNpdGlvbnMgc2V0dXAgY29kZSAod2hpY2ggZXhwZWN0cyBib3R0b20tdG8tdG9wIG9yZGVyLCBzbyB3ZSBzd2FwIGhlcmUpCiAgICAgICAgIHNldHVwTGVhc2gobGVhc2hTdXJmYWNlLCBjaGFuZ2UsIGluZm8uZ2V0Q2hhbmdlcygpLnNpemUoKSAtIG9yZGVyLCBpbmZvLCB0KTsKQEAgLTI2MSw0ICsyNjMsMTggQEAKICAgICAgICAgdGFyZ2V0LnNldFJvdGF0aW9uQ2hhbmdlKGNoYW5nZS5nZXRFbmRSb3RhdGlvbigpIC0gY2hhbmdlLmdldFN0YXJ0Um90YXRpb24oKSk7CiAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgdGhlICJjb3JyZWN0IiByb290IGlkeCBmb3IgYSBjaGFuZ2UuIFRoZSBjaGFuZ2UncyBlbmQgZGlzcGxheSBpcyBwcmlvcml0aXplZCwgdGhlbgorICAgICAqIHRoZSBzdGFydCBkaXNwbGF5LiBJZiB0aGVyZSBpcyBubyBkaXNwbGF5LCBpdCB3aWxsIGZhbGxiYWNrIG9uIHRoZSAwdGggcm9vdCBpbiB0aGUKKyAgICAgKiB0cmFuc2l0aW9uLiBUaGVyZSBNVVNUIGJlIGF0LWxlYXN0IDEgcm9vdCBpbiB0aGUgdHJhbnNpdGlvbiAoaWUuIGl0J3Mgbm90IGEgbm8tb3ApLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHJvb3RJbmRleEZvcihATm9uTnVsbCBUcmFuc2l0aW9uSW5mby5DaGFuZ2UgY2hhbmdlLAorICAgICAgICAgICAgQE5vbk51bGwgVHJhbnNpdGlvbkluZm8gaW5mbykgeworICAgICAgICBpbnQgcm9vdElkeCA9IGluZm8uZmluZFJvb3RJbmRleChjaGFuZ2UuZ2V0RW5kRGlzcGxheUlkKCkpOworICAgICAgICBpZiAocm9vdElkeCA+PSAwKSByZXR1cm4gcm9vdElkeDsKKyAgICAgICAgcm9vdElkeCA9IGluZm8uZmluZFJvb3RJbmRleChjaGFuZ2UuZ2V0U3RhcnREaXNwbGF5SWQoKSk7CisgICAgICAgIGlmIChyb290SWR4ID49IDApIHJldHVybiByb290SWR4OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL0Rlc2t0b3BNb2RlV2luZG93RGVjb3JhdGlvbi5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC93aW5kb3dkZWNvci9EZXNrdG9wTW9kZVdpbmRvd0RlY29yYXRpb24uamF2YQppbmRleCA3MmRhMTA4Li4zYzBlZjk2IDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL0Rlc2t0b3BNb2RlV2luZG93RGVjb3JhdGlvbi5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvd2luZG93ZGVjb3IvRGVza3RvcE1vZGVXaW5kb3dEZWNvcmF0aW9uLmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CkBAIC00Niw2ICs0Nyw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLkRpc3BsYXlDb250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLndtLnNoZWxsLmNvbW1vbi5TeW5jVHJhbnNhY3Rpb25RdWV1ZTsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5kZXNrdG9wbW9kZS5EZXNrdG9wTW9kZVN0YXR1czsKK2ltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5kZXNrdG9wbW9kZS5EZXNrdG9wVGFza3NDb250cm9sbGVyOwogCiAvKioKICAqIERlZmluZXMgdmlzdWFscyBhbmQgYmVoYXZpb3JzIG9mIGEgd2luZG93IGRlY29yYXRpb24gb2YgYSBjYXB0aW9uIGJhciBhbmQgc2hhZG93cy4gSXQgd29ya3Mgd2l0aApAQCAtOTUsNiArOTcsMTcgQEAKICAgICAgICAgbURlc2t0b3BBY3RpdmUgPSBEZXNrdG9wTW9kZVN0YXR1cy5pc0FjdGl2ZShtQ29udGV4dCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbldpdGhPdmVycmlkZXMoCisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ1Rhc2tJbmZvIHRhc2tJbmZvKSB7CisgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHRhc2tJbmZvLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKERlc2t0b3BUYXNrc0NvbnRyb2xsZXIuaXNEZXNrdG9wRGVuc2l0eU92ZXJyaWRlU2V0KCkpIHsKKyAgICAgICAgICAgIC8vIERlbnNpdHkgaXMgb3ZlcnJpZGRlbiBmb3IgZGVza3RvcCB0YXNrcy4gS2VlcCBzeXN0ZW0gZGVuc2l0eSBmb3Igd2luZG93IGRlY29yYXRpb24uCisgICAgICAgICAgICBjb25maWd1cmF0aW9uLmRlbnNpdHlEcGkgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkuZGVuc2l0eURwaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKKyAgICB9CisKICAgICB2b2lkIHNldENhcHRpb25MaXN0ZW5lcnMoCiAgICAgICAgICAgICBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBvbkNhcHRpb25CdXR0b25DbGlja0xpc3RlbmVyLAogICAgICAgICAgICAgVmlldy5PblRvdWNoTGlzdGVuZXIgb25DYXB0aW9uVG91Y2hMaXN0ZW5lcikgewpkaWZmIC0tZ2l0IGEvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC93aW5kb3dkZWNvci9EcmFnUmVzaXplSW5wdXRMaXN0ZW5lci5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC93aW5kb3dkZWNvci9EcmFnUmVzaXplSW5wdXRMaXN0ZW5lci5qYXZhCmluZGV4IDBhOWMzMzEuLjhjYjU3NWMgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvd2luZG93ZGVjb3IvRHJhZ1Jlc2l6ZUlucHV0TGlzdGVuZXIuamF2YQorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL0RyYWdSZXNpemVJbnB1dExpc3RlbmVyLmphdmEKQEAgLTEwMyw2ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGhvc3RJbnB1dFRva2VuICovLAogICAgICAgICAgICAgICAgICAgICBGTEFHX05PVF9GT0NVU0FCTEUsCiAgICAgICAgICAgICAgICAgICAgIFBSSVZBVEVfRkxBR19UUlVTVEVEX09WRVJMQVksCisgICAgICAgICAgICAgICAgICAgIDAgLyogaW5wdXRGZWF0dXJlcyAqLywKICAgICAgICAgICAgICAgICAgICAgVFlQRV9BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiB3aW5kb3dUb2tlbiAqLywKICAgICAgICAgICAgICAgICAgICAgbUZvY3VzR3JhbnRUb2tlbiwKQEAgLTIwOCw2ICsyMDksNyBAQAogICAgICAgICAgICAgICAgICAgICBtRGVjb3JhdGlvblN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgIEZMQUdfTk9UX0ZPQ1VTQUJMRSwKICAgICAgICAgICAgICAgICAgICAgUFJJVkFURV9GTEFHX1RSVVNURURfT1ZFUkxBWSwKKyAgICAgICAgICAgICAgICAgICAgMCAvKiBpbnB1dEZlYXR1cmVzICovLAogICAgICAgICAgICAgICAgICAgICB0b3VjaFJlZ2lvbik7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBlLnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL09XTkVSUyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvd2luZG93ZGVjb3IvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTcyMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL09XTkVSUwpAQCAtMCwwICsxIEBACitqb3JnZWdpbEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3dpbmRvd2RlY29yL1dpbmRvd0RlY29yYXRpb24uamF2YSBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvd2luZG93ZGVjb3IvV2luZG93RGVjb3JhdGlvbi5qYXZhCmluZGV4IDdhN2FjNDcuLmRkZDNiNDQgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvd2luZG93ZGVjb3IvV2luZG93RGVjb3JhdGlvbi5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvd2luZG93ZGVjb3IvV2luZG93RGVjb3JhdGlvbi5qYXZhCkBAIC0xMzEsNyArMTMxLDE3IEBACiAgICAgICAgIG1TdXJmYWNlQ29udHJvbFZpZXdIb3N0RmFjdG9yeSA9IHN1cmZhY2VDb250cm9sVmlld0hvc3RGYWN0b3J5OwogCiAgICAgICAgIG1EaXNwbGF5ID0gbURpc3BsYXlDb250cm9sbGVyLmdldERpc3BsYXkobVRhc2tJbmZvLmRpc3BsYXlJZCk7Ci0gICAgICAgIG1EZWNvcldpbmRvd0NvbnRleHQgPSBtQ29udGV4dC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dChtVGFza0luZm8uZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgbURlY29yV2luZG93Q29udGV4dCA9IG1Db250ZXh0LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0KAorICAgICAgICAgICAgICAgIGdldENvbmZpZ3VyYXRpb25XaXRoT3ZlcnJpZGVzKG1UYXNrSW5mbykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB7QGxpbmsgQ29uZmlndXJhdGlvbn0gZnJvbSBzdXBwbGllZCB7QGxpbmsgUnVubmluZ1Rhc2tJbmZvfS4KKyAgICAgKgorICAgICAqIEFsbG93cyB2YWx1ZXMgdG8gYmUgb3ZlcnJpZGRlbiBiZWZvcmUgcmV0dXJuaW5nIHRoZSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb25XaXRoT3ZlcnJpZGVzKFJ1bm5pbmdUYXNrSW5mbyB0YXNrSW5mbykgeworICAgICAgICByZXR1cm4gdGFza0luZm8uZ2V0Q29uZmlndXJhdGlvbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY1LDcgKzE3NSw3IEBACiAKICAgICAgICAgb3V0UmVzdWx0Lm1Sb290VmlldyA9IHJvb3RWaWV3OwogICAgICAgICByb290VmlldyA9IG51bGw7IC8vIENsZWFyIGl0IGp1c3QgaW4gY2FzZSB3ZSB1c2UgaXQgYWNjaWRlbnRhbGx5Ci0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gdGFza0NvbmZpZyA9IG1UYXNrSW5mby5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gdGFza0NvbmZpZyA9IGdldENvbmZpZ3VyYXRpb25XaXRoT3ZlcnJpZGVzKG1UYXNrSW5mbyk7CiAgICAgICAgIGlmIChvbGRUYXNrQ29uZmlnLmRlbnNpdHlEcGkgIT0gdGFza0NvbmZpZy5kZW5zaXR5RHBpCiAgICAgICAgICAgICAgICAgfHwgbURpc3BsYXkgPT0gbnVsbAogICAgICAgICAgICAgICAgIHx8IG1EaXNwbGF5LmdldERpc3BsYXlJZCgpICE9IG1UYXNrSW5mby5kaXNwbGF5SWQpIHsKZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC90ZXN0cy91bml0dGVzdC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvVHJhbnNpdGlvbkluZm9CdWlsZGVyLmphdmEgYi9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvdGVzdHMvdW5pdHRlc3Qvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL1RyYW5zaXRpb25JbmZvQnVpbGRlci5qYXZhCmluZGV4IDM1YzM3NGQuLjI2Yjc4N2YgMTAwNjQ0Ci0tLSBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC90ZXN0cy91bml0dGVzdC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvVHJhbnNpdGlvbkluZm9CdWlsZGVyLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3Rlc3RzL3VuaXR0ZXN0L3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9UcmFuc2l0aW9uSW5mb0J1aWxkZXIuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkluZm9CdWlsZGVyIHsKICAgICBmaW5hbCBUcmFuc2l0aW9uSW5mbyBtSW5mbzsKKyAgICBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfSUQgPSAwOwogCiAgICAgcHVibGljIFRyYW5zaXRpb25JbmZvQnVpbGRlcihAV2luZG93TWFuYWdlci5UcmFuc2l0aW9uVHlwZSBpbnQgdHlwZSkgewogICAgICAgICB0aGlzKHR5cGUsIDAgLyogZmxhZ3MgKi8pOwpAQCAtMzgsNyArMzksNyBAQAogICAgIHB1YmxpYyBUcmFuc2l0aW9uSW5mb0J1aWxkZXIoQFdpbmRvd01hbmFnZXIuVHJhbnNpdGlvblR5cGUgaW50IHR5cGUsCiAgICAgICAgICAgICBAV2luZG93TWFuYWdlci5UcmFuc2l0aW9uRmxhZ3MgaW50IGZsYWdzKSB7CiAgICAgICAgIG1JbmZvID0gbmV3IFRyYW5zaXRpb25JbmZvKHR5cGUsIGZsYWdzKTsKLSAgICAgICAgbUluZm8uc2V0Um9vdExlYXNoKGNyZWF0ZU1vY2tTdXJmYWNlKHRydWUgLyogdmFsaWQgKi8pLCAwLCAwKTsKKyAgICAgICAgbUluZm8uYWRkUm9vdExlYXNoKERJU1BMQVlfSUQsIGNyZWF0ZU1vY2tTdXJmYWNlKHRydWUgLyogdmFsaWQgKi8pLCAwLCAwKTsKICAgICB9CiAKICAgICBwdWJsaWMgVHJhbnNpdGlvbkluZm9CdWlsZGVyIGFkZENoYW5nZShAV2luZG93TWFuYWdlci5UcmFuc2l0aW9uVHlwZSBpbnQgbW9kZSwKQEAgLTYxLDYgKzYyLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgVHJhbnNpdGlvbkluZm9CdWlsZGVyIGFkZENoYW5nZShUcmFuc2l0aW9uSW5mby5DaGFuZ2UgY2hhbmdlKSB7CisgICAgICAgIGNoYW5nZS5zZXREaXNwbGF5SWQoRElTUExBWV9JRCwgRElTUExBWV9JRCk7CiAgICAgICAgIG1JbmZvLmFkZENoYW5nZShjaGFuZ2UpOwogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CmRpZmYgLS1naXQgYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvdGVzdHMvdW5pdHRlc3Qvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9waG9uZS9QaXBDb250cm9sbGVyVGVzdC5qYXZhIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3Rlc3RzL3VuaXR0ZXN0L3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9waXAvcGhvbmUvUGlwQ29udHJvbGxlclRlc3QuamF2YQppbmRleCAwZTE0YzY5Li4xMDhlMjczIDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvdGVzdHMvdW5pdHRlc3Qvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3BpcC9waG9uZS9QaXBDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC90ZXN0cy91bml0dGVzdC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvcGlwL3Bob25lL1BpcENvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTUzLDYgKzUzLDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5jb21tb24uRGlzcGxheUluc2V0c0NvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLkRpc3BsYXlMYXlvdXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlNoZWxsRXhlY3V0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhYmxldG9wTW9kZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQud20uc2hlbGwuY29tbW9uLlRhc2tTdGFja0xpc3RlbmVySW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5vbmVoYW5kZWQuT25lSGFuZGVkQ29udHJvbGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC53bS5zaGVsbC5waXAuUGlwQW5pbWF0aW9uQ29udHJvbGxlcjsKQEAgLTExNSw2ICsxMTYsNyBAQAogICAgIEBNb2NrIHByaXZhdGUgT3B0aW9uYWw8T25lSGFuZGVkQ29udHJvbGxlcj4gbU1vY2tPbmVIYW5kZWRDb250cm9sbGVyOwogICAgIEBNb2NrIHByaXZhdGUgUGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlciBtTW9ja1BpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXI7CiAgICAgQE1vY2sgcHJpdmF0ZSBEaXNwbGF5SW5zZXRzQ29udHJvbGxlciBtTW9ja0Rpc3BsYXlJbnNldHNDb250cm9sbGVyOworICAgIEBNb2NrIHByaXZhdGUgVGFibGV0b3BNb2RlQ29udHJvbGxlciBtTW9ja1RhYmxldG9wTW9kZUNvbnRyb2xsZXI7CiAKICAgICBATW9jayBwcml2YXRlIERpc3BsYXlMYXlvdXQgbU1vY2tEaXNwbGF5TGF5b3V0MTsKICAgICBATW9jayBwcml2YXRlIERpc3BsYXlMYXlvdXQgbU1vY2tEaXNwbGF5TGF5b3V0MjsKQEAgLTEzNyw3ICsxMzksOCBAQAogICAgICAgICAgICAgICAgIG1Nb2NrUGlwVGFza09yZ2FuaXplciwgbU1vY2tQaXBUcmFuc2l0aW9uU3RhdGUsIG1Nb2NrUGlwVG91Y2hIYW5kbGVyLAogICAgICAgICAgICAgICAgIG1Nb2NrUGlwVHJhbnNpdGlvbkNvbnRyb2xsZXIsIG1Nb2NrV2luZG93TWFuYWdlclNoZWxsV3JhcHBlciwKICAgICAgICAgICAgICAgICBtTW9ja1Rhc2tTdGFja0xpc3RlbmVyLCBtTW9ja1BpcFBhcmFtc0NoYW5nZWRGb3J3YXJkZXIsCi0gICAgICAgICAgICAgICAgbU1vY2tEaXNwbGF5SW5zZXRzQ29udHJvbGxlciwgbU1vY2tPbmVIYW5kZWRDb250cm9sbGVyLCBtTW9ja0V4ZWN1dG9yKTsKKyAgICAgICAgICAgICAgICBtTW9ja0Rpc3BsYXlJbnNldHNDb250cm9sbGVyLCBtTW9ja1RhYmxldG9wTW9kZUNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgbU1vY2tPbmVIYW5kZWRDb250cm9sbGVyLCBtTW9ja0V4ZWN1dG9yKTsKICAgICAgICAgbVNoZWxsSW5pdC5pbml0KCk7CiAgICAgICAgIHdoZW4obU1vY2tQaXBCb3VuZHNBbGdvcml0aG0uZ2V0U25hcEFsZ29yaXRobSgpKS50aGVuUmV0dXJuKG1Nb2NrUGlwU25hcEFsZ29yaXRobSk7CiAgICAgICAgIHdoZW4obU1vY2tQaXBUb3VjaEhhbmRsZXIuZ2V0TW90aW9uSGVscGVyKCkpLnRoZW5SZXR1cm4obU1vY2tQaXBNb3Rpb25IZWxwZXIpOwpAQCAtMjI4LDcgKzIzMSw4IEBACiAgICAgICAgICAgICAgICAgbU1vY2tQaXBUYXNrT3JnYW5pemVyLCBtTW9ja1BpcFRyYW5zaXRpb25TdGF0ZSwgbU1vY2tQaXBUb3VjaEhhbmRsZXIsCiAgICAgICAgICAgICAgICAgbU1vY2tQaXBUcmFuc2l0aW9uQ29udHJvbGxlciwgbU1vY2tXaW5kb3dNYW5hZ2VyU2hlbGxXcmFwcGVyLAogICAgICAgICAgICAgICAgIG1Nb2NrVGFza1N0YWNrTGlzdGVuZXIsIG1Nb2NrUGlwUGFyYW1zQ2hhbmdlZEZvcndhcmRlciwKLSAgICAgICAgICAgICAgICBtTW9ja0Rpc3BsYXlJbnNldHNDb250cm9sbGVyLCBtTW9ja09uZUhhbmRlZENvbnRyb2xsZXIsIG1Nb2NrRXhlY3V0b3IpKTsKKyAgICAgICAgICAgICAgICBtTW9ja0Rpc3BsYXlJbnNldHNDb250cm9sbGVyLCBtTW9ja1RhYmxldG9wTW9kZUNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgbU1vY2tPbmVIYW5kZWRDb250cm9sbGVyLCBtTW9ja0V4ZWN1dG9yKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC90ZXN0cy91bml0dGVzdC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvc3BsaXRzY3JlZW4vU3BsaXRUcmFuc2l0aW9uVGVzdHMuamF2YSBiL2xpYnMvV2luZG93TWFuYWdlci9TaGVsbC90ZXN0cy91bml0dGVzdC9zcmMvY29tL2FuZHJvaWQvd20vc2hlbGwvc3BsaXRzY3JlZW4vU3BsaXRUcmFuc2l0aW9uVGVzdHMuamF2YQppbmRleCAzOTAxZGFiLi5kZjc4ZDkyIDEwMDY0NAotLS0gYS9saWJzL1dpbmRvd01hbmFnZXIvU2hlbGwvdGVzdHMvdW5pdHRlc3Qvc3JjL2NvbS9hbmRyb2lkL3dtL3NoZWxsL3NwbGl0c2NyZWVuL1NwbGl0VHJhbnNpdGlvblRlc3RzLmphdmEKKysrIGIvbGlicy9XaW5kb3dNYW5hZ2VyL1NoZWxsL3Rlc3RzL3VuaXR0ZXN0L3NyYy9jb20vYW5kcm9pZC93bS9zaGVsbC9zcGxpdHNjcmVlbi9TcGxpdFRyYW5zaXRpb25UZXN0cy5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55SW50OwpAQCAtMjQ5LDcgKzI1MCw3IEBACiAKICAgICBAVGVzdAogICAgIEBVaVRocmVhZFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJSZWNlbnRzKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclJlY2VudHNBbmRDb21taXQoKSB7CiAgICAgICAgIGVudGVyU3BsaXQoKTsKIAogICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ1Rhc2tJbmZvIGhvbWVUYXNrID0gbmV3IFRlc3RSdW5uaW5nVGFza0luZm9CdWlsZGVyKCkKQEAgLTI1OCwyNyArMjU5LDY1IEBACiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAKICAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCB0byBicmluZyBob21lIGZvcndhcmQKLSAgICAgICAgVHJhbnNpdGlvblJlcXVlc3RJbmZvIHJlcXVlc3QgPSBuZXcgVHJhbnNpdGlvblJlcXVlc3RJbmZvKFRSQU5TSVRfVE9fRlJPTlQsIGhvbWVUYXNrLCBudWxsKTsKKyAgICAgICAgVHJhbnNpdGlvblJlcXVlc3RJbmZvIHJlcXVlc3QgPSBuZXcgVHJhbnNpdGlvblJlcXVlc3RJbmZvKFRSQU5TSVRfVE9fRlJPTlQsIGhvbWVUYXNrLAorICAgICAgICAgICAgICAgIG1vY2soUmVtb3RlVHJhbnNpdGlvbi5jbGFzcykpOwogICAgICAgICBJQmluZGVyIHRyYW5zaXRpb24gPSBtb2NrKElCaW5kZXIuY2xhc3MpOwogICAgICAgICBXaW5kb3dDb250YWluZXJUcmFuc2FjdGlvbiByZXN1bHQgPSBtU3RhZ2VDb29yZGluYXRvci5oYW5kbGVSZXF1ZXN0KHRyYW5zaXRpb24sIHJlcXVlc3QpOwotCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmlzRW1wdHkoKSk7CisgICAgICAgIC8vIERvbid0IGhhbmRsZSByZWNlbnRzIG9wZW5pbmcKKyAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHQpOwogCiAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IG1hZGUgYW55IGxvY2FsIGNoYW5nZXMgeWV0IChuZWVkIHRvIHdhaXQgdW50aWwgdHJhbnNpdGlvbiBpcyByZWFkeSkKICAgICAgICAgYXNzZXJ0VHJ1ZShtU3RhZ2VDb29yZGluYXRvci5pc1NwbGl0U2NyZWVuVmlzaWJsZSgpKTsKIAotICAgICAgICAvLyBzaW11bGF0ZSB0aGUgdHJhbnNpdGlvbgotICAgICAgICBUcmFuc2l0aW9uSW5mbyBpbmZvID0gbmV3IFRyYW5zaXRpb25JbmZvQnVpbGRlcihUUkFOU0lUX1RPX0ZST05ULCAwKQotICAgICAgICAgICAgICAgIC5hZGRDaGFuZ2UoVFJBTlNJVF9UT19GUk9OVCwgaG9tZVRhc2spCi0gICAgICAgICAgICAgICAgLmFkZENoYW5nZShUUkFOU0lUX1RPX0JBQ0ssIG1NYWluQ2hpbGQpCi0gICAgICAgICAgICAgICAgLmFkZENoYW5nZShUUkFOU0lUX1RPX0JBQ0ssIG1TaWRlQ2hpbGQpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIC8vIHNpbXVsYXRlIHRoZSBzdGFydCBvZiByZWNlbnRzIHRyYW5zaXRpb24KICAgICAgICAgbU1haW5TdGFnZS5vblRhc2tWYW5pc2hlZChtTWFpbkNoaWxkKTsKICAgICAgICAgbVNpZGVTdGFnZS5vblRhc2tWYW5pc2hlZChtU2lkZUNoaWxkKTsKLSAgICAgICAgbVN0YWdlQ29vcmRpbmF0b3Iuc3RhcnRBbmltYXRpb24odHJhbnNpdGlvbiwgaW5mbywKLSAgICAgICAgICAgICAgICBtb2NrKFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uLmNsYXNzKSwKLSAgICAgICAgICAgICAgICBtb2NrKFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uLmNsYXNzKSwKLSAgICAgICAgICAgICAgICBtb2NrKFRyYW5zaXRpb25zLlRyYW5zaXRpb25GaW5pc2hDYWxsYmFjay5jbGFzcykpOworICAgICAgICBtU3RhZ2VDb29yZGluYXRvci5vblJlY2VudHNJblNwbGl0QW5pbWF0aW9uU3RhcnQobW9jayhTdXJmYWNlQ29udHJvbC5UcmFuc2FjdGlvbi5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKG1TdGFnZUNvb3JkaW5hdG9yLmlzU3BsaXRTY3JlZW5WaXNpYmxlKCkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCBjbGVhbnMtdXAgaWYgcmVjZW50cyBkb2Vzbid0IHJlc3RvcmUKKyAgICAgICAgV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24gY29tbWl0V0NUID0gbmV3IFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1TdGFnZUNvb3JkaW5hdG9yLm9uUmVjZW50c0luU3BsaXRBbmltYXRpb25GaW5pc2goY29tbWl0V0NULAorICAgICAgICAgICAgICAgIG1vY2soU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVN0YWdlQ29vcmRpbmF0b3IuaXNTcGxpdFNjcmVlblZpc2libGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAVWlUaHJlYWRUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGVyUmVjZW50c0FuZFJlc3RvcmUoKSB7CisgICAgICAgIGVudGVyU3BsaXQoKTsKKworICAgICAgICBBY3Rpdml0eU1hbmFnZXIuUnVubmluZ1Rhc2tJbmZvIGhvbWVUYXNrID0gbmV3IFRlc3RSdW5uaW5nVGFza0luZm9CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0V2luZG93aW5nTW9kZShXSU5ET1dJTkdfTU9ERV9GVUxMU0NSRUVOKQorICAgICAgICAgICAgICAgIC5zZXRBY3Rpdml0eVR5cGUoQUNUSVZJVFlfVFlQRV9IT01FKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlcXVlc3QgdG8gYnJpbmcgaG9tZSBmb3J3YXJkCisgICAgICAgIFRyYW5zaXRpb25SZXF1ZXN0SW5mbyByZXF1ZXN0ID0gbmV3IFRyYW5zaXRpb25SZXF1ZXN0SW5mbyhUUkFOU0lUX1RPX0ZST05ULCBob21lVGFzaywKKyAgICAgICAgICAgICAgICBtb2NrKFJlbW90ZVRyYW5zaXRpb24uY2xhc3MpKTsKKyAgICAgICAgSUJpbmRlciB0cmFuc2l0aW9uID0gbW9jayhJQmluZGVyLmNsYXNzKTsKKyAgICAgICAgV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24gcmVzdWx0ID0gbVN0YWdlQ29vcmRpbmF0b3IuaGFuZGxlUmVxdWVzdCh0cmFuc2l0aW9uLCByZXF1ZXN0KTsKKyAgICAgICAgLy8gRG9uJ3QgaGFuZGxlIHJlY2VudHMgb3BlbmluZworICAgICAgICBhc3NlcnROdWxsKHJlc3VsdCk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgbWFkZSBhbnkgbG9jYWwgY2hhbmdlcyB5ZXQgKG5lZWQgdG8gd2FpdCB1bnRpbCB0cmFuc2l0aW9uIGlzIHJlYWR5KQorICAgICAgICBhc3NlcnRUcnVlKG1TdGFnZUNvb3JkaW5hdG9yLmlzU3BsaXRTY3JlZW5WaXNpYmxlKCkpOworCisgICAgICAgIC8vIHNpbXVsYXRlIHRoZSBzdGFydCBvZiByZWNlbnRzIHRyYW5zaXRpb24KKyAgICAgICAgbU1haW5TdGFnZS5vblRhc2tWYW5pc2hlZChtTWFpbkNoaWxkKTsKKyAgICAgICAgbVNpZGVTdGFnZS5vblRhc2tWYW5pc2hlZChtU2lkZUNoaWxkKTsKKyAgICAgICAgbVN0YWdlQ29vcmRpbmF0b3Iub25SZWNlbnRzSW5TcGxpdEFuaW1hdGlvblN0YXJ0KG1vY2soU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtU3RhZ2VDb29yZGluYXRvci5pc1NwbGl0U2NyZWVuVmlzaWJsZSgpKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgcmVtYWluIGluIHNwbGl0IGFmdGVyIHJlY2VudHMgcmVzdG9yZXMuCisgICAgICAgIFdpbmRvd0NvbnRhaW5lclRyYW5zYWN0aW9uIHJlc3RvcmVXQ1QgPSBuZXcgV2luZG93Q29udGFpbmVyVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgcmVzdG9yZVdDVC5yZW9yZGVyKG1NYWluQ2hpbGQudG9rZW4sIHRydWUgLyogdG9Ub3AgKi8pOworICAgICAgICByZXN0b3JlV0NULnJlb3JkZXIobVNpZGVDaGlsZC50b2tlbiwgdHJ1ZSAvKiB0b1RvcCAqLyk7CisgICAgICAgIC8vIHNpbXVsYXRlIHRoZSByZXN0b3JlV0NUIGJlaW5nIGFwcGxpZWQ6CisgICAgICAgIG1NYWluU3RhZ2Uub25UYXNrQXBwZWFyZWQobU1haW5DaGlsZCwgbW9jayhTdXJmYWNlQ29udHJvbC5jbGFzcykpOworICAgICAgICBtU2lkZVN0YWdlLm9uVGFza0FwcGVhcmVkKG1TaWRlQ2hpbGQsIG1vY2soU3VyZmFjZUNvbnRyb2wuY2xhc3MpKTsKKyAgICAgICAgbVN0YWdlQ29vcmRpbmF0b3Iub25SZWNlbnRzSW5TcGxpdEFuaW1hdGlvbkZpbmlzaChyZXN0b3JlV0NULAorICAgICAgICAgICAgICAgIG1vY2soU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24uY2xhc3MpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtU3RhZ2VDb29yZGluYXRvci5pc1NwbGl0U2NyZWVuVmlzaWJsZSgpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmNwcCBiL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmNwcAppbmRleCBiMDg5NmRhLi45ZGY2ODIyIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvUHJvcGVydGllcy5jcHAKKysrIGIvbGlicy9od3VpL1Byb3BlcnRpZXMuY3BwCkBAIC05MSw2ICs5MSw4IEBACiBib29sIFByb3BlcnRpZXM6OmlzTG93UmFtID0gZmFsc2U7CiBib29sIFByb3BlcnRpZXM6OmlzU3lzdGVtT3JQZXJzaXN0ZW50ID0gZmFsc2U7CiAKK2Zsb2F0IFByb3BlcnRpZXM6Om1heEhkckhlYWRyb29tT244Yml0ID0gNS5mOyAgLy8gVE9ETzogUmVmaW5lIHRoaXMgbnVtYmVyCisKIFN0cmV0Y2hFZmZlY3RCZWhhdmlvciBQcm9wZXJ0aWVzOjpzdHJldGNoRWZmZWN0QmVoYXZpb3IgPSBTdHJldGNoRWZmZWN0QmVoYXZpb3I6OlNoYWRlckhXVUk7CiAKIERyYXdpbmdFbmFibGVkIFByb3BlcnRpZXM6OmRyYXdpbmdFbmFibGVkID0gRHJhd2luZ0VuYWJsZWQ6Ok5vdEluaXRpYWxpemVkOwpAQCAtMTUwLDYgKzE1MiwxMSBAQAogCiAgICAgZW5hYmxlV2ViVmlld092ZXJsYXlzID0gYmFzZTo6R2V0Qm9vbFByb3BlcnR5KFBST1BFUlRZX1dFQlZJRVdfT1ZFUkxBWVNfRU5BQkxFRCwgdHJ1ZSk7CiAKKyAgICBhdXRvIGhkckhlYWRyb29tID0gKGZsb2F0KWF0b2YoYmFzZTo6R2V0UHJvcGVydHkoUFJPUEVSVFlfOEJJVF9IRFJfSEVBRFJPT00sICIiKS5jX3N0cigpKTsKKyAgICBpZiAoaGRySGVhZHJvb20gPj0gMS5mKSB7CisgICAgICAgIG1heEhkckhlYWRyb29tT244Yml0ID0gc3RkOjptaW4oaGRySGVhZHJvb20sIDEwMC5mKTsKKyAgICB9CisKICAgICAvLyBjYWxsIGlzRHJhd2luZ0VuYWJsZWQgdG8gZm9yY2UgbG9hZGluZyBvZiB0aGUgcHJvcGVydHkKICAgICBpc0RyYXdpbmdFbmFibGVkKCk7CiAKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmggYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCmluZGV4IGVkNzE3NWUuLjI0ZTIwNmIgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmgKKysrIGIvbGlicy9od3VpL1Byb3BlcnRpZXMuaApAQCAtMjE4LDYgKzIxOCw4IEBACiAKICNkZWZpbmUgUFJPUEVSVFlfTUVNT1JZX1BPTElDWSAiZGVidWcuaHd1aS5hcHBfbWVtb3J5X3BvbGljeSIKIAorI2RlZmluZSBQUk9QRVJUWV84QklUX0hEUl9IRUFEUk9PTSAiZGVidWcuaHd1aS44Yml0X2hkcl9oZWFkcm9vbSIKKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTWlzYwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMzIxLDYgKzMyMyw4IEBACiAgICAgc3RhdGljIGJvb2wgaXNMb3dSYW07CiAgICAgc3RhdGljIGJvb2wgaXNTeXN0ZW1PclBlcnNpc3RlbnQ7CiAKKyAgICBzdGF0aWMgZmxvYXQgbWF4SGRySGVhZHJvb21PbjhiaXQ7CisKICAgICBzdGF0aWMgU3RyZXRjaEVmZmVjdEJlaGF2aW9yIGdldFN0cmV0Y2hFZmZlY3RCZWhhdmlvcigpIHsKICAgICAgICAgcmV0dXJuIHN0cmV0Y2hFZmZlY3RCZWhhdmlvcjsKICAgICB9CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvZWZmZWN0cy9HYWlubWFwUmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL2VmZmVjdHMvR2Fpbm1hcFJlbmRlcmVyLmNwcAppbmRleCA4OTc3ZDNjLi5iZmU0ZWFmIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvZWZmZWN0cy9HYWlubWFwUmVuZGVyZXIuY3BwCisrKyBiL2xpYnMvaHd1aS9lZmZlY3RzL0dhaW5tYXBSZW5kZXJlci5jcHAKQEAgLTIzLDIxICsyMyw1NSBAQAogI2luY2x1ZGUgInV0aWxzL1RyYWNlLmgiCiAKICNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgImluY2x1ZGUvY29yZS9Ta0NvbG9yU3BhY2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2NvcmUvU2tJbWFnZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvY29yZS9Ta1NoYWRlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvZWZmZWN0cy9Ta1J1bnRpbWVFZmZlY3QuaCIKKyNpbmNsdWRlICJpbmNsdWRlL3ByaXZhdGUvU2tHYWlubWFwSW5mby5oIgogI2luY2x1ZGUgInJlbmRlcnRocmVhZC9DYW52YXNDb250ZXh0LmgiCisjaW5jbHVkZSAic3JjL2NvcmUvU2tDb2xvckZpbHRlclByaXYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9Ta0ltYWdlSW5mb1ByaXYuaCIKKyNpbmNsdWRlICJzcmMvY29yZS9Ta1J1bnRpbWVFZmZlY3RQcml2LmgiCiAjZW5kaWYKIAogbmFtZXNwYWNlIGFuZHJvaWQ6OnVpcmVuZGVyZXIgewogCiB1c2luZyBuYW1lc3BhY2UgcmVuZGVydGhyZWFkOwogCitzdGF0aWMgZmxvYXQgZ2V0VGFyZ2V0SGRyU2RyUmF0aW8oY29uc3QgU2tDb2xvclNwYWNlKiBkZXN0Q29sb3JzcGFjZSkgeworICAgIC8vIFdlIHNob3VsZCBhbHdheXMgaGF2ZSBhIGtub3duIGRlc3RpbmF0aW9uIGNvbG9yc3BhY2UuIElmIHdlIGRvbid0IHdlIG11c3QgYmUgaW4gc29tZQorICAgIC8vIGxlZ2FjeSBtb2RlIHdoZXJlIHdlJ3JlIGxvc3QgYW5kIGFsc28gZGVmaW5pdGVseSBub3QgZ29pbmcgdG8gSERSCisgICAgaWYgKGRlc3RDb2xvcnNwYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDEuZjsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgZmxvYXQgR2VuZXJpY1NkcldoaXRlTml0cyA9IDIwMy5mOworICAgIGNvbnN0ZXhwciBmbG9hdCBtYXhQUUx1eCA9IDEwMDAwLmY7CisgICAgY29uc3RleHByIGZsb2F0IG1heEhMR0x1eCA9IDEwMDAuZjsKKyAgICBza2Ntc19UcmFuc2ZlckZ1bmN0aW9uIGRlc3RURjsKKyAgICBkZXN0Q29sb3JzcGFjZS0+dHJhbnNmZXJGbigmZGVzdFRGKTsKKyAgICBpZiAoc2tjbXNfVHJhbnNmZXJGdW5jdGlvbl9pc1BRaXNoKCZkZXN0VEYpKSB7CisgICAgICAgIHJldHVybiBtYXhQUUx1eCAvIEdlbmVyaWNTZHJXaGl0ZU5pdHM7CisgICAgfSBlbHNlIGlmIChza2Ntc19UcmFuc2ZlckZ1bmN0aW9uX2lzSExHaXNoKCZkZXN0VEYpKSB7CisgICAgICAgIHJldHVybiBtYXhITEdMdXggLyBHZW5lcmljU2RyV2hpdGVOaXRzOworICAgIH0gZWxzZSB7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgQ2FudmFzQ29udGV4dCogY29udGV4dCA9IENhbnZhc0NvbnRleHQ6OmdldEFjdGl2ZUNvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQgPyBjb250ZXh0LT50YXJnZXRTZHJIZHJSYXRpbygpIDogMS5mOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIDEuZjsKKyNlbmRpZgorICAgIH0KK30KKwogdm9pZCBEcmF3R2Fpbm1hcEJpdG1hcChTa0NhbnZhcyogYywgY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGltYWdlLCBjb25zdCBTa1JlY3QmIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tSZWN0JiBkc3QsIGNvbnN0IFNrU2FtcGxpbmdPcHRpb25zJiBzYW1wbGluZywgY29uc3QgU2tQYWludCogcGFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzOjpTcmNSZWN0Q29uc3RyYWludCBjb25zdHJhaW50LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgZ2Fpbm1hcEltYWdlLCBjb25zdCBTa0dhaW5tYXBJbmZvJiBnYWlubWFwSW5mbykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAjaWZkZWYgX19BTkRST0lEX18KLSAgICBDYW52YXNDb250ZXh0KiBjb250ZXh0ID0gQ2FudmFzQ29udGV4dDo6Z2V0QWN0aXZlQ29udGV4dCgpOwotICAgIGZsb2F0IHRhcmdldFNkckhkclJhdGlvID0gY29udGV4dCA/IGNvbnRleHQtPnRhcmdldFNkckhkclJhdGlvKCkgOiAxLmY7CisgICAgYXV0byBkZXN0Q29sb3JzcGFjZSA9IGMtPmltYWdlSW5mbygpLnJlZkNvbG9yU3BhY2UoKTsKKyAgICBmbG9hdCB0YXJnZXRTZHJIZHJSYXRpbyA9IGdldFRhcmdldEhkclNkclJhdGlvKGRlc3RDb2xvcnNwYWNlLmdldCgpKTsKICAgICBpZiAodGFyZ2V0U2RySGRyUmF0aW8gPiAxLmYgJiYgZ2Fpbm1hcEltYWdlKSB7CiAgICAgICAgIFNrUGFpbnQgZ2Fpbm1hcFBhaW50ID0gKnBhaW50OwogICAgICAgICBmbG9hdCBzWCA9IGdhaW5tYXBJbWFnZS0+d2lkdGgoKSAvIChmbG9hdClpbWFnZS0+d2lkdGgoKTsKQEAgLTQ4LDkgKzgyLDkgQEAKICAgICAgICAgZ2Fpbm1hcFNyYy5mUmlnaHQgKj0gc1g7CiAgICAgICAgIGdhaW5tYXBTcmMuZlRvcCAqPSBzWTsKICAgICAgICAgZ2Fpbm1hcFNyYy5mQm90dG9tICo9IHNZOwotICAgICAgICBhdXRvIHNoYWRlciA9IFNrR2Fpbm1hcFNoYWRlcjo6TWFrZShpbWFnZSwgc3JjLCBzYW1wbGluZywgZ2Fpbm1hcEltYWdlLCBnYWlubWFwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZywgZ2Fpbm1hcEluZm8sIGRzdCwgdGFyZ2V0U2RySGRyUmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmltYWdlSW5mbygpLnJlZkNvbG9yU3BhY2UoKSk7CisgICAgICAgIGF1dG8gc2hhZGVyID0KKyAgICAgICAgICAgICAgICBTa0dhaW5tYXBTaGFkZXI6Ok1ha2UoaW1hZ2UsIHNyYywgc2FtcGxpbmcsIGdhaW5tYXBJbWFnZSwgZ2Fpbm1hcFNyYywgc2FtcGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5tYXBJbmZvLCBkc3QsIHRhcmdldFNkckhkclJhdGlvLCBkZXN0Q29sb3JzcGFjZSk7CiAgICAgICAgIGdhaW5tYXBQYWludC5zZXRTaGFkZXIoc2hhZGVyKTsKICAgICAgICAgYy0+ZHJhd1JlY3QoZHN0LCBnYWlubWFwUGFpbnQpOwogICAgIH0gZWxzZQpAQCAtNTgsNCArOTIsMjEzIEBACiAgICAgICAgIGMtPmRyYXdJbWFnZVJlY3QoaW1hZ2UuZ2V0KCksIHNyYywgZHN0LCBzYW1wbGluZywgcGFpbnQsIGNvbnN0cmFpbnQpOwogfQogCisjaWZkZWYgX19BTkRST0lEX18KKworc3RhdGljIGNvbnN0ZXhwciBjaGFyIGdHYWlubWFwU0tTTFtdID0gUiJTS1NMKAorICAgIHVuaWZvcm0gc2hhZGVyIGJhc2U7CisgICAgdW5pZm9ybSBzaGFkZXIgZ2Fpbm1hcDsKKyAgICB1bmlmb3JtIGNvbG9yRmlsdGVyIHdvcmtpbmdTcGFjZVRvTGluZWFyU3JnYjsKKyAgICB1bmlmb3JtIGhhbGY0IGxvZ1JhdGlvTWluOworICAgIHVuaWZvcm0gaGFsZjQgbG9nUmF0aW9NYXg7CisgICAgdW5pZm9ybSBoYWxmNCBnYWlubWFwR2FtbWE7CisgICAgdW5pZm9ybSBoYWxmNCBlcHNpbG9uU2RyOworICAgIHVuaWZvcm0gaGFsZjQgZXBzaWxvbkhkcjsKKyAgICB1bmlmb3JtIGhhbGYgVzsKKyAgICB1bmlmb3JtIGludCBnYWlubWFwSXNBbHBoYTsKKyAgICB1bmlmb3JtIGludCBnYWlubWFwSXNSZWQ7CisgICAgdW5pZm9ybSBpbnQgc2luZ2xlQ2hhbm5lbDsKKyAgICB1bmlmb3JtIGludCBub0dhbW1hOworCisgICAgaGFsZjQgdG9EZXN0KGhhbGY0IHdvcmtpbmcpIHsKKyAgICAgICAgaGFsZjQgbHMgPSB3b3JraW5nU3BhY2VUb0xpbmVhclNyZ2IuZXZhbCh3b3JraW5nKTsKKyAgICAgICAgdmVjMyBkZXN0ID0gZnJvbUxpbmVhclNyZ2IobHMucmdiKTsKKyAgICAgICAgcmV0dXJuIGhhbGY0KGRlc3QuciwgZGVzdC5nLCBkZXN0LmIsIGxzLmEpOworICAgIH0KKworICAgIGhhbGY0IG1haW4oZmxvYXQyIGNvb3JkKSB7CisgICAgICAgIGhhbGY0IFMgPSBiYXNlLmV2YWwoY29vcmQpOworICAgICAgICBoYWxmNCBHID0gZ2Fpbm1hcC5ldmFsKGNvb3JkKTsKKyAgICAgICAgaWYgKGdhaW5tYXBJc0FscGhhID09IDEpIHsKKyAgICAgICAgICAgIEcgPSBoYWxmNChHLmEsIEcuYSwgRy5hLCAxLjApOworICAgICAgICB9CisgICAgICAgIGlmIChnYWlubWFwSXNSZWQgPT0gMSkgeworICAgICAgICAgICAgRyA9IGhhbGY0KEcuciwgRy5yLCBHLnIsIDEuMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpbmdsZUNoYW5uZWwgPT0gMSkgeworICAgICAgICAgICAgaGFsZiBMOworICAgICAgICAgICAgaWYgKG5vR2FtbWEgPT0gMSkgeworICAgICAgICAgICAgICAgIEwgPSBtaXgobG9nUmF0aW9NaW4uciwgbG9nUmF0aW9NYXguciwgRy5yKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTCA9IG1peChsb2dSYXRpb01pbi5yLCBsb2dSYXRpb01heC5yLCBwb3coRy5yLCBnYWlubWFwR2FtbWEucikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFsZjMgSCA9IChTLnJnYiArIGVwc2lsb25TZHIucmdiKSAqIGV4cChMICogVykgLSBlcHNpbG9uSGRyLnJnYjsKKyAgICAgICAgICAgIHJldHVybiB0b0Rlc3QoaGFsZjQoSC5yLCBILmcsIEguYiwgUy5hKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYWxmMyBMOworICAgICAgICAgICAgaWYgKG5vR2FtbWEgPT0gMSkgeworICAgICAgICAgICAgICAgIEwgPSBtaXgobG9nUmF0aW9NaW4ucmdiLCBsb2dSYXRpb01heC5yZ2IsIEcucmdiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTCA9IG1peChsb2dSYXRpb01pbi5yZ2IsIGxvZ1JhdGlvTWF4LnJnYiwgcG93KEcucmdiLCBnYWlubWFwR2FtbWEucmdiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYWxmMyBIID0gKFMucmdiICsgZXBzaWxvblNkci5yZ2IpICogZXhwKEwgKiBXKSAtIGVwc2lsb25IZHIucmdiOworICAgICAgICAgICAgcmV0dXJuIHRvRGVzdChoYWxmNChILnIsIEguZywgSC5iLCBTLmEpKTsKKyAgICAgICAgfQorICAgIH0KKylTS1NMIjsKKworc3RhdGljIHNrX3NwPFNrUnVudGltZUVmZmVjdD4gZ2Fpbm1hcF9hcHBseV9lZmZlY3QoKSB7CisgICAgc3RhdGljIGNvbnN0IFNrUnVudGltZUVmZmVjdCogZWZmZWN0ID0gW10oKSAtPiBTa1J1bnRpbWVFZmZlY3QqIHsKKyAgICAgICAgYXV0byBidWlsZFJlc3VsdCA9IFNrUnVudGltZUVmZmVjdDo6TWFrZUZvclNoYWRlcihTa1N0cmluZyhnR2Fpbm1hcFNLU0wpLCB7fSk7CisgICAgICAgIGlmIChidWlsZFJlc3VsdC5lZmZlY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBidWlsZFJlc3VsdC5lZmZlY3QucmVsZWFzZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiRmFpbGVkIHRvIGJ1aWxkIGdhaW5tYXAgc2hhZGVyOiAlcyIsIGJ1aWxkUmVzdWx0LmVycm9yVGV4dC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0oKTsKKyAgICBTa0FTU0VSVChlZmZlY3QpOworICAgIHJldHVybiBza19yZWZfc3AoZWZmZWN0KTsKK30KKworc3RhdGljIGJvb2wgYWxsX2NoYW5uZWxzX2VxdWFsKGNvbnN0IFNrQ29sb3I0ZiYgYykgeworICAgIHJldHVybiBjLmZSID09IGMuZkcgJiYgYy5mUiA9PSBjLmZCOworfQorCitjbGFzcyBEZWZlcnJlZEdhaW5tYXBTaGFkZXIgeworcHJpdmF0ZToKKyAgICBza19zcDxTa1J1bnRpbWVFZmZlY3Q+IG1TaGFkZXJ7Z2Fpbm1hcF9hcHBseV9lZmZlY3QoKX07CisgICAgU2tSdW50aW1lU2hhZGVyQnVpbGRlciBtQnVpbGRlcnttU2hhZGVyfTsKKyAgICBTa0dhaW5tYXBJbmZvIG1HYWlubWFwSW5mbzsKKyAgICBzdGQ6Om11dGV4IG1Vbmlmb3JtR3VhcmQ7CisKKyAgICB2b2lkIHNldHVwQ2hpbGRyZW4oY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGJhc2VJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGdhaW5tYXBJbWFnZSwgU2tUaWxlTW9kZSB0aWxlTW9kZVgsCisgICAgICAgICAgICAgICAgICAgICAgIFNrVGlsZU1vZGUgdGlsZU1vZGVZLCBjb25zdCBTa1NhbXBsaW5nT3B0aW9ucyYgc2FtcGxpbmdPcHRpb25zKSB7CisgICAgICAgIHNrX3NwPFNrQ29sb3JTcGFjZT4gYmFzZUNvbG9yU3BhY2UgPQorICAgICAgICAgICAgICAgIGJhc2VJbWFnZS0+Y29sb3JTcGFjZSgpID8gYmFzZUltYWdlLT5yZWZDb2xvclNwYWNlKCkgOiBTa0NvbG9yU3BhY2U6Ok1ha2VTUkdCKCk7CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBjb2xvciBzcGFjZSBpbiB3aGljaCB0aGUgZ2Fpbm1hcCBtYXRoIGlzIHRvIGJlIGFwcGxpZWQuCisgICAgICAgIHNrX3NwPFNrQ29sb3JTcGFjZT4gZ2Fpbm1hcE1hdGhDb2xvclNwYWNlID0gYmFzZUNvbG9yU3BhY2UtPm1ha2VMaW5lYXJHYW1tYSgpOworCisgICAgICAgIC8vIENyZWF0ZSBhIGNvbG9yIGZpbHRlciB0byB0cmFuc2Zvcm0gZnJvbSB0aGUgYmFzZSBpbWFnZSdzIGNvbG9yIHNwYWNlIHRvIHRoZSBjb2xvciBzcGFjZQorICAgICAgICAvLyBpbiB3aGljaCB0aGUgZ2Fpbm1hcCBpcyB0byBiZSBhcHBsaWVkLgorICAgICAgICBhdXRvIGNvbG9yWGZvcm1TZHJUb0dhaW5tYXAgPQorICAgICAgICAgICAgICAgIFNrQ29sb3JGaWx0ZXJQcml2OjpNYWtlQ29sb3JTcGFjZVhmb3JtKGJhc2VDb2xvclNwYWNlLCBnYWlubWFwTWF0aENvbG9yU3BhY2UpOworCisgICAgICAgIC8vIFRoZSBiYXNlIGltYWdlIHNoYWRlciB3aWxsIGNvbnZlcnQgaW50byB0aGUgY29sb3Igc3BhY2UgaW4gd2hpY2ggdGhlIGdhaW5tYXAgaXMgYXBwbGllZC4KKyAgICAgICAgYXV0byBiYXNlSW1hZ2VTaGFkZXIgPSBiYXNlSW1hZ2UtPm1ha2VSYXdTaGFkZXIodGlsZU1vZGVYLCB0aWxlTW9kZVksIHNhbXBsaW5nT3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bWFrZVdpdGhDb2xvckZpbHRlcihjb2xvclhmb3JtU2RyVG9HYWlubWFwKTsKKworICAgICAgICAvLyBUaGUgZ2Fpbm1hcCBpbWFnZSBzaGFkZXIgd2lsbCBpZ25vcmUgYW55IGNvbG9yIHNwYWNlIHRoYXQgdGhlIGdhaW5tYXAgaGFzLgorICAgICAgICBjb25zdCBTa01hdHJpeCBnYWlubWFwUmVjdFRvRHN0UmVjdCA9CisgICAgICAgICAgICAgICAgU2tNYXRyaXg6OlJlY3RUb1JlY3QoU2tSZWN0OjpNYWtlV0goZ2Fpbm1hcEltYWdlLT53aWR0aCgpLCBnYWlubWFwSW1hZ2UtPmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1JlY3Q6Ok1ha2VXSChiYXNlSW1hZ2UtPndpZHRoKCksIGJhc2VJbWFnZS0+aGVpZ2h0KCkpKTsKKyAgICAgICAgYXV0byBnYWlubWFwSW1hZ2VTaGFkZXIgPSBnYWlubWFwSW1hZ2UtPm1ha2VSYXdTaGFkZXIodGlsZU1vZGVYLCB0aWxlTW9kZVksIHNhbXBsaW5nT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdhaW5tYXBSZWN0VG9Ec3RSZWN0KTsKKworICAgICAgICAvLyBDcmVhdGUgYSBjb2xvciBmaWx0ZXIgdG8gdHJhbnNmb3JtIGZyb20gdGhlIGNvbG9yIHNwYWNlIGluIHdoaWNoIHRoZSBnYWlubWFwIGlzIGFwcGxpZWQKKyAgICAgICAgLy8gdG8gdGhlIGludGVybWVkaWF0ZSBkZXN0aW5hdGlvbiBjb2xvciBzcGFjZS4KKyAgICAgICAgYXV0byBjb2xvclhmb3JtR2Fpbm1hcFRvRHN0ID0gU2tDb2xvckZpbHRlclByaXY6Ok1ha2VDb2xvclNwYWNlWGZvcm0oCisgICAgICAgICAgICAgICAgZ2Fpbm1hcE1hdGhDb2xvclNwYWNlLCBTa0NvbG9yU3BhY2U6Ok1ha2VTUkdCTGluZWFyKCkpOworCisgICAgICAgIG1CdWlsZGVyLmNoaWxkKCJiYXNlIikgPSBzdGQ6Om1vdmUoYmFzZUltYWdlU2hhZGVyKTsKKyAgICAgICAgbUJ1aWxkZXIuY2hpbGQoImdhaW5tYXAiKSA9IHN0ZDo6bW92ZShnYWlubWFwSW1hZ2VTaGFkZXIpOworICAgICAgICBtQnVpbGRlci5jaGlsZCgid29ya2luZ1NwYWNlVG9MaW5lYXJTcmdiIikgPSBzdGQ6Om1vdmUoY29sb3JYZm9ybUdhaW5tYXBUb0RzdCk7CisgICAgfQorCisgICAgdm9pZCBzZXR1cEdlbmVyaWNVbmlmb3Jtcyhjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgZ2Fpbm1hcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tHYWlubWFwSW5mbyYgZ2Fpbm1hcEluZm8pIHsKKyAgICAgICAgY29uc3QgU2tDb2xvcjRmIGxvZ1JhdGlvTWluKHtza19mbG9hdF9sb2coZ2Fpbm1hcEluZm8uZkdhaW5tYXBSYXRpb01pbi5mUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tfZmxvYXRfbG9nKGdhaW5tYXBJbmZvLmZHYWlubWFwUmF0aW9NaW4uZkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrX2Zsb2F0X2xvZyhnYWlubWFwSW5mby5mR2Fpbm1hcFJhdGlvTWluLmZCKSwgMS5mfSk7CisgICAgICAgIGNvbnN0IFNrQ29sb3I0ZiBsb2dSYXRpb01heCh7c2tfZmxvYXRfbG9nKGdhaW5tYXBJbmZvLmZHYWlubWFwUmF0aW9NYXguZlIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrX2Zsb2F0X2xvZyhnYWlubWFwSW5mby5mR2Fpbm1hcFJhdGlvTWF4LmZHKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza19mbG9hdF9sb2coZ2Fpbm1hcEluZm8uZkdhaW5tYXBSYXRpb01heC5mQiksIDEuZn0pOworICAgICAgICBjb25zdCBpbnQgbm9HYW1tYSA9IGdhaW5tYXBJbmZvLmZHYWlubWFwR2FtbWEuZlIgPT0gMS5mICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fpbm1hcEluZm8uZkdhaW5tYXBHYW1tYS5mRyA9PSAxLmYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWlubWFwSW5mby5mR2Fpbm1hcEdhbW1hLmZCID09IDEuZjsKKyAgICAgICAgY29uc3QgdWludDMyX3QgY29sb3JUeXBlRmxhZ3MgPSBTa0NvbG9yVHlwZUNoYW5uZWxGbGFncyhnYWlubWFwSW1hZ2UtPmNvbG9yVHlwZSgpKTsKKyAgICAgICAgY29uc3QgaW50IGdhaW5tYXBJc0FscGhhID0gY29sb3JUeXBlRmxhZ3MgPT0ga0FscGhhX1NrQ29sb3JDaGFubmVsRmxhZzsKKyAgICAgICAgY29uc3QgaW50IGdhaW5tYXBJc1JlZCA9IGNvbG9yVHlwZUZsYWdzID09IGtSZWRfU2tDb2xvckNoYW5uZWxGbGFnOworICAgICAgICBjb25zdCBpbnQgc2luZ2xlQ2hhbm5lbCA9IGFsbF9jaGFubmVsc19lcXVhbChnYWlubWFwSW5mby5mR2Fpbm1hcEdhbW1hKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9jaGFubmVsc19lcXVhbChnYWlubWFwSW5mby5mR2Fpbm1hcFJhdGlvTWluKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9jaGFubmVsc19lcXVhbChnYWlubWFwSW5mby5mR2Fpbm1hcFJhdGlvTWF4KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvclR5cGVGbGFncyA9PSBrR3JheV9Ta0NvbG9yQ2hhbm5lbEZsYWcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JUeXBlRmxhZ3MgPT0ga0FscGhhX1NrQ29sb3JDaGFubmVsRmxhZyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclR5cGVGbGFncyA9PSBrUmVkX1NrQ29sb3JDaGFubmVsRmxhZyk7CisgICAgICAgIG1CdWlsZGVyLnVuaWZvcm0oImxvZ1JhdGlvTWluIikgPSBsb2dSYXRpb01pbjsKKyAgICAgICAgbUJ1aWxkZXIudW5pZm9ybSgibG9nUmF0aW9NYXgiKSA9IGxvZ1JhdGlvTWF4OworICAgICAgICBtQnVpbGRlci51bmlmb3JtKCJnYWlubWFwR2FtbWEiKSA9IGdhaW5tYXBJbmZvLmZHYWlubWFwR2FtbWE7CisgICAgICAgIG1CdWlsZGVyLnVuaWZvcm0oImVwc2lsb25TZHIiKSA9IGdhaW5tYXBJbmZvLmZFcHNpbG9uU2RyOworICAgICAgICBtQnVpbGRlci51bmlmb3JtKCJlcHNpbG9uSGRyIikgPSBnYWlubWFwSW5mby5mRXBzaWxvbkhkcjsKKyAgICAgICAgbUJ1aWxkZXIudW5pZm9ybSgibm9HYW1tYSIpID0gbm9HYW1tYTsKKyAgICAgICAgbUJ1aWxkZXIudW5pZm9ybSgic2luZ2xlQ2hhbm5lbCIpID0gc2luZ2xlQ2hhbm5lbDsKKyAgICAgICAgbUJ1aWxkZXIudW5pZm9ybSgiZ2Fpbm1hcElzQWxwaGEiKSA9IGdhaW5tYXBJc0FscGhhOworICAgICAgICBtQnVpbGRlci51bmlmb3JtKCJnYWlubWFwSXNSZWQiKSA9IGdhaW5tYXBJc1JlZDsKKyAgICB9CisKKyAgICBza19zcDxjb25zdCBTa0RhdGE+IGJ1aWxkKGZsb2F0IHRhcmdldEhkclNkclJhdGlvKSB7CisgICAgICAgIHNrX3NwPGNvbnN0IFNrRGF0YT4gdW5pZm9ybXM7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBjYWxsZWQgY29uY3VycmVudGx5IGZyb20gbXVsdGlwbGUgdGhyZWFkcywgd2UgbmVlZCB0byBndWFyZCB0aGUgY2FsbAorICAgICAgICAgICAgLy8gdG8gd3JpdGFibGVVbmlmb3JtcygpIHdoaWNoIG11dGF0ZXMgbVVuaWZvcm0uIFRoaXMgaXMgb3RoZXJ3aXNlIHNhZmUgYmVjYXVzZQorICAgICAgICAgICAgLy8gd3JpdGVhYmxlVW5pZm9ybXMoKSB3aWxsIG1ha2UgYSBjb3B5IGlmIGl0J3Mgbm90IHVuaXF1ZSBiZWZvcmUgbXV0YXRpbmcKKyAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBhIEJpdG1hcFNoYWRlciBpcyB1c2VkIG9uIG11bHRpcGxlIGNhbnZhcycsIHN1Y2ggYXMgYQorICAgICAgICAgICAgLy8gc29mdHdhcmUgKyBoYXJkd2FyZSBjYW52YXMsIHdoaWNoIGlzIG90aGVyd2lzZSB2YWxpZCBhcyBTa1NoYWRlciBpcyAiaW1tdXRhYmxlIgorICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIF9sb2NrKG1Vbmlmb3JtR3VhcmQpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgV3VuY2xhbXBlZCA9IChza19mbG9hdF9sb2codGFyZ2V0SGRyU2RyUmF0aW8pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tfZmxvYXRfbG9nKG1HYWlubWFwSW5mby5mRGlzcGxheVJhdGlvU2RyKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza19mbG9hdF9sb2cobUdhaW5tYXBJbmZvLmZEaXNwbGF5UmF0aW9IZHIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tfZmxvYXRfbG9nKG1HYWlubWFwSW5mby5mRGlzcGxheVJhdGlvU2RyKSk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBXID0gc3RkOjptYXgoc3RkOjptaW4oV3VuY2xhbXBlZCwgMS5mKSwgMC5mKTsKKyAgICAgICAgICAgIG1CdWlsZGVyLnVuaWZvcm0oIlciKSA9IFc7CisgICAgICAgICAgICB1bmlmb3JtcyA9IG1CdWlsZGVyLnVuaWZvcm1zKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVuaWZvcm1zOworICAgIH0KKworcHVibGljOgorICAgIGV4cGxpY2l0IERlZmVycmVkR2Fpbm1hcFNoYWRlcihjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNrX3NwPGNvbnN0IFNrSW1hZ2U+JiBnYWlubWFwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrR2Fpbm1hcEluZm8mIGdhaW5tYXBJbmZvLCBTa1RpbGVNb2RlIHRpbGVNb2RlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tUaWxlTW9kZSB0aWxlTW9kZVksIGNvbnN0IFNrU2FtcGxpbmdPcHRpb25zJiBzYW1wbGluZykgeworICAgICAgICBtR2Fpbm1hcEluZm8gPSBnYWlubWFwSW5mbzsKKyAgICAgICAgc2V0dXBDaGlsZHJlbihpbWFnZSwgZ2Fpbm1hcEltYWdlLCB0aWxlTW9kZVgsIHRpbGVNb2RlWSwgc2FtcGxpbmcpOworICAgICAgICBzZXR1cEdlbmVyaWNVbmlmb3JtcyhnYWlubWFwSW1hZ2UsIGdhaW5tYXBJbmZvKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc2tfc3A8U2tTaGFkZXI+IE1ha2UoY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgZ2Fpbm1hcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0dhaW5tYXBJbmZvJiBnYWlubWFwSW5mbywgU2tUaWxlTW9kZSB0aWxlTW9kZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrVGlsZU1vZGUgdGlsZU1vZGVZLCBjb25zdCBTa1NhbXBsaW5nT3B0aW9ucyYgc2FtcGxpbmcpIHsKKyAgICAgICAgYXV0byBkZWZlcnJlZEhhbmRsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPERlZmVycmVkR2Fpbm1hcFNoYWRlcj4oCisgICAgICAgICAgICAgICAgaW1hZ2UsIGdhaW5tYXBJbWFnZSwgZ2Fpbm1hcEluZm8sIHRpbGVNb2RlWCwgdGlsZU1vZGVZLCBzYW1wbGluZyk7CisgICAgICAgIGF1dG8gY2FsbGJhY2sgPQorICAgICAgICAgICAgICAgIFtkZWZlcnJlZEhhbmRsZXJdKGNvbnN0IFNrUnVudGltZUVmZmVjdFByaXY6OlVuaWZvcm1zQ2FsbGJhY2tDb250ZXh0JiByZW5kZXJDb250ZXh0KQorICAgICAgICAgICAgICAgIC0+IHNrX3NwPGNvbnN0IFNrRGF0YT4geworICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkSGFuZGxlci0+YnVpbGQoZ2V0VGFyZ2V0SGRyU2RyUmF0aW8ocmVuZGVyQ29udGV4dC5mRHN0Q29sb3JTcGFjZSkpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gU2tSdW50aW1lRWZmZWN0UHJpdjo6TWFrZURlZmVycmVkU2hhZGVyKGRlZmVycmVkSGFuZGxlci0+bVNoYWRlci5nZXQoKSwgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRIYW5kbGVyLT5tQnVpbGRlci5jaGlsZHJlbigpKTsKKyAgICB9Cit9OworCitza19zcDxTa1NoYWRlcj4gTWFrZUdhaW5tYXBTaGFkZXIoY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNrX3NwPGNvbnN0IFNrSW1hZ2U+JiBnYWlubWFwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tHYWlubWFwSW5mbyYgZ2Fpbm1hcEluZm8sIFNrVGlsZU1vZGUgdGlsZU1vZGVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrVGlsZU1vZGUgdGlsZU1vZGVZLCBjb25zdCBTa1NhbXBsaW5nT3B0aW9ucyYgc2FtcGxpbmcpIHsKKyAgICByZXR1cm4gRGVmZXJyZWRHYWlubWFwU2hhZGVyOjpNYWtlKGltYWdlLCBnYWlubWFwSW1hZ2UsIGdhaW5tYXBJbmZvLCB0aWxlTW9kZVgsIHRpbGVNb2RlWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nKTsKK30KKworI2Vsc2UgIC8vIF9fQU5EUk9JRF9fCisKK3NrX3NwPFNrU2hhZGVyPiBNYWtlR2Fpbm1hcFNoYWRlcihjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tfc3A8Y29uc3QgU2tJbWFnZT4mIGdhaW5tYXBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0dhaW5tYXBJbmZvJiBnYWlubWFwSW5mbywgU2tUaWxlTW9kZSB0aWxlTW9kZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tUaWxlTW9kZSB0aWxlTW9kZVksIGNvbnN0IFNrU2FtcGxpbmdPcHRpb25zJiBzYW1wbGluZykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKK30KKworI2VuZGlmICAvLyBfX0FORFJPSURfXworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6dWlyZW5kZXJlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9lZmZlY3RzL0dhaW5tYXBSZW5kZXJlci5oIGIvbGlicy9od3VpL2VmZmVjdHMvR2Fpbm1hcFJlbmRlcmVyLmgKaW5kZXggN2M1NmQ5NC4uNGVkMjQ0NSAxMDA2NDQKLS0tIGEvbGlicy9od3VpL2VmZmVjdHMvR2Fpbm1hcFJlbmRlcmVyLmgKKysrIGIvbGlicy9od3VpL2VmZmVjdHMvR2Fpbm1hcFJlbmRlcmVyLmgKQEAgLTMwLDQgKzMwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXM6OlNyY1JlY3RDb25zdHJhaW50IGNvbnN0cmFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNrX3NwPGNvbnN0IFNrSW1hZ2U+JiBnYWlubWFwSW1hZ2UsIGNvbnN0IFNrR2Fpbm1hcEluZm8mIGdhaW5tYXBJbmZvKTsKIAorc2tfc3A8U2tTaGFkZXI+IE1ha2VHYWlubWFwU2hhZGVyKGNvbnN0IHNrX3NwPGNvbnN0IFNrSW1hZ2U+JiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza19zcDxjb25zdCBTa0ltYWdlPiYgZ2Fpbm1hcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrR2Fpbm1hcEluZm8mIGdhaW5tYXBJbmZvLCBTa1RpbGVNb2RlIHRpbGVNb2RlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1RpbGVNb2RlIHRpbGVNb2RlWSwgY29uc3QgU2tTYW1wbGluZ09wdGlvbnMmIHNhbXBsaW5nKTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQ6OnVpcmVuZGVyZXIKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9qbmkvU2hhZGVyLmNwcCBiL2xpYnMvaHd1aS9qbmkvU2hhZGVyLmNwcAppbmRleCA3NWQ0NWU1Li43ZWI3OWJlIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvam5pL1NoYWRlci5jcHAKKysrIGIvbGlicy9od3VpL2puaS9TaGFkZXIuY3BwCkBAIC0xLDYgKzEsOSBAQAogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiU2hhZGVySk5JIgogCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiR2Fpbm1hcC5oIgogI2luY2x1ZGUgIkdyYXBoaWNzSk5JLmgiCiAjaW5jbHVkZSAiU2tCaXRtYXAuaCIKICNpbmNsdWRlICJTa0JsZW5kTW9kZS5oIgpAQCAtMTcsMTAgKzIwLDkgQEAKICNpbmNsdWRlICJTa1NoYWRlci5oIgogI2luY2x1ZGUgIlNrU3RyaW5nLmgiCiAjaW5jbHVkZSAiU2tUaWxlTW9kZS5oIgorI2luY2x1ZGUgImVmZmVjdHMvR2Fpbm1hcFJlbmRlcmVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9lZmZlY3RzL1NrUnVudGltZUVmZmVjdC5oIgogCi0jaW5jbHVkZSA8dmVjdG9yPgotCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6dWlyZW5kZXJlcjsKIAogLyoqCkBAIC03NCw3ICs3NiwyMCBAQAogICAgIGlmIChiaXRtYXBIYW5kbGUpIHsKICAgICAgICAgLy8gT25seSBwYXNzIGEgdmFsaWQgU2tCaXRtYXAgb2JqZWN0IHRvIHRoZSBjb25zdHJ1Y3RvciBpZiB0aGUgQml0bWFwIGV4aXN0cy4gT3RoZXJ3aXNlLAogICAgICAgICAvLyB3ZSdsbCBwYXNzIGFuIGVtcHR5IFNrQml0bWFwIHRvIGF2b2lkIGNyYXNoaW5nL2V4Y2VwdGluZyBmb3IgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgaW1hZ2UgPSBhbmRyb2lkOjpiaXRtYXA6OnRvQml0bWFwKGJpdG1hcEhhbmRsZSkubWFrZUltYWdlKCk7CisgICAgICAgIGF1dG8mIGJpdG1hcCA9IGFuZHJvaWQ6OmJpdG1hcDo6dG9CaXRtYXAoYml0bWFwSGFuZGxlKTsKKyAgICAgICAgaW1hZ2UgPSBiaXRtYXAubWFrZUltYWdlKCk7CisKKyAgICAgICAgaWYgKCFpc0RpcmVjdFNhbXBsZWQgJiYgYml0bWFwLmhhc0dhaW5tYXAoKSkgeworICAgICAgICAgICAgc2tfc3A8U2tTaGFkZXI+IGdhaW5tYXBTaGFkZXIgPSBNYWtlR2Fpbm1hcFNoYWRlcigKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2UsIGJpdG1hcC5nYWlubWFwKCktPmJpdG1hcC0+bWFrZUltYWdlKCksIGJpdG1hcC5nYWlubWFwKCktPmluZm8sCisgICAgICAgICAgICAgICAgICAgIChTa1RpbGVNb2RlKXRpbGVNb2RlWCwgKFNrVGlsZU1vZGUpdGlsZU1vZGVZLCBzYW1wbGluZyk7CisgICAgICAgICAgICBpZiAoZ2Fpbm1hcFNoYWRlcikgeworICAgICAgICAgICAgICAgIGlmIChtYXRyaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2Fpbm1hcFNoYWRlciA9IGdhaW5tYXBTaGFkZXItPm1ha2VXaXRoTG9jYWxNYXRyaXgoKm1hdHJpeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGpsb25nPihnYWlubWFwU2hhZGVyLnJlbGVhc2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoIWltYWdlLmdldCgpKSB7CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvcmVuZGVydGhyZWFkL0NhbnZhc0NvbnRleHQuY3BwIGIvbGlicy9od3VpL3JlbmRlcnRocmVhZC9DYW52YXNDb250ZXh0LmNwcAppbmRleCBmMTBiMmIyLi5kZDc4MWJiIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvcmVuZGVydGhyZWFkL0NhbnZhc0NvbnRleHQuY3BwCisrKyBiL2xpYnMvaHd1aS9yZW5kZXJ0aHJlYWQvQ2FudmFzQ29udGV4dC5jcHAKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgIH0KICAgICBzd2l0Y2ggKG1Db2xvck1vZGUpIHsKICAgICAgICAgY2FzZSBDb2xvck1vZGU6OkhkcjoKLSAgICAgICAgICAgIHJldHVybiAzLmY7ICAvLyBUT0RPOiBSZWZpbmUgdGhpcyBudW1iZXIKKyAgICAgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzOjptYXhIZHJIZWFkcm9vbU9uOGJpdDsKICAgICAgICAgY2FzZSBDb2xvck1vZGU6OkhkcjEwOgogICAgICAgICAgICAgcmV0dXJuIDEwLmY7CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvcmVuZGVydGhyZWFkL1JlbmRlclRocmVhZC5jcHAgYi9saWJzL2h3dWkvcmVuZGVydGhyZWFkL1JlbmRlclRocmVhZC5jcHAKaW5kZXggN2E3ZjFhYi4uMGFmZDk0OSAxMDA2NDQKLS0tIGEvbGlicy9od3VpL3JlbmRlcnRocmVhZC9SZW5kZXJUaHJlYWQuY3BwCisrKyBiL2xpYnMvaHd1aS9yZW5kZXJ0aHJlYWQvUmVuZGVyVGhyZWFkLmNwcApAQCAtMTM1LDcgKzEzNSw5IEBACiAgICAgICAgICFtRnJhbWVDYWxsYmFja1Rhc2tQZW5kaW5nKSB7CiAgICAgICAgIEFUUkFDRV9OQU1FKCJxdWV1ZSBtRnJhbWVDYWxsYmFja1Rhc2siKTsKICAgICAgICAgbUZyYW1lQ2FsbGJhY2tUYXNrUGVuZGluZyA9IHRydWU7Ci0gICAgICAgIG5zZWNzX3QgcnVuQXQgPSAoZnJhbWVUaW1lTmFub3MgKyBtRGlzcGF0Y2hGcmFtZURlbGF5KTsKKworICAgICAgICBuc2Vjc190IHRpbWVVbnRpbERlYWRsaW5lID0gZnJhbWVEZWFkbGluZSAtIGZyYW1lVGltZU5hbm9zOworICAgICAgICBuc2Vjc190IHJ1bkF0ID0gKGZyYW1lVGltZU5hbm9zICsgKHRpbWVVbnRpbERlYWRsaW5lICogMC4yNWYpKTsKICAgICAgICAgcXVldWUoKS5wb3N0QXQocnVuQXQsIFs9XSgpIHsgZGlzcGF0Y2hGcmFtZUNhbGxiYWNrcygpOyB9KTsKICAgICB9CiB9CkBAIC0yNTcsNyArMjU5LDYgQEAKIHZvaWQgUmVuZGVyVGhyZWFkOjpzZXR1cEZyYW1lSW50ZXJ2YWwoKSB7CiAgICAgbnNlY3NfdCBmcmFtZUludGVydmFsTmFub3MgPSBEZXZpY2VJbmZvOjpnZXRWc3luY1BlcmlvZCgpOwogICAgIG1UaW1lTG9yZC5zZXRGcmFtZUludGVydmFsKGZyYW1lSW50ZXJ2YWxOYW5vcyk7Ci0gICAgbURpc3BhdGNoRnJhbWVEZWxheSA9IHN0YXRpY19jYXN0PG5zZWNzX3Q+KGZyYW1lSW50ZXJ2YWxOYW5vcyAqIC4yNWYpOwogfQogCiB2b2lkIFJlbmRlclRocmVhZDo6cmVxdWlyZUdsQ29udGV4dCgpIHsKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9yZW5kZXJ0aHJlYWQvUmVuZGVyVGhyZWFkLmggYi9saWJzL2h3dWkvcmVuZGVydGhyZWFkL1JlbmRlclRocmVhZC5oCmluZGV4IDBhODllNWUuLmM3N2NkNDEgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9yZW5kZXJ0aHJlYWQvUmVuZGVyVGhyZWFkLmgKKysrIGIvbGlicy9od3VpL3JlbmRlcnRocmVhZC9SZW5kZXJUaHJlYWQuaApAQCAtMjM1LDcgKzIzNSw2IEBACiAgICAgYm9vbCBtRnJhbWVDYWxsYmFja1Rhc2tQZW5kaW5nOwogCiAgICAgVGltZUxvcmQgbVRpbWVMb3JkOwotICAgIG5zZWNzX3QgbURpc3BhdGNoRnJhbWVEZWxheSA9IDRfbXM7CiAgICAgUmVuZGVyU3RhdGUqIG1SZW5kZXJTdGF0ZTsKICAgICBFZ2xNYW5hZ2VyKiBtRWdsTWFuYWdlcjsKICAgICBXZWJWaWV3RnVuY3Rvck1hbmFnZXImIG1GdW5jdG9yTWFuYWdlcjsKZGlmZiAtLWdpdCBhL2xpYnMvaW5wdXQvTW91c2VDdXJzb3JDb250cm9sbGVyLmNwcCBiL2xpYnMvaW5wdXQvTW91c2VDdXJzb3JDb250cm9sbGVyLmNwcAppbmRleCAyNGNmYzlkLi5jM2FkNzY3IDEwMDY0NAotLS0gYS9saWJzL2lucHV0L01vdXNlQ3Vyc29yQ29udHJvbGxlci5jcHAKKysrIGIvbGlicy9pbnB1dC9Nb3VzZUN1cnNvckNvbnRyb2xsZXIuY3BwCkBAIC01Myw4ICs1Myw2IEBACiAgICAgbUxvY2tlZC5yZXNvbHZlZFBvaW50ZXJUeXBlID0gUG9pbnRlckljb25TdHlsZTo6VFlQRV9OT1RfU1BFQ0lGSUVEOwogCiAgICAgbUxvY2tlZC5yZXNvdXJjZXNMb2FkZWQgPSBmYWxzZTsKLQotICAgIG1Mb2NrZWQuYnV0dG9uU3RhdGUgPSAwOwogfQogCiBNb3VzZUN1cnNvckNvbnRyb2xsZXI6On5Nb3VzZUN1cnNvckNvbnRyb2xsZXIoKSB7CkBAIC02MywyNCArNjEsMjMgQEAKICAgICBtTG9ja2VkLnBvaW50ZXJTcHJpdGUuY2xlYXIoKTsKIH0KIAotYm9vbCBNb3VzZUN1cnNvckNvbnRyb2xsZXI6OmdldEJvdW5kcyhmbG9hdCogb3V0TWluWCwgZmxvYXQqIG91dE1pblksIGZsb2F0KiBvdXRNYXhYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogb3V0TWF4WSkgY29uc3Qgeworc3RkOjpvcHRpb25hbDxGbG9hdFJlY3Q+IE1vdXNlQ3Vyc29yQ29udHJvbGxlcjo6Z2V0Qm91bmRzKCkgY29uc3QgewogICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTG9jayk7CiAKLSAgICByZXR1cm4gZ2V0Qm91bmRzTG9ja2VkKG91dE1pblgsIG91dE1pblksIG91dE1heFgsIG91dE1heFkpOworICAgIHJldHVybiBnZXRCb3VuZHNMb2NrZWQoKTsKIH0KIAotYm9vbCBNb3VzZUN1cnNvckNvbnRyb2xsZXI6OmdldEJvdW5kc0xvY2tlZChmbG9hdCogb3V0TWluWCwgZmxvYXQqIG91dE1pblksIGZsb2F0KiBvdXRNYXhYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogb3V0TWF4WSkgY29uc3QgUkVRVUlSRVMobUxvY2spIHsKK3N0ZDo6b3B0aW9uYWw8RmxvYXRSZWN0PiBNb3VzZUN1cnNvckNvbnRyb2xsZXI6OmdldEJvdW5kc0xvY2tlZCgpIGNvbnN0IFJFUVVJUkVTKG1Mb2NrKSB7CiAgICAgaWYgKCFtTG9ja2VkLnZpZXdwb3J0LmlzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB7fTsKICAgICB9CiAKLSAgICAqb3V0TWluWCA9IG1Mb2NrZWQudmlld3BvcnQubG9naWNhbExlZnQ7Ci0gICAgKm91dE1pblkgPSBtTG9ja2VkLnZpZXdwb3J0LmxvZ2ljYWxUb3A7Ci0gICAgKm91dE1heFggPSBtTG9ja2VkLnZpZXdwb3J0LmxvZ2ljYWxSaWdodCAtIDE7Ci0gICAgKm91dE1heFkgPSBtTG9ja2VkLnZpZXdwb3J0LmxvZ2ljYWxCb3R0b20gLSAxOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBGbG9hdFJlY3R7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4obUxvY2tlZC52aWV3cG9ydC5sb2dpY2FsTGVmdCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4obUxvY2tlZC52aWV3cG9ydC5sb2dpY2FsVG9wKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihtTG9ja2VkLnZpZXdwb3J0LmxvZ2ljYWxSaWdodCAtIDEpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1Mb2NrZWQudmlld3BvcnQubG9naWNhbEJvdHRvbSAtIDEpLAorICAgIH07CiB9CiAKIHZvaWQgTW91c2VDdXJzb3JDb250cm9sbGVyOjptb3ZlKGZsb2F0IGRlbHRhWCwgZmxvYXQgZGVsdGFZKSB7CkBAIC05NiwyMiArOTMsNiBAQAogICAgIHNldFBvc2l0aW9uTG9ja2VkKG1Mb2NrZWQucG9pbnRlclggKyBkZWx0YVgsIG1Mb2NrZWQucG9pbnRlclkgKyBkZWx0YVkpOwogfQogCi12b2lkIE1vdXNlQ3Vyc29yQ29udHJvbGxlcjo6c2V0QnV0dG9uU3RhdGUoaW50MzJfdCBidXR0b25TdGF0ZSkgewotI2lmIERFQlVHX01PVVNFX0NVUlNPUl9VUERBVEVTCi0gICAgQUxPR0QoIlNldCBidXR0b24gc3RhdGUgMHglMDh4IiwgYnV0dG9uU3RhdGUpOwotI2VuZGlmCi0gICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtTG9ja2VkLmJ1dHRvblN0YXRlICE9IGJ1dHRvblN0YXRlKSB7Ci0gICAgICAgIG1Mb2NrZWQuYnV0dG9uU3RhdGUgPSBidXR0b25TdGF0ZTsKLSAgICB9Ci19Ci0KLWludDMyX3QgTW91c2VDdXJzb3JDb250cm9sbGVyOjpnZXRCdXR0b25TdGF0ZSgpIGNvbnN0IHsKLSAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobUxvY2spOwotICAgIHJldHVybiBtTG9ja2VkLmJ1dHRvblN0YXRlOwotfQotCiB2b2lkIE1vdXNlQ3Vyc29yQ29udHJvbGxlcjo6c2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSkgewogI2lmIERFQlVHX01PVVNFX0NVUlNPUl9VUERBVEVTCiAgICAgQUxPR0QoIlNldCBwb2ludGVyIHBvc2l0aW9uIHRvIHg9JTAuM2YsIHk9JTAuM2YiLCB4LCB5KTsKQEAgLTEyMSwzMSArMTAyLDE5IEBACiB9CiAKIHZvaWQgTW91c2VDdXJzb3JDb250cm9sbGVyOjpzZXRQb3NpdGlvbkxvY2tlZChmbG9hdCB4LCBmbG9hdCB5KSBSRVFVSVJFUyhtTG9jaykgewotICAgIGZsb2F0IG1pblgsIG1pblksIG1heFgsIG1heFk7Ci0gICAgaWYgKGdldEJvdW5kc0xvY2tlZCgmbWluWCwgJm1pblksICZtYXhYLCAmbWF4WSkpIHsKLSAgICAgICAgaWYgKHggPD0gbWluWCkgewotICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyWCA9IG1pblg7Ci0gICAgICAgIH0gZWxzZSBpZiAoeCA+PSBtYXhYKSB7Ci0gICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJYID0gbWF4WDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlclggPSB4OwotICAgICAgICB9Ci0gICAgICAgIGlmICh5IDw9IG1pblkpIHsKLSAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlclkgPSBtaW5ZOwotICAgICAgICB9IGVsc2UgaWYgKHkgPj0gbWF4WSkgewotICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyWSA9IG1heFk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJZID0geTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQb2ludGVyTG9ja2VkKCk7Ci0gICAgfQorICAgIGNvbnN0IGF1dG8gYm91bmRzID0gZ2V0Qm91bmRzTG9ja2VkKCk7CisgICAgaWYgKCFib3VuZHMpIHJldHVybjsKKworICAgIG1Mb2NrZWQucG9pbnRlclggPSBzdGQ6Om1heChib3VuZHMtPmxlZnQsIHN0ZDo6bWluKGJvdW5kcy0+cmlnaHQsIHgpKTsKKyAgICBtTG9ja2VkLnBvaW50ZXJZID0gc3RkOjptYXgoYm91bmRzLT50b3AsIHN0ZDo6bWluKGJvdW5kcy0+Ym90dG9tLCB5KSk7CisKKyAgICB1cGRhdGVQb2ludGVyTG9ja2VkKCk7CiB9CiAKLXZvaWQgTW91c2VDdXJzb3JDb250cm9sbGVyOjpnZXRQb3NpdGlvbihmbG9hdCogb3V0WCwgZmxvYXQqIG91dFkpIGNvbnN0IHsKK0Zsb2F0UG9pbnQgTW91c2VDdXJzb3JDb250cm9sbGVyOjpnZXRQb3NpdGlvbigpIGNvbnN0IHsKICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobUxvY2spOwogCi0gICAgKm91dFggPSBtTG9ja2VkLnBvaW50ZXJYOwotICAgICpvdXRZID0gbUxvY2tlZC5wb2ludGVyWTsKKyAgICByZXR1cm4ge21Mb2NrZWQucG9pbnRlclgsIG1Mb2NrZWQucG9pbnRlcll9OwogfQogCiBpbnQzMl90IE1vdXNlQ3Vyc29yQ29udHJvbGxlcjo6Z2V0RGlzcGxheUlkKCkgY29uc3QgewpAQCAtMjM1LDEwICsyMDQsOSBAQAogICAgIC8vIFJlc2V0IGN1cnNvciBwb3NpdGlvbiB0byBjZW50ZXIgaWYgc2l6ZSBvciBkaXNwbGF5IGNoYW5nZWQuCiAgICAgaWYgKG9sZFZpZXdwb3J0LmRpc3BsYXlJZCAhPSB2aWV3cG9ydC5kaXNwbGF5SWQgfHwgb2xkRGlzcGxheVdpZHRoICE9IG5ld0Rpc3BsYXlXaWR0aCB8fAogICAgICAgICBvbGREaXNwbGF5SGVpZ2h0ICE9IG5ld0Rpc3BsYXlIZWlnaHQpIHsKLSAgICAgICAgZmxvYXQgbWluWCwgbWluWSwgbWF4WCwgbWF4WTsKLSAgICAgICAgaWYgKGdldEJvdW5kc0xvY2tlZCgmbWluWCwgJm1pblksICZtYXhYLCAmbWF4WSkpIHsKLSAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlclggPSAobWluWCArIG1heFgpICogMC41ZjsKLSAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlclkgPSAobWluWSArIG1heFkpICogMC41ZjsKKyAgICAgICAgaWYgKGNvbnN0IGF1dG8gYm91bmRzID0gZ2V0Qm91bmRzTG9ja2VkKCk7IGJvdW5kcykgeworICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyWCA9IChib3VuZHMtPmxlZnQgKyBib3VuZHMtPnJpZ2h0KSAqIDAuNWY7CisgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJZID0gKGJvdW5kcy0+dG9wICsgYm91bmRzLT5ib3R0b20pICogMC41ZjsKICAgICAgICAgICAgIC8vIFJlbG9hZCBpY29uIHJlc291cmNlcyBmb3IgZGVuc2l0eSBtYXkgYmUgY2hhbmdlZC4KICAgICAgICAgICAgIGxvYWRSZXNvdXJjZXNMb2NrZWQoZ2V0QWRkaXRpb25hbE1vdXNlUmVzb3VyY2VzKTsKICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2xpYnMvaW5wdXQvTW91c2VDdXJzb3JDb250cm9sbGVyLmggYi9saWJzL2lucHV0L01vdXNlQ3Vyc29yQ29udHJvbGxlci5oCmluZGV4IGRiMGFiNTYuLjAwZGMwODUgMTAwNjQ0Ci0tLSBhL2xpYnMvaW5wdXQvTW91c2VDdXJzb3JDb250cm9sbGVyLmgKKysrIGIvbGlicy9pbnB1dC9Nb3VzZUN1cnNvckNvbnRyb2xsZXIuaApAQCAtNDMsMTIgKzQzLDEwIEBACiAgICAgTW91c2VDdXJzb3JDb250cm9sbGVyKFBvaW50ZXJDb250cm9sbGVyQ29udGV4dCYgY29udGV4dCk7CiAgICAgfk1vdXNlQ3Vyc29yQ29udHJvbGxlcigpOwogCi0gICAgYm9vbCBnZXRCb3VuZHMoZmxvYXQqIG91dE1pblgsIGZsb2F0KiBvdXRNaW5ZLCBmbG9hdCogb3V0TWF4WCwgZmxvYXQqIG91dE1heFkpIGNvbnN0OworICAgIHN0ZDo6b3B0aW9uYWw8RmxvYXRSZWN0PiBnZXRCb3VuZHMoKSBjb25zdDsKICAgICB2b2lkIG1vdmUoZmxvYXQgZGVsdGFYLCBmbG9hdCBkZWx0YVkpOwotICAgIHZvaWQgc2V0QnV0dG9uU3RhdGUoaW50MzJfdCBidXR0b25TdGF0ZSk7Ci0gICAgaW50MzJfdCBnZXRCdXR0b25TdGF0ZSgpIGNvbnN0OwogICAgIHZvaWQgc2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSk7Ci0gICAgdm9pZCBnZXRQb3NpdGlvbihmbG9hdCogb3V0WCwgZmxvYXQqIG91dFkpIGNvbnN0OworICAgIEZsb2F0UG9pbnQgZ2V0UG9zaXRpb24oKSBjb25zdDsKICAgICBpbnQzMl90IGdldERpc3BsYXlJZCgpIGNvbnN0OwogICAgIHZvaWQgZmFkZShQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6VHJhbnNpdGlvbiB0cmFuc2l0aW9uKTsKICAgICB2b2lkIHVuZmFkZShQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6VHJhbnNpdGlvbiB0cmFuc2l0aW9uKTsKQEAgLTk2LDEzICs5NCwxMSBAQAogICAgICAgICBQb2ludGVySWNvblN0eWxlIHJlcXVlc3RlZFBvaW50ZXJUeXBlOwogICAgICAgICBQb2ludGVySWNvblN0eWxlIHJlc29sdmVkUG9pbnRlclR5cGU7CiAKLSAgICAgICAgaW50MzJfdCBidXR0b25TdGF0ZTsKLQogICAgICAgICBib29sIGFuaW1hdGluZ3tmYWxzZX07CiAKICAgICB9IG1Mb2NrZWQgR1VBUkRFRF9CWShtTG9jayk7CiAKLSAgICBib29sIGdldEJvdW5kc0xvY2tlZChmbG9hdCogb3V0TWluWCwgZmxvYXQqIG91dE1pblksIGZsb2F0KiBvdXRNYXhYLCBmbG9hdCogb3V0TWF4WSkgY29uc3Q7CisgICAgc3RkOjpvcHRpb25hbDxGbG9hdFJlY3Q+IGdldEJvdW5kc0xvY2tlZCgpIGNvbnN0OwogICAgIHZvaWQgc2V0UG9zaXRpb25Mb2NrZWQoZmxvYXQgeCwgZmxvYXQgeSk7CiAKICAgICB2b2lkIHVwZGF0ZVBvaW50ZXJMb2NrZWQoKTsKZGlmZiAtLWdpdCBhL2xpYnMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuY3BwIGIvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5jcHAKaW5kZXggZmVkZjU4ZC4uODhlMzUxOSAxMDA2NDQKLS0tIGEvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5jcHAKKysrIGIvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5jcHAKQEAgLTExNCwxNiArMTE0LDE1IEBACiBQb2ludGVyQ29udHJvbGxlcjo6flBvaW50ZXJDb250cm9sbGVyKCkgewogICAgIG1EaXNwbGF5SW5mb0xpc3RlbmVyLT5vblBvaW50ZXJDb250cm9sbGVyRGVzdHJveWVkKCk7CiAgICAgbVVucmVnaXN0ZXJXaW5kb3dJbmZvc0xpc3RlbmVyKG1EaXNwbGF5SW5mb0xpc3RlbmVyKTsKLSAgICBtQ29udGV4dC5nZXRQb2xpY3koKS0+b25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChBRElTUExBWV9JRF9OT05FLCAwLCAwKTsKKyAgICBtQ29udGV4dC5nZXRQb2xpY3koKS0+b25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChBRElTUExBWV9JRF9OT05FLCBGbG9hdFBvaW50ezAsIDB9KTsKIH0KIAogc3RkOjptdXRleCYgUG9pbnRlckNvbnRyb2xsZXI6OmdldExvY2soKSBjb25zdCB7CiAgICAgcmV0dXJuIG1EaXNwbGF5SW5mb0xpc3RlbmVyLT5tTG9jazsKIH0KIAotYm9vbCBQb2ludGVyQ29udHJvbGxlcjo6Z2V0Qm91bmRzKGZsb2F0KiBvdXRNaW5YLCBmbG9hdCogb3V0TWluWSwgZmxvYXQqIG91dE1heFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG91dE1heFkpIGNvbnN0IHsKLSAgICByZXR1cm4gbUN1cnNvckNvbnRyb2xsZXIuZ2V0Qm91bmRzKG91dE1pblgsIG91dE1pblksIG91dE1heFgsIG91dE1heFkpOworc3RkOjpvcHRpb25hbDxGbG9hdFJlY3Q+IFBvaW50ZXJDb250cm9sbGVyOjpnZXRCb3VuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1DdXJzb3JDb250cm9sbGVyLmdldEJvdW5kcygpOwogfQogCiB2b2lkIFBvaW50ZXJDb250cm9sbGVyOjptb3ZlKGZsb2F0IGRlbHRhWCwgZmxvYXQgZGVsdGFZKSB7CkBAIC0xMzcsMTQgKzEzNiw2IEBACiAgICAgbUN1cnNvckNvbnRyb2xsZXIubW92ZSh0cmFuc2Zvcm1lZC54LCB0cmFuc2Zvcm1lZC55KTsKIH0KIAotdm9pZCBQb2ludGVyQ29udHJvbGxlcjo6c2V0QnV0dG9uU3RhdGUoaW50MzJfdCBidXR0b25TdGF0ZSkgewotICAgIG1DdXJzb3JDb250cm9sbGVyLnNldEJ1dHRvblN0YXRlKGJ1dHRvblN0YXRlKTsKLX0KLQotaW50MzJfdCBQb2ludGVyQ29udHJvbGxlcjo6Z2V0QnV0dG9uU3RhdGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1DdXJzb3JDb250cm9sbGVyLmdldEJ1dHRvblN0YXRlKCk7Ci19Ci0KIHZvaWQgUG9pbnRlckNvbnRyb2xsZXI6OnNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHkpIHsKICAgICBjb25zdCBpbnQzMl90IGRpc3BsYXlJZCA9IG1DdXJzb3JDb250cm9sbGVyLmdldERpc3BsYXlJZCgpOwogICAgIHZlYzIgdHJhbnNmb3JtZWQ7CkBAIC0xNTYsMTUgKzE0NywxMyBAQAogICAgIG1DdXJzb3JDb250cm9sbGVyLnNldFBvc2l0aW9uKHRyYW5zZm9ybWVkLngsIHRyYW5zZm9ybWVkLnkpOwogfQogCi12b2lkIFBvaW50ZXJDb250cm9sbGVyOjpnZXRQb3NpdGlvbihmbG9hdCogb3V0WCwgZmxvYXQqIG91dFkpIGNvbnN0IHsKK0Zsb2F0UG9pbnQgUG9pbnRlckNvbnRyb2xsZXI6OmdldFBvc2l0aW9uKCkgY29uc3QgewogICAgIGNvbnN0IGludDMyX3QgZGlzcGxheUlkID0gbUN1cnNvckNvbnRyb2xsZXIuZ2V0RGlzcGxheUlkKCk7Ci0gICAgbUN1cnNvckNvbnRyb2xsZXIuZ2V0UG9zaXRpb24ob3V0WCwgb3V0WSk7CisgICAgY29uc3QgYXV0byBwID0gbUN1cnNvckNvbnRyb2xsZXIuZ2V0UG9zaXRpb24oKTsKICAgICB7CiAgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhnZXRMb2NrKCkpOwogICAgICAgICBjb25zdCBhdXRvJiB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1Gb3JEaXNwbGF5TG9ja2VkKGRpc3BsYXlJZCk7Ci0gICAgICAgIGNvbnN0IGF1dG8geHkgPSB0cmFuc2Zvcm0uaW52ZXJzZSgpLnRyYW5zZm9ybSgqb3V0WCwgKm91dFkpOwotICAgICAgICAqb3V0WCA9IHh5Lng7Ci0gICAgICAgICpvdXRZID0geHkueTsKKyAgICAgICAgcmV0dXJuIEZsb2F0UG9pbnR7dHJhbnNmb3JtLmludmVyc2UoKS50cmFuc2Zvcm0ocC54LCBwLnkpfTsKICAgICB9CiB9CiAKQEAgLTI2MiwxOSArMjUxLDMxIEBACiB9CiAKIHZvaWQgUG9pbnRlckNvbnRyb2xsZXI6OnNldERpc3BsYXlWaWV3cG9ydChjb25zdCBEaXNwbGF5Vmlld3BvcnQmIHZpZXdwb3J0KSB7Ci0gICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKGdldExvY2soKSk7CisgICAgc3RydWN0IFBvaW50ZXJEaXNwbGF5Q2hhbmdlQXJncyB7CisgICAgICAgIGludDMyX3QgZGlzcGxheUlkOworICAgICAgICBGbG9hdFBvaW50IGN1cnNvclBvc2l0aW9uOworICAgIH07CisgICAgc3RkOjpvcHRpb25hbDxQb2ludGVyRGlzcGxheUNoYW5nZUFyZ3M+IHBvaW50ZXJEaXNwbGF5Q2hhbmdlZDsKIAotICAgIGJvb2wgZ2V0QWRkaXRpb25hbE1vdXNlUmVzb3VyY2VzID0gZmFsc2U7Ci0gICAgaWYgKG1Mb2NrZWQucHJlc2VudGF0aW9uID09IFBvaW50ZXJDb250cm9sbGVyOjpQcmVzZW50YXRpb246OlBPSU5URVIgfHwKLSAgICAgICAgbUxvY2tlZC5wcmVzZW50YXRpb24gPT0gUG9pbnRlckNvbnRyb2xsZXI6OlByZXNlbnRhdGlvbjo6U1RZTFVTX0hPVkVSKSB7Ci0gICAgICAgIGdldEFkZGl0aW9uYWxNb3VzZVJlc291cmNlcyA9IHRydWU7Ci0gICAgfQotICAgIG1DdXJzb3JDb250cm9sbGVyLnNldERpc3BsYXlWaWV3cG9ydCh2aWV3cG9ydCwgZ2V0QWRkaXRpb25hbE1vdXNlUmVzb3VyY2VzKTsKLSAgICBpZiAodmlld3BvcnQuZGlzcGxheUlkICE9IG1Mb2NrZWQucG9pbnRlckRpc3BsYXlJZCkgewotICAgICAgICBmbG9hdCB4UG9zLCB5UG9zOwotICAgICAgICBtQ3Vyc29yQ29udHJvbGxlci5nZXRQb3NpdGlvbigmeFBvcywgJnlQb3MpOwotICAgICAgICBtQ29udGV4dC5nZXRQb2xpY3koKS0+b25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZCh2aWV3cG9ydC5kaXNwbGF5SWQsIHhQb3MsIHlQb3MpOwotICAgICAgICBtTG9ja2VkLnBvaW50ZXJEaXNwbGF5SWQgPSB2aWV3cG9ydC5kaXNwbGF5SWQ7CisgICAgeyAvLyBhY3F1aXJlIGxvY2sKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKGdldExvY2soKSk7CisKKyAgICAgICAgYm9vbCBnZXRBZGRpdGlvbmFsTW91c2VSZXNvdXJjZXMgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1Mb2NrZWQucHJlc2VudGF0aW9uID09IFBvaW50ZXJDb250cm9sbGVyOjpQcmVzZW50YXRpb246OlBPSU5URVIgfHwKKyAgICAgICAgICAgIG1Mb2NrZWQucHJlc2VudGF0aW9uID09IFBvaW50ZXJDb250cm9sbGVyOjpQcmVzZW50YXRpb246OlNUWUxVU19IT1ZFUikgeworICAgICAgICAgICAgZ2V0QWRkaXRpb25hbE1vdXNlUmVzb3VyY2VzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtQ3Vyc29yQ29udHJvbGxlci5zZXREaXNwbGF5Vmlld3BvcnQodmlld3BvcnQsIGdldEFkZGl0aW9uYWxNb3VzZVJlc291cmNlcyk7CisgICAgICAgIGlmICh2aWV3cG9ydC5kaXNwbGF5SWQgIT0gbUxvY2tlZC5wb2ludGVyRGlzcGxheUlkKSB7CisgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJEaXNwbGF5SWQgPSB2aWV3cG9ydC5kaXNwbGF5SWQ7CisgICAgICAgICAgICBwb2ludGVyRGlzcGxheUNoYW5nZWQgPSB7dmlld3BvcnQuZGlzcGxheUlkLCBtQ3Vyc29yQ29udHJvbGxlci5nZXRQb3NpdGlvbigpfTsKKyAgICAgICAgfQorICAgIH0gLy8gcmVsZWFzZSBsb2NrCisKKyAgICBpZiAocG9pbnRlckRpc3BsYXlDaGFuZ2VkKSB7CisgICAgICAgIC8vIE5vdGlmeSB0aGUgcG9saWN5IHdpdGhvdXQgaG9sZGluZyB0aGUgcG9pbnRlciBjb250cm9sbGVyIGxvY2suCisgICAgICAgIG1Db250ZXh0LmdldFBvbGljeSgpLT5vblBvaW50ZXJEaXNwbGF5SWRDaGFuZ2VkKHBvaW50ZXJEaXNwbGF5Q2hhbmdlZC0+ZGlzcGxheUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyRGlzcGxheUNoYW5nZWQtPmN1cnNvclBvc2l0aW9uKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuaCBiL2xpYnMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuaAppbmRleCA0OGQ1YTU3Li5jYTE0YjZlIDEwMDY0NAotLS0gYS9saWJzL2lucHV0L1BvaW50ZXJDb250cm9sbGVyLmgKKysrIGIvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5oCkBAIC01MCwyMSArNTAsMTkgQEAKIAogICAgIH5Qb2ludGVyQ29udHJvbGxlcigpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBib29sIGdldEJvdW5kcyhmbG9hdCogb3V0TWluWCwgZmxvYXQqIG91dE1pblksIGZsb2F0KiBvdXRNYXhYLCBmbG9hdCogb3V0TWF4WSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIG1vdmUoZmxvYXQgZGVsdGFYLCBmbG9hdCBkZWx0YVkpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRCdXR0b25TdGF0ZShpbnQzMl90IGJ1dHRvblN0YXRlKTsKLSAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QnV0dG9uU3RhdGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSk7Ci0gICAgdmlydHVhbCB2b2lkIGdldFBvc2l0aW9uKGZsb2F0KiBvdXRYLCBmbG9hdCogb3V0WSkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQzMl90IGdldERpc3BsYXlJZCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBmYWRlKFRyYW5zaXRpb24gdHJhbnNpdGlvbik7Ci0gICAgdmlydHVhbCB2b2lkIHVuZmFkZShUcmFuc2l0aW9uIHRyYW5zaXRpb24pOwotICAgIHZpcnR1YWwgdm9pZCBzZXREaXNwbGF5Vmlld3BvcnQoY29uc3QgRGlzcGxheVZpZXdwb3J0JiB2aWV3cG9ydCk7CisgICAgc3RkOjpvcHRpb25hbDxGbG9hdFJlY3Q+IGdldEJvdW5kcygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgbW92ZShmbG9hdCBkZWx0YVgsIGZsb2F0IGRlbHRhWSkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5KSBvdmVycmlkZTsKKyAgICBGbG9hdFBvaW50IGdldFBvc2l0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgaW50MzJfdCBnZXREaXNwbGF5SWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGZhZGUoVHJhbnNpdGlvbiB0cmFuc2l0aW9uKSBvdmVycmlkZTsKKyAgICB2b2lkIHVuZmFkZShUcmFuc2l0aW9uIHRyYW5zaXRpb24pIG92ZXJyaWRlOworICAgIHZvaWQgc2V0RGlzcGxheVZpZXdwb3J0KGNvbnN0IERpc3BsYXlWaWV3cG9ydCYgdmlld3BvcnQpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkIHNldFByZXNlbnRhdGlvbihQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3BvdHMoY29uc3QgUG9pbnRlckNvb3Jkcyogc3BvdENvb3JkcywgY29uc3QgdWludDMyX3QqIHNwb3RJZFRvSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFNldDMyIHNwb3RJZEJpdHMsIGludDMyX3QgZGlzcGxheUlkKTsKLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJTcG90cygpOworICAgIHZvaWQgc2V0UHJlc2VudGF0aW9uKFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIG92ZXJyaWRlOworICAgIHZvaWQgc2V0U3BvdHMoY29uc3QgUG9pbnRlckNvb3Jkcyogc3BvdENvb3JkcywgY29uc3QgdWludDMyX3QqIHNwb3RJZFRvSW5kZXgsCisgICAgICAgICAgICAgICAgICBCaXRTZXQzMiBzcG90SWRCaXRzLCBpbnQzMl90IGRpc3BsYXlJZCkgb3ZlcnJpZGU7CisgICAgdm9pZCBjbGVhclNwb3RzKCkgb3ZlcnJpZGU7CiAKICAgICB2b2lkIHVwZGF0ZVBvaW50ZXJJY29uKFBvaW50ZXJJY29uU3R5bGUgaWNvbklkKTsKICAgICB2b2lkIHNldEN1c3RvbVBvaW50ZXJJY29uKGNvbnN0IFNwcml0ZUljb24mIGljb24pOwpkaWZmIC0tZ2l0IGEvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlckNvbnRleHQuaCBiL2xpYnMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXJDb250ZXh0LmgKaW5kZXggOTZkODNhNS4uZjZmNWQzYiAxMDA2NDQKLS0tIGEvbGlicy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlckNvbnRleHQuaAorKysgYi9saWJzL2lucHV0L1BvaW50ZXJDb250cm9sbGVyQ29udGV4dC5oCkBAIC04MSw3ICs4MSw3IEBACiAgICAgdmlydHVhbCBQb2ludGVySWNvblN0eWxlIGdldERlZmF1bHRQb2ludGVySWNvbklkKCkgPSAwOwogICAgIHZpcnR1YWwgUG9pbnRlckljb25TdHlsZSBnZXREZWZhdWx0U3R5bHVzSWNvbklkKCkgPSAwOwogICAgIHZpcnR1YWwgUG9pbnRlckljb25TdHlsZSBnZXRDdXN0b21Qb2ludGVySWNvbklkKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBvblBvaW50ZXJEaXNwbGF5SWRDaGFuZ2VkKGludDMyX3QgZGlzcGxheUlkLCBmbG9hdCB4UG9zLCBmbG9hdCB5UG9zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uUG9pbnRlckRpc3BsYXlJZENoYW5nZWQoaW50MzJfdCBkaXNwbGF5SWQsIGNvbnN0IEZsb2F0UG9pbnQmIHBvc2l0aW9uKSA9IDA7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvbGlicy9pbnB1dC90ZXN0cy9Qb2ludGVyQ29udHJvbGxlcl90ZXN0LmNwcCBiL2xpYnMvaW5wdXQvdGVzdHMvUG9pbnRlckNvbnRyb2xsZXJfdGVzdC5jcHAKaW5kZXggYzgyMGQwMC4uMjM3OGQ0MiAxMDA2NDQKLS0tIGEvbGlicy9pbnB1dC90ZXN0cy9Qb2ludGVyQ29udHJvbGxlcl90ZXN0LmNwcAorKysgYi9saWJzL2lucHV0L3Rlc3RzL1BvaW50ZXJDb250cm9sbGVyX3Rlc3QuY3BwCkBAIC02MCw3ICs2MCw3IEBACiAgICAgdmlydHVhbCBQb2ludGVySWNvblN0eWxlIGdldERlZmF1bHRQb2ludGVySWNvbklkKCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBQb2ludGVySWNvblN0eWxlIGdldERlZmF1bHRTdHlsdXNJY29uSWQoKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIFBvaW50ZXJJY29uU3R5bGUgZ2V0Q3VzdG9tUG9pbnRlckljb25JZCgpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgdm9pZCBvblBvaW50ZXJEaXNwbGF5SWRDaGFuZ2VkKGludDMyX3QgZGlzcGxheUlkLCBmbG9hdCB4UG9zLCBmbG9hdCB5UG9zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChpbnQzMl90IGRpc3BsYXlJZCwgY29uc3QgRmxvYXRQb2ludCYgcG9zaXRpb24pIG92ZXJyaWRlOwogCiAgICAgYm9vbCBhbGxSZXNvdXJjZXNBcmVMb2FkZWQoKTsKICAgICBib29sIG5vUmVzb3VyY2VzQXJlTG9hZGVkKCk7CkBAIC0xNDMsOCArMTQzLDggQEAKIH0KIAogdm9pZCBNb2NrUG9pbnRlckNvbnRyb2xsZXJQb2xpY3lJbnRlcmZhY2U6Om9uUG9pbnRlckRpc3BsYXlJZENoYW5nZWQoaW50MzJfdCBkaXNwbGF5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKnhQb3MqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qeVBvcyovKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiAvKnBvc2l0aW9uKi8KKykgewogICAgIGxhdGVzdFBvaW50ZXJEaXNwbGF5SWQgPSBkaXNwbGF5SWQ7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvRXhpZkludGVyZmFjZS5qYXZhCmluZGV4IDIzZjg3YWIuLmY4NmI5YWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuamF2YQpAQCAtMTU2Niw3ICsxNTY2LDcgQEAKICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBsb2FkQXR0cmlidXRlcyhpbik7CisgICAgICAgICAgICBsb2FkQXR0cmlidXRlcyhpbiwgZmlsZURlc2NyaXB0b3IpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgY2xvc2VRdWlldGx5KGluKTsKICAgICAgICAgICAgIGlmIChpc0ZkRHVwZWQpIHsKQEAgLTE2MzcsNyArMTYzNyw3IEBACiAgICAgICAgICAgICAgICAgbVNlZWthYmxlRmlsZURlc2NyaXB0b3IgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGxvYWRBdHRyaWJ1dGVzKGlucHV0U3RyZWFtKTsKKyAgICAgICAgbG9hZEF0dHJpYnV0ZXMoaW5wdXRTdHJlYW0sIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk2Myw3ICsxOTYzLDcgQEAKICAgICAgKiBUaGlzIGZ1bmN0aW9uIGRlY2lkZXMgd2hpY2ggcGFyc2VyIHRvIHJlYWQgdGhlIGltYWdlIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0KICAgICAgKiB0eXBlIGFuZCB0aGUgY29udGVudCBvZiB0aGUgaW5wdXQgc3RyZWFtLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkQXR0cmlidXRlcyhATm9uTnVsbCBJbnB1dFN0cmVhbSBpbikgeworICAgIHByaXZhdGUgdm9pZCBsb2FkQXR0cmlidXRlcyhATm9uTnVsbCBJbnB1dFN0cmVhbSBpbiwgQE51bGxhYmxlIEZpbGVEZXNjcmlwdG9yIGZkKSB7CiAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImlucHV0c3RyZWFtIHNob3VsZG4ndCBiZSBudWxsIik7CiAgICAgICAgIH0KQEAgLTE5OTMsNyArMTk5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjYXNlIElNQUdFX1RZUEVfSEVJRjogewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZkF0dHJpYnV0ZXMoaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZkF0dHJpYnV0ZXMoaW5wdXRTdHJlYW0sIGZkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU1BR0VfVFlQRV9PUkY6IHsKQEAgLTI1ODAsNyArMjU4MCw3IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzU2Vla2FibGVGRChpbi5nZXRGRCgpKSkgewogICAgICAgICAgICAgICAgIG1TZWVrYWJsZUZpbGVEZXNjcmlwdG9yID0gaW4uZ2V0RkQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvYWRBdHRyaWJ1dGVzKGluKTsKKyAgICAgICAgICAgIGxvYWRBdHRyaWJ1dGVzKGluLCBudWxsKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGNsb3NlUXVpZXRseShpbik7CiAgICAgICAgICAgICBpZiAobW9kZXJuRmQgIT0gbnVsbCkgewpAQCAtMzA2OCw1OSArMzA2OCw2NiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGdldEhlaWZBdHRyaWJ1dGVzKEJ5dGVPcmRlcmVkRGF0YUlucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBnZXRIZWlmQXR0cmlidXRlcyhCeXRlT3JkZXJlZERhdGFJbnB1dFN0cmVhbSBpbiwgQE51bGxhYmxlIEZpbGVEZXNjcmlwdG9yIGZkKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlciByZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0cmlldmVyLnNldERhdGFTb3VyY2UobmV3IE1lZGlhRGF0YVNvdXJjZSgpIHsKLSAgICAgICAgICAgICAgICBsb25nIG1Qb3NpdGlvbjsKKyAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0cmlldmVyLnNldERhdGFTb3VyY2UoZmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShuZXcgTWVkaWFEYXRhU291cmNlKCkgeworICAgICAgICAgICAgICAgICAgICBsb25nIG1Qb3NpdGlvbjsKIAotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7fQogCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGludCByZWFkQXQobG9uZyBwb3NpdGlvbiwgYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IHNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWRBdChsb25nIHBvc2l0aW9uLCBieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb3NpdGlvbiAhPSBwb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBhbGxvdyBzZWVrIHRvIHBvc2l0aW9ucyBhZnRlciB0aGUgYXZhaWxhYmxlIGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgc3RyZWFtIHdvbid0IGJlIGFibGUgdG8gc2VlayBiYWNrIHRoZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHdlIGhpdCBhbiBleGNlcHRpb24gYmVmb3JlIChtUG9zaXRpb24gc2V0IHRvIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGl0IHRyeSB0aGUgc2VlayBpbiBob3BlIGl0IG1pZ2h0IHJlY292ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9zaXRpb24gPj0gMCAmJiBwb3NpdGlvbiA+PSBtUG9zaXRpb24gKyBpbi5hdmFpbGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLnNlZWsocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVhZCB3aWxsIGNhdXNlIHVzIHRvIGdvIG92ZXIgdGhlIGF2YWlsYWJsZSBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWR1Y2UgdGhlIHNpemUgc28gdGhhdCB3ZSBzdGF5IGluIHRoZSBhdmFpbGFibGUgcmFuZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBpbnB1dCBzdHJlYW0gbWF5IG5vdCBiZSBhYmxlIHRvIHNlZWsgYmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IGluLmF2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBpbi5hdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaW4ucmVhZChidWZmZXIsIG9mZnNldCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3NpdGlvbiArPSBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFic29yYiB0aGUgZXhjZXB0aW9uIGFuZCBmYWxsIHRocm91Z2ggdG8gdGhlICdmYWlsZWQgcmVhZCcgcGF0aCBiZWxvdworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uID0gLTE7IC8vIG5lZWQgdG8gc2VlayBvbiBuZXh0IHJlYWQKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb3NpdGlvbiAhPSBwb3NpdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGFsbG93IHNlZWsgdG8gcG9zaXRpb25zIGFmdGVyIHRoZSBhdmFpbGFibGUgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlucHV0IHN0cmVhbSB3b24ndCBiZSBhYmxlIHRvIHNlZWsgYmFjayB0aGVuLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHdlIGhpdCBhbiBleGNlcHRpb24gYmVmb3JlIChtUG9zaXRpb24gc2V0IHRvIC0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgaXQgdHJ5IHRoZSBzZWVrIGluIGhvcGUgaXQgbWlnaHQgcmVjb3Zlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvc2l0aW9uID49IDAgJiYgcG9zaXRpb24gPj0gbVBvc2l0aW9uICsgaW4uYXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5zZWVrKHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlYWQgd2lsbCBjYXVzZSB1cyB0byBnbyBvdmVyIHRoZSBhdmFpbGFibGUgYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWR1Y2UgdGhlIHNpemUgc28gdGhhdCB3ZSBzdGF5IGluIHRoZSBhdmFpbGFibGUgcmFuZ2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhlIGlucHV0IHN0cmVhbSBtYXkgbm90IGJlIGFibGUgdG8gc2VlayBiYWNrLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBpbi5hdmFpbGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBpbi5hdmFpbGFibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGluLnJlYWQoYnVmZmVyLCBvZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uICs9IGJ5dGVzUmVhZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXNSZWFkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb24gPSAtMTsgLy8gbmVlZCB0byBzZWVrIG9uIG5leHQgcmVhZAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZyBleGlmT2Zmc2V0U3RyID0gcmV0cmlldmVyLmV4dHJhY3RNZXRhZGF0YSgKICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfRVhJRl9PRkZTRVQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuamF2YQppbmRleCA1YmM4YzA0Li4wYTBhNjI2IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFDYXMuamF2YQpAQCAtNDM2LDcgKzQzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChtRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1FdmVudEhhbmRsZXIuc2VuZE1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FdmVudEhhbmRsZXIub2J0YWluTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXIuTVNHX0NBU19FVkVOVCwgZXZlbnQsIGFyZywgZGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlci5NU0dfQ0FTX0VWRU5ULCBldmVudCwgYXJnLCB0b0J5dGVzKGRhdGEpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZvcm1hdC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRm9ybWF0LmphdmEKaW5kZXggOWM2MjliYi4uYjFiN2Q0MCAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRm9ybWF0LmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRm9ybWF0LmphdmEKQEAgLTEyMTAsNyArMTIxMCw3IEBACiAKICAgICAvKioKICAgICAgKiBBIGtleSBkZXNjcmliaW5nIHRoZSBkZXNpcmVkIGJpdHJhdGUgbW9kZSB0byBiZSB1c2VkIGJ5IGFuIGVuY29kZXIuCi0gICAgICogQ29uc3RhbnRzIGFyZSBkZWNsYXJlZCBpbiB7QGxpbmsgTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXN9LgorICAgICAqIENvbnN0YW50cyBhcmUgZGVjbGFyZWQgaW4ge0BsaW5rIE1lZGlhQ29kZWNJbmZvLkVuY29kZXJDYXBhYmlsaXRpZXN9LgogICAgICAqCiAgICAgICogQHNlZSBNZWRpYUNvZGVjSW5mby5FbmNvZGVyQ2FwYWJpbGl0aWVzI2lzQml0cmF0ZU1vZGVTdXBwb3J0ZWQoaW50KQogICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJNYW5hZ2VyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlck1hbmFnZXIuamF2YQppbmRleCAwZTllZjRjLi5hZTgxMjFhIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlck1hbmFnZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlck1hbmFnZXIuamF2YQpAQCAtOTQsMTIgKzk0LDE3IEBACiAgICAgICAgICAgICBvcmlnaW5hdG9ySWRlbnRpdHkucGFja2FnZU5hbWUgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50T3BQYWNrYWdlTmFtZSgpOwogCiAgICAgICAgICAgICB0cnkgKFNhZmVDbG9zZWFibGUgaWdub3JlZCA9IENsZWFyQ2FsbGluZ0lkZW50aXR5Q29udGV4dC5jcmVhdGUoKSkgewotICAgICAgICAgICAgICAgIExpc3Q8TW9kdWxlUHJvcGVydGllcz4gbW9kdWxlUHJvcGVydGllc0xpc3QgPSBzb3VuZFRyaWdnZXJTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAubGlzdE1vZHVsZVByb3BlcnRpZXMob3JpZ2luYXRvcklkZW50aXR5KTsKLSAgICAgICAgICAgICAgICBpZiAoIW1vZHVsZVByb3BlcnRpZXNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIE1vZHVsZVByb3BlcnRpZXMgbW9kdWxlUHJvcGVydGllcyA9IHNvdW5kVHJpZ2dlclNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC5saXN0TW9kdWxlUHJvcGVydGllcyhvcmlnaW5hdG9ySWRlbnRpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocHJvcCAtPiAhcHJvcC5nZXRTdXBwb3J0ZWRNb2RlbEFyY2goKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKFNvdW5kVHJpZ2dlci5GQUtFX0hBTF9BUkNIKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgLm9yRWxzZShudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobW9kdWxlUHJvcGVydGllcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Tb3VuZFRyaWdnZXJTZXNzaW9uID0gc291bmRUcmlnZ2VyU2VydmljZS5hdHRhY2hBc09yaWdpbmF0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hdG9ySWRlbnRpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQcm9wZXJ0aWVzTGlzdC5nZXQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpbmRlclRva2VuKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbiA9IG51bGw7CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvSVR2SW5wdXRTZXNzaW9uV3JhcHBlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L0lUdklucHV0U2Vzc2lvbldyYXBwZXIuamF2YQppbmRleCA3OTQ2YmFlZS4uZjkzOWY1MiAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L0lUdklucHV0U2Vzc2lvbldyYXBwZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvSVR2SW5wdXRTZXNzaW9uV3JhcHBlci5qYXZhCkBAIC0yODAsNyArMjgwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgRE9fTk9USUZZX1RWX01FU1NBR0U6IHsKICAgICAgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gKFNvbWVBcmdzKSBtc2cub2JqOwotICAgICAgICAgICAgICAgIG1UdklucHV0U2Vzc2lvbkltcGwub25Udk1lc3NhZ2VSZWNlaXZlZCgoU3RyaW5nKSBhcmdzLmFyZzEsIChCdW5kbGUpIGFyZ3MuYXJnMik7CisgICAgICAgICAgICAgICAgbVR2SW5wdXRTZXNzaW9uSW1wbC5vblR2TWVzc2FnZVJlY2VpdmVkKChJbnRlZ2VyKSBhcmdzLmFyZzEsIChCdW5kbGUpIGFyZ3MuYXJnMik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWZhdWx0OiB7CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvVHZJbnB1dE1hbmFnZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS90di9UdklucHV0TWFuYWdlci5qYXZhCmluZGV4IDdkNmE4YjQuLmVmMmI1YTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS90di9UdklucHV0TWFuYWdlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS90di9UdklucHV0TWFuYWdlci5qYXZhCkBAIC0xNDksMTAgKzE0OSw0NSBAQAogICAgIC8qKgogICAgICAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCBhcyBhIHtAbGluayBCdW5kbGV9IGtleSBmb3IgVFYgbWVzc2FnZXMuIFRoZSB2YWx1ZSBvZiB0aGUga2V5CiAgICAgICogaWRlbnRpZmllcyB0aGUgc3RyZWFtIG9uIHRoZSBUViBpbnB1dCBzb3VyY2UgZm9yIHdoaWNoIHRoZSB3YXRlcm1hcmsgZXZlbnQgaXMgcmVsZXZhbnQgdG8uCisgICAgICoKKyAgICAgKiA8cD4gVHlwZTogU3RyaW5nCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFZfTUVTU0FHRV9LRVlfU1RSRUFNX0lEID0KICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnR2LlR2SW5wdXRNYW5hZ2VyLnN0cmVhbV9pZCI7CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgYXMgYSB7QGxpbmsgQnVuZGxlfSBrZXkgZm9yIFRWIG1lc3NhZ2VzLiBUaGUgdmFsdWUgb2YgdGhlIGtleQorICAgICAqIGlkZW50aWZpZXMgdGhlIHN1YnR5cGUgb2YgdGhlIGRhdGEsIHN1Y2ggYXMgdGhlIGZvcm1hdCBvZiB0aGUgQ0MgZGF0YS4gVGhlIGZvcm1hdAorICAgICAqIGZvdW5kIGF0IHRoaXMga2V5IGNhbiB0aGVuIGJlIHVzZWQgdG8gaWRlbnRpZnkgaG93IHRvIHBhcnNlIHRoZSBkYXRhIGF0CisgICAgICoge0BsaW5rICNUVl9NRVNTQUdFX0tFWV9SQVdfREFUQX0uCisgICAgICoKKyAgICAgKiBUbyBwYXJzZSB0aGUgcmF3IGRhdGEgYnNlZCBvbiB0aGUgc3VidHlwZSwgcGxlYXNlIHJlZmVyIHRvIHRoZSBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIG9mIHRoZQorICAgICAqIGNvbmNlcm5pbmcgc3VidHlwZS4gRm9yIGV4YW1wbGUsIGZvciB0aGUgc3VidHlwZSAiQVRTQyBBLzMzNSIgZm9yIHdhdGVybWFya2luZywgdGhlCisgICAgICogZG9jdW1lbnQgZm9yIEEvMzM1IGZyb20gdGhlIEFUU0Mgc3RhbmRhcmQgZGV0YWlscyBob3cgdGhpcyBkYXRhIGlzIGZvcm1hdHRlZC4KKyAgICAgKgorICAgICAqIFNvbWUgb3RoZXIgZXhhbXBsZXMgb2YgY29tbW9uIGZvcm1hdHMgaW5jbHVkZToKKyAgICAgKiA8dWw+CisgICAgICogICAgIDxsaT5XYXRlcm1hcmtpbmcgLSBBVFNDIEEvMzM2PC9saT4KKyAgICAgKiAgICAgPGxpPkNsb3NlZCBDYXB0aW9uaW5nIC0gQ1RBIDYwOC1FPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPHA+IFR5cGU6IFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRWX01FU1NBR0VfS0VZX1NVQlRZUEUgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEudHYuVHZJbnB1dE1hbmFnZXIuc3VidHlwZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgYXMgYSB7QGxpbmsgQnVuZGxlfSBrZXkgZm9yIFRWIG1lc3NhZ2VzLiBUaGUgdmFsdWUgb2YgdGhlIGtleQorICAgICAqIHN0b3JlcyB0aGUgcmF3IGRhdGEgY29udGFpbmVkIGluIHRoaXMgVFYgTWVzc2FnZS4gVGhlIGZvcm1hdCBvZiB0aGlzIGRhdGEgaXMgZGV0ZXJtaW5lZAorICAgICAqIGJ5IHRoZSBmb3JtYXQgZGVmaW5lZCBieSB0aGUgc3VidHlwZSwgZm91bmQgdXNpbmcgdGhlIGtleSBhdAorICAgICAqIHtAbGluayAjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0uIFNlZSB7QGxpbmsgI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9IGZvciBtb3JlCisgICAgICogaW5mb3JtYXRpb24gb24gaG93IHRvIHBhcnNlIHRoaXMgZGF0YS4KKyAgICAgKgorICAgICAqIDxwPiBUeXBlOiBieXRlW10KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUVl9NRVNTQUdFX0tFWV9SQVdfREFUQSA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS50di5UdklucHV0TWFuYWdlci5yYXdfZGF0YSI7CisKICAgICBzdGF0aWMgZmluYWwgaW50IFZJREVPX1VOQVZBSUxBQkxFX1JFQVNPTl9TVEFSVCA9IDA7CiAgICAgc3RhdGljIGZpbmFsIGludCBWSURFT19VTkFWQUlMQUJMRV9SRUFTT05fRU5EID0gMTg7CiAKQEAgLTgwMiw3ICs4MzcsMTMgQEAKICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIHNlc3Npb24gQSB7QGxpbmsgVHZJbnB1dE1hbmFnZXIuU2Vzc2lvbn0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FsbGJhY2suCiAgICAgICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIG1lc3NhZ2UgcmVjZWl2ZWQsIHN1Y2ggYXMge0BsaW5rICNUVl9NRVNTQUdFX1RZUEVfV0FURVJNQVJLfQotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmF3IGRhdGEgb2YgdGhlIG1lc3NhZ2UKKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJhdyBkYXRhIG9mIHRoZSBtZXNzYWdlLiBUaGUgYnVuZGxlIGtleXMgYXJlOgorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1RSRUFNX0lEfSwKKyAgICAgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9LAorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfUkFXX0RBVEF9LgorICAgICAgICAgKiAgICAgICAgICAgICBTZWUge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgICAgICAgICAqICAgICAgICAgICAgIGhvdyB0byBwYXJzZSB0aGlzIGRhdGEuCisgICAgICAgICAqCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBvblR2TWVzc2FnZShTZXNzaW9uIHNlc3Npb24sIEBUdklucHV0TWFuYWdlci5Udk1lc3NhZ2VUeXBlIGludCB0eXBlLAogICAgICAgICAgICAgICAgIEJ1bmRsZSBkYXRhKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvVHZJbnB1dFNlcnZpY2UuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS90di9UdklucHV0U2VydmljZS5qYXZhCmluZGV4IDNjNmVkOTEuLjBkMjgzZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS90di9UdklucHV0U2VydmljZS5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS90di9UdklucHV0U2VydmljZS5qYXZhCkBAIC0xMDMwLDcgKzEwMzAsMTIgQEAKICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIHR5cGUgVGhlIG9mIG1lc3NhZ2UgdGhhdCB3YXMgc2VudCwgc3VjaCBhcwogICAgICAgICAgKiB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9UWVBFX1dBVEVSTUFSS30KLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgc2VudCB3aXRoIHRoZSBtZXNzYWdlLgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmF3IGRhdGEgb2YgdGhlIG1lc3NhZ2UuIFRoZSBidW5kbGUga2V5cyBhcmU6CisgICAgICAgICAqICAgICAgICAgICAgIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX0tFWV9TVFJFQU1fSUR9LAorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0sCisgICAgICAgICAqICAgICAgICAgICAgIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX0tFWV9SQVdfREFUQX0uCisgICAgICAgICAqICAgICAgICAgICAgIFNlZSB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKyAgICAgICAgICogICAgICAgICAgICAgaG93IHRvIHBhcnNlIHRoaXMgZGF0YS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVR2TWVzc2FnZShAVHZJbnB1dE1hbmFnZXIuVHZNZXNzYWdlVHlwZSBpbnQgdHlwZSwKICAgICAgICAgICAgICAgICBATm9uTnVsbCBCdW5kbGUgZGF0YSkgewpAQCAtMTUwMCw5ICsxNTA1LDE0IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIG1lc3NhZ2UgcmVjZWl2ZWQsIHN1Y2ggYXMKICAgICAgICAgICoge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfVFlQRV9XQVRFUk1BUkt9Ci0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByYXcgZGF0YSBvZiB0aGUgbWVzc2FnZQorICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmF3IGRhdGEgb2YgdGhlIG1lc3NhZ2UuIFRoZSBidW5kbGUga2V5cyBhcmU6CisgICAgICAgICAqICAgICAgICAgICAgIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX0tFWV9TVFJFQU1fSUR9LAorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0sCisgICAgICAgICAqICAgICAgICAgICAgIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX0tFWV9SQVdfREFUQX0uCisgICAgICAgICAqICAgICAgICAgICAgIFNlZSB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKyAgICAgICAgICogICAgICAgICAgICAgaG93IHRvIHBhcnNlIHRoaXMgZGF0YS4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVHZNZXNzYWdlKEBOb25OdWxsIEBUdklucHV0TWFuYWdlci5Udk1lc3NhZ2VUeXBlIFN0cmluZyB0eXBlLAorICAgICAgICBwdWJsaWMgdm9pZCBvblR2TWVzc2FnZShAVHZJbnB1dE1hbmFnZXIuVHZNZXNzYWdlVHlwZSBpbnQgdHlwZSwKICAgICAgICAgICAgICAgICBATm9uTnVsbCBCdW5kbGUgZGF0YSkgewogICAgICAgICB9CiAKQEAgLTIwNTUsNyArMjA2NSw3IEBACiAgICAgICAgICAgICBvbkFkQnVmZmVyUmVhZHkoYnVmZmVyKTsKICAgICAgICAgfQogCi0gICAgICAgIHZvaWQgb25Udk1lc3NhZ2VSZWNlaXZlZChTdHJpbmcgdHlwZSwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgdm9pZCBvblR2TWVzc2FnZVJlY2VpdmVkKGludCB0eXBlLCBCdW5kbGUgZGF0YSkgewogICAgICAgICAgICAgb25Udk1lc3NhZ2UodHlwZSwgZGF0YSk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L1R2Vmlldy5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L1R2Vmlldy5qYXZhCmluZGV4IDE5YTJlNWQuLjhhODg2ODMyIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvVHZWaWV3LmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L1R2Vmlldy5qYXZhCkBAIC0xMjU0LDcgKzEyNTQsMTIgQEAKICAgICAgICAgICogQHBhcmFtIGlucHV0SWQgVGhlIElEIG9mIHRoZSBUViBpbnB1dCBib3VuZCB0byB0aGlzIHZpZXcuCiAgICAgICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIG1lc3NhZ2UgcmVjZWl2ZWQsIHN1Y2ggYXMKICAgICAgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfVFlQRV9XQVRFUk1BUkt9Ci0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByYXcgZGF0YSBvZiB0aGUgbWVzc2FnZQorICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmF3IGRhdGEgb2YgdGhlIG1lc3NhZ2UuIFRoZSBidW5kbGUga2V5cyBhcmU6CisgICAgICAgICAqICAgICAgICAgICAgIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX0tFWV9TVFJFQU1fSUR9LAorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0sCisgICAgICAgICAqICAgICAgICAgICAgIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX0tFWV9SQVdfREFUQX0uCisgICAgICAgICAqICAgICAgICAgICAgIFNlZSB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKyAgICAgICAgICogICAgICAgICAgICAgaG93IHRvIHBhcnNlIHRoaXMgZGF0YS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uVHZNZXNzYWdlKEBOb25OdWxsIFN0cmluZyBpbnB1dElkLAogICAgICAgICAgICAgICAgIEBUdklucHV0TWFuYWdlci5Udk1lc3NhZ2VUeXBlIGludCB0eXBlLCBATm9uTnVsbCBCdW5kbGUgZGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L2ludGVyYWN0aXZlL1R2SW50ZXJhY3RpdmVBcHBTZXJ2aWNlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFNlcnZpY2UuamF2YQppbmRleCA3ZGZlMTZhLi42OWZmOWM2IDEwMDc1NQotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFNlcnZpY2UuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFNlcnZpY2UuamF2YQpAQCAtOTE5LDcgKzkxOSwxMiBAQAogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBtZXNzYWdlIHJlY2VpdmVkLCBzdWNoIGFzCiAgICAgICAgICAqIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX1RZUEVfV0FURVJNQVJLfQotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmF3IGRhdGEgb2YgdGhlIG1lc3NhZ2UKKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJhdyBkYXRhIG9mIHRoZSBtZXNzYWdlLiBUaGUgYnVuZGxlIGtleXMgYXJlOgorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1RSRUFNX0lEfSwKKyAgICAgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9LAorICAgICAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfUkFXX0RBVEF9LgorICAgICAgICAgKiAgICAgICAgICAgICBTZWUge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgICAgICAgICAqICAgICAgICAgICAgIGhvdyB0byBwYXJzZSB0aGlzIGRhdGEuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBvblR2TWVzc2FnZShAVHZJbnB1dE1hbmFnZXIuVHZNZXNzYWdlVHlwZSBpbnQgdHlwZSwKICAgICAgICAgICAgICAgICBATm9uTnVsbCBCdW5kbGUgZGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3R2L2ludGVyYWN0aXZlL1R2SW50ZXJhY3RpdmVBcHBWaWV3LmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFZpZXcuamF2YQppbmRleCAxYTAzMTliLi44MGExNDM1IDEwMDc1NQotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFZpZXcuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdHYvaW50ZXJhY3RpdmUvVHZJbnRlcmFjdGl2ZUFwcFZpZXcuamF2YQpAQCAtOTQ0LDcgKzk0NCwxMiBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgbWVzc2FnZSByZWNlaXZlZCwgc3VjaCBhcwogICAgICAqIHtAbGluayBUdklucHV0TWFuYWdlciNUVl9NRVNTQUdFX1RZUEVfV0FURVJNQVJLfQotICAgICAqIEBwYXJhbSBkYXRhIFRoZSByYXcgZGF0YSBvZiB0aGUgbWVzc2FnZQorICAgICAqIEBwYXJhbSBkYXRhIFRoZSByYXcgZGF0YSBvZiB0aGUgbWVzc2FnZS4gVGhlIGJ1bmRsZSBrZXlzIGFyZToKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1RSRUFNX0lEfSwKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgVHZJbnB1dE1hbmFnZXIjVFZfTUVTU0FHRV9LRVlfU1VCVFlQRX0sCisgICAgICogICAgICAgICAgICAge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1JBV19EQVRBfS4KKyAgICAgKiAgICAgICAgICAgICBTZWUge0BsaW5rIFR2SW5wdXRNYW5hZ2VyI1RWX01FU1NBR0VfS0VZX1NVQlRZUEV9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgICAgICogICAgICAgICAgICAgaG93IHRvIHBhcnNlIHRoaXMgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBub3RpZnlUdk1lc3NhZ2UoQE5vbk51bGwgQFR2SW5wdXRNYW5hZ2VyLlR2TWVzc2FnZVR5cGUgaW50IHR5cGUsCiAgICAgICAgICAgICBATm9uTnVsbCBCdW5kbGUgZGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfdHZfVHVuZXIuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfdHZfVHVuZXIuY3BwCmluZGV4IDdmNGMwM2IuLjZmNjdkNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX3R2X1R1bmVyLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV90dl9UdW5lci5jcHAKQEAgLTYxNyw4ICs2MTcsNiBAQAogdm9pZCBGaWx0ZXJDbGllbnRDYWxsYmFja0ltcGw6OmdldFNlY3Rpb25FdmVudChqb2JqZWN0QXJyYXkgJmFyciwgY29uc3QgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRXZlbnQgJmV2ZW50KSB7CiAgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamNsYXNzIGV2ZW50Q2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvU2VjdGlvbkV2ZW50Iik7Ci0gICAgam1ldGhvZElEIGV2ZW50SW5pdCA9IGVudi0+R2V0TWV0aG9kSUQoZXZlbnRDbGF6eiwgIjxpbml0PiIsICIoSUlJSilWIik7CiAKICAgICBjb25zdCBEZW11eEZpbHRlclNlY3Rpb25FdmVudCAmc2VjdGlvbkV2ZW50ID0gZXZlbnQuZ2V0PERlbXV4RmlsdGVyRXZlbnQ6OlRhZzo6c2VjdGlvbj4oKTsKICAgICBqaW50IHRhYmxlSWQgPSBzZWN0aW9uRXZlbnQudGFibGVJZDsKQEAgLTYyNiwyMyArNjI0LDE1IEBACiAgICAgamludCBzZWN0aW9uTnVtID0gc2VjdGlvbkV2ZW50LnNlY3Rpb25OdW07CiAgICAgamxvbmcgZGF0YUxlbmd0aCA9IHNlY3Rpb25FdmVudC5kYXRhTGVuZ3RoOwogCi0gICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChldmVudENsYXp6LCBldmVudEluaXQsIHRhYmxlSWQsIHZlcnNpb24sIHNlY3Rpb25OdW0sIGRhdGFMZW5ndGgpOworICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QobVNlY3Rpb25FdmVudENsYXNzLCBtU2VjdGlvbkV2ZW50SW5pdElELCB0YWJsZUlkLCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbk51bSwgZGF0YUxlbmd0aCk7CiAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoYXJyLCBzaXplLCBvYmopOwogICAgIGVudi0+RGVsZXRlTG9jYWxSZWYob2JqKTsKLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGV2ZW50Q2xhenopOwogfQogCiB2b2lkIEZpbHRlckNsaWVudENhbGxiYWNrSW1wbDo6Z2V0TWVkaWFFdmVudChqb2JqZWN0QXJyYXkgJmFyciwgY29uc3QgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50ICZldmVudCkgewogICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBldmVudENsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL01lZGlhRXZlbnQiKTsKLSAgICBqbWV0aG9kSUQgZXZlbnRJbml0ID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgICAgICAgIGV2ZW50Q2xhenosCi0gICAgICAgICAgICAiPGluaXQ+IiwKLSAgICAgICAgICAgICIoSVpKWkpKSkxhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMkTGluZWFyQmxvY2s7IgotICAgICAgICAgICAgIlpKSVpJTGFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL0F1ZGlvRGVzY3JpcHRvcjsiCi0gICAgICAgICAgICAiTGphdmEvdXRpbC9MaXN0OylWIik7Ci0gICAgamZpZWxkSUQgZXZlbnRDb250ZXh0ID0gZW52LT5HZXRGaWVsZElEKGV2ZW50Q2xhenosICJtTmF0aXZlQ29udGV4dCIsICJKIik7CiAKICAgICBjb25zdCBEZW11eEZpbHRlck1lZGlhRXZlbnQgJm1lZGlhRXZlbnQgPSBldmVudC5nZXQ8RGVtdXhGaWx0ZXJFdmVudDo6VGFnOjptZWRpYT4oKTsKICAgICBqb2JqZWN0IGF1ZGlvRGVzY3JpcHRvciA9IG51bGxwdHI7CkBAIC02NTAsOCArNjQwLDYgQEAKICAgICBqb2JqZWN0IHByZXNlbnRhdGlvbnNKT2JqID0gSkF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6YXNKb2JqZWN0KGVudiwgZ0F1ZGlvUHJlc2VudGF0aW9uRmllbGRzKTsKICAgICBzd2l0Y2ggKG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5nZXRUYWcoKSkgewogICAgICAgICBjYXNlIERlbXV4RmlsdGVyTWVkaWFFdmVudEV4dHJhTWV0YURhdGE6OlRhZzo6YXVkaW86IHsKLSAgICAgICAgICAgIGpjbGFzcyBhZENsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL0F1ZGlvRGVzY3JpcHRvciIpOwotICAgICAgICAgICAgam1ldGhvZElEIGFkSW5pdCA9IGVudi0+R2V0TWV0aG9kSUQoYWRDbGF6eiwgIjxpbml0PiIsICIoQkJDQkJCKVYiKTsKIAogICAgICAgICAgICAgY29uc3QgQXVkaW9FeHRyYU1ldGFEYXRhICZhZCA9CiAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5nZXQ8RGVtdXhGaWx0ZXJNZWRpYUV2ZW50RXh0cmFNZXRhRGF0YTo6VGFnOjphdWRpbz4oKTsKQEAgLTY2Miw5ICs2NTAsOSBAQAogICAgICAgICAgICAgamJ5dGUgYWRHYWluRnJvbnQgPSBhZC5hZEdhaW5Gcm9udDsKICAgICAgICAgICAgIGpieXRlIGFkR2FpblN1cnJvdW5kID0gYWQuYWRHYWluU3Vycm91bmQ7CiAKLSAgICAgICAgICAgIGF1ZGlvRGVzY3JpcHRvciA9IGVudi0+TmV3T2JqZWN0KGFkQ2xhenosIGFkSW5pdCwgYWRGYWRlLCBhZFBhbiwgdmVyc2lvblRleHRUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEdhaW5DZW50ZXIsIGFkR2FpbkZyb250LCBhZEdhaW5TdXJyb3VuZCk7Ci0gICAgICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGFkQ2xhenopOworICAgICAgICAgICAgYXVkaW9EZXNjcmlwdG9yID0gZW52LT5OZXdPYmplY3QobUF1ZGlvRGVzY3JpcHRvckNsYXNzLCBtQXVkaW9EZXNjcmlwdG9ySW5pdElELCBhZEZhZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFBhbiwgdmVyc2lvblRleHRUYWcsIGFkR2FpbkNlbnRlciwgYWRHYWluRnJvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEdhaW5TdXJyb3VuZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIERlbXV4RmlsdGVyTWVkaWFFdmVudEV4dHJhTWV0YURhdGE6OlRhZzo6YXVkaW9QcmVzZW50YXRpb25zOiB7CkBAIC03MDUsMTAgKzY5MywxMCBAQAogICAgICAgICBzYyA9IG1lZGlhRXZlbnQuc2NJbmRleE1hc2suZ2V0PERlbXV4RmlsdGVyU2NJbmRleE1hc2s6OlRhZzo6c2NWdmM+KCk7CiAgICAgfQogCi0gICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChldmVudENsYXp6LCBldmVudEluaXQsIHN0cmVhbUlkLCBpc1B0c1ByZXNlbnQsIHB0cywgaXNEdHNQcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzLCBkYXRhTGVuZ3RoLCBvZmZzZXQsIG51bGxwdHIsIGlzU2VjdXJlTWVtb3J5LCBhdkRhdGFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wdVNlcXVlbmNlTnVtYmVyLCBpc1Blc1ByaXZhdGVEYXRhLCBzYywgYXVkaW9EZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uc0pPYmopOworICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QobU1lZGlhRXZlbnRDbGFzcywgbU1lZGlhRXZlbnRJbml0SUQsIHN0cmVhbUlkLCBpc1B0c1ByZXNlbnQsIHB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRHRzUHJlc2VudCwgZHRzLCBkYXRhTGVuZ3RoLCBvZmZzZXQsIG51bGxwdHIsIGlzU2VjdXJlTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZEYXRhSWQsIG1wdVNlcXVlbmNlTnVtYmVyLCBpc1Blc1ByaXZhdGVEYXRhLCBzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRGVzY3JpcHRvciwgcHJlc2VudGF0aW9uc0pPYmopOwogCiAgICAgdWludDY0X3QgYXZTaGFyZWRNZW1TaXplID0gbUZpbHRlckNsaWVudC0+Z2V0QXZTaGFyZWRIYW5kbGVJbmZvKCkuc2l6ZTsKICAgICBpZiAobWVkaWFFdmVudC5hdk1lbW9yeS5mZHMuc2l6ZSgpID4gMCB8fCBtZWRpYUV2ZW50LmF2RGF0YUlkICE9IDAgfHwKQEAgLTcxNyw3ICs3MDUsNyBAQAogICAgICAgICAgICAgICAgIG5ldyBNZWRpYUV2ZW50KG1GaWx0ZXJDbGllbnQsIGR1cEZyb21BaWRsKG1lZGlhRXZlbnQuYXZNZW1vcnkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuYXZEYXRhSWQsIGRhdGFMZW5ndGggKyBvZmZzZXQsIG9iaik7CiAgICAgICAgIG1lZGlhRXZlbnRTcC0+bUF2SGFuZGxlUmVmQ250Kys7Ci0gICAgICAgIGVudi0+U2V0TG9uZ0ZpZWxkKG9iaiwgZXZlbnRDb250ZXh0LCAoamxvbmcpbWVkaWFFdmVudFNwLmdldCgpKTsKKyAgICAgICAgZW52LT5TZXRMb25nRmllbGQob2JqLCBtTWVkaWFFdmVudEZpZWxkQ29udGV4dElELCAoamxvbmcpbWVkaWFFdmVudFNwLmdldCgpKTsKICAgICAgICAgbWVkaWFFdmVudFNwLT5pbmNTdHJvbmcob2JqKTsKICAgICB9CiAKQEAgLTcyNiwzMiArNzE0LDI3IEBACiAgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoYXVkaW9EZXNjcmlwdG9yKTsKICAgICB9CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihwcmVzZW50YXRpb25zSk9iaik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRQZXNFdmVudChqb2JqZWN0QXJyYXkgJmFyciwgY29uc3QgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJFdmVudCAmZXZlbnQpIHsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgZXZlbnRDbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9QZXNFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKElJSSlWIik7CiAKICAgICBjb25zdCBEZW11eEZpbHRlclBlc0V2ZW50ICZwZXNFdmVudCA9IGV2ZW50LmdldDxEZW11eEZpbHRlckV2ZW50OjpUYWc6OnBlcz4oKTsKICAgICBqaW50IHN0cmVhbUlkID0gcGVzRXZlbnQuc3RyZWFtSWQ7CiAgICAgamludCBkYXRhTGVuZ3RoID0gcGVzRXZlbnQuZGF0YUxlbmd0aDsKICAgICBqaW50IG1wdVNlcXVlbmNlTnVtYmVyID0gcGVzRXZlbnQubXB1U2VxdWVuY2VOdW1iZXI7CiAKLSAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KGV2ZW50Q2xhenosIGV2ZW50SW5pdCwgc3RyZWFtSWQsIGRhdGFMZW5ndGgsIG1wdVNlcXVlbmNlTnVtYmVyKTsKKyAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KG1QZXNFdmVudENsYXNzLCBtUGVzRXZlbnRJbml0SUQsIHN0cmVhbUlkLCBkYXRhTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXB1U2VxdWVuY2VOdW1iZXIpOwogICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGFyciwgc2l6ZSwgb2JqKTsKICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKG9iaik7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihldmVudENsYXp6KTsKIH0KIAogdm9pZCBGaWx0ZXJDbGllbnRDYWxsYmFja0ltcGw6OmdldFRzUmVjb3JkRXZlbnQoam9iamVjdEFycmF5ICZhcnIsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJFdmVudCAmZXZlbnQpIHsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgZXZlbnRDbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9Uc1JlY29yZEV2ZW50Iik7Ci0gICAgam1ldGhvZElEIGV2ZW50SW5pdCA9IGVudi0+R2V0TWV0aG9kSUQoZXZlbnRDbGF6eiwgIjxpbml0PiIsICIoSUlJSkpJKVYiKTsKIAogICAgIGNvbnN0IERlbXV4RmlsdGVyVHNSZWNvcmRFdmVudCAmdHNSZWNvcmRFdmVudCA9IGV2ZW50LmdldDxEZW11eEZpbHRlckV2ZW50OjpUYWc6OnRzUmVjb3JkPigpOwogICAgIERlbXV4UGlkIHBpZCA9IHRzUmVjb3JkRXZlbnQucGlkOwpAQCAtNzgxLDE4ICs3NjQsMTUgQEAKICAgICBqbG9uZyBwdHMgPSB0c1JlY29yZEV2ZW50LnB0czsKICAgICBqaW50IGZpcnN0TWJJblNsaWNlID0gdHNSZWNvcmRFdmVudC5maXJzdE1iSW5TbGljZTsKIAotICAgIGpvYmplY3Qgb2JqID0KLSAgICAgICAgICAgIGVudi0+TmV3T2JqZWN0KGV2ZW50Q2xhenosIGV2ZW50SW5pdCwganBpZCwgdHMsIHNjLCBieXRlTnVtYmVyLCBwdHMsIGZpcnN0TWJJblNsaWNlKTsKKyAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KG1Uc1JlY29yZEV2ZW50Q2xhc3MsIG1Uc1JlY29yZEV2ZW50SW5pdElELCBqcGlkLCB0cywgc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlTnVtYmVyLCBwdHMsIGZpcnN0TWJJblNsaWNlKTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRNbXRwUmVjb3JkRXZlbnQoam9iamVjdEFycmF5ICZhcnIsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50ICZldmVudCkgewogICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBldmVudENsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL01tdHBSZWNvcmRFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKElKSUpJSSlWIik7CiAKICAgICBjb25zdCBEZW11eEZpbHRlck1tdHBSZWNvcmRFdmVudCAmbW10cFJlY29yZEV2ZW50ID0KICAgICAgICAgICAgIGV2ZW50LmdldDxEZW11eEZpbHRlckV2ZW50OjpUYWc6Om1tdHBSZWNvcmQ+KCk7CkBAIC04MDMsMTggKzc4MywxNSBAQAogICAgIGppbnQgZmlyc3RNYkluU2xpY2UgPSBtbXRwUmVjb3JkRXZlbnQuZmlyc3RNYkluU2xpY2U7CiAgICAgamxvbmcgdHNJbmRleE1hc2sgPSBtbXRwUmVjb3JkRXZlbnQudHNJbmRleE1hc2s7CiAKLSAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KGV2ZW50Q2xhenosIGV2ZW50SW5pdCwgc2NIZXZjSW5kZXhNYXNrLCBieXRlTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXB1U2VxdWVuY2VOdW1iZXIsIHB0cywgZmlyc3RNYkluU2xpY2UsIHRzSW5kZXhNYXNrKTsKKyAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KG1NbXRwUmVjb3JkRXZlbnRDbGFzcywgbU1tdHBSZWNvcmRFdmVudEluaXRJRCwgc2NIZXZjSW5kZXhNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZU51bWJlciwgbXB1U2VxdWVuY2VOdW1iZXIsIHB0cywgZmlyc3RNYkluU2xpY2UsIHRzSW5kZXhNYXNrKTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXREb3dubG9hZEV2ZW50KGpvYmplY3RBcnJheSAmYXJyLCBjb25zdCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRXZlbnQgJmV2ZW50KSB7CiAgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamNsYXNzIGV2ZW50Q2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvRG93bmxvYWRFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKElJSUlJSSlWIik7CiAKICAgICBjb25zdCBEZW11eEZpbHRlckRvd25sb2FkRXZlbnQgJmRvd25sb2FkRXZlbnQgPSBldmVudC5nZXQ8RGVtdXhGaWx0ZXJFdmVudDo6VGFnOjpkb3dubG9hZD4oKTsKICAgICBqaW50IGl0ZW1JZCA9IGRvd25sb2FkRXZlbnQuaXRlbUlkOwpAQCAtODI0LDMyICs4MDEsMjcgQEAKICAgICBqaW50IGxhc3RJdGVtRnJhZ21lbnRJbmRleCA9IGRvd25sb2FkRXZlbnQubGFzdEl0ZW1GcmFnbWVudEluZGV4OwogICAgIGppbnQgZGF0YUxlbmd0aCA9IGRvd25sb2FkRXZlbnQuZGF0YUxlbmd0aDsKIAotICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QoZXZlbnRDbGF6eiwgZXZlbnRJbml0LCBpdGVtSWQsIGRvd25sb2FkSWQsIG1wdVNlcXVlbmNlTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUZyYWdtZW50SW5kZXgsIGxhc3RJdGVtRnJhZ21lbnRJbmRleCwgZGF0YUxlbmd0aCk7CisgICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChtRG93bmxvYWRFdmVudENsYXNzLCBtRG93bmxvYWRFdmVudEluaXRJRCwgaXRlbUlkLCBkb3dubG9hZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXB1U2VxdWVuY2VOdW1iZXIsIGl0ZW1GcmFnbWVudEluZGV4LCBsYXN0SXRlbUZyYWdtZW50SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoKTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRJcFBheWxvYWRFdmVudChqb2JqZWN0QXJyYXkgJmFyciwgY29uc3QgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJFdmVudCAmZXZlbnQpIHsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgZXZlbnRDbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9JcFBheWxvYWRFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKEkpViIpOwogCiAgICAgY29uc3QgRGVtdXhGaWx0ZXJJcFBheWxvYWRFdmVudCAmaXBQYXlsb2FkRXZlbnQgPSBldmVudC5nZXQ8RGVtdXhGaWx0ZXJFdmVudDo6VGFnOjppcFBheWxvYWQ+KCk7CiAgICAgamludCBkYXRhTGVuZ3RoID0gaXBQYXlsb2FkRXZlbnQuZGF0YUxlbmd0aDsKLSAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KGV2ZW50Q2xhenosIGV2ZW50SW5pdCwgZGF0YUxlbmd0aCk7CisgICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChtSXBQYXlsb2FkRXZlbnRDbGFzcywgbUlwUGF5bG9hZEV2ZW50SW5pdElELCBkYXRhTGVuZ3RoKTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRUZW1pRXZlbnQoam9iamVjdEFycmF5ICZhcnIsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50ICZldmVudCkgewogICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBldmVudENsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL1RlbWlFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKEpCW0IpViIpOwogCiAgICAgY29uc3QgRGVtdXhGaWx0ZXJUZW1pRXZlbnQgJnRlbWlFdmVudCA9IGV2ZW50LmdldDxEZW11eEZpbHRlckV2ZW50OjpUYWc6OnRlbWk+KCk7CiAgICAgamxvbmcgcHRzID0gdGVtaUV2ZW50LnB0czsKQEAgLTg1OSw2MyArODMxLDUzIEBACiAgICAgamJ5dGVBcnJheSBhcnJheSA9IGVudi0+TmV3Qnl0ZUFycmF5KGRlc2NyRGF0YS5zaXplKCkpOwogICAgIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGFycmF5LCAwLCBkZXNjckRhdGEuc2l6ZSgpLCByZWludGVycHJldF9jYXN0PGpieXRlICo+KCZkZXNjckRhdGFbMF0pKTsKIAotICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QoZXZlbnRDbGF6eiwgZXZlbnRJbml0LCBwdHMsIGRlc2NyVGFnLCBhcnJheSk7CisgICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChtVGVtaUV2ZW50Q2xhc3MsIG1UZW1pRXZlbnRJbml0SUQsIHB0cywgZGVzY3JUYWcsIGFycmF5KTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRTY3JhbWJsaW5nU3RhdHVzRXZlbnQoam9iamVjdEFycmF5ICZhcnIsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50ICZldmVudCkgewogICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBldmVudENsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL1NjcmFtYmxpbmdTdGF0dXNFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKEkpViIpOwogCiAgICAgY29uc3QgRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQgJnNjcmFtYmxpbmdTdGF0dXMgPQogICAgICAgICAgICAgZXZlbnQuZ2V0PERlbXV4RmlsdGVyRXZlbnQ6OlRhZzo6bW9uaXRvckV2ZW50PigpCiAgICAgICAgICAgICAgICAgICAgIC5nZXQ8RGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OlRhZzo6c2NyYW1ibGluZ1N0YXR1cz4oKTsKLSAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KGV2ZW50Q2xhenosIGV2ZW50SW5pdCwgc2NyYW1ibGluZ1N0YXR1cyk7CisgICAgam9iamVjdCBvYmogPSBlbnYtPk5ld09iamVjdChtU2NyYW1ibGluZ1N0YXR1c0V2ZW50Q2xhc3MsIG1TY3JhbWJsaW5nU3RhdHVzRXZlbnRJbml0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhbWJsaW5nU3RhdHVzKTsKICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnIsIHNpemUsIG9iaik7CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXZlbnRDbGF6eik7CiB9CiAKIHZvaWQgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsOjpnZXRJcENpZENoYW5nZUV2ZW50KGpvYmplY3RBcnJheSAmYXJyLCBjb25zdCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbXV4RmlsdGVyRXZlbnQgJmV2ZW50KSB7CiAgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamNsYXNzIGV2ZW50Q2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvSXBDaWRDaGFuZ2VFdmVudCIpOwotICAgIGptZXRob2RJRCBldmVudEluaXQgPSBlbnYtPkdldE1ldGhvZElEKGV2ZW50Q2xhenosICI8aW5pdD4iLCAiKEkpViIpOwogCiAgICAgY29uc3QgRGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQgJmNpZCA9IGV2ZW50LmdldDxEZW11eEZpbHRlckV2ZW50OjpUYWc6Om1vbml0b3JFdmVudD4oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQ8RGVtdXhGaWx0ZXJNb25pdG9yRXZlbnQ6OlRhZzo6Y2lkPigpOwotICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QoZXZlbnRDbGF6eiwgZXZlbnRJbml0LCBjaWQpOworICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QobUlwQ2lkQ2hhbmdlRXZlbnRDbGFzcywgbUlwQ2lkQ2hhbmdlRXZlbnRJbml0SUQsIGNpZCk7CiAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoYXJyLCBzaXplLCBvYmopOwogICAgIGVudi0+RGVsZXRlTG9jYWxSZWYob2JqKTsKLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGV2ZW50Q2xhenopOwogfQogCiB2b2lkIEZpbHRlckNsaWVudENhbGxiYWNrSW1wbDo6Z2V0UmVzdGFydEV2ZW50KGpvYmplY3RBcnJheSAmYXJyLCBjb25zdCBpbnQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJFdmVudCAmZXZlbnQpIHsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgZXZlbnRDbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9SZXN0YXJ0RXZlbnQiKTsKLSAgICBqbWV0aG9kSUQgZXZlbnRJbml0ID0gZW52LT5HZXRNZXRob2RJRChldmVudENsYXp6LCAiPGluaXQ+IiwgIihJKVYiKTsKIAogICAgIGNvbnN0IGludDMyX3QgJnN0YXJ0SWQgPSBldmVudC5nZXQ8RGVtdXhGaWx0ZXJFdmVudDo6VGFnOjpzdGFydElkPigpOwotICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdPYmplY3QoZXZlbnRDbGF6eiwgZXZlbnRJbml0LCBzdGFydElkKTsKKyAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3T2JqZWN0KG1SZXN0YXJ0RXZlbnRDbGFzcywgbVJlc3RhcnRFdmVudEluaXRJRCwgc3RhcnRJZCk7CiAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoYXJyLCBzaXplLCBvYmopOwogICAgIGVudi0+RGVsZXRlTG9jYWxSZWYob2JqKTsKLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGV2ZW50Q2xhenopOwogfQogCiB2b2lkIEZpbHRlckNsaWVudENhbGxiYWNrSW1wbDo6b25GaWx0ZXJFdmVudChjb25zdCB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudD4gJmV2ZW50cykgewogICAgIEFMT0dWKCJGaWx0ZXJDbGllbnRDYWxsYmFja0ltcGw6Om9uRmlsdGVyRXZlbnQiKTsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgZXZlbnRDbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9GaWx0ZXJFdmVudCIpOwogICAgIGpvYmplY3RBcnJheSBhcnJheTsKIAogICAgIGlmICghZXZlbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgYXJyYXkgPSBlbnYtPk5ld09iamVjdEFycmF5KGV2ZW50cy5zaXplKCksIGV2ZW50Q2xhenosIG51bGxwdHIpOworICAgICAgICBhcnJheSA9IGVudi0+TmV3T2JqZWN0QXJyYXkoZXZlbnRzLnNpemUoKSwgbUV2ZW50Q2xhc3MsIG51bGxwdHIpOwogICAgIH0KIAogICAgIGZvciAoaW50IGkgPSAwLCBhcnJheVNpemUgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7CkBAIC0xMDA0LDcgKzk2Niw2IEBACiAgICAgICAgICAgICAgICJGaWx0ZXIgb2JqZWN0IGhhcyBiZWVuIGZyZWVkLiBJZ25vcmluZyBjYWxsYmFjay4iKTsKICAgICB9CiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihldmVudENsYXp6KTsKIH0KIAogdm9pZCBGaWx0ZXJDbGllbnRDYWxsYmFja0ltcGw6Om9uRmlsdGVyU3RhdHVzKGNvbnN0IERlbXV4RmlsdGVyU3RhdHVzIHN0YXR1cykgewpAQCAtMTA0MCw2ICsxMDAxLDY3IEBACiAgICAgbVNoYXJlZEZpbHRlciA9IHRydWU7CiB9CiAKK0ZpbHRlckNsaWVudENhbGxiYWNrSW1wbDo6RmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsKCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIFNjb3BlZExvY2FsUmVmIGV2ZW50Q2xhc3MgPQorICAgICAgICBTY29wZWRMb2NhbFJlZihlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9GaWx0ZXJFdmVudCIpKTsKKyAgICBTY29wZWRMb2NhbFJlZiBzZWN0aW9uRXZlbnRDbGFzcyA9CisgICAgICAgIFNjb3BlZExvY2FsUmVmKGVudiwgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL1NlY3Rpb25FdmVudCIpKTsKKyAgICBTY29wZWRMb2NhbFJlZiBtZWRpYUV2ZW50Q2xhc3MgPQorICAgICAgICBTY29wZWRMb2NhbFJlZihlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9NZWRpYUV2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIGF1ZGlvRGVzY3JpcHRvckNsYXNzID0KKyAgICAgICAgU2NvcGVkTG9jYWxSZWYoZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvQXVkaW9EZXNjcmlwdG9yIikpOworICAgIFNjb3BlZExvY2FsUmVmIHBlc0V2ZW50Q2xhc3MgPQorICAgICAgICBTY29wZWRMb2NhbFJlZihlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9QZXNFdmVudCIpKTsKKyAgICBTY29wZWRMb2NhbFJlZiB0c1JlY29yZEV2ZW50Q2xhc3MgPQorICAgICAgICBTY29wZWRMb2NhbFJlZihlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9Uc1JlY29yZEV2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIG1tdHBSZWNvcmRFdmVudENsYXNzID0KKyAgICAgICAgU2NvcGVkTG9jYWxSZWYoZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvTW10cFJlY29yZEV2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIGRvd25sb2FkRXZlbnRDbGFzcyA9CisgICAgICAgIFNjb3BlZExvY2FsUmVmKGVudiwgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL0Rvd25sb2FkRXZlbnQiKSk7CisgICAgU2NvcGVkTG9jYWxSZWYgaXBQYXlsb2FkRXZlbnRDbGFzcyA9CisgICAgICAgIFNjb3BlZExvY2FsUmVmKGVudiwgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL0lwUGF5bG9hZEV2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIHRlbWlFdmVudENsYXNzID0KKyAgICAgICAgU2NvcGVkTG9jYWxSZWYoZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvVGVtaUV2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIHNjcmFtYmxpbmdTdGF0dXNFdmVudENsYXNzID0KKyAgICAgICAgU2NvcGVkTG9jYWxSZWYoZW52LCBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS90di90dW5lci9maWx0ZXIvU2NyYW1ibGluZ1N0YXR1c0V2ZW50IikpOworICAgIFNjb3BlZExvY2FsUmVmIGlwQ2lkQ2hhbmdlRXZlbnRDbGFzcyA9CisgICAgICAgIFNjb3BlZExvY2FsUmVmKGVudiwgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvdHYvdHVuZXIvZmlsdGVyL0lwQ2lkQ2hhbmdlRXZlbnQiKSk7CisgICAgU2NvcGVkTG9jYWxSZWYgcmVzdGFydEV2ZW50Q2xhc3MgPQorICAgICAgICBTY29wZWRMb2NhbFJlZihlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9SZXN0YXJ0RXZlbnQiKSk7CisgICAgbUV2ZW50Q2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihldmVudENsYXNzLmdldCgpKTsKKyAgICBtU2VjdGlvbkV2ZW50Q2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihzZWN0aW9uRXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbU1lZGlhRXZlbnRDbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKG1lZGlhRXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbUF1ZGlvRGVzY3JpcHRvckNsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoYXVkaW9EZXNjcmlwdG9yQ2xhc3MuZ2V0KCkpOworICAgIG1QZXNFdmVudENsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYocGVzRXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbVRzUmVjb3JkRXZlbnRDbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKHRzUmVjb3JkRXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbU1tdHBSZWNvcmRFdmVudENsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYobW10cFJlY29yZEV2ZW50Q2xhc3MuZ2V0KCkpOworICAgIG1Eb3dubG9hZEV2ZW50Q2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihkb3dubG9hZEV2ZW50Q2xhc3MuZ2V0KCkpOworICAgIG1JcFBheWxvYWRFdmVudENsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoaXBQYXlsb2FkRXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbVRlbWlFdmVudENsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYodGVtaUV2ZW50Q2xhc3MuZ2V0KCkpOworICAgIG1TY3JhbWJsaW5nU3RhdHVzRXZlbnRDbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKHNjcmFtYmxpbmdTdGF0dXNFdmVudENsYXNzLmdldCgpKTsKKyAgICBtSXBDaWRDaGFuZ2VFdmVudENsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoaXBDaWRDaGFuZ2VFdmVudENsYXNzLmdldCgpKTsKKyAgICBtUmVzdGFydEV2ZW50Q2xhc3MgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihyZXN0YXJ0RXZlbnRDbGFzcy5nZXQoKSk7CisgICAgbVNlY3Rpb25FdmVudEluaXRJRCA9IGVudi0+R2V0TWV0aG9kSUQobVNlY3Rpb25FdmVudENsYXNzLCAiPGluaXQ+IiwgIihJSUlKKVYiKTsKKyAgICBtTWVkaWFFdmVudEluaXRJRCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtTWVkaWFFdmVudENsYXNzLAorICAgICAgICAgICAgIjxpbml0PiIsCisgICAgICAgICAgICAiKElaSlpKSkpMYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjJExpbmVhckJsb2NrOyIKKyAgICAgICAgICAgICJaSklaSUxhbmRyb2lkL21lZGlhL3R2L3R1bmVyL2ZpbHRlci9BdWRpb0Rlc2NyaXB0b3I7IgorICAgICAgICAgICAgIkxqYXZhL3V0aWwvTGlzdDspViIpOworICAgIG1BdWRpb0Rlc2NyaXB0b3JJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb0Rlc2NyaXB0b3JDbGFzcywgIjxpbml0PiIsICIoQkJDQkJCKVYiKTsKKyAgICBtUGVzRXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1QZXNFdmVudENsYXNzLCAiPGluaXQ+IiwgIihJSUkpViIpOworICAgIG1Uc1JlY29yZEV2ZW50SW5pdElEID0gZW52LT5HZXRNZXRob2RJRChtVHNSZWNvcmRFdmVudENsYXNzLCAiPGluaXQ+IiwgIihJSUlKSkkpViIpOworICAgIG1NbXRwUmVjb3JkRXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1NbXRwUmVjb3JkRXZlbnRDbGFzcywgIjxpbml0PiIsICIoSUpJSklJKVYiKTsKKyAgICBtRG93bmxvYWRFdmVudEluaXRJRCA9IGVudi0+R2V0TWV0aG9kSUQobURvd25sb2FkRXZlbnRDbGFzcywgIjxpbml0PiIsICIoSUlJSUlJKVYiKTsKKyAgICBtSXBQYXlsb2FkRXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1JcFBheWxvYWRFdmVudENsYXNzLCAiPGluaXQ+IiwgIihJKVYiKTsKKyAgICBtVGVtaUV2ZW50SW5pdElEID0gZW52LT5HZXRNZXRob2RJRChtVGVtaUV2ZW50Q2xhc3MsICI8aW5pdD4iLCAiKEpCW0IpViIpOworICAgIG1TY3JhbWJsaW5nU3RhdHVzRXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1TY3JhbWJsaW5nU3RhdHVzRXZlbnRDbGFzcywgIjxpbml0PiIsICIoSSlWIik7CisgICAgbUlwQ2lkQ2hhbmdlRXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1JcENpZENoYW5nZUV2ZW50Q2xhc3MsICI8aW5pdD4iLCAiKEkpViIpOworICAgIG1SZXN0YXJ0RXZlbnRJbml0SUQgPSBlbnYtPkdldE1ldGhvZElEKG1SZXN0YXJ0RXZlbnRDbGFzcywgIjxpbml0PiIsICIoSSlWIik7CisgICAgbU1lZGlhRXZlbnRGaWVsZENvbnRleHRJRCA9IGVudi0+R2V0RmllbGRJRChtTWVkaWFFdmVudENsYXNzLCAibU5hdGl2ZUNvbnRleHQiLCAiSiIpOworfQorCiBGaWx0ZXJDbGllbnRDYWxsYmFja0ltcGw6On5GaWx0ZXJDbGllbnRDYWxsYmFja0ltcGwoKSB7CiAgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CiAgICAgaWYgKG1GaWx0ZXJPYmogIT0gbnVsbHB0cikgewpAQCAtMTA0Nyw2ICsxMDY5LDE5IEBACiAgICAgICAgIG1GaWx0ZXJPYmogPSBudWxscHRyOwogICAgIH0KICAgICBtRmlsdGVyQ2xpZW50ID0gbnVsbHB0cjsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtRXZlbnRDbGFzcyk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobVNlY3Rpb25FdmVudENsYXNzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTWVkaWFFdmVudENsYXNzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQXVkaW9EZXNjcmlwdG9yQ2xhc3MpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1QZXNFdmVudENsYXNzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtVHNSZWNvcmRFdmVudENsYXNzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTW10cFJlY29yZEV2ZW50Q2xhc3MpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1Eb3dubG9hZEV2ZW50Q2xhc3MpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1JcFBheWxvYWRFdmVudENsYXNzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtVGVtaUV2ZW50Q2xhc3MpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1TY3JhbWJsaW5nU3RhdHVzRXZlbnRDbGFzcyk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUlwQ2lkQ2hhbmdlRXZlbnRDbGFzcyk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobVJlc3RhcnRFdmVudENsYXNzKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vIEZyb250ZW5kQ2xpZW50Q2FsbGJhY2tJbXBsIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV90dl9UdW5lci5oIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfdHZfVHVuZXIuaAppbmRleCAyYmIxNGY2Li42YjFiNmIxIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV90dl9UdW5lci5oCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX3R2X1R1bmVyLmgKQEAgLTEyNSw2ICsxMjUsNyBAQAogfTsKIAogc3RydWN0IEZpbHRlckNsaWVudENhbGxiYWNrSW1wbCA6IHB1YmxpYyBGaWx0ZXJDbGllbnRDYWxsYmFjayB7CisgICAgRmlsdGVyQ2xpZW50Q2FsbGJhY2tJbXBsKCk7CiAgICAgfkZpbHRlckNsaWVudENhbGxiYWNrSW1wbCgpOwogICAgIHZpcnR1YWwgdm9pZCBvbkZpbHRlckV2ZW50KGNvbnN0IHZlY3RvcjxEZW11eEZpbHRlckV2ZW50PiYgZXZlbnRzKTsKICAgICB2aXJ0dWFsIHZvaWQgb25GaWx0ZXJTdGF0dXMoY29uc3QgRGVtdXhGaWx0ZXJTdGF0dXMgc3RhdHVzKTsKQEAgLTEzNSw2ICsxMzYsMzIgQEAKIHByaXZhdGU6CiAgICAgandlYWsgbUZpbHRlck9iajsKICAgICBzcDxGaWx0ZXJDbGllbnQ+IG1GaWx0ZXJDbGllbnQ7CisgICAgamNsYXNzIG1FdmVudENsYXNzOworICAgIGpjbGFzcyBtU2VjdGlvbkV2ZW50Q2xhc3M7CisgICAgamNsYXNzIG1NZWRpYUV2ZW50Q2xhc3M7CisgICAgamNsYXNzIG1BdWRpb0Rlc2NyaXB0b3JDbGFzczsKKyAgICBqY2xhc3MgbVBlc0V2ZW50Q2xhc3M7CisgICAgamNsYXNzIG1Uc1JlY29yZEV2ZW50Q2xhc3M7CisgICAgamNsYXNzIG1NbXRwUmVjb3JkRXZlbnRDbGFzczsKKyAgICBqY2xhc3MgbURvd25sb2FkRXZlbnRDbGFzczsKKyAgICBqY2xhc3MgbUlwUGF5bG9hZEV2ZW50Q2xhc3M7CisgICAgamNsYXNzIG1UZW1pRXZlbnRDbGFzczsKKyAgICBqY2xhc3MgbVNjcmFtYmxpbmdTdGF0dXNFdmVudENsYXNzOworICAgIGpjbGFzcyBtSXBDaWRDaGFuZ2VFdmVudENsYXNzOworICAgIGpjbGFzcyBtUmVzdGFydEV2ZW50Q2xhc3M7CisgICAgam1ldGhvZElEIG1TZWN0aW9uRXZlbnRJbml0SUQ7CisgICAgam1ldGhvZElEIG1NZWRpYUV2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtQXVkaW9EZXNjcmlwdG9ySW5pdElEOworICAgIGptZXRob2RJRCBtUGVzRXZlbnRJbml0SUQ7CisgICAgam1ldGhvZElEIG1Uc1JlY29yZEV2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtTW10cFJlY29yZEV2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtRG93bmxvYWRFdmVudEluaXRJRDsKKyAgICBqbWV0aG9kSUQgbUlwUGF5bG9hZEV2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtVGVtaUV2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtU2NyYW1ibGluZ1N0YXR1c0V2ZW50SW5pdElEOworICAgIGptZXRob2RJRCBtSXBDaWRDaGFuZ2VFdmVudEluaXRJRDsKKyAgICBqbWV0aG9kSUQgbVJlc3RhcnRFdmVudEluaXRJRDsKKyAgICBqZmllbGRJRCBtTWVkaWFFdmVudEZpZWxkQ29udGV4dElEOwogICAgIGJvb2wgbVNoYXJlZEZpbHRlcjsKICAgICB2b2lkIGdldFNlY3Rpb25FdmVudChqb2JqZWN0QXJyYXkmIGFyciwgY29uc3QgaW50IHNpemUsIGNvbnN0IERlbXV4RmlsdGVyRXZlbnQmIGV2ZW50KTsKICAgICB2b2lkIGdldE1lZGlhRXZlbnQoam9iamVjdEFycmF5JiBhcnIsIGNvbnN0IGludCBzaXplLCBjb25zdCBEZW11eEZpbHRlckV2ZW50JiBldmVudCk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9DYXJyaWVyRGVmYXVsdEFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvQ2FycmllckRlZmF1bHRBcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCBlOTFkMzViLi5mNGU4OWExNCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvQ2FycmllckRlZmF1bHRBcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9DYXJyaWVyRGVmYXVsdEFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xLDYgKzEsNiBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxyZXNvdXJjZXM+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+Q2FycmllckRlZmF1bHRBcHA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5DYXJyaWVyIENvbW11bmljYXRpb25zPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhbmRyb2lkX3N5c3RlbV9sYWJlbCI+TW9iaWxlIENhcnJpZXI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvcnRhbF9ub3RpZmljYXRpb25faWQiPk1vYmlsZSBkYXRhIGhhcyBydW4gb3V0PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJub19kYXRhX25vdGlmaWNhdGlvbl9pZCI+WW91ciBtb2JpbGUgZGF0YSBoYXMgYmVlbiBkZWFjdGl2YXRlZDwvc3RyaW5nPgpAQCAtMTcsOSArMTcsOSBAQAogICAgIDwhLS0gVGVsZXBob255IG5vdGlmaWNhdGlvbiBjaGFubmVsIG5hbWUgZm9yIHBlcmZvcm1hbmNlIGJvb3N0IG5vdGlmaWNhdGlvbnMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVyZm9ybWFuY2VfYm9vc3Rfbm90aWZpY2F0aW9uX2NoYW5uZWwiPlBlcmZvcm1hbmNlIGJvb3N0PC9zdHJpbmc+CiAgICAgPCEtLSBOb3RpZmljYXRpb24gdGl0bGUgdGV4dCBmb3IgdGhlIHBlcmZvcm1hbmNlIGJvb3N0IG5vdGlmaWNhdGlvbi4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJmb3JtYW5jZV9ib29zdF9ub3RpZmljYXRpb25fdGl0bGUiPkltcHJvdmUgeW91ciBhcHAgZXhwZXJpZW5jZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVyZm9ybWFuY2VfYm9vc3Rfbm90aWZpY2F0aW9uX3RpdGxlIj41RyBvcHRpb25zIGZyb20geW91ciBjYXJyaWVyPC9zdHJpbmc+CiAgICAgPCEtLSBOb3RpZmljYXRpb24gZGV0YWlsIHRleHQgZm9yIHRoZSBwZXJmb3JtYW5jZSBib29zdCBub3RpZmljYXRpb24uIC0tPgotICAgIDxzdHJpbmcgbmFtZT0icGVyZm9ybWFuY2VfYm9vc3Rfbm90aWZpY2F0aW9uX2RldGFpbCI+VGFwIHRvIHZpc2l0ICVzXCdzIHdlYnNpdGUgYW5kIGxlYXJuIG1vcmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcmZvcm1hbmNlX2Jvb3N0X25vdGlmaWNhdGlvbl9kZXRhaWwiPlZpc2l0ICVzXCdzIHdlYnNpdGUgdG8gc2VlIG9wdGlvbnMgZm9yIHlvdXIgYXBwIGV4cGVyaWVuY2U8L3N0cmluZz4KICAgICA8IS0tIE5vdGlmaWNhdGlvbiBidXR0b24gdGV4dCB0byBjYW5jZWwgdGhlIHBlcmZvcm1hbmNlIGJvb3N0IG5vdGlmaWNhdGlvbi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJmb3JtYW5jZV9ib29zdF9ub3RpZmljYXRpb25fYnV0dG9uX25vdF9ub3ciPk5vdCBub3c8L3N0cmluZz4KICAgICA8IS0tIE5vdGlmaWNhdGlvbiBidXR0b24gdGV4dCB0byBtYW5hZ2UgdGhlIHBlcmZvcm1hbmNlIGJvb3N0IG5vdGlmaWNhdGlvbi4gLS0+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9DcmVkZW50aWFsTWFuYWdlci9zcmMvY29tL2FuZHJvaWQvY3JlZGVudGlhbG1hbmFnZXIvZ2V0Zmxvdy9HZXRDcmVkZW50aWFsQ29tcG9uZW50cy5rdCBiL3BhY2thZ2VzL0NyZWRlbnRpYWxNYW5hZ2VyL3NyYy9jb20vYW5kcm9pZC9jcmVkZW50aWFsbWFuYWdlci9nZXRmbG93L0dldENyZWRlbnRpYWxDb21wb25lbnRzLmt0CmluZGV4IGRkNjA3NjMuLjU2MzI0NTggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0NyZWRlbnRpYWxNYW5hZ2VyL3NyYy9jb20vYW5kcm9pZC9jcmVkZW50aWFsbWFuYWdlci9nZXRmbG93L0dldENyZWRlbnRpYWxDb21wb25lbnRzLmt0CisrKyBiL3BhY2thZ2VzL0NyZWRlbnRpYWxNYW5hZ2VyL3NyYy9jb20vYW5kcm9pZC9jcmVkZW50aWFsbWFuYWdlci9nZXRmbG93L0dldENyZWRlbnRpYWxDb21wb25lbnRzLmt0CkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICAgICAgICAgICAgICBsZWZ0QnV0dG9uID0gaWYgKHRvdGFsRW50cmllc0NvdW50ID4gMSkgewogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25CdXR0b24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nUmVzb3VyY2UoUi5zdHJpbmcuZ2V0X2RpYWxvZ191c2Vfc2F2ZWRfcGFzc2tleV9mb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlKFIuc3RyaW5nLmdldF9kaWFsb2dfdGl0bGVfc2lnbl9pbl9vcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk1vcmVPcHRpb25TZWxlY3RlZAogICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfYXJhYmljLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9hcmFiaWMua2NtCmluZGV4IDE2MTQxODguLjljMjA2NGMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9hcmFiaWMua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9hcmFiaWMua2NtCkBAIC0yMiw4OSArMjIsODkgQEAKIAoga2V5IEdSQVZFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjMwJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzAnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY1MScKIH0KIAoga2V5IDEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NjEnCi0gICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyEnCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEnCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyEnCiB9CiAKIGtleSAyIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjYyJwotICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICcyJworICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCiBrZXkgMyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2MycKLSAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycKICAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycKIH0KIAoga2V5IDQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NjQnCi0gICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyQnCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQnCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyQnCiB9CiAKIGtleSA1IHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjY1JwotICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclJwogICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICc1JworICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclJwogfQogCiBrZXkgNiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2NicKLSAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXicKICAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXicKIH0KIAoga2V5IDcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NjcnCi0gICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYnCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzcnCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYnCiB9CiAKIGtleSA4IHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjY4JwotICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqJwogICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICc4JworICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqJwogfQogCiBrZXkgOSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2OScKLSAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScKICAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnOScKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScKIH0KIAoga2V5IDAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NjAnCi0gICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAnCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnCiB9CiAKIGtleSBNSU5VUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJy0nCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ18nCiB9CiAKIGtleSBFUVVBTFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9JwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICc9JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcrJwogfQogCkBAIC0xMTIsNzkgKzExMiw3OSBAQAogCiBrZXkgUSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzNicKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjM2JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NGUnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM1JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzUnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0YicKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MmInCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyYicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjRmJwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0MicKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQyJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NGMnCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQxJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDEnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1ZmVmOScKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2M2EnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzYScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjI1JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzOScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjM5JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwMTgnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQ3JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDcnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNycKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MmUnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyZScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ3JwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyZCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJkJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MWInCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MmMnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyYycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPicKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MmYnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyZicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KIAoga2V5IEJBQ0tTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcXCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCiB9CiAKQEAgLTE5Miw2NyArMTkyLDY3IEBACiAKIGtleSBBIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM0JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzQnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY1MCcKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzMnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjRkJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0YScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjRhJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyOCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjI4JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ0JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdWZlZjcnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjI3JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjcnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyMycKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MmEnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyYScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQwJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NicKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ2JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MGMnCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQ1JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDUnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2NDMnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0MycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOicKIH0KIAoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM3JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzcnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyInCiB9CiAKQEAgLTI2MCw2MCArMjYwLDYwIEBACiAKIGtleSBaIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjI2JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjYnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjIxJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjEnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY1MicKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MjQnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyNCcKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzEnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneycKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdWZlZmInCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1ZmVmYicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHVmZWY1JwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0OScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ5JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjInCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjI5JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjknCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjAxOScKIH0KIAoga2V5IENPTU1BIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQ4JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDgnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiB9CiAKIGtleSBQRVJJT0QgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzInCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKIH0KIAoga2V5IFNMQVNIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM4JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzgnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYxZicKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9hemVyYmFpamFuaS5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfYXplcmJhaWphbmkua2NtCmluZGV4IDY5NDkwY2MuLjNmNWU4OTQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9hemVyYmFpamFuaS5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2F6ZXJiYWlqYW5pLmtjbQpAQCAtMTA3LDcyICsxMDcsODQgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEzMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTMwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMWUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExZicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxMWYnCiB9CiAKIGtleSBCQUNLU0xBU0ggewpAQCAtMTg3LDY2ICsxOTksNzcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMzEnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDEzMScKIH0KIAoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxOGYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDI1OScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMThmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAyNTknCiB9CiAKICMjIyBST1cgNApAQCAtMjU1LDU0ICsyNzgsNjMgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IENPTU1BIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU3JwogfQogCiBrZXkgUEVSSU9EIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTVlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNWYnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1ZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMTVmJwogfQogCiBrZXkgU0xBU0ggewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2JlbGFydXNpYW4ua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2JlbGFydXNpYW4ua2NtCmluZGV4IDNkZWI5ZGQuLjY3NTFlMWQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9iZWxhcnVzaWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfYmVsYXJ1c2lhbi5rY20KQEAgLTI0LDYgKzI0LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDAxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NTEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQwMScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDUxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdgJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd+JwogfQpAQCAtMTA2LDE2MyArMTA3LDIwMyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE5JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1EnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3EnCiB9CiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndycKIH0KIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDIzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdFJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdlJwogfQoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1InCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3InCiB9CiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndCcKIH0KIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFkJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdZJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd5JwogfQoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3UnCiB9CiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaScKIH0KIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDBFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NUUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQwRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDVFJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdPJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdvJwogfQoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1AnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3AnCiB9CiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwotICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd7JworICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwMjcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDAyNycKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMDI3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwotICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd9JworICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd9JwogfQogIyMjIFJPVyAzCiBrZXkgQSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYScKIH0KIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJiJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdTJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdzJwogfQoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2QnCiB9CiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZicKIH0KIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdHJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdnJwogfQoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0gnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2gnCiB9CiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaicKIH0KIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFiJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdLJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdrJwogfQoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE0JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0wnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2wnCiB9CiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwotICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc6JworICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc6JwogfQoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnJwotICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICciJworICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICciJwogfQoga2V5IEJBQ0tTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwpAQCAtMjc1LDY5ICszMTYsODUgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdaJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd6JwogfQoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1gnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3gnCiB9CiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2MnCiB9CiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndicKIH0KIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDA2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NTYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQwNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDU2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdCJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdiJwogfQoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ04nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ24nCiB9CiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbScKIH0KIGtleSBDT01NQSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKLSAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKKyAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KIGtleSBQRVJJT0QgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCi0gICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCisgICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CiBrZXkgU0xBU0ggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJwotICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc/JworICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc/JwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2JlbGdpYW4ua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2JlbGdpYW4ua2NtCmluZGV4IGYyYzM5Y2UuLmQ1MjkzMTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9iZWxnaWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfYmVsZ2lhbi5rY20KQEAgLTEyMiwxOCArMTIyLDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBaIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTE0MSw0MiArMTQ0LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTk5LDYwICsyMDksNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IEFQT1NUUk9QSEUgewpAQCAtMjgyLDM2ICszMDIsNDIgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfYnJhemlsaWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9icmF6aWxpYW4ua2NtCmluZGV4IDE0MGM3YWMuLmFkMzE5OWYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9icmF6aWxpYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9icmF6aWxpYW4ua2NtCkBAIC0xMTUsNiArMTE1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycKIH0KIApAQCAtMTIyLDYgKzEyMyw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz8nCiB9CiAKQEAgLTEyOSw2ICsxMzEsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTEzNiw0MiArMTM5LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTkzLDYwICsyMDMsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKQEAgLTI1OCw3ICsyNzgsNyBAQAoga2V5IEJBQ0tTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ10nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ10nCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ30nCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiYScKIH0KIApAQCAtMjc0LDE4ICsyOTQsMjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhMicKIH0KIApAQCAtMjkzLDI0ICszMTYsMjggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IENPTU1BIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9idWxnYXJpYW4ua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbi5rY20KaW5kZXggYzU2MzY3ZS4uOTRmZmJkMCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbi5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbi5rY20KQEAgLTI3LDcgKzI3LDcgQEAKIGtleSBHUkFWRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ34nCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CkBAIC0xMjMsODkgKzEyMywxMDkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRiJwotICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1cnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdFJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdlJwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjgnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI4JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDgnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI5JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDknCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ5JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdZJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0knCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdPJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWycKLSAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAneycKKyAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAneycKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewpAQCAtMjEzLDcgKzIzMyw3IEBACiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzsnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhNycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKLSAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfScKKyAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KIAogIyMjIFJPVyAzCkBAIC0yMjIsNzggKzI0Miw5NyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0EnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdTJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdHJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0onCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFkJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdLJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnOicKIH0KQEAgLTMwMiw2ICszNDEsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICciJwogfQpAQCAtMzI4LDYyICszNjgsNzcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdaJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJkJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdWJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ04nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdNJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiB9CkBAIC0zOTIsNiArNDQ3LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFiJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc+JwogfQpAQCAtNDAwLDYgKzQ1Niw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPycKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9idWxnYXJpYW5fcGhvbmV0aWMua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbl9waG9uZXRpYy5rY20KaW5kZXggODg3ODgwNy4uNjMxNDE1OCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbl9waG9uZXRpYy5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2J1bGdhcmlhbl9waG9uZXRpYy5rY20KQEAgLTI4LDYgKzI4LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnficKIH0KQEAgLTEyMiw4OCArMTIzLDEwOCBAQAoga2V5IFEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NycKLSAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI3JwotICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjcnCisgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdRJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdSJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1knCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdVJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ08nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdQJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQpAQCAtMjExLDcgKzIzMiw4IEBACiBrZXkgUklHSFRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ5JwotICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjknCisgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ5JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd9JwogfQpAQCAtMjE5LDkgKzI0MSw4IEBACiBrZXkgQkFDS1NMQVNIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGMnCi0gICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYycKLSAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJjJwotICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MGQnCisgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfCcKIH0KQEAgLTIzMiw3OCArMjUzLDk2IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdEJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0cnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdIJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0snCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdMJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnOicKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnOicKIH0KQEAgLTMxMSw3ICszNTAsNyBAQAoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJyInCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICciJwogfQpAQCAtMzIyLDYgKzM2MSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1ZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDVkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MGQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1ZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCiB9CkBAIC0zMzAsNjIgKzM3MCw3NiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1onCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdYJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdCJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ00nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MjAxZScKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMDFlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc8JwogfQpAQCAtMzkzLDcgKzQ0Nyw3IEBACiBrZXkgUEVSSU9EIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUyMDFjJworICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwMWMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CkBAIC00MDEsNyArNDU1LDcgQEAKIGtleSBTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJz8nCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz8nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz8nCiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfY3JvYXRpYW5fYW5kX3Nsb3Zlbmlhbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfY3JvYXRpYW5fYW5kX3Nsb3Zlbmlhbi5rY20KaW5kZXggOTY0NDVhNC4uMWM3NzRjYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2Nyb2F0aWFuX2FuZF9zbG92ZW5pYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jcm9hdGlhbl9hbmRfc2xvdmVuaWFuLmtjbQpAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogfQogCkBAIC0xMjksNiArMTMwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcKIH0KIApAQCAtMTM2LDYgKzEzOCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTQzLDQ4ICsxNDYsNTYgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2MCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTYxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2MScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY3JwogfQogCkBAIC0xOTIsNiArMjAzLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTEwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMTEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDExMCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMTExJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZDcnCiB9CiAKQEAgLTIwMSwyNCArMjEzLDI4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiB9CiAKQEAgLTIyNiw2ICsyNDIsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogfQogCkBAIC0yMzMsNDAgKzI1MCw0OCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMjY4JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxOTcnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE5NycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMjY4JwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE0MicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTQxJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNDEnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE0MicKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwYycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTBkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwZCcKIH0KIAoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMDYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTA2JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxMDcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkZicKIH0KIApAQCAtMjc0LDYgKzI5OSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGE0JwogfQogCkBAIC0yODksMjQgKzMxNSwyOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCkBAIC0zMTQsNiArMzQ0LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneycKIH0KIApAQCAtMzIxLDYgKzM1Miw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nCiB9CiAKQEAgLTMyOCw2ICszNjAsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTcnCiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jemVjaC5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfY3plY2gua2NtCmluZGV4IDMyNzUwZTAuLjA4YjAxMmUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jemVjaC5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2N6ZWNoLmtjbQpAQCAtMTMxLDE4ICsxMzEsMjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTUwLDQyICsxNTMsNDkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0yMTEsNTQgKzIyMSw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0zMDAsMjQgKzMxOSwyOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCkBAIC0zMjUsMTggKzM0OCwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI1JwogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfY3plY2hfcXdlcnR5LmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jemVjaF9xd2VydHkua2NtCmluZGV4IDQ1N2Q0ZGEuLmNhZDI2MmIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jemVjaF9xd2VydHkua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9jemVjaF9xd2VydHkua2NtCkBAIC0xMzEsMTggKzEzMSwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0xNTAsNDIgKzE1Myw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTIxMSw1NCArMjIxLDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKQEAgLTMwMCwyNCArMzE5LDI4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0AnCiB9CiAKQEAgLTMyNSwxOCArMzQ4LDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYjUnCiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9kYW5pc2gua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2RhbmlzaC5rY20KaW5kZXggOTE2OGQxMi4uODNlZThjMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2RhbmlzaC5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2RhbmlzaC5rY20KQEAgLTExNSw3NiArMTE1LDkwIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlMicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMGMyJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwYzInCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBlMicKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKLSAgICByYWx0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTY3JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNjYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE2NicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTY3JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjZicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGNmJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZWYnCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY1JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwZDUnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkNScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGY1JwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTUnCiB9CiAKIGtleSBSSUdIVF9CUkFDS0VUIHsKQEAgLTIwMCw4NCArMjE0LDEwNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTEnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMxJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTEnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTYxJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE2MCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTYxJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExMScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTEwJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMTAnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDExMScKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZTUnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlNCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWU0JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZTUnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMWU3JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxZTYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFlNicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMWU3JwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDIxZicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMjFlJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAyMWUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDIxZicKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlOScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWU4JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZTgnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlOScKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTQnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjNCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM0JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTQnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkOCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGY4JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBkNicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGQ2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZjYnCiB9CiAKIGtleSBCQUNLU0xBU0ggewpAQCAtMjk5LDUzICszMzMsNjUgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTdlJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE3ZCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTdlJwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTBkJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDEwYycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTBkJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlZicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWVlJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZWUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlZicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAyOTInCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFiNycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWI3JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAyOTInCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTRiJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNGEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE0YScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTRiJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCi0gICAgcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgICAgICAgJ1x1MDBiNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKKyAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI1JwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdWsua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdWsua2NtCmluZGV4IDZkOWMyZTUuLjkzYTUwODIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9lbmdsaXNoX3VrLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91ay5rY20KQEAgLTEwOCw2OCArMTA4LDgyIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTknCi0gICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjOScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM5JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTknCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGZhJwotICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkYScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGZhJwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlZCcKLSAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGNkJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwY2QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBlZCcKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjMnCi0gICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkMycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGQzJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZjMnCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0xOTAsNTYgKzIwNCw2NiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTEnCi0gICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMxJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTEnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKQEAgLTI3NCw0MiArMjk4LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91cy5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91cy5rY20KaW5kZXggMDUwYjE0OS4uZGE3NjQ0OCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXMua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9lbmdsaXNoX3VzLmtjbQpAQCAtMTA2LDYwICsxMDYsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0xODYsNTQgKzE5Niw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0yNTQsNDIgKzI3Myw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXNfY29sZW1hay5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19jb2xlbWFrLmtjbQppbmRleCA3MmU2ZDA0Li5lNTJjY2YwIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19jb2xlbWFrLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19jb2xlbWFrLmtjbQpAQCAtMTI1LDYwICsxMjUsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICc6JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICc6JwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTIwNSw1NCArMjE1LDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CkBAIC0yNzMsNDIgKzI5Miw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXNfZHZvcmFrLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9lbmdsaXNoX3VzX2R2b3Jhay5rY20KaW5kZXggZGY2YTNmZC4uNmZmNjI3YiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXNfZHZvcmFrLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19kdm9yYWsua2NtCkBAIC0xNjAsNDIgKzE2MCw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0xBU0ggewpAQCAtMjIyLDYwICsyMjksNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IE1JTlVTIHsKQEAgLTI5Niw1MiArMzEzLDYxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IFogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXNfaW50bC5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19pbnRsLmtjbQppbmRleCBhYTMxNDkzLi5kZmYxN2IzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19pbnRsLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c19pbnRsLmtjbQpAQCAtMTIxLDMwICsxMjEsMzcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwYzQnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBlNCcKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTUnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjNScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGU1JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlOScKICAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM5JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTknCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGFlJwogfQogCkBAIC0xNTIsNDggKzE1OSw2MCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZmUnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkZScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGZlJwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYycKICAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGRjJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZmMnCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGZhJwogICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZGEnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmYScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZWQnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjZCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGVkJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmMycKICAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGQzJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZjMnCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmNicKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0yMjQsMTQgKzI0MywxNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTEnCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMxJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTEnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGRmJwogICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTcnCiB9CkBAIC0yNDAsNDYgKzI2Miw1NSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjAnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkMCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGYwJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjgnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkOCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGY4JwogfQogCiBrZXkgU0VNSUNPTE9OIHsKQEAgLTMxMiwyMCArMzQzLDI0IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNicKICAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTYnCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTknCiAgICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhMicKIH0KQEAgLTMzNCwyNiArMzY5LDMxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjEnCiAgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkMScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGYxJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNScKIH0KIApAQCAtMzYzLDYgKzQwMyw3IEBACiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKICAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM3JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTcnCiB9CiAKIGtleSBQRVJJT0QgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VuZ2xpc2hfdXNfd29ya21hbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c193b3JrbWFuLmtjbQppbmRleCBmZTgyYzhkLi43MTNhZmJhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c193b3JrbWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZW5nbGlzaF91c193b3JrbWFuLmtjbQpAQCAtMTI5LDYwICsxMjksNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICc6JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICc6JwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTIwOSw0OCArMjE5LDU2IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IE8gewpAQCAtMjYzLDYgKzI4MSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKQEAgLTI3Nyw0MiArMjk2LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZXN0b25pYW4ua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2VzdG9uaWFuLmtjbQppbmRleCBlZjU0NWI4Li4yN2EwM2RhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZXN0b25pYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9lc3Rvbmlhbi5rY20KQEAgLTExNiwxOCArMTE2LDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTEzNSw1NCArMTM4LDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiB9CiAKIGtleSBSSUdIVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGY1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTcnCiB9CiAKQEAgLTE5Miw2OCArMjA0LDgwIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTYxJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE2MCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTYxJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGQ2JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZjYnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDInCiB9CiAKQEAgLTI3Nyw0NCArMzAxLDUyIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTdkJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE3ZScKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IENPTU1BIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9maW5uaXNoLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9maW5uaXNoLmtjbQppbmRleCBiNGRlZWQ0Li43OTA5NmFkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZmlubmlzaC5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2Zpbm5pc2gua2NtCkBAIC0xMTUsNzYgKzExNSw5MCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTInCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjMicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMyJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTInCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCi0gICAgcmFsdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2NycKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTY2JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNjYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE2NycKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGVmJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwY2YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjZicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGVmJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMGQ1JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZDUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmNScKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU1JwogfQogCiBrZXkgUklHSFRfQlJBQ0tFVCB7CkBAIC0yMDAsODQgKzIxNCwxMDQgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGUxJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwYzEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGUxJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2MScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTYwJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE2MScKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMTEnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDExMCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTEwJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxMTEnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMWU1JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxZTQnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFlNCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMWU1JwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlNycKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWU2JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZTYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlNycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAyMWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDIxZScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMjFlJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAyMWYnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZTknCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlOCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWU4JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZTknCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY4JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwZDgnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkOCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGY4JwogfQogCiBrZXkgQVBPU1RST1BIRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwYzQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU2JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwYzYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjNicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGU2JwogfQogCiBrZXkgQkFDS1NMQVNIIHsKQEAgLTI5OSw1MyArMzMzLDY1IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTdkJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE3ZScKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwZCcKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTBjJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDEwZCcKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlZScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWVlJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZWYnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMjkyJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxYjcnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFiNycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMjkyJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE0YicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTRhJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNGEnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE0YicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJwotICAgIHJhbHQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICdcdTAwYjUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCisgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNScKIH0KIAoga2V5IENPTU1BIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9mcmVuY2gua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2ZyZW5jaC5rY20KaW5kZXggODllODNkYS4uNDkwNjMwNCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2ZyZW5jaC5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2ZyZW5jaC5rY20KQEAgLTEyMywxOCArMTIzLDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBaIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTE0Miw0MiArMTQ1LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTk5LDYwICsyMDksNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IEFQT1NUUk9QSEUgewpAQCAtMjc5LDM2ICsyOTksNDIgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZnJlbmNoX2NhLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9mcmVuY2hfY2Eua2NtCmluZGV4IDU1ZGRkNjAuLjAzYjVjMTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9mcmVuY2hfY2Eua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9mcmVuY2hfY2Eua2NtCkBAIC0xMTksNTQgKzExOSw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGE3JwogfQogCkBAIC0xNzQsNiArMTgzLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI2JwogfQogCkBAIC0xOTYsNTQgKzIwNiw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0yNzksNDIgKzI5OCw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYjUnCiB9CiAKQEAgLTMzNSw1ICszNjEsNiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlOScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM5JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMScKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9nZW9yZ2lhbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZ2VvcmdpYW4ua2NtCmluZGV4IDM1YjY2YTMuLmE4ZjIyOWYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9nZW9yZ2lhbi5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2dlb3JnaWFuLmtjbQpAQCAtMjgsNiArMjgsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwMWUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjAxZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUyMDFjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTIwMWUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CkBAIC0xMjgsNzkgKzEyOSw5MiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZTUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZWMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUxMGVkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTEwZWMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1cnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGQ0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGUwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZTAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MTBlNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUxMGUwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdSJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlMicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGUyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTEwZDcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlMicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZTcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlNycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZTMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlMycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDgnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZGQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZGUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ3snCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3snCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ3snCiB9CkBAIC0yMDgsNyArMjIyLDcgQEAKIGtleSBSSUdIVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnfScKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KQEAgLTIyNyw3MiArMjQxLDg0IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGQwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdBJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGUxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTEwZTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkMycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZTQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlNCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkMicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZjAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBmMCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZWYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUxMGRmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTEwZWYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0onCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGQ5JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0snCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGRhJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZGEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MjBiZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUxMGRhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdMJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnOicKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnOicKIH0KQEAgLTMwMCw3ICszMjYsNyBAQAoga2V5IEFQT1NUUk9QSEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJyInCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICciJwogfQpAQCAtMzExLDU3ICszMzcsNjYgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGQ2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MTBlYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUxMGQ2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdaJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlZScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGVlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdYJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlYScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUxMGVhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTEwZTknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MTBlYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZGMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTEwZGInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MTBkYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IENPTU1BIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKLSAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnPCcKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KQEAgLTM2OSw3ICs0MDQsNyBAQAoga2V5IFBFUklPRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJz4nCisgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZ2VybWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9nZXJtYW4ua2NtCmluZGV4IGQ5Y2FhMzIuLjIzY2NjOWEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9nZXJtYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9nZXJtYW4ua2NtCkBAIC0xOCw3ICsxOCw3IEBACiAKIHR5cGUgT1ZFUkxBWQogCi1tYXAga2V5IDEyIFNMQVNIICAgICAgICAgICAgIyCnID8gXAorbWFwIGtleSAxMiBTTEFTSCAgICAgICAgICAgICMgwqcgPyBcCiBtYXAga2V5IDIxIFoKIG1hcCBrZXkgNDQgWQogbWFwIGtleSA1MyBNSU5VUyAgICAgICAgICAgICMgLSBfCkBAIC0xMTcsNiArMTE3LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQCcKIH0KIApAQCAtMTI0LDEyICsxMjUsMTQgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTEzNyw0OCArMTQwLDU2IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiB9CiAKIGtleSBSSUdIVF9CUkFDS0VUIHsKQEAgLTE5NCw2NiArMjA1LDc3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogfQogCiBrZXkgQVBPU1RST1BIRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwYzQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNCcKIH0KIAoga2V5IEJBQ0tTTEFTSCB7CkBAIC0yNzUsNDIgKzI5Nyw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYjUnCiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ncmVlay5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfZ3JlZWsua2NtCmluZGV4IGE3Njg0ZTEuLjZlZmYxMTQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ncmVlay5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2dyZWVrLmtjbQpAQCAtMjQsODggKzI0LDg4IEBACiAKIGtleSBHUkFWRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2AnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CiAKIGtleSAxIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnMScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIScKIH0KIAoga2V5IDIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICcyJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYjInCiB9CiAKIGtleSAzIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnMycKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGIzJwogfQogCiBrZXkgNCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJzQnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhMycKIH0KIAoga2V5IDUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1JwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICc1JworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTcnCiB9CiAKIGtleSA2IHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnNicKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI2JwogfQogCiBrZXkgNyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzcnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJzcnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzcnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYnCiB9CiAKIGtleSA4IHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnOCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGE0JwogfQogCiBrZXkgOSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzknCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJzknCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzknCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhNicKIH0KIAoga2V5IDAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICcwJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcpJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYjAnCiB9CiAKIGtleSBNSU5VUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJy0nCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ18nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiMScKIH0KIAoga2V5IEVRVUFMUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJz0nCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJysnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiZCcKIH0KQEAgLTExNCwxMyArMTE0LDEzIEBACiAKIGtleSBRIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnOycKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOicKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYzInCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjMicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzg1JwogfQogCkBAIC0xMjgsNiArMTI4LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2I1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOTUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0xMzUsNiArMTM2LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2MxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzYTEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGFlJwogfQogCkBAIC0xNDIsMTIgKzE0NCwxNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYzQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDNhNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2M0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjNScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwM2E1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYzUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhNScKIH0KIApAQCAtMTU1LDM2ICsxNTksNDAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2I4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiOCcKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYjknCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDM5OScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2I5JwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMzlmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYmYnCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2MwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzYTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjMCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1snCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3snCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhYicKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICddJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYmInCiB9CkBAIC0xOTUsNTkgKzIwMyw2OCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYjEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDM5MScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2IxJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwM2EzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYzMnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2I0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOTQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiNCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDNhNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2M2JwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMzkzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYjMnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2I3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOTcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiNycKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYmUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDM5ZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2JlJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMzlhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYmEnCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2JiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOWInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiYicKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzsnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAxJwogI3Nob3VsZCBiZSBcdTAzODQgKGdyZWVrIHRvbm9zKQogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDgnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDM4NScKQEAgLTI1NSwxMyArMjcyLDEzIEBACiAKIGtleSBBUE9TVFJPUEhFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1wnJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIicKIH0KIAoga2V5IEJBQ0tTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcXCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhYycKIH0KQEAgLTI3MCw3ICsyODcsNyBAQAogCiBrZXkgUExVUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwnCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJzwnCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd8JwpAQCAtMjgwLDE4ICsyOTcsMjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2I2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOTYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiNicKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYzcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDNhNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2M3JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjOCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwM2E4JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYzgnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhOScKIH0KIApAQCAtMjk5LDQwICszMTksNDQgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2M5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzYTknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNjOScKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzYjInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDM5MicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwM2IyJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMzlkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAzYmQnCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwM2JjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAzOWMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDNiYycKIH0KIAoga2V5IENPTU1BIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnLCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KIAoga2V5IFBFUklPRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJy4nCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CiAKIGtleSBTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCi0gICAgYmFzZSwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJy8nCisgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz8nCiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaGVicmV3LmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9oZWJyZXcua2NtCmluZGV4IDI4M2NiNGUuLjExYWRlNDIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9oZWJyZXcua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9oZWJyZXcua2NtCkBAIC0xMjEsMTggKzEyMSwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDAyNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZTcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTQwLDI0ICsxNDMsMjggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWU4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkMCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZDgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWQ1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZjAnCiB9CiAKQEAgLTE2NSwyOSArMTcyLDMyIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZGQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWU0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKLSAgICBiYXNlLCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXScKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdbJworICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQogCkBAIC0xOTcsMzYgKzIwNyw0MiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZTknCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWQzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZGInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWUyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkOScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWYyJwogfQogCkBAIC0yMzQsNiArMjUwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWQ3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZjEnCiB9CiAKQEAgLTI0MSwxMiArMjU4LDE0IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZGEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewpAQCAtMjU0LDYgKzI3Myw3IEBACiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVlMycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOicKICAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnOycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnOicKIH0KIAoga2V5IEFQT1NUUk9QSEUgewpAQCAtMjYxLDYgKzI4MSw3IEBACiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyInCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICciJwogfQogCiBrZXkgQkFDS1NMQVNIIHsKQEAgLTI3Myw3ICsyOTQsNyBAQAogCiBrZXkgUExVUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwotICAgIGJhc2UsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcXCcKKyAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCiB9CiAKQEAgLTI4MSw0MiArMzAyLDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZTEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWQxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVkNCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZTAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNWRlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVlNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IENPTU1BIHsKQEAgLTMyNCw2ICszNTIsNyBAQAogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA1ZWEnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiAgICAgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CiAKIGtleSBQRVJJT0QgewpAQCAtMzMxLDYgKzM2MCw3IEBACiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDVlNScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKICAgICBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnPCcKIH0KIAoga2V5IFNMQVNIIHsKQEAgLTMzOCw0ICszNjgsNSBAQAogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc/JwogICAgIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICc/JwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2h1bmdhcmlhbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaHVuZ2FyaWFuLmtjbQppbmRleCBkYWZiNTBiLi42Yzk0N2M3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaHVuZ2FyaWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaHVuZ2FyaWFuLmtjbQpAQCAtMTAxLDYgKzEwMSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzBiJwogfQogCkBAIC0xMDgsNiArMTA5LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGZjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDgnCiB9CiAKQEAgLTExNSw2ICsxMTcsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZDMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGQzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZjMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMyNycKIH0KIApAQCAtMTI0LDYgKzEyNyw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogfQogCkBAIC0xMzEsNiArMTM1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcKIH0KIApAQCAtMTM4LDYgKzE0Myw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNCcKIH0KIApAQCAtMTQ1LDI0ICsxNTEsMjggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0xNzAsNiArMTgwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGNkJwogfQogCkBAIC0xNzcsMTggKzE4OCwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNTAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTUwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxNTEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNycKIH0KIApAQCAtMTk2LDYgKzIxMCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkYScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGZhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZGEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ3JwogfQogCkBAIC0yMDUsNiArMjIwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogfQogCkBAIC0yMTIsNiArMjI4LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTExJwogfQogCkBAIC0yMTksNiArMjM2LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTEwJwogfQogCkBAIC0yMjYsNiArMjQ0LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWycKIH0KIApAQCAtMjMzLDYgKzI1Miw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ10nCiB9CiAKQEAgLTI0MCwxMiArMjYwLDE0IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGVkJwogfQogCkBAIC0yNTMsNiArMjc1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTk3JwogfQogCkBAIC0yNjAsNiArMjgzLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTQxJwogfQogCkBAIC0yNjcsNiArMjkxLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM5JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTknCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjOScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU5JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICckJwogfQogCkBAIC0yNzQsNiArMjk5LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGMxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGUxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGYnCiB9CiAKQEAgLTI4MSw2ICszMDcsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNzAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTcwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxNzEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhNCcKIH0KIApAQCAtMjkwLDYgKzMxNyw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGVkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwY2QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KIApAQCAtMjk3LDYgKzMyNSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CiAKQEAgLTMwNCw2ICszMzMsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjJwogfQogCkBAIC0zMTEsNiArMzQxLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJicKIH0KIApAQCAtMzE4LDYgKzM0OSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0AnCiB9CiAKQEAgLTMyNSw2ICszNTcsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQogCkBAIC0zMzIsNiArMzY1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KIApAQCAtMzM5LDYgKzM3Myw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaWNlbGFuZGljLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9pY2VsYW5kaWMua2NtCmluZGV4IDExN2Y1OGIuLjUxMzFiNGYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9pY2VsYW5kaWMua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9pY2VsYW5kaWMua2NtCkBAIC05OSw2ICs5OSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiB9CiAKQEAgLTExNCw2ICsxMTUsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCkBAIC0xMjEsMTIgKzEyMywxNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTM0LDQ4ICsxMzgsNTYgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTExJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDExMScKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewpAQCAtMTkxLDYwICsyMDMsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM2JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTYnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKQEAgLTI3NCw0MiArMjk2LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNScKIH0KIApAQCAtMzI5LDQgKzM1OCw1IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkZScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGZlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZGUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmZScKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9pdGFsaWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9pdGFsaWFuLmtjbQppbmRleCBiZDJkMjVhLi4zMDlkOGIyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfaXRhbGlhbi5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2l0YWxpYW4ua2NtCkBAIC0xMDksMTggKzEwOSwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0xMjgsNDIgKzEzMSw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTE4OCw1NCArMTk4LDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKQEAgLTI3MCw0MiArMjg5LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfbGF0dmlhbl9xd2VydHkua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2xhdHZpYW5fcXdlcnR5LmtjbQppbmRleCBkNGJjMGMwLi4zYjc3Y2IxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfbGF0dmlhbl9xd2VydHkua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9sYXR2aWFuX3F3ZXJ0eS5rY20KQEAgLTExOSw3MCArMTE5LDg1IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMTMnCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDExMicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTEyJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxMTMnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTU3JwotICAgIHNoaWZ0K3JhbHQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxNTYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE1NicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTU3JwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNmInCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDE2YScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTZhJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxNmInCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTJiJwotICAgIHNoaWZ0K3JhbHQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxMmEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDEyYScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTJiJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNScKLSAgICBzaGlmdCtyYWx0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMGQ1JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZDUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmNScKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTIwNCw2NCArMjE5LDc4IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwMScKLSAgICBzaGlmdCtyYWx0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTAwJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMDAnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDEwMScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNjEnCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDE2MCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTYwJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxNjEnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEyMycKLSAgICBzaGlmdCtyYWx0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTIyJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMjInCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDEyMycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTM3JwotICAgIHNoaWZ0K3JhbHQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxMzYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDEzNicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTM3JwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEzYycKLSAgICBzaGlmdCtyYWx0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTNiJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxM2InCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDEzYycKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0yOTgsNDggKzMyNyw1OCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxN2UnCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDE3ZCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTdkJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxN2UnCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMGQnCi0gICAgc2hpZnQrcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDEwYycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTBjJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxMGQnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE0NicKLSAgICBzaGlmdCtyYWx0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTQ1JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNDUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE0NicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2xpdGh1YW5pYW4ua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X2xpdGh1YW5pYW4ua2NtCmluZGV4IDcyY2EzMzMuLmJjZmRiMTIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9saXRodWFuaWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfbGl0aHVhbmlhbi5rY20KQEAgLTMyLDYgKzMyLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTA1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMDQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMScKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnIScKIH0KQEAgLTQwLDYgKzQxLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTBkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMicKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnQCcKIH0KQEAgLTQ4LDYgKzUwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTE5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDExOScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnIycKIH0KQEAgLTU2LDYgKzU5LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTE3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMTYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDExNycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNCcKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnJCcKIH0KQEAgLTY0LDYgKzY4LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTJmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMmUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDEyZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNScKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnJScKIH0KQEAgLTcyLDYgKzc3LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTYxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2MScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKICAgICBzaGlmdCtyYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzAyJwogfQpAQCAtODAsNiArODYsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNzMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDE3MicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMTczJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3JwogICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICcmJwogfQpAQCAtODgsNiArOTUsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNmInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDE2YScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMTZiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4JwogICAgIHNoaWZ0K3JhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICcqJwogfQpAQCAtMTE2LDYgKzEyNCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTdkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxN2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCiAgICAgc2hpZnQrcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgJysnCiB9CkBAIC0xMjYsMTggKzEzNSwyMSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0xNDUsNDIgKzE1Nyw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTIwMSw1NCArMjIwLDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKQEAgLTI4MSw0MiArMzA5LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfbW9uZ29saWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9tb25nb2xpYW4ua2NtCmluZGV4IDNkNGE4YzYuLjc3Y2M2NzIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9tb25nb2xpYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9tb25nb2xpYW4ua2NtCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJysnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJysnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CkBAIC0xMjIsODYgKzEyMywxMDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdRJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdSJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1knCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdVJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0YWYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDRhZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNGFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0YWYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ08nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdQJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNhJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQpAQCAtMjEwLDYgKzIzMiw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KQEAgLTIyMCw3OCArMjQzLDk3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJiJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdEJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDRlOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNGU5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0ZTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDRlOScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzAnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0cnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdIJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0snCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdMJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc6JwogfQpAQCAtMzAwLDYgKzM0Miw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJyInCiB9CkBAIC0zMTgsNjIgKzM2MSw3NyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1onCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdYJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1MScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDUxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MDEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1MScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdCJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ00nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KQEAgLTM4Miw2ICs0NDAsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfbm9yd2VnaWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ub3J3ZWdpYW4ua2NtCmluZGV4IDU2MGRkMTYuLmNhZTFjOTQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ub3J3ZWdpYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ub3J3ZWdpYW4ua2NtCkBAIC0xMTUsNzYgKzExNSw5MCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTInCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjMicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMyJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTInCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCi0gICAgcmFsdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2NycKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTY2JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNjYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE2NycKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGVmJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwY2YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjZicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGVmJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMGQ1JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZDUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmNScKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU1JwogfQogCiBrZXkgUklHSFRfQlJBQ0tFVCB7CkBAIC0yMDAsODQgKzIxNCwxMDQgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGUxJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwYzEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGUxJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE2MScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTYwJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE2MScKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMTEnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDExMCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTEwJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxMTEnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMWU1JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxZTQnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFlNCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMWU1JwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlNycKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWU2JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZTYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlNycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAyMWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDIxZScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMjFlJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAyMWYnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZTknCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlOCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWU4JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZTknCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkNicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGY2JwogfQogCiBrZXkgQVBPU1RST1BIRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwYzYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwYzQnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBjNCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGU0JwogfQogCiBrZXkgQkFDS1NMQVNIIHsKQEAgLTI5OCw1MyArMzMyLDY1IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3ZScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTdkJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE3ZScKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEwZCcKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTBjJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDEwZCcKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlZScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWVlJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZWYnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMjkyJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxYjcnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFiNycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMjkyJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE0YicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTRhJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNGEnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE0YicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJwotICAgIHJhbHQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICdcdTAwYjUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCisgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNScKIH0KIAoga2V5IENPTU1BIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9wZXJzaWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9wZXJzaWFuLmtjbQppbmRleCBiZmU3ODIxLi42NzQ0OTIyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcGVyc2lhbi5rY20KKysrIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3BlcnNpYW4ua2NtCkBAIC0yMiwyMzEgKzIyLDIyMiBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzNCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjI0JwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM0JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjMwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTIwMEMnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzAnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjMyJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDY5OCcKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMicKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2Q0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDZDQycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjRBJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNkNDJwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJCJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2NEQnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MkInCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjI4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MjgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDYyNScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyOCcKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjIzJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQ0JwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjI3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2MjInCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MjcnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDY1MScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NycKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MkEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyQScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjI5JwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjJBJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwQUInCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2NDYnCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBCQicKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0NScKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2N0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY3RScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjIxJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjdFJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJGJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2NTQnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MkYnCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MkUnCi0gICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ10nCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJEJwotICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdbJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWycKIH0KIAoga2V5IFEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjUyJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM2JwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0MicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2NEInCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2NDInCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjMzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDYyNicKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMycKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjRGJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjQxJwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjM5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2NEUnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzknCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjMxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDY3MCcKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzMScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzNScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjRDJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM1JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjM3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA2NTMnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQorICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA2MzcnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjNBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2M0EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDY1MCcKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzQScKIH0KIAoga2V5IFogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MzgnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYzOCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNjQzJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNjM4JwogfQogCiBrZXkgMCB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ1x1MDZGMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNkYwJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKIH0KIAoga2V5IDEgewogICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDZGMScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSAyIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkYyJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjInCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2QycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiAKIH0KIGtleSAzIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkYzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjMnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2QicKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSA0IHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkY0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjQnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1RkRGQycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSA1IHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkY1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjUnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY2QScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSA2IHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkY2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjYnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBENycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIApAQCAtMjU0LDI0OCArMjQ1LDgyIEBACiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ1x1MDZGNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNkY3JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2MEMnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQogfQogCiBrZXkgOCB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ1x1MDZGOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNkY4JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKIH0KIAoga2V5IDkgewogICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICdcdTA2RjknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDZGOScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBTUEFDRSB7Ci0gICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgRU5URVIgewotICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbicKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgVEFCIHsKLSAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHQnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x0JwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKIH0KIAoga2V5IENPTU1BIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNjQ4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2NDgnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQogfQogCiBrZXkgUEVSSU9EIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnLicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSBTTEFTSCB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJy8nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDYxRicKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSBHUkFWRSB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBGNycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKLQoga2V5IE1JTlVTIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnLScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLScKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSBFUVVBTFMgewogICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICc9JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9JwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcrJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ1x1MDYyQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNjJDJwogICAgIHNoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd9JwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKIH0KIAoga2V5IFJJR0hUX0JSQUNLRVQgewogICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICdcdTA2ODYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDY4NicKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCiB9CiAKIGtleSBCQUNLU0xBU0ggewogICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICdcXCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnXHUwNkE5JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA2QTknCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzonCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQogfQogCiBrZXkgQVBPU1RST1BIRSB7CiAgICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJ1wnJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICBzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCInCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi0jIyMgTnVtZXJpYyBrZXlwYWQgIyMjCi0KLWtleSBOVU1QQURfMCB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJzAnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgSU5TRVJUCi0gICAgbnVtbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEXzEgewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICcxJwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrIE1PVkVfRU5ECi0gICAgbnVtbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEXzIgewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICcyJwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrIERQQURfRE9XTgotICAgIG51bWxvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKLX0KLQota2V5IE5VTVBBRF8zIHsKLSAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnMycKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFjayBQQUdFX0RPV04KLSAgICBudW1sb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfNCB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJzQnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgRFBBRF9MRUZUCi0gICAgbnVtbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEXzUgewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICc1JwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrIERQQURfQ0VOVEVSCi0gICAgbnVtbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzUnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEXzYgewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICc2JwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrIERQQURfUklHSFQKLSAgICBudW1sb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfNyB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJzcnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgTU9WRV9IT01FCi0gICAgbnVtbG9jazogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzcnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEXzggewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICc4JwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrIERQQURfVVAKLSAgICBudW1sb2NrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfOSB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJzknCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgUEFHRV9VUAotICAgIG51bWxvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICc5JwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKLX0KLQota2V5IE5VTVBBRF9MRUZUX1BBUkVOIHsKLSAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnKScKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfUklHSFRfUEFSRU4gewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICcoJwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKLX0KLQota2V5IE5VTVBBRF9ESVZJREUgewotICAgIGxhYmVsLCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICcvJwotICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKLX0KLQota2V5IE5VTVBBRF9NVUxUSVBMWSB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJyonCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyonCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEX1NVQlRSQUNUIHsKLSAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnLScKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLScKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfQUREIHsKLSAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnKycKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKycKLSAgICBjdHJsLCBhbHQsIG1ldGE6ICAgICAgICAgICAgICAgICAgICBub25lCi19Ci0KLWtleSBOVU1QQURfRE9UIHsKLSAgICBsYWJlbCwgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAnLicKLSAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFjayBGT1JXQVJEX0RFTAotICAgIG51bWxvY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUKLX0KLQota2V5IE5VTVBBRF9DT01NQSB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJywnCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEX0VRVUFMUyB7Ci0gICAgbGFiZWwsIG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgJz0nCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nCi0gICAgY3RybCwgYWx0LCBtZXRhOiAgICAgICAgICAgICAgICAgICAgbm9uZQotfQotCi1rZXkgTlVNUEFEX0VOVEVSIHsKLSAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCi0gICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJyBmYWxsYmFjayBFTlRFUgotICAgIGN0cmwsIGFsdCwgbWV0YTogICAgICAgICAgICAgICAgICAgIG5vbmUgZmFsbGJhY2sgRU5URVIKLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcG9saXNoLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9wb2xpc2gua2NtCmluZGV4IDU1OWVjMDcuLjY2ZmJlZmMxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcG9saXNoLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcG9saXNoLmtjbQpAQCAtMTA0LDY0ICsxMDQsNzYgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExOScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTE4JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMTgnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDExOScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMEYzJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAwRDMnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBEMycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMEYzJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTg4LDYwICsyMDAsNzIgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTA1JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxMDQnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDEwNCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTA1JwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1YicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTVhJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNWEnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE1YicKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNDInCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDE0MScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTQxJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxNDInCiB9CiAKIGtleSBTRU1JQ09MT04gewpAQCAtMjYyLDUwICsyODYsNjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTdjJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAxN2InCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE3YicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTdjJwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE3YScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTc5JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNzknCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE3YScKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMDcnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDEwNicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTA2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxMDcnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE0NCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMTQzJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxNDMnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDE0NCcKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3BvcnR1Z3Vlc2Uua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3BvcnR1Z3Vlc2Uua2NtCmluZGV4IDQ3ZWU4NjcuLjZmZTBlNDcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9wb3J0dWd1ZXNlLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcG9ydHVndWVzZS5rY20KQEAgLTExNSwxOCArMTE1LDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTEzNCw0MiArMTM3LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTkxLDYwICsyMDEsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKQEAgLTI3Miw0MiArMjkyLDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcnVzc2lhbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcnVzc2lhbi5rY20KaW5kZXggNDFjNmJiMy4uZWNhZGE0OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3J1c3NpYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ydXNzaWFuLmtjbQpAQCAtMjgsNiArMjgsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDAxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NTEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ34nCiB9CkBAIC0xMjQsODYgKzEyNSwxMDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE5JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzknCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM5JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdRJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdxJwogfQogCiBrZXkgVyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2UnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFhJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdSJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFkJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1knCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDEzJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdVJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI5JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ08nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdQJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd7JwogfQpAQCAtMjEyLDYgKzIzNCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXScKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnfScKIH0KQEAgLTIyMiw3OCArMjQ1LDk3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJiJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMyJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdEJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTAnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0cnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDIwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdIJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFiJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2InCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0snCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdMJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7JwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc6JwogfQpAQCAtMzAyLDYgKzM0NCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJyInCiB9CkBAIC0zMTksNjIgKzM2Miw3NyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1onCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdYJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1YnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdCJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ00nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDMxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnPCcKIH0KQEAgLTM4Myw2ICs0NDEsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MmUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0ZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDJlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NGUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcnVzc2lhbl9tYWMua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3J1c3NpYW5fbWFjLmtjbQppbmRleCAxMWMyYWQ0Li41NDE3YmMzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfcnVzc2lhbl9tYWMua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9ydXNzaWFuX21hYy5rY20KQEAgLTEyNiw4NiArMTI2LDEwNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE5JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1EnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdXJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1InCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdUJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdJJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1AnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ3snCiB9CkBAIC0yMTQsNiArMjM1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJhJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd9JwogfQpAQCAtMjI0LDc4ICsyNDYsOTcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdBJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDRiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MmInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0YicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDEwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdGJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0gnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdKJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE0JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0wnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE2JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzsnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJzonCiB9CkBAIC0zMDQsNiArMzQ1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJkJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRkJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnIicKIH0KQEAgLTMxMiw2ICszNTQsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDAxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NTEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd8JwogfQpAQCAtMzMwLDYyICszNzMsNzcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdaJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdWJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ04nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdNJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDExJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiB9CkBAIC0zOTQsNiArNDUyLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc+JwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3Nsb3Zhay5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc2xvdmFrLmtjbQppbmRleCAyZWIwZjYzLi41MDY1YWE4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc2xvdmFrLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc2xvdmFrLmtjbQpAQCAtMTE4LDYgKzExOCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogfQogCkBAIC0xMjUsNiArMTI2LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcKIH0KIApAQCAtMTMyLDYgKzEzNCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTM5LDQyICsxNDIsNDkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCcnCiB9CiAKQEAgLTE5OCwxMiArMjA4LDE0IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTExJwogfQogCkBAIC0yMTEsNiArMjIzLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTEwJwogfQogCkBAIC0yMTgsNiArMjMxLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWycKIH0KIApAQCAtMjI1LDYgKzIzOSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ10nCiB9CiAKQEAgLTIzMiwxOCArMjQ3LDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNDInCiB9CiAKQEAgLTI1MSw2ICsyNjksNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNDEnCiB9CiAKQEAgLTI4OCw2ICszMDcsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc+JwogfQogCkBAIC0yOTUsNiArMzE1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycKIH0KIApAQCAtMzAyLDYgKzMyMyw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYnCiB9CiAKQEAgLTMwOSw2ICszMzEsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCkBAIC0zMTYsNiArMzM5LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneycKIH0KIApAQCAtMzIzLDYgKzM0Nyw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nCiB9CiAKQEAgLTMzMCw2ICszNTUsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3NwYW5pc2gua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3NwYW5pc2gua2NtCmluZGV4IGRhOTE1OWIuLjZhNjNlNzAgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9zcGFuaXNoLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3BhbmlzaC5rY20KQEAgLTExMywxOCArMTEzLDIxIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdFJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTIwYWMnCiB9CiAKQEAgLTEzMiw0MiArMTM1LDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKIH0KIAoga2V5IFkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgVSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaScKIH0KIAoga2V5IE8gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewpAQCAtMTkwLDYwICsyMDAsNzAgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZDEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmMScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGQxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZjEnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKQEAgLTI1Nyw2ICsyNzcsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ30nCiB9CiAKQEAgLTI3Miw0MiArMjkzLDQ5IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBYIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdDJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdjJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBDT01NQSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3BhbmlzaF9sYXRpbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3BhbmlzaF9sYXRpbi5rY20KaW5kZXggMTZlYjUzZi4uMjlhYWI5NyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3NwYW5pc2hfbGF0aW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9zcGFuaXNoX2xhdGluLmtjbQpAQCAtMTA5LDYgKzEwOSw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0AnCiB9CiAKQEAgLTExNiw1NCArMTE3LDYzIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3cnCiB9CiAKIGtleSBFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdSJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdyJwogfQogCiBrZXkgVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3QnCiB9CiAKIGtleSBZIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdVJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd1JwogfQogCiBrZXkgSSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogfQogCiBrZXkgTEVGVF9CUkFDS0VUIHsKQEAgLTE4Niw2MCArMTk2LDcwIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdEJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdkJwogfQogCiBrZXkgRiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2YnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdIJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdoJwogfQogCiBrZXkgSiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiB9CiAKIGtleSBLIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkMScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGYxJwogfQogCiBrZXkgQVBPU1RST1BIRSB7CkBAIC0yNjgsNDIgKzI4OCw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3N3ZWRpc2gua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3N3ZWRpc2gua2NtCmluZGV4IDhhNGU5YTUuLmYxMjgwNGYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF9zd2VkaXNoLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dlZGlzaC5rY20KQEAgLTExNSw3NiArMTE1LDkwIEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlMicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMGMyJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwYzInCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBlMicKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKLSAgICByYWx0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCiBrZXkgUiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTY3JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNjYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE2NicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTY3JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZWYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjZicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGNmJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZWYnCiB9CiAKIGtleSBPIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY1JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAwZDUnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBkNScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGY1JwogfQogCiBrZXkgUCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYzUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGM1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZTUnCiB9CiAKIGtleSBSSUdIVF9CUkFDS0VUIHsKQEAgLTIwMCw4NCArMjE0LDEwNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTEnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjMScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGMxJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTEnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTYxJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNjAnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE2MCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTYxJwogfQogCiBrZXkgRCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExMScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMTEwJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxMTAnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDExMScKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxZTUnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFlNCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWU0JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAxZTUnCiB9CiAKIGtleSBHIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMWU3JwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxZTYnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDFlNicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMWU3JwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDIxZicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMjFlJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAyMWUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDIxZicKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlOScKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWU4JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZTgnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlOScKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdMJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdsJwogfQogCiBrZXkgU0VNSUNPTE9OIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZjgnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBkOCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGQ4JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZjgnCiB9CiAKIGtleSBBUE9TVFJPUEhFIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGM0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTYnCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDBjNicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTYnCiB9CiAKIGtleSBCQUNLU0xBU0ggewpAQCAtMjk5LDUzICszMzMsNjUgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTdlJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxN2QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE3ZCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTdlJwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTBkJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxMGMnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDEwYycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTBkJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1YnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1YnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3YnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDFlZicKLSAgICByYWx0K2NhcHNsb2NrLCBzaGlmdCtyYWx0OiAgICAgICAgICAnXHUwMWVlJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAxZWUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDFlZicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAyOTInCi0gICAgcmFsdCtjYXBzbG9jaywgc2hpZnQrcmFsdDogICAgICAgICAgJ1x1MDFiNycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMWI3JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAyOTInCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTRiJwotICAgIHJhbHQrY2Fwc2xvY2ssIHNoaWZ0K3JhbHQ6ICAgICAgICAgICdcdTAxNGEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDE0YScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMTRiJwogfQogCiBrZXkgTSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCi0gICAgcmFsdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgICAgICAgJ1x1MDBiNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKKyAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI1JwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3N3aXNzX2ZyZW5jaC5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZnJlbmNoLmtjbQppbmRleCA5ZTIwNDYyLi42NDc2NzkzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZnJlbmNoLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZnJlbmNoLmtjbQpAQCAtMTE5LDE4ICsxMTksMjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTM4LDQyICsxNDEsNDkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0xOTYsNTQgKzIwNiw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0yNzksNDIgKzI5OCw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3N3aXNzX2dlcm1hbi5rY20gYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZ2VybWFuLmtjbQppbmRleCA3ZmJkMWE5Li45ZDZmMzY3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZ2VybWFuLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfc3dpc3NfZ2VybWFuLmtjbQpAQCAtMTE5LDE4ICsxMTksMjEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncScKIH0KIAoga2V5IFcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTM4LDQyICsxNDEsNDkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CkBAIC0xOTgsNTQgKzIwOCw2MyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3MnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZCcKIH0KIAoga2V5IEYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0cnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2cnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaCcKIH0KIAoga2V5IEogewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0snCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2snCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CkBAIC0yODUsNDIgKzMwNCw0OSBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdZJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd5JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3gnCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYycKIH0KIAoga2V5IFYgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0InCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2InCiB9CiAKIGtleSBOIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbicKIH0KIAoga2V5IE0gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3R1cmtpc2gua2NtIGIvcGFja2FnZXMvSW5wdXREZXZpY2VzL3Jlcy9yYXcva2V5Ym9hcmRfbGF5b3V0X3R1cmtpc2gua2NtCmluZGV4IGUxOTNkMzQuLjJhOGZjZWYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF90dXJraXNoLmtjbQorKysgYi9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfdHVya2lzaC5rY20KQEAgLTEyNCw2ICsxMjQsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAJwogfQogCkBAIC0xMzEsMTIgKzEzMiwxNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0UnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2UnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MjBhYycKIH0KIApAQCAtMTQ0LDUwICsxNDcsNTkgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiB9CiAKIGtleSBVIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndScKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMzEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDEzMCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMTMwJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ08nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ28nCiB9CiAKIGtleSBQIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncCcKIH0KIAoga2V5IExFRlRfQlJBQ0tFVCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExZScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTFmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxMWUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDExZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMzA4JwogfQogCkBAIC0xOTUsNiArMjA3LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBkYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGZjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzMDMnCiB9CiAKQEAgLTIwNCwxNCArMjE3LDE3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0EnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMGM2JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwYzYnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBlNicKIH0KIAoga2V5IFMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdTJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdzJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGYnCiB9CiAKQEAgLTIxOSw0OCArMjM1LDU2IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKIH0KIAoga2V5IEcgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdHJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdnJwogfQogCiBrZXkgSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnSicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnaicKIH0KIAoga2V5IEsgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgTCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxNWUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1ZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTVlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxNWYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDMwMScKIH0KIApAQCAtMjY4LDYgKzI5Miw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDEzMCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTMwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgQ09NTUEgewpAQCAtMjkwLDU0ICszMTUsNjMgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnWicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAneicKIH0KIAoga2V5IFggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdYJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICd4JwogfQogCiBrZXkgQyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKIH0KIAoga2V5IEIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdCJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdiJwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbScKIH0KIAoga2V5IEVRVUFMUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBkNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKIH0KIAoga2V5IEJBQ0tTTEFTSCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwYzcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBlNycKIH0KIAoga2V5IFBFUklPRCB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfdHVya2lzaF9mLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF90dXJraXNoX2Yua2NtCmluZGV4IDViOTZkYTAuLmIyN2Y2ZmEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF90dXJraXNoX2Yua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF90dXJraXNoX2Yua2NtCkBAIC0xMjUsNiArMTI1LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQCcKIH0KIApAQCAtMTMyLDMyICsxMzMsMzggQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMWYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDExZicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTFlJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAxMWYnCiB9CiAKIGtleSBSIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTMxJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAxMzEnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMGFlJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwYWUnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBiNicKIH0KIAoga2V5IFQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdPJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdvJwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2QnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhNScKIH0KIApAQCAtMTY1LDI2ICsxNzIsMzEgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncicKIH0KIAoga2V5IEkgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdOJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICduJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2gnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmOCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnXHUwMGQ4JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdcdTAwZDgnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ1x1MDBmOCcKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdQJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwYTMnCiB9CiAKQEAgLTE5Miw2ICsyMDQsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdRJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdRJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdxJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJwogfQogCkBAIC0xOTksNiArMjEyLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnficKIH0KIApAQCAtMjA4LDIyICsyMjIsMjcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMDc1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwNzUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDA1NScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMDc1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTYnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDBjNicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGM2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZTYnCiB9CiAKIGtleSBTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMTMwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdpJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZGYnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDBhNycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGE3JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwZGYnCiB9CiAKIGtleSBEIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnZScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGFjJwogfQogCkBAIC0yMzEsNiArMjUwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGFhJwogfQogCkBAIC0yMzgsMTIgKzI1OCwxNCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmYycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwMGRjJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTAwZmMnCiB9CiAKIGtleSBIIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUyMGJhJwogfQogCkBAIC0yNTEsMjQgKzI3MywyOCBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdLJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdrJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ00nCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ00nCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ20nCiB9CiAKIGtleSBMIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnTCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnbCcKIH0KIAoga2V5IFNFTUlDT0xPTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1knCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1knCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3knCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBiNCcKIH0KIApAQCAtMjc2LDYgKzMwMiw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1ZicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMTVmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAxNWUnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDE1ZicKIH0KIAoga2V5IENPTU1BIHsKQEAgLTI5Miw2MyArMzE5LDc2IEBACiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiAgICAgc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1x1MDBhNicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnXHUwMGE2JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd8JwogfQogCiBrZXkgWiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2onCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBhYicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnPCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnPCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGFiJwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTAwZDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDBmNicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGJiJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICc+JworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICc+JworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdcdTAwYmInCiB9CiAKIGtleSBDIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnVicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAndicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGEyJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAwYTknCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBhOScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGEyJwogfQogCiBrZXkgViB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBCIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGU3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAwZTcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDBjNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwMGU3JwogfQogCiBrZXkgTiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1onCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ3onCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAncycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGI1JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdcdTAwYmEnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1x1MDBiYScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnXHUwMGI1JwogfQogCiBrZXkgRVFVQUxTIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGQ3JwogfQogCkBAIC0zNTYsNiArMzk2LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnOicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnOicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwMGY3JwogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9JbnB1dERldmljZXMvcmVzL3Jhdy9rZXlib2FyZF9sYXlvdXRfdWtyYWluaWFuLmtjbSBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF91a3JhaW5pYW4ua2NtCmluZGV4IGE4MDI0NjAuLjEzNDZiYmIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF91a3JhaW5pYW4ua2NtCisrKyBiL3BhY2thZ2VzL0lucHV0RGV2aWNlcy9yZXMvcmF3L2tleWJvYXJkX2xheW91dF91a3JhaW5pYW4ua2NtCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQwMScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDUxJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MDEnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1MScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYCcKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnficKIH0KQEAgLTEyNCw4NiArMTI1LDEwNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTknCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE5JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzknCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1EnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1EnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3EnCiB9CiAKIGtleSBXIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI2JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ2JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdXJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdXJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd3JwogfQogCiBrZXkgRSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyMycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQzJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjMnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZScKIH0KIAoga2V5IFIgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MWEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDFhJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0M2EnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1InCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1InCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3InCiB9CiAKIGtleSBUIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDE1JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxNScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDM1JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdUJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdUJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd0JwogfQogCiBrZXkgWSB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNkJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWQnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWScKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWScKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneScKIH0KIAoga2V5IFUgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTMnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEzJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzMnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1UnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1UnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3UnCiB9CiAKIGtleSBJIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI4JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDgnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ4JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdJJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdJJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdpJwogfQogCiBrZXkgTyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyOScKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ5JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjknCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0OScKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnTycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnTycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnbycKIH0KIAoga2V5IFAgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTcnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNycKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE3JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzcnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ1AnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ1AnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ3AnCiB9CiAKIGtleSBMRUZUX0JSQUNLRVQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjUnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDI1JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDUnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1snCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJ3snCiB9CkBAIC0yMTIsNiArMjM0LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDA3JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NTcnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQwNycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDU3JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd9JwogfQpAQCAtMjIyLDc4ICsyNDUsOTcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDI0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NDQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDQ0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdBJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdBJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdhJwogfQogCiBrZXkgUyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQwNicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDU2JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MDYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ1NicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnUycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnUycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAncycKIH0KIAoga2V5IEQgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDEyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0QnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0QnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2QnCiB9CiAKIGtleSBGIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDEwJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MzAnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxMCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDMwJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdGJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdGJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdmJwogfQogCiBrZXkgRyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNmJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWYnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzZicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnRycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnRycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnZycKIH0KIAoga2V5IEggewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDAnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0gnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0gnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2gnCiB9CiAKIGtleSBKIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2UnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdKJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdKJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdqJwogfQogCiBrZXkgSyB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYicKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDNiJwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MWInCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzYicKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnSycKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnSycKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnaycKIH0KIAoga2V5IEwgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTQnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNCcKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE0JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzQnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0wnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0wnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2wnCiB9CiAKIGtleSBTRU1JQ09MT04gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTYnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzNicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDE2JworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzYnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzsnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJzonCiB9CkBAIC0zMDIsNiArMzQ0LDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDA0JwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NTQnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQwNCcKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDU0JwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcJycKICAgICByYWx0K3NoaWZ0OiAgICAgICAgICAgICAgICAgICAgICAgICAnIicKIH0KQEAgLTMxOSw2ICszNjIsNyBAQAogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0OTAnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ5MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDkwJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0OTEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICd8JwogfQpAQCAtMzI3LDYyICszNzEsNzcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJmJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGYnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZicKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRmJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdaJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdaJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd6JwogfQogCiBrZXkgWCB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQyNycKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDQ3JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MjcnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0NycKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnWCcKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAneCcKIH0KIAoga2V5IEMgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIxJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ0MnCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ0MnCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ2MnCiB9CiAKIGtleSBWIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDFjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0M2MnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQxYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDNjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdWJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdWJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICd2JwogfQogCiBrZXkgQiB7CiAgICAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQxOCcKICAgICBiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDM4JwogICAgIHNoaWZ0LCBjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICdcdTA0MTgnCisgICAgc2hpZnQrY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzOCcKICAgICByYWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicKLSAgICByYWx0K3NoaWZ0LCByYWx0K2NhcHNsb2NrOiAgICAgICAgICAnQicKKyAgICBzaGlmdCtyYWx0LCBjYXBzbG9jaytyYWx0OiAgICAgICAgICAnQicKKyAgICBzaGlmdCtjYXBzbG9jaytyYWx0OiAgICAgICAgICAgICAgICAnYicKIH0KIAoga2V5IE4gewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MjInCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQ0MicKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDIyJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0NDInCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nCi0gICAgcmFsdCtzaGlmdCwgcmFsdCtjYXBzbG9jazogICAgICAgICAgJ04nCisgICAgc2hpZnQrcmFsdCwgY2Fwc2xvY2srcmFsdDogICAgICAgICAgJ04nCisgICAgc2hpZnQrY2Fwc2xvY2srcmFsdDogICAgICAgICAgICAgICAgJ24nCiB9CiAKIGtleSBNIHsKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJjJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGMnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyYycKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRjJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJwotICAgIHJhbHQrc2hpZnQsIHJhbHQrY2Fwc2xvY2s6ICAgICAgICAgICdNJworICAgIHNoaWZ0K3JhbHQsIGNhcHNsb2NrK3JhbHQ6ICAgICAgICAgICdNJworICAgIHNoaWZ0K2NhcHNsb2NrK3JhbHQ6ICAgICAgICAgICAgICAgICdtJwogfQogCiBrZXkgQ09NTUEgewogICAgIGxhYmVsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0MTEnCiAgICAgYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDQzMScKICAgICBzaGlmdCwgY2Fwc2xvY2s6ICAgICAgICAgICAgICAgICAgICAnXHUwNDExJworICAgIHNoaWZ0K2NhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgICdcdTA0MzEnCiAgICAgcmFsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnCiAgICAgcmFsdCtzaGlmdDogICAgICAgICAgICAgICAgICAgICAgICAgJzwnCiB9CkBAIC0zOTEsNiArNDUwLDcgQEAKICAgICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHUwNDJlJwogICAgIGJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdTA0NGUnCiAgICAgc2hpZnQsIGNhcHNsb2NrOiAgICAgICAgICAgICAgICAgICAgJ1x1MDQyZScKKyAgICBzaGlmdCtjYXBzbG9jazogICAgICAgICAgICAgICAgICAgICAnXHUwNDRlJwogICAgIHJhbHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJwogICAgIHJhbHQrc2hpZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICc+JwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2svQW5kcm9pZC5icCBiL3BhY2thZ2VzL1NldHRpbmdzTGliL0RldmljZVN0YXRlUm90YXRpb25Mb2NrL0FuZHJvaWQuYnAKaW5kZXggYzY0MmJkMS4uMTAzMzA5YSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2svQW5kcm9pZC5icAorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9EZXZpY2VTdGF0ZVJvdGF0aW9uTG9jay9BbmRyb2lkLmJwCkBAIC0xMCw3ICsxMCwxMCBAQAogYW5kcm9pZF9saWJyYXJ5IHsKICAgICBuYW1lOiAiU2V0dGluZ3NMaWJEZXZpY2VTdGF0ZVJvdGF0aW9uTG9jayIsCiAKLSAgICBzcmNzOiBbInNyYy8qKi8qLmphdmEiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvKiovKi5qYXZhIiwKKyAgICAgICAgInNyYy8qKi8qLmt0IiwKKyAgICBdLAogCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjEiLAogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2svc3JjL2NvbS5hbmRyb2lkLnNldHRpbmdzbGliLmRldmljZXN0YXRlL0RldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ3NNYW5hZ2VyLmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9EZXZpY2VTdGF0ZVJvdGF0aW9uTG9jay9zcmMvY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5nc01hbmFnZXIuamF2YQppbmRleCAxMGIwMDRlLi43NmUxZGYxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi9EZXZpY2VTdGF0ZVJvdGF0aW9uTG9jay9zcmMvY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5nc01hbmFnZXIuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9EZXZpY2VTdGF0ZVJvdGF0aW9uTG9jay9zcmMvY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5nc01hbmFnZXIuamF2YQpAQCAtNTcsMTcgKzU3LDE5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1NYWluSGFuZGxlciA9IG5ldyBIYW5kbGVyKExvb3Blci5nZXRNYWluTG9vcGVyKCkpOwogICAgIHByaXZhdGUgZmluYWwgU2V0PERldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ3NMaXN0ZW5lcj4gbUxpc3RlbmVycyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICBwcml2YXRlIGZpbmFsIFNlY3VyZVNldHRpbmdzIG1TZWN1cmVTZXR0aW5nczsKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja0RlZmF1bHRzOwotICAgIHByaXZhdGUgU3BhcnNlSW50QXJyYXkgbURldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ3M7Ci0gICAgcHJpdmF0ZSBTcGFyc2VJbnRBcnJheSBtRGV2aWNlU3RhdGVEZWZhdWx0Um90YXRpb25Mb2NrU2V0dGluZ3M7Ci0gICAgcHJpdmF0ZSBTcGFyc2VJbnRBcnJheSBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tGYWxsYmFja1NldHRpbmdzOworICAgIHByaXZhdGUgZmluYWwgUG9zdHVyZXNIZWxwZXIgbVBvc3R1cmVzSGVscGVyOworICAgIHByaXZhdGUgU3RyaW5nW10gbVBvc3R1cmVSb3RhdGlvbkxvY2tEZWZhdWx0czsKKyAgICBwcml2YXRlIFNwYXJzZUludEFycmF5IG1Qb3N0dXJlUm90YXRpb25Mb2NrU2V0dGluZ3M7CisgICAgcHJpdmF0ZSBTcGFyc2VJbnRBcnJheSBtUG9zdHVyZURlZmF1bHRSb3RhdGlvbkxvY2tTZXR0aW5nczsKKyAgICBwcml2YXRlIFNwYXJzZUludEFycmF5IG1Qb3N0dXJlUm90YXRpb25Mb2NrRmFsbGJhY2tTZXR0aW5nczsKICAgICBwcml2YXRlIFN0cmluZyBtTGFzdFNldHRpbmdWYWx1ZTsKICAgICBwcml2YXRlIExpc3Q8U2V0dGFibGVEZXZpY2VTdGF0ZT4gbVNldHRhYmxlRGV2aWNlU3RhdGVzOwogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5nc01hbmFnZXIoQ29udGV4dCBjb250ZXh0LCBTZWN1cmVTZXR0aW5ncyBzZWN1cmVTZXR0aW5ncykgewotICAgICAgICB0aGlzLm1TZWN1cmVTZXR0aW5ncyA9IHNlY3VyZVNldHRpbmdzOwotICAgICAgICBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tEZWZhdWx0cyA9CisgICAgICAgIG1TZWN1cmVTZXR0aW5ncyA9IHNlY3VyZVNldHRpbmdzOworICAgICAgICBtUG9zdHVyZXNIZWxwZXIgPSBuZXcgUG9zdHVyZXNIZWxwZXIoY29udGV4dCk7CisgICAgICAgIG1Qb3N0dXJlUm90YXRpb25Mb2NrRGVmYXVsdHMgPQogICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmdBcnJheShSLmFycmF5LmNvbmZpZ19wZXJEZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja0RlZmF1bHRzKTsKICAgICAgICAgbG9hZERlZmF1bHRzKCk7CkBAIC0xMzQsMTMgKzEzNiwxNCBAQAogCiAgICAgLyoqIFVwZGF0ZXMgdGhlIHJvdGF0aW9uIGxvY2sgc2V0dGluZyBmb3IgYSBzcGVjaWZpZWQgZGV2aWNlIHN0YXRlLiAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVNldHRpbmcoaW50IGRldmljZVN0YXRlLCBib29sZWFuIHJvdGF0aW9uTG9ja2VkKSB7Ci0gICAgICAgIGlmIChtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tGYWxsYmFja1NldHRpbmdzLmluZGV4T2ZLZXkoZGV2aWNlU3RhdGUpID49IDApIHsKLSAgICAgICAgICAgIC8vIFRoZSBzZXR0aW5nIGZvciB0aGlzIGRldmljZSBzdGF0ZSBpcyBJR05PUkVELCBhbmQgaGFzIGEgZmFsbGJhY2sgZGV2aWNlIHN0YXRlLgotICAgICAgICAgICAgLy8gVGhlIHNldHRpbmcgZm9yIHRoYXQgZmFsbGJhY2sgZGV2aWNlIHN0YXRlIHNob3VsZCBiZSB0aGUgY2hhbmdlZCBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICBkZXZpY2VTdGF0ZSA9IG1EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja0ZhbGxiYWNrU2V0dGluZ3MuZ2V0KGRldmljZVN0YXRlKTsKKyAgICAgICAgaW50IHBvc3R1cmUgPSBtUG9zdHVyZXNIZWxwZXIuZGV2aWNlU3RhdGVUb1Bvc3R1cmUoZGV2aWNlU3RhdGUpOworICAgICAgICBpZiAobVBvc3R1cmVSb3RhdGlvbkxvY2tGYWxsYmFja1NldHRpbmdzLmluZGV4T2ZLZXkocG9zdHVyZSkgPj0gMCkgeworICAgICAgICAgICAgLy8gVGhlIHNldHRpbmcgZm9yIHRoaXMgZGV2aWNlIHBvc3R1cmUgaXMgSUdOT1JFRCwgYW5kIGhhcyBhIGZhbGxiYWNrIHBvc3R1cmUuCisgICAgICAgICAgICAvLyBUaGUgc2V0dGluZyBmb3IgdGhhdCBmYWxsYmFjayBwb3N0dXJlIHNob3VsZCBiZSB0aGUgY2hhbmdlZCBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICBwb3N0dXJlID0gbVBvc3R1cmVSb3RhdGlvbkxvY2tGYWxsYmFja1NldHRpbmdzLmdldChwb3N0dXJlKTsKICAgICAgICAgfQotICAgICAgICBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5ncy5wdXQoCi0gICAgICAgICAgICAgICAgZGV2aWNlU3RhdGUsCisgICAgICAgIG1Qb3N0dXJlUm90YXRpb25Mb2NrU2V0dGluZ3MucHV0KAorICAgICAgICAgICAgICAgIHBvc3R1cmUsCiAgICAgICAgICAgICAgICAgcm90YXRpb25Mb2NrZWQKICAgICAgICAgICAgICAgICAgICAgICAgID8gREVWSUNFX1NUQVRFX1JPVEFUSU9OX0xPQ0tfTE9DS0VECiAgICAgICAgICAgICAgICAgICAgICAgICA6IERFVklDRV9TVEFURV9ST1RBVElPTl9MT0NLX1VOTE9DS0VEKTsKQEAgLTE1OSwyMiArMTYyLDIzIEBACiAgICAgICovCiAgICAgQFNldHRpbmdzLlNlY3VyZS5EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmcKICAgICBwdWJsaWMgaW50IGdldFJvdGF0aW9uTG9ja1NldHRpbmcoaW50IGRldmljZVN0YXRlKSB7Ci0gICAgICAgIGludCByb3RhdGlvbkxvY2tTZXR0aW5nID0gbURldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ3MuZ2V0KAotICAgICAgICAgICAgICAgIGRldmljZVN0YXRlLCAvKiB2YWx1ZUlmS2V5Tm90Rm91bmQ9ICovIERFVklDRV9TVEFURV9ST1RBVElPTl9MT0NLX0lHTk9SRUQpOworICAgICAgICBpbnQgZGV2aWNlUG9zdHVyZSA9IG1Qb3N0dXJlc0hlbHBlci5kZXZpY2VTdGF0ZVRvUG9zdHVyZShkZXZpY2VTdGF0ZSk7CisgICAgICAgIGludCByb3RhdGlvbkxvY2tTZXR0aW5nID0gbVBvc3R1cmVSb3RhdGlvbkxvY2tTZXR0aW5ncy5nZXQoCisgICAgICAgICAgICAgICAgZGV2aWNlUG9zdHVyZSwgLyogdmFsdWVJZktleU5vdEZvdW5kPSAqLyBERVZJQ0VfU1RBVEVfUk9UQVRJT05fTE9DS19JR05PUkVEKTsKICAgICAgICAgaWYgKHJvdGF0aW9uTG9ja1NldHRpbmcgPT0gREVWSUNFX1NUQVRFX1JPVEFUSU9OX0xPQ0tfSUdOT1JFRCkgewotICAgICAgICAgICAgcm90YXRpb25Mb2NrU2V0dGluZyA9IGdldEZhbGxiYWNrUm90YXRpb25Mb2NrU2V0dGluZyhkZXZpY2VTdGF0ZSk7CisgICAgICAgICAgICByb3RhdGlvbkxvY2tTZXR0aW5nID0gZ2V0RmFsbGJhY2tSb3RhdGlvbkxvY2tTZXR0aW5nKGRldmljZVBvc3R1cmUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByb3RhdGlvbkxvY2tTZXR0aW5nOwogICAgIH0KIAotICAgIHByaXZhdGUgaW50IGdldEZhbGxiYWNrUm90YXRpb25Mb2NrU2V0dGluZyhpbnQgZGV2aWNlU3RhdGUpIHsKLSAgICAgICAgaW50IGluZGV4T2ZGYWxsYmFja1N0YXRlID0gbURldmljZVN0YXRlUm90YXRpb25Mb2NrRmFsbGJhY2tTZXR0aW5ncy5pbmRleE9mS2V5KGRldmljZVN0YXRlKTsKLSAgICAgICAgaWYgKGluZGV4T2ZGYWxsYmFja1N0YXRlIDwgMCkgeworICAgIHByaXZhdGUgaW50IGdldEZhbGxiYWNrUm90YXRpb25Mb2NrU2V0dGluZyhpbnQgZGV2aWNlUG9zdHVyZSkgeworICAgICAgICBpbnQgaW5kZXhPZkZhbGxiYWNrID0gbVBvc3R1cmVSb3RhdGlvbkxvY2tGYWxsYmFja1NldHRpbmdzLmluZGV4T2ZLZXkoZGV2aWNlUG9zdHVyZSk7CisgICAgICAgIGlmIChpbmRleE9mRmFsbGJhY2sgPCAwKSB7CiAgICAgICAgICAgICBMb2cudyhUQUcsICJTZXR0aW5nIGlzIGlnbm9yZWQsIGJ1dCBubyBmYWxsYmFjayB3YXMgc3BlY2lmaWVkLiIpOwogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9TVEFURV9ST1RBVElPTl9MT0NLX0lHTk9SRUQ7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGZhbGxiYWNrU3RhdGUgPSBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tGYWxsYmFja1NldHRpbmdzLnZhbHVlQXQoaW5kZXhPZkZhbGxiYWNrU3RhdGUpOwotICAgICAgICByZXR1cm4gbURldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ3MuZ2V0KGZhbGxiYWNrU3RhdGUsCisgICAgICAgIGludCBmYWxsYmFja1Bvc3R1cmUgPSBtUG9zdHVyZVJvdGF0aW9uTG9ja0ZhbGxiYWNrU2V0dGluZ3MudmFsdWVBdChpbmRleE9mRmFsbGJhY2spOworICAgICAgICByZXR1cm4gbVBvc3R1cmVSb3RhdGlvbkxvY2tTZXR0aW5ncy5nZXQoZmFsbGJhY2tQb3N0dXJlLAogICAgICAgICAgICAgICAgIC8qIHZhbHVlSWZLZXlOb3RGb3VuZD0gKi8gREVWSUNFX1NUQVRFX1JPVEFUSU9OX0xPQ0tfSUdOT1JFRCk7CiAgICAgfQogCkBAIC0xODksOCArMTkzLDggQEAKICAgICAgKiBERVZJQ0VfU1RBVEVfUk9UQVRJT05fTE9DS19VTkxPQ0tFRH0uCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNSb3RhdGlvbkxvY2tlZEZvckFsbFN0YXRlcygpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5ncy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdzLnZhbHVlQXQoaSkKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUG9zdHVyZVJvdGF0aW9uTG9ja1NldHRpbmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobVBvc3R1cmVSb3RhdGlvbkxvY2tTZXR0aW5ncy52YWx1ZUF0KGkpCiAgICAgICAgICAgICAgICAgICAgID09IERFVklDRV9TVEFURV9ST1RBVElPTl9MT0NLX1VOTE9DS0VEKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtMjIxLDcgKzIyNSw3IEBACiAgICAgICAgICAgICBmYWxsYmFja09uRGVmYXVsdHMoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5ncyA9IG5ldyBTcGFyc2VJbnRBcnJheSh2YWx1ZXMubGVuZ3RoIC8gMik7CisgICAgICAgIG1Qb3N0dXJlUm90YXRpb25Mb2NrU2V0dGluZ3MgPSBuZXcgU3BhcnNlSW50QXJyYXkodmFsdWVzLmxlbmd0aCAvIDIpOwogICAgICAgICBpbnQga2V5OwogICAgICAgICBpbnQgdmFsdWU7CiAKQEAgLTIzMCw3ICsyMzQsNyBAQAogICAgICAgICAgICAgICAgIGtleSA9IEludGVnZXIucGFyc2VJbnQodmFsdWVzW2krK10pOwogICAgICAgICAgICAgICAgIHZhbHVlID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZXNbaSsrXSk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BlcnNpc3RlZFZhbHVlSWdub3JlZCA9IHZhbHVlID09IERFVklDRV9TVEFURV9ST1RBVElPTl9MT0NLX0lHTk9SRUQ7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0RlZmF1bHRWYWx1ZUlnbm9yZWQgPSBtRGV2aWNlU3RhdGVEZWZhdWx0Um90YXRpb25Mb2NrU2V0dGluZ3MuZ2V0KGtleSkKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzRGVmYXVsdFZhbHVlSWdub3JlZCA9IG1Qb3N0dXJlRGVmYXVsdFJvdGF0aW9uTG9ja1NldHRpbmdzLmdldChrZXkpCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBERVZJQ0VfU1RBVEVfUk9UQVRJT05fTE9DS19JR05PUkVEOwogICAgICAgICAgICAgICAgIGlmIChpc1BlcnNpc3RlZFZhbHVlSWdub3JlZCAhPSBpc0RlZmF1bHRWYWx1ZUlnbm9yZWQpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29uZmxpY3QgZm9yIGlnbm9yZWQgZGV2aWNlIHN0YXRlICIgKyBrZXkKQEAgLTIzOCw3ICsyNDIsNyBAQAogICAgICAgICAgICAgICAgICAgICBmYWxsYmFja09uRGVmYXVsdHMoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5ncy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgbVBvc3R1cmVSb3RhdGlvbkxvY2tTZXR0aW5ncy5wdXQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgZGVzZXJpYWxpemluZyBvbmUgb2YgdGhlIHNhdmVkIHNldHRpbmdzIiwgZSk7CiAgICAgICAgICAgICAgICAgZmFsbGJhY2tPbkRlZmF1bHRzKCk7CkBAIC0yNTMsNyArMjU3LDcgQEAKICAgICAgKi8KICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwdWJsaWMgdm9pZCByZXNldFN0YXRlRm9yVGVzdGluZyhSZXNvdXJjZXMgcmVzb3VyY2VzKSB7Ci0gICAgICAgIG1EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja0RlZmF1bHRzID0KKyAgICAgICAgbVBvc3R1cmVSb3RhdGlvbkxvY2tEZWZhdWx0cyA9CiAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFN0cmluZ0FycmF5KFIuYXJyYXkuY29uZmlnX3BlckRldmljZVN0YXRlUm90YXRpb25Mb2NrRGVmYXVsdHMpOwogICAgICAgICBmYWxsYmFja09uRGVmYXVsdHMoKTsKICAgICB9CkBAIC0yNjQsMjMgKzI2OCwyMyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBwZXJzaXN0U2V0dGluZ3MoKSB7Ci0gICAgICAgIGlmIChtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5ncy5zaXplKCkgPT0gMCkgeworICAgICAgICBpZiAobVBvc3R1cmVSb3RhdGlvbkxvY2tTZXR0aW5ncy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgcGVyc2lzdFNldHRpbmdJZkNoYW5nZWQoLyogbmV3U2V0dGluZ1ZhbHVlPSAqLyAiIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBzdHJpbmdCdWlsZGVyCi0gICAgICAgICAgICAgICAgLmFwcGVuZChtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5ncy5rZXlBdCgwKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1Qb3N0dXJlUm90YXRpb25Mb2NrU2V0dGluZ3Mua2V5QXQoMCkpCiAgICAgICAgICAgICAgICAgLmFwcGVuZChTRVBBUkFUT1JfUkVHRVgpCi0gICAgICAgICAgICAgICAgLmFwcGVuZChtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5ncy52YWx1ZUF0KDApKTsKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1Qb3N0dXJlUm90YXRpb25Mb2NrU2V0dGluZ3MudmFsdWVBdCgwKSk7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5ncy5zaXplKCk7IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1Qb3N0dXJlUm90YXRpb25Mb2NrU2V0dGluZ3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIKICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChTRVBBUkFUT1JfUkVHRVgpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobURldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ3Mua2V5QXQoaSkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobVBvc3R1cmVSb3RhdGlvbkxvY2tTZXR0aW5ncy5rZXlBdChpKSkKICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChTRVBBUkFUT1JfUkVHRVgpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobURldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ3MudmFsdWVBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobVBvc3R1cmVSb3RhdGlvbkxvY2tTZXR0aW5ncy52YWx1ZUF0KGkpKTsKICAgICAgICAgfQogICAgICAgICBwZXJzaXN0U2V0dGluZ0lmQ2hhbmdlZChzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkpOwogICAgIH0KQEAgLTMwMCwyMiArMzA0LDIwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGxvYWREZWZhdWx0cygpIHsKLSAgICAgICAgbVNldHRhYmxlRGV2aWNlU3RhdGVzID0gbmV3IEFycmF5TGlzdDw+KG1EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja0RlZmF1bHRzLmxlbmd0aCk7Ci0gICAgICAgIG1EZXZpY2VTdGF0ZURlZmF1bHRSb3RhdGlvbkxvY2tTZXR0aW5ncyA9IG5ldyBTcGFyc2VJbnRBcnJheSgKLSAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tEZWZhdWx0cy5sZW5ndGgpOwotICAgICAgICBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5ncyA9IG5ldyBTcGFyc2VJbnRBcnJheSgKLSAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tEZWZhdWx0cy5sZW5ndGgpOwotICAgICAgICBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tGYWxsYmFja1NldHRpbmdzID0gbmV3IFNwYXJzZUludEFycmF5KDEpOwotICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IG1EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja0RlZmF1bHRzKSB7CisgICAgICAgIG1TZXR0YWJsZURldmljZVN0YXRlcyA9IG5ldyBBcnJheUxpc3Q8PihtUG9zdHVyZVJvdGF0aW9uTG9ja0RlZmF1bHRzLmxlbmd0aCk7CisgICAgICAgIG1Qb3N0dXJlRGVmYXVsdFJvdGF0aW9uTG9ja1NldHRpbmdzID0gbmV3IFNwYXJzZUludEFycmF5KAorICAgICAgICAgICAgICAgIG1Qb3N0dXJlUm90YXRpb25Mb2NrRGVmYXVsdHMubGVuZ3RoKTsKKyAgICAgICAgbVBvc3R1cmVSb3RhdGlvbkxvY2tTZXR0aW5ncyA9IG5ldyBTcGFyc2VJbnRBcnJheShtUG9zdHVyZVJvdGF0aW9uTG9ja0RlZmF1bHRzLmxlbmd0aCk7CisgICAgICAgIG1Qb3N0dXJlUm90YXRpb25Mb2NrRmFsbGJhY2tTZXR0aW5ncyA9IG5ldyBTcGFyc2VJbnRBcnJheSgxKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBtUG9zdHVyZVJvdGF0aW9uTG9ja0RlZmF1bHRzKSB7CiAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBlbnRyeS5zcGxpdChTRVBBUkFUT1JfUkVHRVgpOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgZGV2aWNlU3RhdGUgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgaW50IHBvc3R1cmUgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlc1swXSk7CiAgICAgICAgICAgICAgICAgaW50IHJvdGF0aW9uTG9ja1NldHRpbmcgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlc1sxXSk7CiAgICAgICAgICAgICAgICAgaWYgKHJvdGF0aW9uTG9ja1NldHRpbmcgPT0gREVWSUNFX1NUQVRFX1JPVEFUSU9OX0xPQ0tfSUdOT1JFRCkgewogICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFsbGJhY2tEZXZpY2VTdGF0ZSA9IEludGVnZXIucGFyc2VJbnQodmFsdWVzWzJdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja0ZhbGxiYWNrU2V0dGluZ3MucHV0KGRldmljZVN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxsYmFja0RldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmYWxsYmFja1Bvc3R1cmUgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlc1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUG9zdHVyZVJvdGF0aW9uTG9ja0ZhbGxiYWNrU2V0dGluZ3MucHV0KHBvc3R1cmUsIGZhbGxiYWNrUG9zdHVyZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb3RhdGlvbiBsb2NrIHNldHRpbmcgaXMgSUdOT1JFRCwgYnV0IHZhbHVlcyBoYXZlIHVuZXhwZWN0ZWQgIgpAQCAtMzI0LDkgKzMyNiwxNCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTZXR0YWJsZSA9IHJvdGF0aW9uTG9ja1NldHRpbmcgIT0gREVWSUNFX1NUQVRFX1JPVEFUSU9OX0xPQ0tfSUdOT1JFRDsKLSAgICAgICAgICAgICAgICBtU2V0dGFibGVEZXZpY2VTdGF0ZXMuYWRkKG5ldyBTZXR0YWJsZURldmljZVN0YXRlKGRldmljZVN0YXRlLCBpc1NldHRhYmxlKSk7Ci0gICAgICAgICAgICAgICAgbURldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ3MucHV0KGRldmljZVN0YXRlLCByb3RhdGlvbkxvY2tTZXR0aW5nKTsKLSAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVEZWZhdWx0Um90YXRpb25Mb2NrU2V0dGluZ3MucHV0KGRldmljZVN0YXRlLCByb3RhdGlvbkxvY2tTZXR0aW5nKTsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIGRldmljZVN0YXRlID0gbVBvc3R1cmVzSGVscGVyLnBvc3R1cmVUb0RldmljZVN0YXRlKHBvc3R1cmUpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXR0YWJsZURldmljZVN0YXRlcy5hZGQobmV3IFNldHRhYmxlRGV2aWNlU3RhdGUoZGV2aWNlU3RhdGUsIGlzU2V0dGFibGUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIk5vIG1hdGNoaW5nIGRldmljZSBzdGF0ZSBmb3IgcG9zdHVyZTogIiArIHBvc3R1cmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUG9zdHVyZVJvdGF0aW9uTG9ja1NldHRpbmdzLnB1dChwb3N0dXJlLCByb3RhdGlvbkxvY2tTZXR0aW5nKTsKKyAgICAgICAgICAgICAgICBtUG9zdHVyZURlZmF1bHRSb3RhdGlvbkxvY2tTZXR0aW5ncy5wdXQocG9zdHVyZSwgcm90YXRpb25Mb2NrU2V0dGluZyk7CiAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgcGFyc2luZyBzZXR0aW5ncyBlbnRyeS4gRW50cnkgd2FzOiAiICsgZW50cnksIGUpOwogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTMzOCwxMyArMzQ1LDExIEBACiAgICAgcHVibGljIHZvaWQgZHVtcChJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewogICAgICAgICBwdy5wcmludGxuKCJEZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdzTWFuYWdlciIpOwogICAgICAgICBwdy5pbmNyZWFzZUluZGVudCgpOwotICAgICAgICBwdy5wcmludGxuKCJtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tEZWZhdWx0czogIiArIEFycmF5cy50b1N0cmluZygKLSAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tEZWZhdWx0cykpOwotICAgICAgICBwdy5wcmludGxuKCJtRGV2aWNlU3RhdGVEZWZhdWx0Um90YXRpb25Mb2NrU2V0dGluZ3M6ICIKLSAgICAgICAgICAgICAgICArIG1EZXZpY2VTdGF0ZURlZmF1bHRSb3RhdGlvbkxvY2tTZXR0aW5ncyk7Ci0gICAgICAgIHB3LnByaW50bG4oIm1EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdzOiAiICsgbURldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ3MpOwotICAgICAgICBwdy5wcmludGxuKCJtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tGYWxsYmFja1NldHRpbmdzOiAiCi0gICAgICAgICAgICAgICAgKyBtRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tGYWxsYmFja1NldHRpbmdzKTsKKyAgICAgICAgcHcucHJpbnRsbigibVBvc3R1cmVSb3RhdGlvbkxvY2tEZWZhdWx0czogIgorICAgICAgICAgICAgICAgICsgQXJyYXlzLnRvU3RyaW5nKG1Qb3N0dXJlUm90YXRpb25Mb2NrRGVmYXVsdHMpKTsKKyAgICAgICAgcHcucHJpbnRsbigibVBvc3R1cmVEZWZhdWx0Um90YXRpb25Mb2NrU2V0dGluZ3M6ICIgKyBtUG9zdHVyZURlZmF1bHRSb3RhdGlvbkxvY2tTZXR0aW5ncyk7CisgICAgICAgIHB3LnByaW50bG4oIm1EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdzOiAiICsgbVBvc3R1cmVSb3RhdGlvbkxvY2tTZXR0aW5ncyk7CisgICAgICAgIHB3LnByaW50bG4oIm1Qb3N0dXJlUm90YXRpb25Mb2NrRmFsbGJhY2tTZXR0aW5nczogIiArIG1Qb3N0dXJlUm90YXRpb25Mb2NrRmFsbGJhY2tTZXR0aW5ncyk7CiAgICAgICAgIHB3LnByaW50bG4oIm1TZXR0YWJsZURldmljZVN0YXRlczogIiArIG1TZXR0YWJsZURldmljZVN0YXRlcyk7CiAgICAgICAgIHB3LnByaW50bG4oIm1MYXN0U2V0dGluZ1ZhbHVlOiAiICsgbUxhc3RTZXR0aW5nVmFsdWUpOwogICAgICAgICBwdy5kZWNyZWFzZUluZGVudCgpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2svc3JjL2NvbS5hbmRyb2lkLnNldHRpbmdzbGliLmRldmljZXN0YXRlL1Bvc3R1cmVzSGVscGVyLmt0IGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2svc3JjL2NvbS5hbmRyb2lkLnNldHRpbmdzbGliLmRldmljZXN0YXRlL1Bvc3R1cmVzSGVscGVyLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzBiZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9EZXZpY2VTdGF0ZVJvdGF0aW9uTG9jay9zcmMvY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuZGV2aWNlc3RhdGUvUG9zdHVyZXNIZWxwZXIua3QKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuZGV2aWNlc3RhdGUKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUuREVWSUNFX1NUQVRFX1JPVEFUSU9OX0tFWV9GT0xERUQKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5ERVZJQ0VfU1RBVEVfUk9UQVRJT05fS0VZX0hBTEZfRk9MREVECitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUuREVWSUNFX1NUQVRFX1JPVEFUSU9OX0tFWV9VTkZPTERFRAoraW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkRFVklDRV9TVEFURV9ST1RBVElPTl9LRVlfVU5LTk9XTgoraW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLkRldmljZVN0YXRlUm90YXRpb25Mb2NrS2V5CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUgorCisvKiogSGVscHMgdG8gY29udmVydCBiZXR3ZWVuIGRldmljZSBzdGF0ZSBhbmQgcG9zdHVyZS4gKi8KK2NsYXNzIFBvc3R1cmVzSGVscGVyKGNvbnRleHQ6IENvbnRleHQpIHsKKworICAgIHByaXZhdGUgdmFsIGZvbGRlZERldmljZVN0YXRlcyA9CisgICAgICAgIGNvbnRleHQucmVzb3VyY2VzLmdldEludEFycmF5KFIuYXJyYXkuY29uZmlnX2ZvbGRlZERldmljZVN0YXRlcykKKyAgICBwcml2YXRlIHZhbCBoYWxmRm9sZGVkRGV2aWNlU3RhdGVzID0KKyAgICAgICAgY29udGV4dC5yZXNvdXJjZXMuZ2V0SW50QXJyYXkoUi5hcnJheS5jb25maWdfaGFsZkZvbGRlZERldmljZVN0YXRlcykKKyAgICBwcml2YXRlIHZhbCB1bmZvbGRlZERldmljZVN0YXRlcyA9CisgICAgICAgIGNvbnRleHQucmVzb3VyY2VzLmdldEludEFycmF5KFIuYXJyYXkuY29uZmlnX29wZW5EZXZpY2VTdGF0ZXMpCisKKyAgICBARGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tLZXkKKyAgICBmdW4gZGV2aWNlU3RhdGVUb1Bvc3R1cmUoZGV2aWNlU3RhdGU6IEludCk6IEludCB7CisgICAgICAgIHJldHVybiB3aGVuIChkZXZpY2VTdGF0ZSkgeworICAgICAgICAgICAgaW4gZm9sZGVkRGV2aWNlU3RhdGVzIC0+IERFVklDRV9TVEFURV9ST1RBVElPTl9LRVlfRk9MREVECisgICAgICAgICAgICBpbiBoYWxmRm9sZGVkRGV2aWNlU3RhdGVzIC0+IERFVklDRV9TVEFURV9ST1RBVElPTl9LRVlfSEFMRl9GT0xERUQKKyAgICAgICAgICAgIGluIHVuZm9sZGVkRGV2aWNlU3RhdGVzIC0+IERFVklDRV9TVEFURV9ST1RBVElPTl9LRVlfVU5GT0xERUQKKyAgICAgICAgICAgIGVsc2UgLT4gREVWSUNFX1NUQVRFX1JPVEFUSU9OX0tFWV9VTktOT1dOCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW4gcG9zdHVyZVRvRGV2aWNlU3RhdGUoQERldmljZVN0YXRlUm90YXRpb25Mb2NrS2V5IHBvc3R1cmU6IEludCk6IEludD8geworICAgICAgICByZXR1cm4gd2hlbiAocG9zdHVyZSkgeworICAgICAgICAgICAgREVWSUNFX1NUQVRFX1JPVEFUSU9OX0tFWV9GT0xERUQgLT4gZm9sZGVkRGV2aWNlU3RhdGVzLmZpcnN0T3JOdWxsKCkKKyAgICAgICAgICAgIERFVklDRV9TVEFURV9ST1RBVElPTl9LRVlfSEFMRl9GT0xERUQgLT4gaGFsZkZvbGRlZERldmljZVN0YXRlcy5maXJzdE9yTnVsbCgpCisgICAgICAgICAgICBERVZJQ0VfU1RBVEVfUk9UQVRJT05fS0VZX1VORk9MREVEIC0+IHVuZm9sZGVkRGV2aWNlU3RhdGVzLmZpcnN0T3JOdWxsKCkKKyAgICAgICAgICAgIGVsc2UgLT4gbnVsbAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvU3BhL3NwYS9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvc3BhL2ZyYW1ld29yay9jb21tb24vU3BhTG9nZ2VyLmt0IGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvU3BhL3NwYS9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvc3BhL2ZyYW1ld29yay9jb21tb24vU3BhTG9nZ2VyLmt0CmluZGV4IGNhODhmOGQuLjIxNWY2YjkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzTGliL1NwYS9zcGEvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL3NwYS9mcmFtZXdvcmsvY29tbW9uL1NwYUxvZ2dlci5rdAorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9TcGEvc3BhL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9zcGEvZnJhbWV3b3JrL2NvbW1vbi9TcGFMb2dnZXIua3QKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5zcGEuZnJhbWV3b3JrLmNvbW1vbgogCi1pbXBvcnQgYW5kcm9pZC5hcHAuc2V0dGluZ3MuU2V0dGluZ3NFbnVtcwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlCiAKIC8vIERlZmluZXMgdGhlIGNhdGVnb3J5IG9mIHRoZSBsb2csIGZvciBxdWljayBmaWx0ZXIKQEAgLTMyLDE0ICszMSwxNCBAQAogfQogCiAvLyBEZWZpbmVzIHRoZSBsb2cgZXZlbnRzIGluIFNwYS4KLWVudW0gY2xhc3MgTG9nRXZlbnQodmFsIGFjdGlvbjogSW50KSB7CitlbnVtIGNsYXNzIExvZ0V2ZW50IHsKICAgICAvLyBQYWdlIHJlbGF0ZWQgZXZlbnRzLgotICAgIFBBR0VfRU5URVIoU2V0dGluZ3NFbnVtcy5QQUdFX1ZJU0lCTEUpLAotICAgIFBBR0VfTEVBVkUoU2V0dGluZ3NFbnVtcy5QQUdFX0hJREUpLAorICAgIFBBR0VfRU5URVIsCisgICAgUEFHRV9MRUFWRSwKIAogICAgIC8vIEVudHJ5IHJlbGF0ZWQgZXZlbnRzLgotICAgIEVOVFJZX0NMSUNLKFNldHRpbmdzRW51bXMuQUNUSU9OX1NFVFRJTkdTX1RJTEVfQ0xJQ0spLAotICAgIEVOVFJZX1NXSVRDSChTZXR0aW5nc0VudW1zLkFDVElPTl9TRVRUSU5HU19QUkVGRVJFTkNFX0NIQU5HRSksCisgICAgRU5UUllfQ0xJQ0ssCisgICAgRU5UUllfU1dJVENILAogfQogCiBpbnRlcm5hbCBjb25zdCB2YWwgTE9HX0RBVEFfRElTUExBWV9OQU1FID0gIm5hbWUiCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi9yZXMvdmFsdWVzL2FycmF5cy54bWwgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9yZXMvdmFsdWVzL2FycmF5cy54bWwKaW5kZXggNTAyMjk2MC4uM2UyYjgwMCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvcmVzL3ZhbHVlcy9hcnJheXMueG1sCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbApAQCAtNTcyLDcgKzU3Miw3IEBACiAKICAgICA8IS0tIEJhdHRlcnlNZXRlclZpZXcgcGFyYW1ldGVycyAtLT4KICAgICA8YXJyYXkgbmFtZT0iYmF0dGVyeW1ldGVyX2NvbG9yX2xldmVscyI+Ci0gICAgICAgIDxpdGVtPjE1PC9pdGVtPgorICAgICAgICA8aXRlbT4yMDwvaXRlbT4KICAgICAgICAgPGl0ZW0+MTAwPC9pdGVtPgogICAgIDwvYXJyYXk+CiAgICAgPGFycmF5IG5hbWU9ImJhdHRlcnltZXRlcl9jb2xvcl92YWx1ZXMiPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCmluZGV4IDZiN2U5MTguLjY3MTM5YjUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzTGliL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9yZXMvdmFsdWVzL2NvbG9ycy54bWwKQEAgLTQzLDQgKzQzLDYgQEAKICAgICA8Y29sb3IgbmFtZT0icXJfZm9jdXNlZF9jb3JuZXJfbGluZV9jb2xvciI+I2ZmMWE3M2U4PC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0icXJfYmFja2dyb3VuZF9jb2xvciI+I2IzZmZmZmZmPC9jb2xvcj4gPCEtLSA3MCUgd2hpdGUgdHJhbnNwYXJlbmN5IC0tPgogICAgIDwhLS0gRW5kIG9mIFFSIGNvZGUgc2Nhbm5lciBjb2xvcnMgLS0+CisKKyAgICA8Y29sb3IgbmFtZT0iYmF0dGVyeW1ldGVyX3NhdmVyX2NvbG9yIj4jRkJCQzA0PC9jb2xvcj4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2FwcGxpY2F0aW9ucy9TZXJ2aWNlTGlzdGluZy5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2FwcGxpY2F0aW9ucy9TZXJ2aWNlTGlzdGluZy5qYXZhCmluZGV4IGJkOWU3NjAuLmM4YmNhYmYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9hcHBsaWNhdGlvbnMvU2VydmljZUxpc3RpbmcuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvYXBwbGljYXRpb25zL1NlcnZpY2VMaXN0aW5nLmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKIC8qKgogICogQ2xhc3MgZm9yIG1hbmFnaW5nIHNlcnZpY2VzIG1hdGNoaW5nIGEgZ2l2ZW4gaW50ZW50IGFuZCByZXF1ZXN0aW5nIGEgZ2l2ZW4gcGVybWlzc2lvbi4KQEAgLTUxLDEyICs1MiwxMyBAQAogICAgIHByaXZhdGUgZmluYWwgSGFzaFNldDxDb21wb25lbnROYW1lPiBtRW5hYmxlZFNlcnZpY2VzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgIHByaXZhdGUgZmluYWwgTGlzdDxTZXJ2aWNlSW5mbz4gbVNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENhbGxiYWNrPiBtQ2FsbGJhY2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGUgbVZhbGlkYXRvcjsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtTGlzdGVuaW5nOwogCiAgICAgcHJpdmF0ZSBTZXJ2aWNlTGlzdGluZyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyB0YWcsCiAgICAgICAgICAgICBTdHJpbmcgc2V0dGluZywgU3RyaW5nIGludGVudEFjdGlvbiwgU3RyaW5nIHBlcm1pc3Npb24sIFN0cmluZyBub3VuLAotICAgICAgICAgICAgYm9vbGVhbiBhZGREZXZpY2VMb2NrZWRGbGFncykgeworICAgICAgICAgICAgYm9vbGVhbiBhZGREZXZpY2VMb2NrZWRGbGFncywgUHJlZGljYXRlIHZhbGlkYXRvcikgewogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtVGFnID0gdGFnOwpAQCAtNjUsNiArNjcsNyBAQAogICAgICAgICBtUGVybWlzc2lvbiA9IHBlcm1pc3Npb247CiAgICAgICAgIG1Ob3VuID0gbm91bjsKICAgICAgICAgbUFkZERldmljZUxvY2tlZEZsYWdzID0gYWRkRGV2aWNlTG9ja2VkRmxhZ3M7CisgICAgICAgIG1WYWxpZGF0b3IgPSB2YWxpZGF0b3I7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKQEAgLTEzNyw3ICsxNDAsNiBAQAogICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbVdyYXBwZXIgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBpbnN0YWxsZWRTZXJ2aWNlcyA9IHBtV3JhcHBlci5xdWVyeUludGVudFNlcnZpY2VzQXNVc2VyKAogICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQobUludGVudEFjdGlvbiksIGZsYWdzLCB1c2VyKTsKLQogICAgICAgICBmb3IgKFJlc29sdmVJbmZvIHJlc29sdmVJbmZvIDogaW5zdGFsbGVkU2VydmljZXMpIHsKICAgICAgICAgICAgIFNlcnZpY2VJbmZvIGluZm8gPSByZXNvbHZlSW5mby5zZXJ2aWNlSW5mbzsKIApAQCAtMTQ4LDYgKzE1MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIG1QZXJtaXNzaW9uKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVmFsaWRhdG9yICE9IG51bGwgJiYgIW1WYWxpZGF0b3IudGVzdChpbmZvKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVNlcnZpY2VzLmFkZChpbmZvKTsKICAgICAgICAgfQogICAgICAgICBmb3IgKENhbGxiYWNrIGNhbGxiYWNrIDogbUNhbGxiYWNrcykgewpAQCAtMTk0LDYgKzE5OSw3IEBACiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1QZXJtaXNzaW9uOwogICAgICAgICBwcml2YXRlIFN0cmluZyBtTm91bjsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1BZGREZXZpY2VMb2NrZWRGbGFncyA9IGZhbHNlOworICAgICAgICBwcml2YXRlIFByZWRpY2F0ZSBtVmFsaWRhdG9yOwogCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwpAQCAtMjI0LDYgKzIzMCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWYWxpZGF0b3IoUHJlZGljYXRlPFNlcnZpY2VJbmZvPiB2YWxpZGF0b3IpIHsKKyAgICAgICAgICAgIG1WYWxpZGF0b3IgPSB2YWxpZGF0b3I7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBhZGQgc3VwcG9ydCBmb3IgYm90aCBNQVRDSF9ESVJFQ1RfQk9PVF9BV0FSRSBhbmQKICAgICAgICAgICogTUFUQ0hfRElSRUNUX0JPT1RfVU5BV0FSRSBmbGFncyB3aGVuIHF1ZXJ5aW5nIFBhY2thZ2VNYW5hZ2VyLiBSZXF1aXJlZCB0byBnZXQgcmVzdWx0cwpAQCAtMjM2LDcgKzI0Nyw3IEBACiAKICAgICAgICAgcHVibGljIFNlcnZpY2VMaXN0aW5nIGJ1aWxkKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlTGlzdGluZyhtQ29udGV4dCwgbVRhZywgbVNldHRpbmcsIG1JbnRlbnRBY3Rpb24sIG1QZXJtaXNzaW9uLCBtTm91biwKLSAgICAgICAgICAgICAgICAgICAgbUFkZERldmljZUxvY2tlZEZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgbUFkZERldmljZUxvY2tlZEZsYWdzLCBtVmFsaWRhdG9yKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9kcmVhbS9EcmVhbUJhY2tlbmQuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9kcmVhbS9EcmVhbUJhY2tlbmQuamF2YQppbmRleCA2ODhmYzcyLi5jNGYwOWNlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZHJlYW0vRHJlYW1CYWNrZW5kLmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2RyZWFtL0RyZWFtQmFja2VuZC5qYXZhCkBAIC0zMSwxMyArMzEsMTUgQEAKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5kcmVhbXMuRHJlYW1TZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS5kcmVhbXMuSURyZWFtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CkBAIC0xMTYsNyArMTE4LDcgQEAKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbURyZWFtc0FjdGl2YXRlZE9uU2xlZXBCeURlZmF1bHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1EcmVhbXNBY3RpdmF0ZWRPbkRvY2tCeURlZmF1bHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q29tcG9uZW50TmFtZT4gbURpc2FibGVkRHJlYW1zOwotICAgIHByaXZhdGUgZmluYWwgU2V0PEludGVnZXI+IG1TdXBwb3J0ZWRDb21wbGljYXRpb25zOworICAgIHByaXZhdGUgU2V0PEludGVnZXI+IG1TdXBwb3J0ZWRDb21wbGljYXRpb25zOwogICAgIHByaXZhdGUgc3RhdGljIERyZWFtQmFja2VuZCBzSW5zdGFuY2U7CiAKICAgICBwdWJsaWMgc3RhdGljIERyZWFtQmFja2VuZCBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKQEAgLTI4MSw3ICsyODMsMTggQEAKIAogICAgIC8qKiBHZXRzIGFsbCBjb21wbGljYXRpb25zIHdoaWNoIGhhdmUgYmVlbiBlbmFibGVkIGJ5IHRoZSB1c2VyLiAqLwogICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4gZ2V0RW5hYmxlZENvbXBsaWNhdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb21wbGljYXRpb25zRW5hYmxlZCgpID8gbVN1cHBvcnRlZENvbXBsaWNhdGlvbnMgOiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICBmaW5hbCBTZXQ8SW50ZWdlcj4gZW5hYmxlZENvbXBsaWNhdGlvbnMgPQorICAgICAgICAgICAgICAgIGdldENvbXBsaWNhdGlvbnNFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IEFycmF5U2V0PD4obVN1cHBvcnRlZENvbXBsaWNhdGlvbnMpIDogbmV3IEFycmF5U2V0PD4oKTsKKworICAgICAgICBpZiAoIWdldEhvbWVDb250cm9sc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZW5hYmxlZENvbXBsaWNhdGlvbnMucmVtb3ZlKENPTVBMSUNBVElPTl9UWVBFX0hPTUVfQ09OVFJPTFMpOworICAgICAgICB9IGVsc2UgaWYgKG1TdXBwb3J0ZWRDb21wbGljYXRpb25zLmNvbnRhaW5zKENPTVBMSUNBVElPTl9UWVBFX0hPTUVfQ09OVFJPTFMpKSB7CisgICAgICAgICAgICAvLyBBZGQgaG9tZSBjb250cm9sIHR5cGUgdG8gbGlzdCBvZiBlbmFibGVkIGNvbXBsaWNhdGlvbnMsIGV2ZW4gaWYgb3RoZXIgY29tcGxpY2F0aW9ucworICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIGRpc2FibGVkLgorICAgICAgICAgICAgZW5hYmxlZENvbXBsaWNhdGlvbnMuYWRkKENPTVBMSUNBVElPTl9UWVBFX0hPTUVfQ09OVFJPTFMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbmFibGVkQ29tcGxpY2F0aW9uczsKICAgICB9CiAKICAgICAvKiogU2V0cyBjb21wbGljYXRpb24gZW5hYmxlZCBzdGF0ZS4gKi8KQEAgLTI5MCw2ICszMDMsMTggQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuU0NSRUVOU0FWRVJfQ09NUExJQ0FUSU9OU19FTkFCTEVELCBlbmFibGVkID8gMSA6IDApOwogICAgIH0KIAorICAgIC8qKiBTZXRzIHdoZXRoZXIgaG9tZSBjb250cm9scyBhcmUgZW5hYmxlZCBieSB0aGUgdXNlciBvbiB0aGUgZHJlYW0gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb21lQ29udHJvbHNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TQ1JFRU5TQVZFUl9IT01FX0NPTlRST0xTX0VOQUJMRUQsIGVuYWJsZWQgPyAxIDogMCk7CisgICAgfQorCisgICAgLyoqIEdldHMgd2hldGhlciBob21lIGNvbnRyb2xzIGJ1dHRvbiBpcyBlbmFibGVkIG9uIHRoZSBkcmVhbSAqLworICAgIHByaXZhdGUgYm9vbGVhbiBnZXRIb21lQ29udHJvbHNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuU0NSRUVOU0FWRVJfSE9NRV9DT05UUk9MU19FTkFCTEVELCAxKSA9PSAxOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldHMgd2hldGhlciBjb21wbGljYXRpb25zIGFyZSBlbmFibGVkIG9uIHRoaXMgZGV2aWNlCiAgICAgICovCkBAIC0zMDQsNiArMzI5LDE0IEBACiAgICAgICAgIHJldHVybiBtU3VwcG9ydGVkQ29tcGxpY2F0aW9uczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjb21wbGljYXRpb25zLiBTaG91bGQgb25seSBiZSB1c2VkIGluIHRlc3RzLgorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRlZENvbXBsaWNhdGlvbnMoU2V0PEludGVnZXI+IGNvbXBsaWNhdGlvbnMpIHsKKyAgICAgICAgbVN1cHBvcnRlZENvbXBsaWNhdGlvbnMgPSBjb21wbGljYXRpb25zOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKICAgICAgICAgcmV0dXJuIGdldEJvb2xlYW4oU2V0dGluZ3MuU2VjdXJlLlNDUkVFTlNBVkVSX0VOQUJMRUQsIG1EcmVhbXNFbmFibGVkQnlEZWZhdWx0KTsKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZ3JhcGgvVGhlbWVkQmF0dGVyeURyYXdhYmxlLmt0IGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2dyYXBoL1RoZW1lZEJhdHRlcnlEcmF3YWJsZS5rdAppbmRleCBmYWVhNWIyLi5hMDNhY2MzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZ3JhcGgvVGhlbWVkQmF0dGVyeURyYXdhYmxlLmt0CisrKyBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9ncmFwaC9UaGVtZWRCYXR0ZXJ5RHJhd2FibGUua3QKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdmFsIGVycm9yUGFpbnQgPSBQYWludChQYWludC5BTlRJX0FMSUFTX0ZMQUcpLmFsc28geyBwIC0+Ci0gICAgICAgIHAuY29sb3IgPSBVdGlscy5nZXRDb2xvclN0YXRlTGlzdERlZmF1bHRDb2xvcihjb250ZXh0LCBSLmNvbG9yLmJhdHRlcnltZXRlcl9wbHVzX2NvbG9yKQorICAgICAgICBwLmNvbG9yID0gVXRpbHMuZ2V0Q29sb3JTdGF0ZUxpc3REZWZhdWx0Q29sb3IoY29udGV4dCwgUi5jb2xvci5iYXR0ZXJ5bWV0ZXJfc2F2ZXJfY29sb3IpCiAgICAgICAgIHAuYWxwaGEgPSAyNTUKICAgICAgICAgcC5pc0RpdGhlciA9IHRydWUKICAgICAgICAgcC5zdHJva2VXaWR0aCA9IDBmCkBAIC0yNDQsMTAgKzI0NCwxMSBAQAogICAgICAgICAgICAgICAgIGMuZHJhd1BhdGgoc2NhbGVkQm9sdCwgZmlsbENvbG9yU3Ryb2tlUHJvdGVjdGlvbikKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChwb3dlclNhdmVFbmFibGVkKSB7Ci0gICAgICAgICAgICAvLyBJZiBwb3dlciBzYXZlIGlzIGVuYWJsZWQgZHJhdyB0aGUgcGVyaW1ldGVyIHBhdGggd2l0aCBjb2xvckVycm9yCi0gICAgICAgICAgICBjLmRyYXdQYXRoKHNjYWxlZEVycm9yUGVyaW1ldGVyLCBlcnJvclBhaW50KQorICAgICAgICAgICAgLy8gSWYgcG93ZXIgc2F2ZSBpcyBlbmFibGVkIGRyYXcgdGhlIGxldmVsIHBhdGggd2l0aCBjb2xvckVycm9yCisgICAgICAgICAgICBjLmRyYXdQYXRoKGxldmVsUGF0aCwgZXJyb3JQYWludCkKICAgICAgICAgICAgIC8vIEFuZCBkcmF3IHRoZSBwbHVzIHNpZ24gb24gdG9wIG9mIHRoZSBmaWxsCi0gICAgICAgICAgICBjLmRyYXdQYXRoKHNjYWxlZFBsdXMsIGVycm9yUGFpbnQpCisgICAgICAgICAgICBmaWxsUGFpbnQuY29sb3IgPSBmaWxsQ29sb3IKKyAgICAgICAgICAgIGMuZHJhd1BhdGgoc2NhbGVkUGx1cywgZmlsbFBhaW50KQogICAgICAgICB9CiAgICAgICAgIGMucmVzdG9yZSgpCiAgICAgfQpAQCAtNDE0LDcgKzQxNSw3IEBACiAgICAgY29tcGFuaW9uIG9iamVjdCB7CiAgICAgICAgIGNvbnN0IHZhbCBXSURUSCA9IDEyZgogICAgICAgICBjb25zdCB2YWwgSEVJR0hUID0gMjBmCi0gICAgICAgIHByaXZhdGUgY29uc3QgdmFsIENSSVRJQ0FMX0xFVkVMID0gMTUKKyAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgQ1JJVElDQUxfTEVWRUwgPSAyMAogICAgICAgICAvLyBPbiBhIDEyeDIwIGdyaWQsIGhvdyB3aWRlIHRvIG1ha2UgdGhlIGZpbGwgcHJvdGVjdGlvbiBzdHJva2UuCiAgICAgICAgIC8vIFNjYWxlcyB3aGVuIG91ciBzaXplIGNoYW5nZXMKICAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgUFJPVEVDVElPTl9TVFJPS0VfV0lEVEggPSAzZgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL0luZm9NZWRpYU1hbmFnZXIuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9tZWRpYS9JbmZvTWVkaWFNYW5hZ2VyLmphdmEKaW5kZXggNjg0YTlhYS4uYzllODMxMiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL0luZm9NZWRpYU1hbmFnZXIuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvbWVkaWEvSW5mb01lZGlhTWFuYWdlci5qYXZhCkBAIC0zMSw3ICszMSw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZTJJbmZvLlRZUEVfVVNCX0hFQURTRVQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZTJJbmZvLlRZUEVfV0lSRURfSEVBRFBIT05FUzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlMkluZm8uVFlQRV9XSVJFRF9IRUFEU0VUOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGUyUHJvdmlkZXJTZXJ2aWNlLlJFQVNPTl9VTktOT1dOX0VSUk9SOwogCiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLm1lZGlhLkxvY2FsTWVkaWFNYW5hZ2VyLk1lZGlhRGV2aWNlU3RhdGUuU1RBVEVfU0VMRUNURUQ7CiAKQEAgLTYyMSw5ICs2MjAsMTEgQEAKICAgICAgICAgICAgIGRpc3BhdGNoQ29ubmVjdGVkRGV2aWNlQ2hhbmdlZChpZCk7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogSWdub3JlIGNhbGxiYWNrIGhlcmUgc2luY2Ugd2UnbGwgYWxzbyByZWNlaXZlIHtAbGluayBvblJlcXVlc3RGYWlsZWR9IHdpdGggcmVhc29uIGNvZGUuCisgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25UcmFuc2ZlckZhaWxlZChSb3V0aW5nU2Vzc2lvbkluZm8gc2Vzc2lvbiwgTWVkaWFSb3V0ZTJJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaE9uUmVxdWVzdEZhaWxlZChSRUFTT05fVU5LTk9XTl9FUlJPUik7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzTGliL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9tZWRpYS9NZWRpYURldmljZS5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL01lZGlhRGV2aWNlLmphdmEKaW5kZXggNmI5ODY2Yi4uMDcxYWIyNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL01lZGlhRGV2aWNlLmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL01lZGlhRGV2aWNlLmphdmEKQEAgLTMzLDcgKzMzLDYgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uRkxBR19PTkdPSU5HX1NFU1NJT047CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLkZMQUdfT05HT0lOR19TRVNTSU9OX01BTkFHRUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLkZMQUdfU1VHR0VTVEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TRUxFQ1RJT05fQkVIQVZJT1JfVFJBTlNGRVI7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNVQlRFWFRfQURfUk9VVElOR19ESVNBTExPV0VEOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TVUJURVhUX0NVU1RPTTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uU1VCVEVYVF9ERVZJQ0VfTE9XX1BPV0VSOwpAQCAtNDUsNiArNDQsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TVUJURVhUX1VOQVVUSE9SSVpFRDsKIAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5tZWRpYS5Mb2NhbE1lZGlhTWFuYWdlci5NZWRpYURldmljZVN0YXRlLlNUQVRFX1NFTEVDVEVEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5tZWRpYS5NZWRpYURldmljZS5TZWxlY3Rpb25CZWhhdmlvci5TRUxFQ1RJT05fQkVIQVZJT1JfVFJBTlNGRVI7CiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU3VwcHJlc3NMaW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtOTUsNiArOTUsMTcgQEAKICAgICAgICAgaW50IFRZUEVfQ0FTVF9HUk9VUF9ERVZJQ0UgPSA3OwogICAgIH0KIAorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBASW50RGVmKHtTZWxlY3Rpb25CZWhhdmlvci5TRUxFQ1RJT05fQkVIQVZJT1JfTk9ORSwKKyAgICAgICAgICAgIFNFTEVDVElPTl9CRUhBVklPUl9UUkFOU0ZFUiwKKyAgICAgICAgICAgIFNlbGVjdGlvbkJlaGF2aW9yLlNFTEVDVElPTl9CRUhBVklPUl9HT19UT19BUFAKKyAgICB9KQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlbGVjdGlvbkJlaGF2aW9yIHsKKyAgICAgICAgaW50IFNFTEVDVElPTl9CRUhBVklPUl9OT05FID0gMDsKKyAgICAgICAgaW50IFNFTEVDVElPTl9CRUhBVklPUl9UUkFOU0ZFUiA9IDE7CisgICAgICAgIGludCBTRUxFQ1RJT05fQkVIQVZJT1JfR09fVE9fQVBQID0gMjsKKyAgICB9CisKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBpbnQgbVR5cGU7CiAKQEAgLTIxMyw3ICsyMjQsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBzZWxlY3Rpb24gYmVoYXZpb3Igb2YgZGV2aWNlCiAgICAgICovCi0gICAgQFJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TdWJUZXh0CisgICAgQFNlbGVjdGlvbkJlaGF2aW9yCiAgICAgcHVibGljIGludCBnZXRTZWxlY3Rpb25CZWhhdmlvcigpIHsKICAgICAgICAgcmV0dXJuIEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSBCdWlsZC5WRVJTSU9OX0NPREVTLlVQU0lERV9ET1dOX0NBS0UgJiYgbUl0ZW0gIT0gbnVsbAogICAgICAgICAgICAgICAgID8gbUl0ZW0uZ2V0U2VsZWN0aW9uQmVoYXZpb3IoKSA6IFNFTEVDVElPTl9CRUhBVklPUl9UUkFOU0ZFUjsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzTGliL3Rlc3RzL2ludGVnL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdzTWFuYWdlclRlc3QuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3Rlc3RzL2ludGVnL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdzTWFuYWdlclRlc3QuamF2YQppbmRleCAwZmExNWViLi5mZGVmY2RlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9pbnRlZy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5nc01hbmFnZXJUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NMaWIvdGVzdHMvaW50ZWcvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2RldmljZXN0YXRlL0RldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ3NNYW5hZ2VyVGVzdC5qYXZhCkBAIC03MCwxMiArNzAsMjAgQEAKICAgICAgICAgd2hlbihtTW9ja0NvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkpLnRoZW5SZXR1cm4obU1vY2tDb250ZXh0KTsKICAgICAgICAgd2hlbihtTW9ja0NvbnRleHQuZ2V0UmVzb3VyY2VzKCkpLnRoZW5SZXR1cm4obU1vY2tSZXNvdXJjZXMpOwogICAgICAgICB3aGVuKG1Nb2NrQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSkudGhlblJldHVybihjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpKTsKKyAgICAgICAgd2hlbihtTW9ja1Jlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LmNvbmZpZ19wZXJEZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja0RlZmF1bHRzKSkKKyAgICAgICAgICAgICAgICAudGhlblJldHVybihuZXcgU3RyaW5nW117IjA6MSIsICIxOjA6MiIsICIyOjIifSk7CisgICAgICAgIHdoZW4obU1vY2tSZXNvdXJjZXMuZ2V0SW50QXJyYXkoUi5hcnJheS5jb25maWdfZm9sZGVkRGV2aWNlU3RhdGVzKSkKKyAgICAgICAgICAgICAgICAudGhlblJldHVybihuZXcgaW50W117MH0pOworICAgICAgICB3aGVuKG1Nb2NrUmVzb3VyY2VzLmdldEludEFycmF5KFIuYXJyYXkuY29uZmlnX2hhbGZGb2xkZWREZXZpY2VTdGF0ZXMpKQorICAgICAgICAgICAgICAgIC50aGVuUmV0dXJuKG5ldyBpbnRbXXsxfSk7CisgICAgICAgIHdoZW4obU1vY2tSZXNvdXJjZXMuZ2V0SW50QXJyYXkoUi5hcnJheS5jb25maWdfb3BlbkRldmljZVN0YXRlcykpCisgICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4obmV3IGludFtdezJ9KTsKICAgICAgICAgbUZha2VTZWN1cmVTZXR0aW5ncy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVWSUNFX1NUQVRFX1JPVEFUSU9OX0xPQ0ssCiAgICAgICAgICAgICAgICAgLyogbm90aWZ5Rm9yRGVzY2VuZGVudHM9ICovIGZhbHNlLCAvL05PVFlQTwogICAgICAgICAgICAgICAgIG1Db250ZW50T2JzZXJ2ZXIsCiAgICAgICAgICAgICAgICAgVXNlckhhbmRsZS5VU0VSX0NVUlJFTlQpOwotICAgICAgICBtTWFuYWdlciA9IG5ldyBEZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdzTWFuYWdlcihjb250ZXh0LCBtRmFrZVNlY3VyZVNldHRpbmdzKTsKKyAgICAgICAgbU1hbmFnZXIgPSBuZXcgRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5nc01hbmFnZXIobU1vY2tDb250ZXh0LCBtRmFrZVNlY3VyZVNldHRpbmdzKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTA5LDcgKzExNyw3IEBACiAgICAgcHVibGljIHZvaWQgZ2V0U2V0dGFibGVEZXZpY2VTdGF0ZXNfcmV0dXJuc0V4cGVjdGVkVmFsdWVzSW5PcmlnaW5hbE9yZGVyKCkgewogICAgICAgICB3aGVuKG1Nb2NrUmVzb3VyY2VzLmdldFN0cmluZ0FycmF5KAogICAgICAgICAgICAgICAgIFIuYXJyYXkuY29uZmlnX3BlckRldmljZVN0YXRlUm90YXRpb25Mb2NrRGVmYXVsdHMpKS50aGVuUmV0dXJuKAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiMjoyIiwgIjQ6MCIsICIxOjEiLCAiMDowIn0pOworICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiMjoxIiwgIjE6MDoxIiwgIjA6MiJ9KTsKIAogICAgICAgICBMaXN0PFNldHRhYmxlRGV2aWNlU3RhdGU+IHNldHRhYmxlRGV2aWNlU3RhdGVzID0KICAgICAgICAgICAgICAgICBEZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdzTWFuYWdlci5nZXRJbnN0YW5jZSgKQEAgLTExNyw5ICsxMjUsOCBAQAogCiAgICAgICAgIGFzc2VydFRoYXQoc2V0dGFibGVEZXZpY2VTdGF0ZXMpLmNvbnRhaW5zRXhhY3RseSgKICAgICAgICAgICAgICAgICBuZXcgU2V0dGFibGVEZXZpY2VTdGF0ZSgvKiBkZXZpY2VTdGF0ZT0gKi8gMiwgLyogaXNTZXR0YWJsZT0gKi8gdHJ1ZSksCi0gICAgICAgICAgICAgICAgbmV3IFNldHRhYmxlRGV2aWNlU3RhdGUoLyogZGV2aWNlU3RhdGU9ICovIDQsIC8qIGlzU2V0dGFibGU9ICovIGZhbHNlKSwKLSAgICAgICAgICAgICAgICBuZXcgU2V0dGFibGVEZXZpY2VTdGF0ZSgvKiBkZXZpY2VTdGF0ZT0gKi8gMSwgLyogaXNTZXR0YWJsZT0gKi8gdHJ1ZSksCi0gICAgICAgICAgICAgICAgbmV3IFNldHRhYmxlRGV2aWNlU3RhdGUoLyogZGV2aWNlU3RhdGU9ICovIDAsIC8qIGlzU2V0dGFibGU9ICovIGZhbHNlKQorICAgICAgICAgICAgICAgIG5ldyBTZXR0YWJsZURldmljZVN0YXRlKC8qIGRldmljZVN0YXRlPSAqLyAxLCAvKiBpc1NldHRhYmxlPSAqLyBmYWxzZSksCisgICAgICAgICAgICAgICAgbmV3IFNldHRhYmxlRGV2aWNlU3RhdGUoLyogZGV2aWNlU3RhdGU9ICovIDAsIC8qIGlzU2V0dGFibGU9ICovIHRydWUpCiAgICAgICAgICkuaW5PcmRlcigpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvdGVzdHMvcm9ib3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9hcHBsaWNhdGlvbnMvU2VydmljZUxpc3RpbmdUZXN0LmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2FwcGxpY2F0aW9ucy9TZXJ2aWNlTGlzdGluZ1Rlc3QuamF2YQppbmRleCBmN2ZkMjViLi43ZmYwOTg4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2FwcGxpY2F0aW9ucy9TZXJ2aWNlTGlzdGluZ1Rlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2FwcGxpY2F0aW9ucy9TZXJ2aWNlTGlzdGluZ1Rlc3QuamF2YQpAQCAtMTgsMjAgKzE4LDM1IEBACiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlJbnQ7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55TGlzdDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnNweTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lczsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiAKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmNvcmUuYXBwLkFwcGxpY2F0aW9uUHJvdmlkZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CisKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcjsKIGltcG9ydCBvcmcucm9ib2xlY3RyaWMuUm9ib2xlY3RyaWNUZXN0UnVubmVyOwogaW1wb3J0IG9yZy5yb2JvbGVjdHJpYy5SdW50aW1lRW52aXJvbm1lbnQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogQFJ1bldpdGgoUm9ib2xlY3RyaWNUZXN0UnVubmVyLmNsYXNzKQogcHVibGljIGNsYXNzIFNlcnZpY2VMaXN0aW5nVGVzdCB7CiAKQEAgLTM5LDEwICs1NCwxNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0lOVEVOVCA9ICJjb20uZXhhbXBsZS5pbnRlbnQiOwogCiAgICAgcHJpdmF0ZSBTZXJ2aWNlTGlzdGluZyBtU2VydmljZUxpc3Rpbmc7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXIgbVBtOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBtU2VydmljZUxpc3RpbmcgPSBuZXcgU2VydmljZUxpc3RpbmcuQnVpbGRlcihSdW50aW1lRW52aXJvbm1lbnQuYXBwbGljYXRpb24pCisgICAgICAgIG1QbSA9IG1vY2soUGFja2FnZU1hbmFnZXIuY2xhc3MpOworICAgICAgICBtQ29udGV4dCA9IHNweShBcHBsaWNhdGlvblByb3ZpZGVyLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKKyAgICAgICAgd2hlbihtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpKS50aGVuUmV0dXJuKG1QbSk7CisKKyAgICAgICAgbVNlcnZpY2VMaXN0aW5nID0gbmV3IFNlcnZpY2VMaXN0aW5nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgLnNldFRhZygidGVzdFRhZyIpCiAgICAgICAgICAgICAgICAgLnNldFNldHRpbmcoVEVTVF9TRVRUSU5HKQogICAgICAgICAgICAgICAgIC5zZXROb3VuKCJ0ZXN0Tm91biIpCkBAIC01Miw2ICs3Myw4MSBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRvcigpIHsKKyAgICAgICAgU2VydmljZUluZm8gczEgPSBuZXcgU2VydmljZUluZm8oKTsKKyAgICAgICAgczEucGVybWlzc2lvbiA9ICJ0ZXN0UGVybWlzc2lvbiI7CisgICAgICAgIHMxLnBhY2thZ2VOYW1lID0gInBrZyI7CisgICAgICAgIFNlcnZpY2VJbmZvIHMyID0gbmV3IFNlcnZpY2VJbmZvKCk7CisgICAgICAgIHMyLnBlcm1pc3Npb24gPSAidGVzdFBlcm1pc3Npb24iOworICAgICAgICBzMi5wYWNrYWdlTmFtZSA9ICJwa2cyIjsKKyAgICAgICAgUmVzb2x2ZUluZm8gcjEgPSBuZXcgUmVzb2x2ZUluZm8oKTsKKyAgICAgICAgcjEuc2VydmljZUluZm8gPSBzMTsKKyAgICAgICAgUmVzb2x2ZUluZm8gcjIgPSBuZXcgUmVzb2x2ZUluZm8oKTsKKyAgICAgICAgcjIuc2VydmljZUluZm8gPSBzMjsKKworICAgICAgICB3aGVuKG1QbS5xdWVyeUludGVudFNlcnZpY2VzQXNVc2VyKGFueSgpLCBhbnlJbnQoKSwgYW55SW50KCkpKS50aGVuUmV0dXJuKAorICAgICAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YocjEsIHIyKSk7CisKKyAgICAgICAgbVNlcnZpY2VMaXN0aW5nID0gbmV3IFNlcnZpY2VMaXN0aW5nLkJ1aWxkZXIobUNvbnRleHQpCisgICAgICAgICAgICAgICAgLnNldFRhZygidGVzdFRhZyIpCisgICAgICAgICAgICAgICAgLnNldFNldHRpbmcoVEVTVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC5zZXROb3VuKCJ0ZXN0Tm91biIpCisgICAgICAgICAgICAgICAgLnNldEludGVudEFjdGlvbihURVNUX0lOVEVOVCkKKyAgICAgICAgICAgICAgICAuc2V0VmFsaWRhdG9yKGluZm8gLT4geworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5wYWNrYWdlTmFtZS5lcXVhbHMoInBrZyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuc2V0UGVybWlzc2lvbigidGVzdFBlcm1pc3Npb24iKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBTZXJ2aWNlTGlzdGluZy5DYWxsYmFjayBjYWxsYmFjayA9IG1vY2soU2VydmljZUxpc3RpbmcuQ2FsbGJhY2suY2xhc3MpOworICAgICAgICBtU2VydmljZUxpc3RpbmcuYWRkQ2FsbGJhY2soY2FsbGJhY2spOworICAgICAgICBtU2VydmljZUxpc3RpbmcucmVsb2FkKCk7CisKKyAgICAgICAgdmVyaWZ5KG1QbSkucXVlcnlJbnRlbnRTZXJ2aWNlc0FzVXNlcihhbnkoKSwgYW55SW50KCksIGFueUludCgpKTsKKyAgICAgICAgQXJndW1lbnRDYXB0b3I8TGlzdDxTZXJ2aWNlSW5mbz4+IGNhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKExpc3QuY2xhc3MpOworICAgICAgICB2ZXJpZnkoY2FsbGJhY2ssIHRpbWVzKDEpKS5vblNlcnZpY2VzUmVsb2FkZWQoY2FwdG9yLmNhcHR1cmUoKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChjYXB0b3IuZ2V0VmFsdWUoKS5zaXplKCkpLmlzRXF1YWxUbygxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjYXB0b3IuZ2V0VmFsdWUoKS5nZXQoMCkpLmlzRXF1YWxUbyhzMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9WYWxpZGF0b3IoKSB7CisgICAgICAgIFNlcnZpY2VJbmZvIHMxID0gbmV3IFNlcnZpY2VJbmZvKCk7CisgICAgICAgIHMxLnBlcm1pc3Npb24gPSAidGVzdFBlcm1pc3Npb24iOworICAgICAgICBzMS5wYWNrYWdlTmFtZSA9ICJwa2ciOworICAgICAgICBTZXJ2aWNlSW5mbyBzMiA9IG5ldyBTZXJ2aWNlSW5mbygpOworICAgICAgICBzMi5wZXJtaXNzaW9uID0gInRlc3RQZXJtaXNzaW9uIjsKKyAgICAgICAgczIucGFja2FnZU5hbWUgPSAicGtnMiI7CisgICAgICAgIFJlc29sdmVJbmZvIHIxID0gbmV3IFJlc29sdmVJbmZvKCk7CisgICAgICAgIHIxLnNlcnZpY2VJbmZvID0gczE7CisgICAgICAgIFJlc29sdmVJbmZvIHIyID0gbmV3IFJlc29sdmVJbmZvKCk7CisgICAgICAgIHIyLnNlcnZpY2VJbmZvID0gczI7CisKKyAgICAgICAgd2hlbihtUG0ucXVlcnlJbnRlbnRTZXJ2aWNlc0FzVXNlcihhbnkoKSwgYW55SW50KCksIGFueUludCgpKSkudGhlblJldHVybigKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKHIxLCByMikpOworCisgICAgICAgIG1TZXJ2aWNlTGlzdGluZyA9IG5ldyBTZXJ2aWNlTGlzdGluZy5CdWlsZGVyKG1Db250ZXh0KQorICAgICAgICAgICAgICAgIC5zZXRUYWcoInRlc3RUYWciKQorICAgICAgICAgICAgICAgIC5zZXRTZXR0aW5nKFRFU1RfU0VUVElORykKKyAgICAgICAgICAgICAgICAuc2V0Tm91bigidGVzdE5vdW4iKQorICAgICAgICAgICAgICAgIC5zZXRJbnRlbnRBY3Rpb24oVEVTVF9JTlRFTlQpCisgICAgICAgICAgICAgICAgLnNldFBlcm1pc3Npb24oInRlc3RQZXJtaXNzaW9uIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgU2VydmljZUxpc3RpbmcuQ2FsbGJhY2sgY2FsbGJhY2sgPSBtb2NrKFNlcnZpY2VMaXN0aW5nLkNhbGxiYWNrLmNsYXNzKTsKKyAgICAgICAgbVNlcnZpY2VMaXN0aW5nLmFkZENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICAgICAgbVNlcnZpY2VMaXN0aW5nLnJlbG9hZCgpOworCisgICAgICAgIHZlcmlmeShtUG0pLnF1ZXJ5SW50ZW50U2VydmljZXNBc1VzZXIoYW55KCksIGFueUludCgpLCBhbnlJbnQoKSk7CisgICAgICAgIEFyZ3VtZW50Q2FwdG9yPExpc3Q8U2VydmljZUluZm8+PiBjYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcyhMaXN0LmNsYXNzKTsKKyAgICAgICAgdmVyaWZ5KGNhbGxiYWNrLCB0aW1lcygxKSkub25TZXJ2aWNlc1JlbG9hZGVkKGNhcHRvci5jYXB0dXJlKCkpOworCisgICAgICAgIGFzc2VydFRoYXQoY2FwdG9yLmdldFZhbHVlKCkuc2l6ZSgpKS5pc0VxdWFsVG8oMik7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbGJhY2soKSB7CiAgICAgICAgIFNlcnZpY2VMaXN0aW5nLkNhbGxiYWNrIGNhbGxiYWNrID0gbW9jayhTZXJ2aWNlTGlzdGluZy5DYWxsYmFjay5jbGFzcyk7CiAgICAgICAgIG1TZXJ2aWNlTGlzdGluZy5hZGRDYWxsYmFjayhjYWxsYmFjayk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL2RyZWFtL0RyZWFtQmFja2VuZFRlc3QuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3Rlc3RzL3JvYm90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZHJlYW0vRHJlYW1CYWNrZW5kVGVzdC5qYXZhCmluZGV4IDUyYjkyMjcuLjIyZWMxMmQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzTGliL3Rlc3RzL3JvYm90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZHJlYW0vRHJlYW1CYWNrZW5kVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3Rlc3RzL3JvYm90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvZHJlYW0vRHJlYW1CYWNrZW5kVGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMCBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5kcmVhbTsKIAogCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLmRyZWFtLkRyZWFtQmFja2VuZC5DT01QTElDQVRJT05fVFlQRV9EQVRFOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5kcmVhbS5EcmVhbUJhY2tlbmQuQ09NUExJQ0FUSU9OX1RZUEVfSE9NRV9DT05UUk9MUzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuZHJlYW0uRHJlYW1CYWNrZW5kLkNPTVBMSUNBVElPTl9UWVBFX1RJTUU7CisKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CkBAIC0zNiwxMyArNDAsMTYgQEAKIGltcG9ydCBvcmcucm9ib2xlY3RyaWMuc2hhZG93cy5TaGFkb3dTZXR0aW5nczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogQFJ1bldpdGgoUm9ib2xlY3RyaWNUZXN0UnVubmVyLmNsYXNzKQogQENvbmZpZyhzaGFkb3dzID0ge1NoYWRvd1NldHRpbmdzLlNoYWRvd1NlY3VyZS5jbGFzc30pCiBwdWJsaWMgZmluYWwgY2xhc3MgRHJlYW1CYWNrZW5kVGVzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU1VQUE9SVEVEX0RSRUFNX0NPTVBMSUNBVElPTlMgPSB7MSwgMiwgM307CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU1VQUE9SVEVEX0RSRUFNX0NPTVBMSUNBVElPTlMgPQorICAgICAgICAgICAge0NPTVBMSUNBVElPTl9UWVBFX0hPTUVfQ09OVFJPTFMsIENPTVBMSUNBVElPTl9UWVBFX0RBVEUsCisgICAgICAgICAgICAgICAgICAgIENPTVBMSUNBVElPTl9UWVBFX1RJTUV9OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8SW50ZWdlcj4gU1VQUE9SVEVEX0RSRUFNX0NPTVBMSUNBVElPTlNfTElTVCA9IEFycmF5cy5zdHJlYW0oCiAgICAgICAgICAgICBTVVBQT1JURURfRFJFQU1fQ09NUExJQ0FUSU9OUykuYm94ZWQoKS5jb2xsZWN0KAogICAgICAgICAgICAgQ29sbGVjdG9ycy50b0xpc3QoKSk7CkBAIC05Myw4ICsxMDAsNTIgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQ29tcGxpY2F0aW9ucygpIHsKICAgICAgICAgbUJhY2tlbmQuc2V0Q29tcGxpY2F0aW9uc0VuYWJsZWQoZmFsc2UpOwotICAgICAgICBhc3NlcnRUaGF0KG1CYWNrZW5kLmdldEVuYWJsZWRDb21wbGljYXRpb25zKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQmFja2VuZC5nZXRFbmFibGVkQ29tcGxpY2F0aW9ucygpKQorICAgICAgICAgICAgICAgIC5jb250YWluc0V4YWN0bHkoQ09NUExJQ0FUSU9OX1RZUEVfSE9NRV9DT05UUk9MUyk7CiAgICAgICAgIGFzc2VydFRoYXQobUJhY2tlbmQuZ2V0Q29tcGxpY2F0aW9uc0VuYWJsZWQoKSkuaXNGYWxzZSgpOwogICAgIH0KLX0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhvbWVDb250cm9sc0Rpc2FibGVkX0NvbXBsaWNhdGlvbnNFbmFibGVkKCkgeworICAgICAgICBtQmFja2VuZC5zZXRDb21wbGljYXRpb25zRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbUJhY2tlbmQuc2V0SG9tZUNvbnRyb2xzRW5hYmxlZChmYWxzZSk7CisgICAgICAgIC8vIEhvbWUgY29udHJvbHMgc2hvdWxkIG5vdCBiZSBlbmFibGVkLCBvbmx5IGRhdGUgYW5kIHRpbWUuCisgICAgICAgIGZpbmFsIExpc3Q8SW50ZWdlcj4gZW5hYmxlZENvbXBsaWNhdGlvbnMgPQorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoQ09NUExJQ0FUSU9OX1RZUEVfREFURSwgQ09NUExJQ0FUSU9OX1RZUEVfVElNRSk7CisgICAgICAgIGFzc2VydFRoYXQobUJhY2tlbmQuZ2V0RW5hYmxlZENvbXBsaWNhdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAuY29udGFpbnNFeGFjdGx5RWxlbWVudHNJbihlbmFibGVkQ29tcGxpY2F0aW9ucyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SG9tZUNvbnRyb2xzRGlzYWJsZWRfQ29tcGxpY2F0aW9uc0Rpc2FibGVkKCkgeworICAgICAgICBtQmFja2VuZC5zZXRDb21wbGljYXRpb25zRW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1CYWNrZW5kLnNldEhvbWVDb250cm9sc0VuYWJsZWQoZmFsc2UpOworICAgICAgICBhc3NlcnRUaGF0KG1CYWNrZW5kLmdldEVuYWJsZWRDb21wbGljYXRpb25zKCkpLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIb21lQ29udHJvbHNFbmFibGVkX0NvbXBsaWNhdGlvbnNEaXNhYmxlZCgpIHsKKyAgICAgICAgbUJhY2tlbmQuc2V0Q29tcGxpY2F0aW9uc0VuYWJsZWQoZmFsc2UpOworICAgICAgICBtQmFja2VuZC5zZXRIb21lQ29udHJvbHNFbmFibGVkKHRydWUpOworICAgICAgICAvLyBIb21lIGNvbnRyb2xzIHNob3VsZCBub3QgYmUgZW5hYmxlZCwgb25seSBkYXRlIGFuZCB0aW1lLgorICAgICAgICBmaW5hbCBMaXN0PEludGVnZXI+IGVuYWJsZWRDb21wbGljYXRpb25zID0KKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KENPTVBMSUNBVElPTl9UWVBFX0hPTUVfQ09OVFJPTFMpOworICAgICAgICBhc3NlcnRUaGF0KG1CYWNrZW5kLmdldEVuYWJsZWRDb21wbGljYXRpb25zKCkpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zRXhhY3RseUVsZW1lbnRzSW4oZW5hYmxlZENvbXBsaWNhdGlvbnMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhvbWVDb250cm9sc0VuYWJsZWRfQ29tcGxpY2F0aW9uc0VuYWJsZWQoKSB7CisgICAgICAgIG1CYWNrZW5kLnNldENvbXBsaWNhdGlvbnNFbmFibGVkKHRydWUpOworICAgICAgICBtQmFja2VuZC5zZXRIb21lQ29udHJvbHNFbmFibGVkKHRydWUpOworICAgICAgICAvLyBIb21lIGNvbnRyb2xzIHNob3VsZCBub3QgYmUgZW5hYmxlZCwgb25seSBkYXRlIGFuZCB0aW1lLgorICAgICAgICBmaW5hbCBMaXN0PEludGVnZXI+IGVuYWJsZWRDb21wbGljYXRpb25zID0KKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUExJQ0FUSU9OX1RZUEVfSE9NRV9DT05UUk9MUywKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBMSUNBVElPTl9UWVBFX0RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QTElDQVRJT05fVFlQRV9USU1FCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQmFja2VuZC5nZXRFbmFibGVkQ29tcGxpY2F0aW9ucygpKQorICAgICAgICAgICAgICAgIC5jb250YWluc0V4YWN0bHlFbGVtZW50c0luKGVuYWJsZWRDb21wbGljYXRpb25zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL0luZm9NZWRpYU1hbmFnZXJUZXN0LmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc0xpYi90ZXN0cy9yb2JvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NldHRpbmdzbGliL21lZGlhL0luZm9NZWRpYU1hbmFnZXJUZXN0LmphdmEKaW5kZXggZjYzYzA2YS4uMjcwZmRhOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NMaWIvdGVzdHMvcm9ib3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXR0aW5nc2xpYi9tZWRpYS9JbmZvTWVkaWFNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzTGliL3Rlc3RzL3JvYm90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2V0dGluZ3NsaWIvbWVkaWEvSW5mb01lZGlhTWFuYWdlclRlc3QuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5kb1JldHVybjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnNweTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKQEAgLTc5OSwxMiArODAwLDEyIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBvblRyYW5zZmVyRmFpbGVkX3Nob3VsZERpc3BhdGNoT25SZXF1ZXN0RmFpbGVkKCkgeworICAgIHB1YmxpYyB2b2lkIG9uVHJhbnNmZXJGYWlsZWRfbm90RGlzcGF0Y2hPblJlcXVlc3RGYWlsZWQoKSB7CiAgICAgICAgIG1JbmZvTWVkaWFNYW5hZ2VyLnJlZ2lzdGVyQ2FsbGJhY2sobUNhbGxiYWNrKTsKIAogICAgICAgICBtSW5mb01lZGlhTWFuYWdlci5tTWVkaWFSb3V0ZXJDYWxsYmFjay5vblRyYW5zZmVyRmFpbGVkKG51bGwsIG51bGwpOwogCi0gICAgICAgIHZlcmlmeShtQ2FsbGJhY2spLm9uUmVxdWVzdEZhaWxlZChSRUFTT05fVU5LTk9XTl9FUlJPUik7CisgICAgICAgIHZlcmlmeShtQ2FsbGJhY2ssIG5ldmVyKCkpLm9uUmVxdWVzdEZhaWxlZChSRUFTT05fVU5LTk9XTl9FUlJPUik7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvc2V0dGluZ3MvYmFja3VwL0dsb2JhbFNldHRpbmdzLmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL2JhY2t1cC9HbG9iYWxTZXR0aW5ncy5qYXZhCmluZGV4IDA5YTFiYTIuLmU1MGY1MjIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvc2V0dGluZ3MvYmFja3VwL0dsb2JhbFNldHRpbmdzLmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9zZXR0aW5ncy9iYWNrdXAvR2xvYmFsU2V0dGluZ3MuamF2YQpAQCAtNDksNiArNDksNyBAQAogICAgICAgICBTZXR0aW5ncy5HbG9iYWwuQ0hBUkdJTkdfU09VTkRTX0VOQUJMRUQsCiAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5VU0JfTUFTU19TVE9SQUdFX0VOQUJMRUQsCiAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5ORVRXT1JLX1JFQ09NTUVOREFUSU9OU19FTkFCTEVELAorICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTkVUV09SS19BVk9JRF9CQURfV0lGSSwKICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLldJRklfV0FLRVVQX0VOQUJMRUQsCiAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04sCiAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5VU0VfT1BFTl9XSUZJX1BBQ0tBR0UsCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL2JhY2t1cC9TZWN1cmVTZXR0aW5ncy5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9zZXR0aW5ncy9iYWNrdXAvU2VjdXJlU2V0dGluZ3MuamF2YQppbmRleCBmNjZmY2JhLi4zZWZiNDFkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL2JhY2t1cC9TZWN1cmVTZXR0aW5ncy5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvc2V0dGluZ3MvYmFja3VwL1NlY3VyZVNldHRpbmdzLmphdmEKQEAgLTEzOSw2ICsxMzksNyBAQAogICAgICAgICBTZXR0aW5ncy5TZWN1cmUuU0NSRUVOU0FWRVJfQ09NUE9ORU5UUywKICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlNDUkVFTlNBVkVSX0FDVElWQVRFX09OX0RPQ0ssCiAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TQ1JFRU5TQVZFUl9BQ1RJVkFURV9PTl9TTEVFUCwKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlNDUkVFTlNBVkVSX0hPTUVfQ09OVFJPTFNfRU5BQkxFRCwKICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlNIT1dfRklSU1RfQ1JBU0hfRElBTE9HX0RFVl9PUFRJT04sCiAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5WT0xVTUVfSFVTSF9HRVNUVVJFLAogICAgICAgICBTZXR0aW5ncy5TZWN1cmUuTUFOVUFMX1JJTkdFUl9UT0dHTEVfQ09VTlQsCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL3ZhbGlkYXRvcnMvR2xvYmFsU2V0dGluZ3NWYWxpZGF0b3JzLmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL3ZhbGlkYXRvcnMvR2xvYmFsU2V0dGluZ3NWYWxpZGF0b3JzLmphdmEKaW5kZXggZTU3Y2YzYi4uOGQwN2ZiNiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9zZXR0aW5ncy92YWxpZGF0b3JzL0dsb2JhbFNldHRpbmdzVmFsaWRhdG9ycy5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvc2V0dGluZ3MvdmFsaWRhdG9ycy9HbG9iYWxTZXR0aW5nc1ZhbGlkYXRvcnMuamF2YQpAQCAtMjAsNiArMjAsOSBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuSGRyQ29udmVyc2lvbk1vZGUuSERSX0NPTlZFUlNJT05fUEFTU1RIUk9VR0g7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5IZHJDb252ZXJzaW9uTW9kZS5IRFJfQ09OVkVSU0lPTl9TWVNURU07CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXQuU1VSUk9VTkRfU09VTkRfRU5DT0RJTkc7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eVNldHRpbmdzTWFuYWdlci5ORVRXT1JLX0FWT0lEX0JBRF9XSUZJX0FWT0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlTZXR0aW5nc01hbmFnZXIuTkVUV09SS19BVk9JRF9CQURfV0lGSV9JR05PUkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eVNldHRpbmdzTWFuYWdlci5ORVRXT1JLX0FWT0lEX0JBRF9XSUZJX1BST01QVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5zZXR0aW5ncy52YWxpZGF0b3JzLlNldHRpbmdzVmFsaWRhdG9ycy5BTllfSU5URUdFUl9WQUxJREFUT1I7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuc2V0dGluZ3MudmFsaWRhdG9ycy5TZXR0aW5nc1ZhbGlkYXRvcnMuQU5ZX1NUUklOR19WQUxJREFUT1I7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuc2V0dGluZ3MudmFsaWRhdG9ycy5TZXR0aW5nc1ZhbGlkYXRvcnMuQk9PTEVBTl9WQUxJREFUT1I7CkBAIC0xMDMsNiArMTA2LDE0IEBACiAgICAgICAgIFZBTElEQVRPUlMucHV0KAogICAgICAgICAgICAgICAgIEdsb2JhbC5ORVRXT1JLX1JFQ09NTUVOREFUSU9OU19FTkFCTEVELAogICAgICAgICAgICAgICAgIG5ldyBEaXNjcmV0ZVZhbHVlVmFsaWRhdG9yKG5ldyBTdHJpbmdbXSB7Ii0xIiwgIjAiLCAiMSJ9KSk7CisgICAgICAgIFZBTElEQVRPUlMucHV0KAorICAgICAgICAgICAgICAgIEdsb2JhbC5ORVRXT1JLX0FWT0lEX0JBRF9XSUZJLAorICAgICAgICAgICAgICAgIG5ldyBEaXNjcmV0ZVZhbHVlVmFsaWRhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTkVUV09SS19BVk9JRF9CQURfV0lGSV9JR05PUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihORVRXT1JLX0FWT0lEX0JBRF9XSUZJX1BST01QVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE5FVFdPUktfQVZPSURfQkFEX1dJRklfQVZPSUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICBWQUxJREFUT1JTLnB1dChHbG9iYWwuV0lGSV9XQUtFVVBfRU5BQkxFRCwgQk9PTEVBTl9WQUxJREFUT1IpOwogICAgICAgICBWQUxJREFUT1JTLnB1dChHbG9iYWwuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OLCBCT09MRUFOX1ZBTElEQVRPUik7CiAgICAgICAgIFZBTElEQVRPUlMucHV0KApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9zZXR0aW5ncy92YWxpZGF0b3JzL1NlY3VyZVNldHRpbmdzVmFsaWRhdG9ycy5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvYW5kcm9pZC9wcm92aWRlci9zZXR0aW5ncy92YWxpZGF0b3JzL1NlY3VyZVNldHRpbmdzVmFsaWRhdG9ycy5qYXZhCmluZGV4IDU1OGUxOWYuLmFiZDJjNzUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2FuZHJvaWQvcHJvdmlkZXIvc2V0dGluZ3MvdmFsaWRhdG9ycy9TZWN1cmVTZXR0aW5nc1ZhbGlkYXRvcnMuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL3NldHRpbmdzL3ZhbGlkYXRvcnMvU2VjdXJlU2V0dGluZ3NWYWxpZGF0b3JzLmphdmEKQEAgLTIwNiw2ICsyMDYsNyBAQAogICAgICAgICBWQUxJREFUT1JTLnB1dChTZWN1cmUuU0NSRUVOU0FWRVJfQ09NUE9ORU5UUywgQ09NTUFfU0VQQVJBVEVEX0NPTVBPTkVOVF9MSVNUX1ZBTElEQVRPUik7CiAgICAgICAgIFZBTElEQVRPUlMucHV0KFNlY3VyZS5TQ1JFRU5TQVZFUl9BQ1RJVkFURV9PTl9ET0NLLCBCT09MRUFOX1ZBTElEQVRPUik7CiAgICAgICAgIFZBTElEQVRPUlMucHV0KFNlY3VyZS5TQ1JFRU5TQVZFUl9BQ1RJVkFURV9PTl9TTEVFUCwgQk9PTEVBTl9WQUxJREFUT1IpOworICAgICAgICBWQUxJREFUT1JTLnB1dChTZWN1cmUuU0NSRUVOU0FWRVJfSE9NRV9DT05UUk9MU19FTkFCTEVELCBCT09MRUFOX1ZBTElEQVRPUik7CiAgICAgICAgIFZBTElEQVRPUlMucHV0KFNlY3VyZS5TSE9XX0ZJUlNUX0NSQVNIX0RJQUxPR19ERVZfT1BUSU9OLCBCT09MRUFOX1ZBTElEQVRPUik7CiAgICAgICAgIFZBTElEQVRPUlMucHV0KFNlY3VyZS5WT0xVTUVfSFVTSF9HRVNUVVJFLCBOT05fTkVHQVRJVkVfSU5URUdFUl9WQUxJREFUT1IpOwogICAgICAgICBWQUxJREFUT1JTLnB1dCgKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9HZW5lcmF0aW9uUmVnaXN0cnkuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9HZW5lcmF0aW9uUmVnaXN0cnkuamF2YQppbmRleCBkYjZjYzFhLi5hOGVlZWMzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvR2VuZXJhdGlvblJlZ2lzdHJ5LmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0dlbmVyYXRpb25SZWdpc3RyeS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CiBpbXBvcnQgYW5kcm9pZC51dGlsLk1lbW9yeUludEFycmF5OwpAQCAtMzAsNyArMzEsNyBAQAogCiAvKioKICAqIFRoaXMgY2xhc3MgdHJhY2tzIGNoYW5nZXMgZm9yIGNvbmZpZy9nbG9iYWwvc2VjdXJlL3N5c3RlbSB0YWJsZXMKLSAqIG9uIGEgcGVyIHVzZXIgYmFzaXMgYW5kIHVwZGF0ZXMgc2hhcmVkIG1lbW9yeSByZWdpb25zIHdoaWNoCisgKiBvbiBhIHBlci11c2VyIGJhc2lzIGFuZCB1cGRhdGVzIHNoYXJlZCBtZW1vcnkgcmVnaW9ucyB3aGljaAogICogY2xpZW50IHByb2Nlc3NlcyBjYW4gcmVhZCB0byBkZXRlcm1pbmUgaWYgdGhlaXIgbG9jYWwgY2FjaGVzIGFyZQogICogc3RhbGUuCiAgKi8KQEAgLTgxLDYgKzgyLDEwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluY3JlbWVudEdlbmVyYXRpb25JbnRlcm5hbChpbnQga2V5LCBATm9uTnVsbCBTdHJpbmcgaW5kZXhNYXBLZXkpIHsKKyAgICAgICAgaWYgKFNldHRpbmdzU3RhdGUuaXNHbG9iYWxTZXR0aW5nc0tleShrZXkpKSB7CisgICAgICAgICAgICAvLyBHbG9iYWwgc2V0dGluZ3MgYXJlIHNoYXJlZCBhY3Jvc3MgdXNlcnMsIHNvIGlnbm9yZSB0aGUgdXNlcklkIGluIHRoZSBrZXkKKyAgICAgICAgICAgIGtleSA9IFNldHRpbmdzU3RhdGUubWFrZUtleShTZXR0aW5nc1N0YXRlLlNFVFRJTkdTX1RZUEVfR0xPQkFMLCBVc2VySGFuZGxlLlVTRVJfU1lTVEVNKTsKKyAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICBmaW5hbCBNZW1vcnlJbnRBcnJheSBiYWNraW5nU3RvcmUgPSBnZXRCYWNraW5nU3RvcmVMb2NrZWQoa2V5LAogICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGVJZk5vdEV4aXN0PSAqLyBmYWxzZSk7CkBAIC0xMjYsNiArMTMxLDEwIEBACiAgICAgICogIHJldHVybmluZyB0aGUgcmVzdWx0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEdlbmVyYXRpb25EYXRhKEJ1bmRsZSBidW5kbGUsIGludCBrZXksIFN0cmluZyBpbmRleE1hcEtleSkgeworICAgICAgICBpZiAoU2V0dGluZ3NTdGF0ZS5pc0dsb2JhbFNldHRpbmdzS2V5KGtleSkpIHsKKyAgICAgICAgICAgIC8vIEdsb2JhbCBzZXR0aW5ncyBhcmUgc2hhcmVkIGFjcm9zcyB1c2Vycywgc28gaWdub3JlIHRoZSB1c2VySWQgaW4gdGhlIGtleQorICAgICAgICAgICAga2V5ID0gU2V0dGluZ3NTdGF0ZS5tYWtlS2V5KFNldHRpbmdzU3RhdGUuU0VUVElOR1NfVFlQRV9HTE9CQUwsIFVzZXJIYW5kbGUuVVNFUl9TWVNURU0pOworICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIGZpbmFsIE1lbW9yeUludEFycmF5IGJhY2tpbmdTdG9yZSA9IGdldEJhY2tpbmdTdG9yZUxvY2tlZChrZXksCiAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZUlmTm90RXhpc3Q9ICovIHRydWUpOwpAQCAtMTQwLDExICsxNDksOSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgaGF2aW5nIGVycm9yIGFjY2Vzc2luZyB0aGUgYmFja2luZyBzdG9yZQogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKFNldHRpbmdzLkNBTExfTUVUSE9EX1RSQUNLX0dFTkVSQVRJT05fS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlKTsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShTZXR0aW5ncy5DQUxMX01FVEhPRF9UUkFDS19HRU5FUkFUSU9OX0tFWSwgYmFja2luZ1N0b3JlKTsKICAgICAgICAgICAgICAgICBidW5kbGUucHV0SW50KFNldHRpbmdzLkNBTExfTUVUSE9EX0dFTkVSQVRJT05fSU5ERVhfS0VZLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgYnVuZGxlLnB1dEludChTZXR0aW5ncy5DQUxMX01FVEhPRF9HRU5FUkFUSU9OX0tFWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tpbmdTdG9yZS5nZXQoaW5kZXgpKTsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0SW50KFNldHRpbmdzLkNBTExfTUVUSE9EX0dFTkVSQVRJT05fS0VZLCBiYWNraW5nU3RvcmUuZ2V0KGluZGV4KSk7CiAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuaShMT0dfVEFHLCAiRXhwb3J0ZWQgaW5kZXg6IiArIGluZGV4ICsgIiBmb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGluZGV4TWFwS2V5LmlzRW1wdHkoKSA/ICJ1bnNldCBzZXR0aW5ncyIgOiAic2V0dGluZzoiICsgaW5kZXhNYXBLZXkpCkBAIC0xODksNyArMTk2LDkgQEAKICAgICAgICAgaWYgKGJhY2tpbmdTdG9yZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmIChtTnVtQmFja2luZ1N0b3JlID49IE5VTV9NQVhfQkFDS0lOR19TVE9SRSkgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkVycm9yIGNyZWF0aW5nIGJhY2tpbmcgc3RvcmUgLSBhdCBjYXBhY2l0eSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRXJyb3IgY3JlYXRpbmcgYmFja2luZyBzdG9yZSAtIGF0IGNhcGFjaXR5Iik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJhY2tpbmdTdG9yZSA9IG5ldyBNZW1vcnlJbnRBcnJheShNQVhfQkFDS0lOR19TVE9SRV9TSVpFKTsKQEAgLTI0OSw3ICsyNTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvbiB1c2VyOiIgKyBTZXR0aW5nc1N0YXRlLmdldFVzZXJJZEZyb21LZXkoa2V5KSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkNvdWxkIG5vdCBhbGxvY2F0ZSBnZW5lcmF0aW9uIGluZGV4Iik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiQ291bGQgbm90IGFsbG9jYXRlIGdlbmVyYXRpb24gaW5kZXgiKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGluZGV4OwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc1Byb3ZpZGVyLmphdmEKaW5kZXggZTY0MDhiZi4uNzYwNzkwOSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzUHJvdmlkZXIuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvU2V0dGluZ3NQcm92aWRlci5qYXZhCkBAIC0zNSw2ICszNSwxMyBAQAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlTaG9ydGN1dENvbnRyb2xsZXIuTUFHTklGSUNBVElPTl9DT05UUk9MTEVSX05BTUU7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmFjY2Vzc2liaWxpdHkudXRpbC5BY2Nlc3NpYmlsaXR5VXRpbHMuQUNDRVNTSUJJTElUWV9NRU5VX0lOX1NZU1RFTTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzLlNldHRpbmdzU3RhdGUuRkFMTEJBQ0tfRklMRV9TVUZGSVg7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy5TZXR0aW5nc1N0YXRlLmdldFR5cGVGcm9tS2V5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ3NTdGF0ZS5nZXRVc2VySWRGcm9tS2V5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ3NTdGF0ZS5pc0NvbmZpZ1NldHRpbmdzS2V5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ3NTdGF0ZS5pc0dsb2JhbFNldHRpbmdzS2V5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ3NTdGF0ZS5pc1NlY3VyZVNldHRpbmdzS2V5OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MuU2V0dGluZ3NTdGF0ZS5pc1NzYWlkU2V0dGluZ3NLZXk7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy5TZXR0aW5nc1N0YXRlLmlzU3lzdGVtU2V0dGluZ3NLZXk7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy5TZXR0aW5nc1N0YXRlLm1ha2VLZXk7CiAKIGltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwpAQCAtMzc2LDE0ICszODMsNiBAQAogICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKICAgICBwcml2YXRlIGJvb2xlYW4gbVN5bmNDb25maWdEaXNhYmxlZFVudGlsUmVib290OwogCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VHlwZUZyb21LZXkoaW50IGtleSkgewotICAgICAgICByZXR1cm4gU2V0dGluZ3NTdGF0ZS5nZXRUeXBlRnJvbUtleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFVzZXJJZEZyb21LZXkoaW50IGtleSkgewotICAgICAgICByZXR1cm4gU2V0dGluZ3NTdGF0ZS5nZXRVc2VySWRGcm9tS2V5KGtleSk7Ci0gICAgfQotCiAgICAgQENoYW5nZUlkCiAgICAgQEVuYWJsZWRTaW5jZSh0YXJnZXRTZGtWZXJzaW9uPWFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5TKQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRU5GT1JDRV9SRUFEX1BFUk1JU1NJT05fRk9SX01VTFRJX1NJTV9EQVRBX0NBTEwgPSAxNzI2NzA2NzlMOwpAQCAtMzYyMCwyNiArMzYxOSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNDb25maWdTZXR0aW5nc0tleShpbnQga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VHlwZUZyb21LZXkoa2V5KSA9PSBTRVRUSU5HU19UWVBFX0NPTkZJRzsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0dsb2JhbFNldHRpbmdzS2V5KGludCBrZXkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUeXBlRnJvbUtleShrZXkpID09IFNFVFRJTkdTX1RZUEVfR0xPQkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtU2V0dGluZ3NLZXkoaW50IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFR5cGVGcm9tS2V5KGtleSkgPT0gU0VUVElOR1NfVFlQRV9TWVNURU07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTZWN1cmVTZXR0aW5nc0tleShpbnQga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VHlwZUZyb21LZXkoa2V5KSA9PSBTRVRUSU5HU19UWVBFX1NFQ1VSRTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1NzYWlkU2V0dGluZ3NLZXkoaW50IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFR5cGVGcm9tS2V5KGtleSkgPT0gU0VUVElOR1NfVFlQRV9TU0FJRDsKLSAgICAgICAgfQotCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRCYW4oaW50IHR5cGUpIHsKICAgICAgICAgICAgIGlmIChTRVRUSU5HU19UWVBFX0NPTkZJRyAhPSB0eXBlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzU3RhdGUuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc1N0YXRlLmphdmEKaW5kZXggNGQ4NzA1Zi4uZTMxNTNlMCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzU3RhdGUuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvU2V0dGluZ3NTdGF0ZS5qYXZhCkBAIC0yNTUsNiArMjU1LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb25maWdTZXR0aW5nc0tleShpbnQga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlRnJvbUtleShrZXkpID09IFNFVFRJTkdTX1RZUEVfQ09ORklHOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dsb2JhbFNldHRpbmdzS2V5KGludCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGVGcm9tS2V5KGtleSkgPT0gU0VUVElOR1NfVFlQRV9HTE9CQUw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtU2V0dGluZ3NLZXkoaW50IGtleSkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZUZyb21LZXkoa2V5KSA9PSBTRVRUSU5HU19UWVBFX1NZU1RFTTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWN1cmVTZXR0aW5nc0tleShpbnQga2V5KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlRnJvbUtleShrZXkpID09IFNFVFRJTkdTX1RZUEVfU0VDVVJFOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NzYWlkU2V0dGluZ3NLZXkoaW50IGtleSkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZUZyb21LZXkoa2V5KSA9PSBTRVRUSU5HU19UWVBFX1NTQUlEOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGtleVRvU3RyaW5nKGludCBrZXkpIHsKICAgICAgICAgcmV0dXJuICJLZXlbdXNlcj0iICsgZ2V0VXNlcklkRnJvbUtleShrZXkpICsgIjt0eXBlPSIKICAgICAgICAgICAgICAgICArIHNldHRpbmdUeXBlVG9TdHJpbmcoZ2V0VHlwZUZyb21LZXkoa2V5KSkgKyAiXSI7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci90ZXN0L0FuZHJvaWRUZXN0LnhtbAppbmRleCA5ZDIzNTI2Li4wYmY1M2NjIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3QvQW5kcm9pZFRlc3QueG1sCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTE0LDYgKzE0LDEyIEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVuIFNldHRpbmdzIFByb3ZpZGVyIFRlc3RzLiI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5EZXZpY2VTZXR1cCI+CisgICAgICAgIDxvcHRpb24gbmFtZT0ic2V0LWdsb2JhbC1zZXR0aW5nIiBrZXk9InZlcmlmaWVyX3ZlcmlmeV9hZGJfaW5zdGFsbHMiIHZhbHVlPSIwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJlc3RvcmUtc2V0dGluZ3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImZvcmNlLXNraXAtc3lzdGVtLXByb3BzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKwogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGVzdEFwcEluc3RhbGxTZXR1cCI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJTZXR0aW5nc1Byb3ZpZGVyVGVzdC5hcGsiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3Qvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NCYWNrdXBUZXN0LmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3Qvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NCYWNrdXBUZXN0LmphdmEKaW5kZXggMjc4Y2ViOS4uMWYxNDcyMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci90ZXN0L3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzQmFja3VwVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvdGVzdC9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc0JhY2t1cFRlc3QuamF2YQpAQCAtMzcyLDcgKzM3Miw2IEBACiAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5ORVRQT0xJQ1lfUVVPVEFfRlJBQ19KT0JTLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTkVUUE9MSUNZX1FVT1RBX0ZSQUNfTVVMVElQQVRILAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTkVUUE9MSUNZX09WRVJSSURFX0VOQUJMRUQsCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLkdsb2JhbC5ORVRXT1JLX0FWT0lEX0JBRF9XSUZJLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5HbG9iYWwuTkVUV09SS19ERUZBVUxUX0RBSUxZX01VTFRJUEFUSF9RVU9UQV9CWVRFUywKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLk5FVFdPUktfTUVURVJFRF9NVUxUSVBBVEhfUFJFRkVSRU5DRSwKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLk5FVFdPUktfV0FUQ0hMSVNUX0xBU1RfUkVQT1JUX1RJTUUsCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3Qvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9HZW5lcmF0aW9uUmVnaXN0cnlUZXN0LmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Rlc3Qvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9HZW5lcmF0aW9uUmVnaXN0cnlUZXN0LmphdmEKaW5kZXggNmVjODE0Ni4uNTg2ZDZmNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci90ZXN0L3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvR2VuZXJhdGlvblJlZ2lzdHJ5VGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvdGVzdC9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0dlbmVyYXRpb25SZWdpc3RyeVRlc3QuamF2YQpAQCAtMTcwLDYgKzE3MCwyMyBAQAogICAgICAgICBjaGVja0J1bmRsZShiLCAxLCAyLCBmYWxzZSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2xvYmFsU2V0dGluZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBHZW5lcmF0aW9uUmVnaXN0cnkgZ2VuZXJhdGlvblJlZ2lzdHJ5ID0gbmV3IEdlbmVyYXRpb25SZWdpc3RyeShuZXcgT2JqZWN0KCkpOworICAgICAgICBmaW5hbCBpbnQgZ2xvYmFsS2V5ID0gU2V0dGluZ3NTdGF0ZS5tYWtlS2V5KFNldHRpbmdzU3RhdGUuU0VUVElOR1NfVFlQRV9HTE9CQUwsIDApOworICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdEdsb2JhbFNldHRpbmcgPSAidGVzdF9nbG9iYWxfc2V0dGluZyI7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBiID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBnZW5lcmF0aW9uUmVnaXN0cnkuYWRkR2VuZXJhdGlvbkRhdGEoYiwgZ2xvYmFsS2V5LCB0ZXN0R2xvYmFsU2V0dGluZyk7CisgICAgICAgIGNoZWNrQnVuZGxlKGIsIDAsIDEsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgTWVtb3J5SW50QXJyYXkgYXJyYXkgPSBnZXRBcnJheShiKTsKKyAgICAgICAgZmluYWwgaW50IGdsb2JhbEtleTIgPSBTZXR0aW5nc1N0YXRlLm1ha2VLZXkoU2V0dGluZ3NTdGF0ZS5TRVRUSU5HU19UWVBFX0dMT0JBTCwgMTApOworICAgICAgICBiLmNsZWFyKCk7CisgICAgICAgIGdlbmVyYXRpb25SZWdpc3RyeS5hZGRHZW5lcmF0aW9uRGF0YShiLCBnbG9iYWxLZXkyLCB0ZXN0R2xvYmFsU2V0dGluZyk7CisgICAgICAgIGNoZWNrQnVuZGxlKGIsIDAsIDEsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgTWVtb3J5SW50QXJyYXkgYXJyYXkyID0gZ2V0QXJyYXkoYik7CisgICAgICAgIC8vIENoZWNrIHRoYXQgdXNlcjEwIGFuZCB1c2VyMCB1c2UgdGhlIHNhbWUgYXJyYXkgdG8gc3RvcmUgZ2xvYmFsIHNldHRpbmdzJyBnZW5lcmF0aW9ucworICAgICAgICBhc3NlcnRUaGF0KGFycmF5KS5pc0VxdWFsVG8oYXJyYXkyKTsKKyAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tCdW5kbGUoQnVuZGxlIGIsIGludCBleHBlY3RlZEluZGV4LCBpbnQgZXhwZWN0ZWRHZW5lcmF0aW9uLCBib29sZWFuIGlzTnVsbCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCAxMTM2YzExLi40MjkwY2EwIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTkyNCw3ICs5MjQsNyBAQAogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaG93Rm9yQWxsVXNlcnM9InRydWUiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmZpbmlzaE9uVGFza0xhdW5jaD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlSW5zdGFuY2UiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9InNjcmVlblNpemV8c21hbGxlc3RTY3JlZW5TaXplfHNjcmVlbkxheW91dHxrZXlib2FyZHxrZXlib2FyZEhpZGRlbiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ic2NyZWVuTGF5b3V0fGtleWJvYXJkfGtleWJvYXJkSGlkZGVufG9yaWVudGF0aW9uIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmxlVG9JbnN0YW50QXBwcz0idHJ1ZSI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKQEAgLTk0Niw3ICs5NDYsNyBAQAogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaG93V2hlbkxvY2tlZD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hvd0ZvckFsbFVzZXJzPSJ0cnVlIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpmaW5pc2hPblRhc2tMYXVuY2g9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxvY2tUYXNrTW9kZT0iaWZfd2hpdGVsaXN0ZWQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxvY2tUYXNrTW9kZT0iYWx3YXlzIgogICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJzY3JlZW5TaXplfHNtYWxsZXN0U2NyZWVuU2l6ZXxzY3JlZW5MYXlvdXR8b3JpZW50YXRpb258a2V5Ym9hcmR8a2V5Ym9hcmRIaWRkZW4iCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2libGVUb0luc3RhbnRBcHBzPSJ0cnVlIj4KICAgICAgICAgPC9hY3Rpdml0eT4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eW1lbnUvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eW1lbnUvQWNjZXNzaWJpbGl0eU1lbnVTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9hY2Nlc3NpYmlsaXR5L2FjY2Vzc2liaWxpdHltZW51L3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hY2Nlc3NpYmlsaXR5L2FjY2Vzc2liaWxpdHltZW51L0FjY2Vzc2liaWxpdHlNZW51U2VydmljZS5qYXZhCmluZGV4IDhjYTY0ZDIuLjk2ZWE1YjQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eW1lbnUvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eW1lbnUvQWNjZXNzaWJpbGl0eU1lbnVTZXJ2aWNlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5bWVudS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5bWVudS9BY2Nlc3NpYmlsaXR5TWVudVNlcnZpY2UuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CkBAIC01Niw2ICs1Nyw4IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gQWNjZXNzaWJpbGl0eU1lbnVTZXJ2aWNlLmNsYXNzLmdldFBhY2thZ2VOYW1lKCk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URU5UX1RPR0dMRV9NRU5VID0gIi50b2dnbGVfbWVudSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URU5UX0hJREVfTUVOVSA9ICIuaGlkZV9tZW51IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFTlRfR0xPQkFMX0FDVElPTiA9ICIuZ2xvYmFsX2FjdGlvbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URU5UX0dMT0JBTF9BQ1RJT05fRVhUUkEgPSAiR0xPQkFMX0FDVElPTiI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkExMXlNZW51U2VydmljZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCVUZGRVJfTUlMTElTRUNPTkRTX1RPX1BSRVZFTlRfVVBEQVRFX0ZBSUxVUkUgPSAxMDBMOwpAQCAtMjMxLDYgKzIzNCwyMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGdsb2JhbCBhY3Rpb24gYW5kIGJyb2FkY2FzdHMgYW4gaW50ZW50IGluZGljYXRpbmcgdGhlIGFjdGlvbiB3YXMgcGVyZm9ybWVkLgorICAgICAqIFRoaXMgaXMgdW5uZWNlc3NhcnkgZm9yIGFueSBjdXJyZW50IGZ1bmN0aW9uYWxpdHksIGJ1dCBpcyB1c2VkIGZvciB0ZXN0aW5nLgorICAgICAqIFJlZmVyIHRvIHtAY29kZSBwZXJmb3JtR2xvYmFsQWN0aW9uKCl9LgorICAgICAqCisgICAgICogQHBhcmFtIGdsb2JhbEFjdGlvbiBHbG9iYWwgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBzdWNjZXNzZnVsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcGVyZm9ybUdsb2JhbEFjdGlvbkludGVybmFsKGludCBnbG9iYWxBY3Rpb24pIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoUEFDS0FHRV9OQU1FICsgSU5URU5UX0dMT0JBTF9BQ1RJT04pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoSU5URU5UX0dMT0JBTF9BQ1RJT05fRVhUUkEsIGdsb2JhbEFjdGlvbik7CisgICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAgICAgTG9nLmkoIkExMXlNZW51U2VydmljZSIsICJCcm9hZGNhc3RpbmcgZ2xvYmFsIGFjdGlvbiAiICsgZ2xvYmFsQWN0aW9uKTsKKyAgICAgICAgcmV0dXJuIHBlcmZvcm1HbG9iYWxBY3Rpb24oZ2xvYmFsQWN0aW9uKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBIYW5kbGVzIGNsaWNrIGV2ZW50cyBvZiBzaG9ydGN1dHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdmlldyB0aGUgc2hvcnRjdXQgYnV0dG9uIGJlaW5nIGNsaWNrZWQuCkBAIC0yNDksMTcgKzI2OCwxNyBAQAogICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9BQ0NFU1NJQklMSVRZX1NFVFRJTkdTKSwKICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9DTEVBUl9UQVNLKTsKICAgICAgICAgfSBlbHNlIGlmICh2aWV3VGFnID09IFNob3J0Y3V0SWQuSURfUE9XRVJfVkFMVUUub3JkaW5hbCgpKSB7Ci0gICAgICAgICAgICBwZXJmb3JtR2xvYmFsQWN0aW9uKEdMT0JBTF9BQ1RJT05fUE9XRVJfRElBTE9HKTsKKyAgICAgICAgICAgIHBlcmZvcm1HbG9iYWxBY3Rpb25JbnRlcm5hbChHTE9CQUxfQUNUSU9OX1BPV0VSX0RJQUxPRyk7CiAgICAgICAgIH0gZWxzZSBpZiAodmlld1RhZyA9PSBTaG9ydGN1dElkLklEX1JFQ0VOVF9WQUxVRS5vcmRpbmFsKCkpIHsKLSAgICAgICAgICAgIHBlcmZvcm1HbG9iYWxBY3Rpb24oR0xPQkFMX0FDVElPTl9SRUNFTlRTKTsKKyAgICAgICAgICAgIHBlcmZvcm1HbG9iYWxBY3Rpb25JbnRlcm5hbChHTE9CQUxfQUNUSU9OX1JFQ0VOVFMpOwogICAgICAgICB9IGVsc2UgaWYgKHZpZXdUYWcgPT0gU2hvcnRjdXRJZC5JRF9MT0NLU0NSRUVOX1ZBTFVFLm9yZGluYWwoKSkgewotICAgICAgICAgICAgcGVyZm9ybUdsb2JhbEFjdGlvbihHTE9CQUxfQUNUSU9OX0xPQ0tfU0NSRUVOKTsKKyAgICAgICAgICAgIHBlcmZvcm1HbG9iYWxBY3Rpb25JbnRlcm5hbChHTE9CQUxfQUNUSU9OX0xPQ0tfU0NSRUVOKTsKICAgICAgICAgfSBlbHNlIGlmICh2aWV3VGFnID09IFNob3J0Y3V0SWQuSURfUVVJQ0tTRVRUSU5HX1ZBTFVFLm9yZGluYWwoKSkgewotICAgICAgICAgICAgcGVyZm9ybUdsb2JhbEFjdGlvbihHTE9CQUxfQUNUSU9OX1FVSUNLX1NFVFRJTkdTKTsKKyAgICAgICAgICAgIHBlcmZvcm1HbG9iYWxBY3Rpb25JbnRlcm5hbChHTE9CQUxfQUNUSU9OX1FVSUNLX1NFVFRJTkdTKTsKICAgICAgICAgfSBlbHNlIGlmICh2aWV3VGFnID09IFNob3J0Y3V0SWQuSURfTk9USUZJQ0FUSU9OX1ZBTFVFLm9yZGluYWwoKSkgewotICAgICAgICAgICAgcGVyZm9ybUdsb2JhbEFjdGlvbihHTE9CQUxfQUNUSU9OX05PVElGSUNBVElPTlMpOworICAgICAgICAgICAgcGVyZm9ybUdsb2JhbEFjdGlvbkludGVybmFsKEdMT0JBTF9BQ1RJT05fTk9USUZJQ0FUSU9OUyk7CiAgICAgICAgIH0gZWxzZSBpZiAodmlld1RhZyA9PSBTaG9ydGN1dElkLklEX1NDUkVFTlNIT1RfVkFMVUUub3JkaW5hbCgpKSB7Ci0gICAgICAgICAgICBwZXJmb3JtR2xvYmFsQWN0aW9uKEdMT0JBTF9BQ1RJT05fVEFLRV9TQ1JFRU5TSE9UKTsKKyAgICAgICAgICAgIHBlcmZvcm1HbG9iYWxBY3Rpb25JbnRlcm5hbChHTE9CQUxfQUNUSU9OX1RBS0VfU0NSRUVOU0hPVCk7CiAgICAgICAgIH0gZWxzZSBpZiAodmlld1RhZyA9PSBTaG9ydGN1dElkLklEX0JSSUdIVE5FU1NfVVBfVkFMVUUub3JkaW5hbCgpKSB7CiAgICAgICAgICAgICBhZGp1c3RCcmlnaHRuZXNzKEJSSUdIVE5FU1NfVVBfSU5DUkVNRU5UX0dBTU1BKTsKICAgICAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eW1lbnUvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eW1lbnUvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA3YmU2Y2E3Li4yYmU5MjQ1IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9hY2Nlc3NpYmlsaXR5L2FjY2Vzc2liaWxpdHltZW51L3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5bWVudS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yOSw0ICsyOSwxNSBAQAogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLnN5c3RlbXVpLmFjY2Vzc2liaWxpdHkuYWNjZXNzaWJpbGl0eW1lbnUudGVzdHMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkFjY2Vzc2liaWxpdHlNZW51IFRlc3QgQ2FzZXMiPgogICAgIDwvaW5zdHJ1bWVudGF0aW9uPgorCisgICAgPHF1ZXJpZXM+CisgICAgICAgIDxpbnRlbnQ+CisgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVciIC8+CisgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5CUk9XU0FCTEUiIC8+CisgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnNjaGVtZT0iaHR0cHMiIC8+CisgICAgICAgIDwvaW50ZW50PgorICAgICAgICA8aW50ZW50PgorICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5WT0lDRV9DT01NQU5EIiAvPgorICAgICAgICA8L2ludGVudD4KKyAgICA8L3F1ZXJpZXM+CiA8L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eW1lbnUvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eW1lbnUvdGVzdHMvQWNjZXNzaWJpbGl0eU1lbnVTZXJ2aWNlVGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5bWVudS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5bWVudS90ZXN0cy9BY2Nlc3NpYmlsaXR5TWVudVNlcnZpY2VUZXN0LmphdmEKaW5kZXggNTI5YTcwYy4uMGU4OWRjZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5bWVudS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5bWVudS90ZXN0cy9BY2Nlc3NpYmlsaXR5TWVudVNlcnZpY2VUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5bWVudS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5bWVudS90ZXN0cy9BY2Nlc3NpYmlsaXR5TWVudVNlcnZpY2VUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDE1IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuYWNjZXNzaWJpbGl0eS5hY2Nlc3NpYmlsaXR5bWVudS50ZXN0czsKIAoraW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlLkdMT0JBTF9BQ1RJT05fTE9DS19TQ1JFRU47CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UuR0xPQkFMX0FDVElPTl9OT1RJRklDQVRJT05TOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlLkdMT0JBTF9BQ1RJT05fUE9XRVJfRElBTE9HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlLkdMT0JBTF9BQ1RJT05fUVVJQ0tfU0VUVElOR1M7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UuR0xPQkFMX0FDVElPTl9SRUNFTlRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlLkdMT0JBTF9BQ1RJT05fVEFLRV9TQ1JFRU5TSE9UOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN5c3RlbXVpLmFjY2Vzc2liaWxpdHkuYWNjZXNzaWJpbGl0eW1lbnUuQWNjZXNzaWJpbGl0eU1lbnVTZXJ2aWNlLklOVEVOVF9HTE9CQUxfQUNUSU9OOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zeXN0ZW11aS5hY2Nlc3NpYmlsaXR5LmFjY2Vzc2liaWxpdHltZW51LkFjY2Vzc2liaWxpdHlNZW51U2VydmljZS5JTlRFTlRfR0xPQkFMX0FDVElPTl9FWFRSQTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3lzdGVtdWkuYWNjZXNzaWJpbGl0eS5hY2Nlc3NpYmlsaXR5bWVudS5BY2Nlc3NpYmlsaXR5TWVudVNlcnZpY2UuSU5URU5UX0hJREVfTUVOVTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3lzdGVtdWkuYWNjZXNzaWJpbGl0eS5hY2Nlc3NpYmlsaXR5bWVudS5BY2Nlc3NpYmlsaXR5TWVudVNlcnZpY2UuSU5URU5UX1RPR0dMRV9NRU5VOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zeXN0ZW11aS5hY2Nlc3NpYmlsaXR5LmFjY2Vzc2liaWxpdHltZW51LkFjY2Vzc2liaWxpdHlNZW51U2VydmljZS5QQUNLQUdFX05BTUU7CkBAIC0yMywxMSArMzIsMTUgQEAKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuVWlBdXRvbWF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkJyaWdodG5lc3NJbmZvOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOwogCkBAIC0zNywyMiArNTAsMjkgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wYXRpYmlsaXR5LmNvbW1vbi51dGlsLlRlc3RVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5hY2Nlc3NpYmlsaXR5LmFjY2Vzc2liaWxpdHltZW51Lm1vZGVsLkExMXlNZW51U2hvcnRjdXQuU2hvcnRjdXRJZDsKIAoraW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NC5jbGFzcykKIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5TWVudVNlcnZpY2VUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkExMXlNZW51U2VydmljZVRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTElDS19JRCA9IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQ0xJQ0s7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9TRVJWSUNFX1NUQVRVU19DSEFOR0VfUyA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfVUlfQ0hBTkdFX1MgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX1VJX0NIQU5HRV9TID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX0dMT0JBTF9BQ1RJT04gPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfS0VZRVZFTlRfS0VZQ09ERV9CQUNLID0gImlucHV0IGtleWV2ZW50IEtFWUNPREVfQkFDSyI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBJbnN0cnVtZW50YXRpb24gc0luc3RydW1lbnRhdGlvbjsKICAgICBwcml2YXRlIHN0YXRpYyBVaUF1dG9tYXRpb24gc1VpQXV0b21hdGlvbjsKKyAgICBwcml2YXRlIHN0YXRpYyBBdG9taWNJbnRlZ2VyIHNMYXN0R2xvYmFsQWN0aW9uOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQWNjZXNzaWJpbGl0eU1hbmFnZXIgc0FjY2Vzc2liaWxpdHlNYW5hZ2VyOwogCkBAIC02Miw3ICs4Miw3IEBACiAgICAgICAgIHNJbnN0cnVtZW50YXRpb24gPSBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKTsKICAgICAgICAgc1VpQXV0b21hdGlvbiA9IHNJbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKAogICAgICAgICAgICAgICAgIFVpQXV0b21hdGlvbi5GTEFHX0RPTlRfU1VQUFJFU1NfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyk7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHNJbnN0cnVtZW50YXRpb24uZ2V0Q29udGV4dCgpOworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBzSW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKTsKICAgICAgICAgc0FjY2Vzc2liaWxpdHlNYW5hZ2VyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNsYXNzKTsKIAogICAgICAgICAvLyBEaXNhYmxlIGFsbCBhMTF5U2VydmljZXMgaWYgYW55IGFyZSBhY3RpdmUuCkBAIC04NSw2ICsxMDUsMTcgQEAKICAgICAgICAgICAgICAgICAoKSAtPiBzQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0RW5hYmxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19BTExfTUFTSykuc3RyZWFtKCkuZmlsdGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvIC0+IGluZm8uZ2V0SWQoKS5jb250YWlucyhzZXJ2aWNlTmFtZSkpLmNvdW50KCkgPT0gMSk7CisKKyAgICAgICAgc0xhc3RHbG9iYWxBY3Rpb24gPSBuZXcgQXRvbWljSW50ZWdlcihOT19HTE9CQUxfQUNUSU9OKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlY2VpdmVkIGdsb2JhbCBhY3Rpb24gaW50ZW50LiIpOworICAgICAgICAgICAgICAgIHNMYXN0R2xvYmFsQWN0aW9uLnNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRJbnRFeHRyYShJTlRFTlRfR0xPQkFMX0FDVElPTl9FWFRSQSwgTk9fR0xPQkFMX0FDVElPTikpOworICAgICAgICAgICAgfX0sCisgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihQQUNLQUdFX05BTUUgKyBJTlRFTlRfR0xPQkFMX0FDVElPTiksCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgQ29udGV4dC5SRUNFSVZFUl9FWFBPUlRFRCk7CiAgICAgfQogCiAgICAgQEFmdGVyQ2xhc3MKQEAgLTkzLDIzICsxMjQsMzkgQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTLCAiIik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWVudVZpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBzVWlBdXRvbWF0aW9uLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBzVWlBdXRvbWF0aW9uLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpLmdldFBhY2thZ2VOYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgUEFDS0FHRV9OQU1FKTsKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgb3Blbk1lbnUoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgb3Blbk1lbnUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaWYgKGlzTWVudVZpc2libGUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgY2xvc2VNZW51KCk7CisgICAgICAgIHNMYXN0R2xvYmFsQWN0aW9uLnNldChOT19HTE9CQUxfQUNUSU9OKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWVudVZpc2libGUoKSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyByb290ID0gc1VpQXV0b21hdGlvbi5nZXRSb290SW5BY3RpdmVXaW5kb3coKTsKKyAgICAgICAgcmV0dXJuIHJvb3QgIT0gbnVsbCAmJiByb290LmdldFBhY2thZ2VOYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoUEFDS0FHRV9OQU1FKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG9wZW5NZW51KCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFBBQ0tBR0VfTkFNRSArIElOVEVOVF9UT0dHTEVfTUVOVSk7CiAgICAgICAgIHNJbnN0cnVtZW50YXRpb24uZ2V0Q29udGV4dCgpLnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKwogICAgICAgICBUZXN0VXRpbHMud2FpdFVudGlsKCJUaW1lZCBvdXQgYmVmb3JlIG1lbnUgY291bGQgYXBwZWFyLiIsCi0gICAgICAgICAgICAgICAgVElNRU9VVF9VSV9DSEFOR0VfUywgKCkgLT4gaXNNZW51VmlzaWJsZSgpKTsKKyAgICAgICAgICAgICAgICBUSU1FT1VUX1VJX0NIQU5HRV9TLAorICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWVudVZpc2libGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzSW5zdHJ1bWVudGF0aW9uLmdldENvbnRleHQoKS5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgY2xvc2VNZW51KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZU1lbnUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgaWYgKCFpc01lbnVWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTE5LDExICsxNjYsMjEgQEAKICAgICAgICAgICAgICAgICBUSU1FT1VUX1VJX0NIQU5HRV9TLCAoKSAtPiAhaXNNZW51VmlzaWJsZSgpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBsaXN0IG9mIGFsbCBwcmVzZW50IHNob3J0Y3V0IGJ1dHRvbnMuCisgICAgICogQHJldHVybiBMaXN0IG9mIHNob3J0Y3V0IGJ1dHRvbnMuCisgICAgICovCiAgICAgcHJpdmF0ZSBMaXN0PEFjY2Vzc2liaWxpdHlOb2RlSW5mbz4gZ2V0R3JpZEJ1dHRvbkxpc3QoKSB7CiAgICAgICAgIHJldHVybiBzVWlBdXRvbWF0aW9uLmdldFJvb3RJbkFjdGl2ZVdpbmRvdygpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdJZChQQUNLQUdFX05BTUUgKyAiOmlkL3Nob3J0Y3V0SWNvbkJ0biIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGJ1dHRvbiB3aG9zZSB1bmlxdWVJRCBtYXRjaGVzIHRoZSBwcm92aWRlZCB0ZXh0LgorICAgICAqIEBwYXJhbSBidXR0b25zIExpc3Qgb2YgYnV0dG9ucy4KKyAgICAgKiBAcGFyYW0gdGV4dCBUZXh0IHRvIG1hdGNoIGJ1dHRvbidzIHVuaXF1ZUlEIHRvLgorICAgICAqIEByZXR1cm4gQnV0dG9uIHdob3NlIHVuaXF1ZUlEIG1hdGNoZXMgdGV4dCwge0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KKyAgICAgKi8KICAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaW5kR3JpZEJ1dHRvbkluZm8oCiAgICAgICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlOb2RlSW5mbz4gYnV0dG9ucywgU3RyaW5nIHRleHQpIHsKICAgICAgICAgZm9yIChBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gYnV0dG9uOiBidXR0b25zKSB7CkBAIC0xMzYsOCArMTkzLDYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFkanVzdEJyaWdodG5lc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgb3Blbk1lbnUoKTsKLQogICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBzSW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKTsKICAgICAgICAgRGlzcGxheU1hbmFnZXIgZGlzcGxheU1hbmFnZXIgPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCiAgICAgICAgICAgICAgICAgRGlzcGxheU1hbmFnZXIuY2xhc3MpOwpAQCAtMTQ5LDcgKzIwNCw2IEBACiAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBicmlnaHRuZXNzRG93bkJ1dHRvbiA9IGZpbmRHcmlkQnV0dG9uSW5mbyhidXR0b25zLAogICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKFNob3J0Y3V0SWQuSURfQlJJR0hUTkVTU19ET1dOX1ZBTFVFLm9yZGluYWwoKSkpOwogCi0gICAgICAgIGludCBjbGlja0lkID0gQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFjY2Vzc2liaWxpdHlBY3Rpb24uQUNUSU9OX0NMSUNLLmdldElkKCk7CiAgICAgICAgIEJyaWdodG5lc3NJbmZvIGJyaWdodG5lc3NJbmZvID0gZGlzcGxheU1hbmFnZXIuZ2V0RGlzcGxheSgKICAgICAgICAgICAgICAgICBjb250ZXh0LmdldERpc3BsYXlJZCgpKS5nZXRCcmlnaHRuZXNzSW5mbygpOwogCkBAIC0xNTksNyArMjEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgVElNRU9VVF9VSV9DSEFOR0VfUywKICAgICAgICAgICAgICAgICAgICAgKCkgLT4gZGlzcGxheU1hbmFnZXIuZ2V0QnJpZ2h0bmVzcyhjb250ZXh0LmdldERpc3BsYXlJZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IGJyaWdodG5lc3NJbmZvLmJyaWdodG5lc3NNaW5pbXVtKTsKLSAgICAgICAgICAgIGJyaWdodG5lc3NVcEJ1dHRvbi5wZXJmb3JtQWN0aW9uKGNsaWNrSWQpOworICAgICAgICAgICAgYnJpZ2h0bmVzc1VwQnV0dG9uLnBlcmZvcm1BY3Rpb24oQ0xJQ0tfSUQpOwogICAgICAgICAgICAgVGVzdFV0aWxzLndhaXRVbnRpbCgiRGlkIG5vdCBkZXRlY3QgYW4gaW5jcmVhc2UgaW4gYnJpZ2h0bmVzcy4iLAogICAgICAgICAgICAgICAgICAgICBUSU1FT1VUX1VJX0NIQU5HRV9TLAogICAgICAgICAgICAgICAgICAgICAoKSAtPiBkaXNwbGF5TWFuYWdlci5nZXRCcmlnaHRuZXNzKGNvbnRleHQuZ2V0RGlzcGxheUlkKCkpCkBAIC0xNzAsMTQgKzIyNCwxNTUgQEAKICAgICAgICAgICAgICAgICAgICAgVElNRU9VVF9VSV9DSEFOR0VfUywKICAgICAgICAgICAgICAgICAgICAgKCkgLT4gZGlzcGxheU1hbmFnZXIuZ2V0QnJpZ2h0bmVzcyhjb250ZXh0LmdldERpc3BsYXlJZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IGJyaWdodG5lc3NJbmZvLmJyaWdodG5lc3NNYXhpbXVtKTsKLSAgICAgICAgICAgIGJyaWdodG5lc3NEb3duQnV0dG9uLnBlcmZvcm1BY3Rpb24oY2xpY2tJZCk7CisgICAgICAgICAgICBicmlnaHRuZXNzRG93bkJ1dHRvbi5wZXJmb3JtQWN0aW9uKENMSUNLX0lEKTsKICAgICAgICAgICAgIFRlc3RVdGlscy53YWl0VW50aWwoIkRpZCBub3QgZGV0ZWN0IGEgZGVjcmVhc2UgaW4gYnJpZ2h0bmVzcy4iLAogICAgICAgICAgICAgICAgICAgICBUSU1FT1VUX1VJX0NIQU5HRV9TLAogICAgICAgICAgICAgICAgICAgICAoKSAtPiBkaXNwbGF5TWFuYWdlci5nZXRCcmlnaHRuZXNzKGNvbnRleHQuZ2V0RGlzcGxheUlkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBicmlnaHRuZXNzSW5mby5icmlnaHRuZXNzTWF4aW11bSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBkaXNwbGF5TWFuYWdlci5zZXRCcmlnaHRuZXNzKGNvbnRleHQuZ2V0RGlzcGxheUlkKCksIHJlc2V0QnJpZ2h0bmVzcyk7Ci0gICAgICAgICAgICBjbG9zZU1lbnUoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkanVzdFZvbHVtZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBzSW5zdHJ1bWVudGF0aW9uLmdldFRhcmdldENvbnRleHQoKTsKKyAgICAgICAgQXVkaW9NYW5hZ2VyIGF1ZGlvTWFuYWdlciA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShBdWRpb01hbmFnZXIuY2xhc3MpOworICAgICAgICBpbnQgcmVzZXRWb2x1bWUgPSBhdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOworCisgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBidXR0b25zID0gZ2V0R3JpZEJ1dHRvbkxpc3QoKTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHZvbHVtZVVwQnV0dG9uID0gZmluZEdyaWRCdXR0b25JbmZvKGJ1dHRvbnMsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoU2hvcnRjdXRJZC5JRF9WT0xVTUVfVVBfVkFMVUUub3JkaW5hbCgpKSk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyB2b2x1bWVEb3duQnV0dG9uID0gZmluZEdyaWRCdXR0b25JbmZvKGJ1dHRvbnMsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoU2hvcnRjdXRJZC5JRF9WT0xVTUVfRE9XTl9WQUxVRS5vcmRpbmFsKCkpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IG1pbiA9IGF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NaW5Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQyk7CisgICAgICAgICAgICBhdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIG1pbiwKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLkZMQUdfUkVNT1ZFX1NPVU5EX0FORF9WSUJSQVRFKTsKKyAgICAgICAgICAgIFRlc3RVdGlscy53YWl0VW50aWwoIkNvdWxkIG5vdCBjaGFuZ2UgYXVkaW8gc3RyZWFtIHRvIG1pbmltdW0gdm9sdW1lLiIsCisgICAgICAgICAgICAgICAgICAgIFRJTUVPVVRfVUlfQ0hBTkdFX1MsCisgICAgICAgICAgICAgICAgICAgICgpIC0+IGF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQykgPT0gbWluKTsKKyAgICAgICAgICAgIHZvbHVtZVVwQnV0dG9uLnBlcmZvcm1BY3Rpb24oQ0xJQ0tfSUQpOworICAgICAgICAgICAgVGVzdFV0aWxzLndhaXRVbnRpbCgiRGlkIG5vdCBkZXRlY3QgYW4gaW5jcmVhc2UgaW4gdm9sdW1lLiIsCisgICAgICAgICAgICAgICAgICAgIFRJTUVPVVRfVUlfQ0hBTkdFX1MsCisgICAgICAgICAgICAgICAgICAgICgpIC0+IGF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQykgPiBtaW4pOworCisgICAgICAgICAgICBpbnQgbWF4ID0gYXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKKyAgICAgICAgICAgIGF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgbWF4LAorICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuRkxBR19SRU1PVkVfU09VTkRfQU5EX1ZJQlJBVEUpOworICAgICAgICAgICAgVGVzdFV0aWxzLndhaXRVbnRpbCgiQ291bGQgbm90IGNoYW5nZSBhdWRpbyBzdHJlYW0gdG8gbWF4aW11bSB2b2x1bWUuIiwKKyAgICAgICAgICAgICAgICAgICAgVElNRU9VVF9VSV9DSEFOR0VfUywKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4gYXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKSA9PSBtYXgpOworICAgICAgICAgICAgdm9sdW1lRG93bkJ1dHRvbi5wZXJmb3JtQWN0aW9uKENMSUNLX0lEKTsKKyAgICAgICAgICAgIFRlc3RVdGlscy53YWl0VW50aWwoIkRpZCBub3QgZGV0ZWN0IGEgZGVjcmVhc2UgaW4gdm9sdW1lLiIsCisgICAgICAgICAgICAgICAgICAgIFRJTUVPVVRfVUlfQ0hBTkdFX1MsCisgICAgICAgICAgICAgICAgICAgICgpIC0+IGF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQykgPCBtYXgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLAorICAgICAgICAgICAgICAgICAgICByZXNldFZvbHVtZSwgQXVkaW9NYW5hZ2VyLkZMQUdfUkVNT1ZFX1NPVU5EX0FORF9WSUJSQVRFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzc2lzdGFudEJ1dHRvbl9vcGVuc1ZvaWNlQXNzaXN0YW50KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBhc3Npc3RhbnRCdXR0b24gPSBmaW5kR3JpZEJ1dHRvbkluZm8oZ2V0R3JpZEJ1dHRvbkxpc3QoKSwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihTaG9ydGN1dElkLklEX0FTU0lTVEFOVF9WQUxVRS5vcmRpbmFsKCkpKTsKKyAgICAgICAgSW50ZW50IGV4cGVjdGVkSW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZPSUNFX0NPTU1BTkQpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRQYWNrYWdlID0gZXhwZWN0ZWRJbnRlbnQucmVzb2x2ZUFjdGl2aXR5KAorICAgICAgICAgICAgICAgIHNJbnN0cnVtZW50YXRpb24uZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCkpLmdldFBhY2thZ2VOYW1lKCk7CisKKyAgICAgICAgc1VpQXV0b21hdGlvbi5leGVjdXRlQW5kV2FpdEZvckV2ZW50KAorICAgICAgICAgICAgICAgICgpIC0+IGFzc2lzdGFudEJ1dHRvbi5wZXJmb3JtQWN0aW9uKENMSUNLX0lEKSwKKyAgICAgICAgICAgICAgICAoZXZlbnQpIC0+IGV4cGVjdGVkUGFja2FnZS5jb250YWlucyhldmVudC5nZXRQYWNrYWdlTmFtZSgpKSwKKyAgICAgICAgICAgICAgICBUSU1FT1VUX1VJX0NIQU5HRV9TICogMTAwMAorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc2liaWxpdHlTZXR0aW5nc0J1dHRvbl9vcGVuc0FjY2Vzc2liaWxpdHlTZXR0aW5ncygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc2V0dGluZ3NCdXR0b24gPSBmaW5kR3JpZEJ1dHRvbkluZm8oZ2V0R3JpZEJ1dHRvbkxpc3QoKSwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihTaG9ydGN1dElkLklEX0ExMVlTRVRUSU5HX1ZBTFVFLm9yZGluYWwoKSkpOworICAgICAgICBJbnRlbnQgZXhwZWN0ZWRJbnRlbnQgPSBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9BQ0NFU1NJQklMSVRZX1NFVFRJTkdTKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkUGFja2FnZSA9IGV4cGVjdGVkSW50ZW50LnJlc29sdmVBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBzSW5zdHJ1bWVudGF0aW9uLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpKS5nZXRQYWNrYWdlTmFtZSgpOworCisgICAgICAgIHNVaUF1dG9tYXRpb24uZXhlY3V0ZUFuZFdhaXRGb3JFdmVudCgKKyAgICAgICAgICAgICAgICAoKSAtPiBzZXR0aW5nc0J1dHRvbi5wZXJmb3JtQWN0aW9uKENMSUNLX0lEKSwKKyAgICAgICAgICAgICAgICAoZXZlbnQpIC0+IGV4cGVjdGVkUGFja2FnZS5jb250YWlucyhldmVudC5nZXRQYWNrYWdlTmFtZSgpKSwKKyAgICAgICAgICAgICAgICBUSU1FT1VUX1VJX0NIQU5HRV9TICogMTAwMAorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvd2VyQnV0dG9uX3BlcmZvcm1zR2xvYmFsQWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b24gPSBmaW5kR3JpZEJ1dHRvbkluZm8oZ2V0R3JpZEJ1dHRvbkxpc3QoKSwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihTaG9ydGN1dElkLklEX1BPV0VSX1ZBTFVFLm9yZGluYWwoKSkpOworCisgICAgICAgIGJ1dHRvbi5wZXJmb3JtQWN0aW9uKENMSUNLX0lEKTsKKyAgICAgICAgVGVzdFV0aWxzLndhaXRVbnRpbCgiRGlkIG5vdCBkZXRlY3QgUG93ZXIgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZC4iLAorICAgICAgICAgICAgICAgIFRJTUVPVVRfVUlfQ0hBTkdFX1MsCisgICAgICAgICAgICAgICAgKCkgLT4gc0xhc3RHbG9iYWxBY3Rpb24uY29tcGFyZUFuZFNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9BQ1RJT05fUE9XRVJfRElBTE9HLCBOT19HTE9CQUxfQUNUSU9OKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZW50QnV0dG9uX3BlcmZvcm1zR2xvYmFsQWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b24gPSBmaW5kR3JpZEJ1dHRvbkluZm8oZ2V0R3JpZEJ1dHRvbkxpc3QoKSwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihTaG9ydGN1dElkLklEX1JFQ0VOVF9WQUxVRS5vcmRpbmFsKCkpKTsKKworICAgICAgICBidXR0b24ucGVyZm9ybUFjdGlvbihDTElDS19JRCk7CisgICAgICAgIFRlc3RVdGlscy53YWl0VW50aWwoIkRpZCBub3QgZGV0ZWN0IFJlY2VudHMgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZC4iLAorICAgICAgICAgICAgICAgIFRJTUVPVVRfVUlfQ0hBTkdFX1MsCisgICAgICAgICAgICAgICAgKCkgLT4gc0xhc3RHbG9iYWxBY3Rpb24uY29tcGFyZUFuZFNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9BQ1RJT05fUkVDRU5UUywgTk9fR0xPQkFMX0FDVElPTikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2tCdXR0b25fcGVyZm9ybXNHbG9iYWxBY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbiA9IGZpbmRHcmlkQnV0dG9uSW5mbyhnZXRHcmlkQnV0dG9uTGlzdCgpLAorICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKFNob3J0Y3V0SWQuSURfTE9DS1NDUkVFTl9WQUxVRS5vcmRpbmFsKCkpKTsKKworICAgICAgICBidXR0b24ucGVyZm9ybUFjdGlvbihDTElDS19JRCk7CisgICAgICAgIFRlc3RVdGlscy53YWl0VW50aWwoIkRpZCBub3QgZGV0ZWN0IExvY2sgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZC4iLAorICAgICAgICAgICAgICAgIFRJTUVPVVRfVUlfQ0hBTkdFX1MsCisgICAgICAgICAgICAgICAgKCkgLT4gc0xhc3RHbG9iYWxBY3Rpb24uY29tcGFyZUFuZFNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9BQ1RJT05fTE9DS19TQ1JFRU4sIE5PX0dMT0JBTF9BQ1RJT04pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWlja1NldHRpbmdzQnV0dG9uX3BlcmZvcm1zR2xvYmFsQWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b24gPSBmaW5kR3JpZEJ1dHRvbkluZm8oZ2V0R3JpZEJ1dHRvbkxpc3QoKSwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihTaG9ydGN1dElkLklEX1FVSUNLU0VUVElOR19WQUxVRS5vcmRpbmFsKCkpKTsKKworICAgICAgICBidXR0b24ucGVyZm9ybUFjdGlvbihDTElDS19JRCk7CisgICAgICAgIFRlc3RVdGlscy53YWl0VW50aWwoIkRpZCBub3QgZGV0ZWN0IFF1aWNrIFNldHRpbmdzIGFjdGlvbiBiZWluZyBwZXJmb3JtZWQuIiwKKyAgICAgICAgICAgICAgICBUSU1FT1VUX1VJX0NIQU5HRV9TLAorICAgICAgICAgICAgICAgICgpIC0+IHNMYXN0R2xvYmFsQWN0aW9uLmNvbXBhcmVBbmRTZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQUNUSU9OX1FVSUNLX1NFVFRJTkdTLCBOT19HTE9CQUxfQUNUSU9OKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aWZpY2F0aW9uc0J1dHRvbl9wZXJmb3Jtc0dsb2JhbEFjdGlvbigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gYnV0dG9uID0gZmluZEdyaWRCdXR0b25JbmZvKGdldEdyaWRCdXR0b25MaXN0KCksCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoU2hvcnRjdXRJZC5JRF9OT1RJRklDQVRJT05fVkFMVUUub3JkaW5hbCgpKSk7CisKKyAgICAgICAgYnV0dG9uLnBlcmZvcm1BY3Rpb24oQ0xJQ0tfSUQpOworICAgICAgICBUZXN0VXRpbHMud2FpdFVudGlsKCJEaWQgbm90IGRldGVjdCBOb3RpZmljYXRpb25zIGFjdGlvbiBiZWluZyBwZXJmb3JtZWQuIiwKKyAgICAgICAgICAgICAgICBUSU1FT1VUX1VJX0NIQU5HRV9TLAorICAgICAgICAgICAgICAgICgpIC0+IHNMYXN0R2xvYmFsQWN0aW9uLmNvbXBhcmVBbmRTZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQUNUSU9OX05PVElGSUNBVElPTlMsIE5PX0dMT0JBTF9BQ1RJT04pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JlZW5zaG90QnV0dG9uX3BlcmZvcm1zR2xvYmFsQWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b24gPSBmaW5kR3JpZEJ1dHRvbkluZm8oZ2V0R3JpZEJ1dHRvbkxpc3QoKSwKKyAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihTaG9ydGN1dElkLklEX1NDUkVFTlNIT1RfVkFMVUUub3JkaW5hbCgpKSk7CisKKyAgICAgICAgYnV0dG9uLnBlcmZvcm1BY3Rpb24oQ0xJQ0tfSUQpOworICAgICAgICBUZXN0VXRpbHMud2FpdFVudGlsKCJEaWQgbm90IGRldGVjdCBTY3JlZW5zaG90IGFjdGlvbiBiZWluZyBwZXJmb3JtZWQuIiwKKyAgICAgICAgICAgICAgICBUSU1FT1VUX1VJX0NIQU5HRV9TLAorICAgICAgICAgICAgICAgICgpIC0+IHNMYXN0R2xvYmFsQWN0aW9uLmNvbXBhcmVBbmRTZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQUNUSU9OX1RBS0VfU0NSRUVOU0hPVCwgTk9fR0xPQkFMX0FDVElPTikpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2FuaW1hdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL0ZvbnRWYXJpYXRpb25VdGlscy5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2FuaW1hdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL0ZvbnRWYXJpYXRpb25VdGlscy5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFlNGFmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vRm9udFZhcmlhdGlvblV0aWxzLmt0CkBAIC0wLDAgKzEsNTkgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuYW5pbWF0aW9uCisKK3ByaXZhdGUgY29uc3QgdmFsIFRBR19XR0hUID0gIndnaHQiCitwcml2YXRlIGNvbnN0IHZhbCBUQUdfV0RUSCA9ICJ3ZHRoIgorcHJpdmF0ZSBjb25zdCB2YWwgVEFHX09QU1ogPSAib3BzeiIKK3ByaXZhdGUgY29uc3QgdmFsIFRBR19ST05EID0gIlJPTkQiCisKK2NsYXNzIEZvbnRWYXJpYXRpb25VdGlscyB7CisgICAgcHJpdmF0ZSB2YXIgbVdlaWdodCA9IC0xCisgICAgcHJpdmF0ZSB2YXIgbVdpZHRoID0gLTEKKyAgICBwcml2YXRlIHZhciBtT3B0aWNhbFNpemUgPSAtMQorICAgIHByaXZhdGUgdmFyIG1Sb3VuZG5lc3MgPSAtMQorICAgIHByaXZhdGUgdmFyIGlzVXBkYXRlZCA9IGZhbHNlCisKKyAgICAvKgorICAgICAqIGdlbmVyYXRlIGZvbnRWYXJpYXRpb25TZXR0aW5ncyBzdHJpbmcsIHVzZWQgZm9yIGtleSBpbiB0eXBlZmFjZUNhY2hlIGluIFRleHRBbmltYXRvcgorICAgICAqIHRoZSBvcmRlciBvZiBheGVzIHNob3VsZCBhbGlnbiB0byB0aGUgb3JkZXIgb2YgcGFyYW1ldGVycworICAgICAqIGlmIGV2ZXJ5IGF4aXMgcmVtYWlucyB1bmNoYW5nZWQsIHJldHVybiAiIgorICAgICAqLworICAgIGZ1biB1cGRhdGVGb250VmFyaWF0aW9uKAorICAgICAgICB3ZWlnaHQ6IEludCA9IC0xLAorICAgICAgICB3aWR0aDogSW50ID0gLTEsCisgICAgICAgIG9wdGljYWxTaXplOiBJbnQgPSAtMSwKKyAgICAgICAgcm91bmRuZXNzOiBJbnQgPSAtMQorICAgICk6IFN0cmluZyB7CisgICAgICAgIGlzVXBkYXRlZCA9IGZhbHNlCisgICAgICAgIGlmICh3ZWlnaHQgPj0gMCAmJiBtV2VpZ2h0ICE9IHdlaWdodCkgeworICAgICAgICAgICAgaXNVcGRhdGVkID0gdHJ1ZQorICAgICAgICAgICAgbVdlaWdodCA9IHdlaWdodAorICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCA+PSAwICYmIG1XaWR0aCAhPSB3aWR0aCkgeworICAgICAgICAgICAgaXNVcGRhdGVkID0gdHJ1ZQorICAgICAgICAgICAgbVdpZHRoID0gd2lkdGgKKyAgICAgICAgfQorICAgICAgICBpZiAob3B0aWNhbFNpemUgPj0gMCAmJiBtT3B0aWNhbFNpemUgIT0gb3B0aWNhbFNpemUpIHsKKyAgICAgICAgICAgIGlzVXBkYXRlZCA9IHRydWUKKyAgICAgICAgICAgIG1PcHRpY2FsU2l6ZSA9IG9wdGljYWxTaXplCisgICAgICAgIH0KKworICAgICAgICBpZiAocm91bmRuZXNzID49IDAgJiYgbVJvdW5kbmVzcyAhPSByb3VuZG5lc3MpIHsKKyAgICAgICAgICAgIGlzVXBkYXRlZCA9IHRydWUKKyAgICAgICAgICAgIG1Sb3VuZG5lc3MgPSByb3VuZG5lc3MKKyAgICAgICAgfQorICAgICAgICB2YXIgcmVzdWx0U3RyaW5nID0gIiIKKyAgICAgICAgaWYgKG1XZWlnaHQgPj0gMCkgeworICAgICAgICAgICAgcmVzdWx0U3RyaW5nICs9ICInJFRBR19XR0hUJyAkbVdlaWdodCIKKyAgICAgICAgfQorICAgICAgICBpZiAobVdpZHRoID49IDApIHsKKyAgICAgICAgICAgIHJlc3VsdFN0cmluZyArPSAoaWYgKHJlc3VsdFN0cmluZy5pc0JsYW5rKCkpICIiIGVsc2UgIiwgIikgKyAiJyRUQUdfV0RUSCcgJG1XaWR0aCIKKyAgICAgICAgfQorICAgICAgICBpZiAobU9wdGljYWxTaXplID49IDApIHsKKyAgICAgICAgICAgIHJlc3VsdFN0cmluZyArPSAoaWYgKHJlc3VsdFN0cmluZy5pc0JsYW5rKCkpICIiIGVsc2UgIiwgIikgKyAiJyRUQUdfT1BTWicgJG1PcHRpY2FsU2l6ZSIKKyAgICAgICAgfQorICAgICAgICBpZiAobVJvdW5kbmVzcyA+PSAwKSB7CisgICAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gKGlmIChyZXN1bHRTdHJpbmcuaXNCbGFuaygpKSAiIiBlbHNlICIsICIpICsgIickVEFHX1JPTkQnICRtUm91bmRuZXNzIgorICAgICAgICB9CisgICAgICAgIHJldHVybiBpZiAoaXNVcGRhdGVkKSByZXN1bHRTdHJpbmcgZWxzZSAiIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2FuaW1hdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL1JlbW90ZVRyYW5zaXRpb25BZGFwdGVyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vUmVtb3RlVHJhbnNpdGlvbkFkYXB0ZXIua3QKaW5kZXggNjk0NmU2Yi4uMDNlMWU2NiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vUmVtb3RlVHJhbnNpdGlvbkFkYXB0ZXIua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vUmVtb3RlVHJhbnNpdGlvbkFkYXB0ZXIua3QKQEAgLTU5LDEyICs1OSwxNCBAQAogICAgICAgICAgICAgLy8gY2hhbmdlcyBzaG91bGQgYmUgb3JkZXJlZCB0b3AtdG8tYm90dG9tIGluIHoKICAgICAgICAgICAgIHZhbCBtb2RlID0gY2hhbmdlLm1vZGUKIAorICAgICAgICAgICAgdmFyIHJvb3RJZHggPSBpbmZvLmZpbmRSb290SW5kZXgoY2hhbmdlLmVuZERpc3BsYXlJZCkKKyAgICAgICAgICAgIGlmIChyb290SWR4IDwgMCkgcm9vdElkeCA9IDAKICAgICAgICAgICAgIC8vIExhdW5jaGVyIGFuaW1hdGVzIGxlYWYgdGFza3MgZGlyZWN0bHksIHNvIGFsd2F5cyByZXBhcmVudCBhbGwgdGFzayBsZWFzaGVzIHRvIHJvb3QuCi0gICAgICAgICAgICB0LnJlcGFyZW50KGxlYXNoLCBpbmZvLnJvb3RMZWFzaCkKKyAgICAgICAgICAgIHQucmVwYXJlbnQobGVhc2gsIGluZm8uZ2V0Um9vdChyb290SWR4KS5sZWFzaCkKICAgICAgICAgICAgIHQuc2V0UG9zaXRpb24oCiAgICAgICAgICAgICAgICAgbGVhc2gsCi0gICAgICAgICAgICAgICAgKGNoYW5nZS5zdGFydEFic0JvdW5kcy5sZWZ0IC0gaW5mby5yb290T2Zmc2V0LngpLnRvRmxvYXQoKSwKLSAgICAgICAgICAgICAgICAoY2hhbmdlLnN0YXJ0QWJzQm91bmRzLnRvcCAtIGluZm8ucm9vdE9mZnNldC55KS50b0Zsb2F0KCkKKyAgICAgICAgICAgICAgICAoY2hhbmdlLnN0YXJ0QWJzQm91bmRzLmxlZnQgLSBpbmZvLmdldFJvb3Qocm9vdElkeCkub2Zmc2V0LngpLnRvRmxvYXQoKSwKKyAgICAgICAgICAgICAgICAoY2hhbmdlLnN0YXJ0QWJzQm91bmRzLnRvcCAtIGluZm8uZ2V0Um9vdChyb290SWR4KS5vZmZzZXQueSkudG9GbG9hdCgpCiAgICAgICAgICAgICApCiAgICAgICAgICAgICB0LnNob3cobGVhc2gpCiAgICAgICAgICAgICAvLyBQdXQgYWxsIHRoZSBPUEVOL1NIT1cgb24gdG9wCkBAIC0xMTQsOCArMTE2LDExIEBACiAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKGNoYW5nZS5sZWFzaC50b1N0cmluZygpICsgIl90cmFuc2l0aW9uLWxlYXNoIikKICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRhaW5lckxheWVyKCkKICAgICAgICAgICAgICAgICAgICAgLnNldFBhcmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UucGFyZW50ID09IG51bGwpIGluZm8ucm9vdExlYXNoCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGluZm8uZ2V0Q2hhbmdlKGNoYW5nZS5wYXJlbnQhISkhIS5sZWFzaAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5wYXJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb290SWR4ID0gaW5mby5maW5kUm9vdEluZGV4KGNoYW5nZS5lbmREaXNwbGF5SWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3RJZHggPCAwKSByb290SWR4ID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0Um9vdChyb290SWR4KS5sZWFzaAorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGluZm8uZ2V0Q2hhbmdlKGNoYW5nZS5wYXJlbnQhISkhIS5sZWFzaAogICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCiAgICAgICAgICAgICAvLyBDb3BpZWQgVHJhbnNpdGlvbnMgc2V0dXAgY29kZSAod2hpY2ggZXhwZWN0cyBib3R0b20tdG8tdG9wIG9yZGVyLCBzbyB3ZSBzd2FwIGhlcmUpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9hbmltYXRpb24vc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FuaW1hdGlvbi9UZXh0QW5pbWF0b3Iua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9hbmltYXRpb24vc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FuaW1hdGlvbi9UZXh0QW5pbWF0b3Iua3QKaW5kZXggN2ZlOTRkMy4uOWU5OTI5ZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vVGV4dEFuaW1hdG9yLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL2FuaW1hdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL1RleHRBbmltYXRvci5rdApAQCAtMjMsMTEgKzIzLDggQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmZvbnRzLkZvbnQKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmZvbnRzLkZvbnRWYXJpYXRpb25BeGlzCiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dAotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheQogCi1wcml2YXRlIGNvbnN0IHZhbCBUQUdfV0dIVCA9ICJ3Z2h0IgogcHJpdmF0ZSBjb25zdCB2YWwgREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT046IExvbmcgPSAzMDAKIAogdHlwZWFsaWFzIEdseXBoQ2FsbGJhY2sgPSAoVGV4dEFuaW1hdG9yLlBvc2l0aW9uZWRHbHlwaCwgRmxvYXQpIC0+IFVuaXQKQEAgLTUxLDcgKzQ4LDcgQEAKICAqCiAgKiAgICAgICAgIC8vIENoYW5nZSB0aGUgdGV4dCBzaXplIHdpdGggYW5pbWF0aW9uLgogICogICAgICAgICBmdW4gc2V0VGV4dFNpemUoc2l6ZVB4OiBGbG9hdCwgYW5pbWF0ZTogQm9vbGVhbikgewotICogICAgICAgICAgICAgYW5pbWF0b3Iuc2V0VGV4dFN0eWxlKC0xIC8qIHVuY2hhbmdlZCB3ZWlnaHQgKi8sIHNpemVQeCwgYW5pbWF0ZSkKKyAqICAgICAgICAgICAgIGFuaW1hdG9yLnNldFRleHRTdHlsZSgiIiAvKiB1bmNoYW5nZWQgZnZhci4uLiAqLywgc2l6ZVB4LCBhbmltYXRlKQogICogICAgICAgICB9CiAgKiAgICAgfQogICogYGBgCkBAIC0xMTUsNyArMTEyLDkgQEAKICAgICAgICAgICAgIHByb3RlY3RlZCBzZXQKICAgICB9CiAKLSAgICBwcml2YXRlIHZhbCB0eXBlZmFjZUNhY2hlID0gU3BhcnNlQXJyYXk8VHlwZWZhY2U/PigpCisgICAgcHJpdmF0ZSB2YWwgZm9udFZhcmlhdGlvblV0aWxzID0gRm9udFZhcmlhdGlvblV0aWxzKCkKKworICAgIHByaXZhdGUgdmFsIHR5cGVmYWNlQ2FjaGUgPSBIYXNoTWFwPFN0cmluZywgVHlwZWZhY2U/PigpCiAKICAgICBmdW4gdXBkYXRlTGF5b3V0KGxheW91dDogTGF5b3V0KSB7CiAgICAgICAgIHRleHRJbnRlcnBvbGF0b3IubGF5b3V0ID0gbGF5b3V0CkBAIC0xODYsNyArMTg1LDcgQEAKICAgICAgKiBCdSBwYXNzaW5nIC0xIHRvIGR1cmF0aW9uLCB0aGUgZGVmYXVsdCB0ZXh0IGFuaW1hdGlvbiwgMTAwMG1zLCBpcyB1c2VkLgogICAgICAqIEJ5IHBhc3NpbmcgZmFsc2UgdG8gYW5pbWF0ZSwgdGhlIHRleHQgd2lsbCBiZSB1cGRhdGVkIHdpdGhvdXQgYW5pbWF0aW9uLgogICAgICAqCi0gICAgICogQHBhcmFtIHdlaWdodCBhbiBvcHRpb25hbCB0ZXh0IHdlaWdodC4KKyAgICAgKiBAcGFyYW0gZnZhciBhbiBvcHRpb25hbCB0ZXh0IGZvbnRWYXJpYXRpb25TZXR0aW5ncy4KICAgICAgKiBAcGFyYW0gdGV4dFNpemUgYW4gb3B0aW9uYWwgZm9udCBzaXplLgogICAgICAqIEBwYXJhbSBjb2xvcnMgYW4gb3B0aW9uYWwgY29sb3JzIGFycmF5IHRoYXQgbXVzdCBiZSB0aGUgc2FtZSBzaXplIGFzIG51bUxpbmVzIHBhc3NlZCB0bwogICAgICAqICAgICAgICAgICAgICAgdGhlIFRleHRJbnRlcnBvbGF0b3IKQEAgLTE5OSw3ICsxOTgsNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB1c2VkLiBUaGlzIGlzIGlnbm9yZWQgaWYgYW5pbWF0ZSBpcyBmYWxzZS4KICAgICAgKi8KICAgICBmdW4gc2V0VGV4dFN0eWxlKAotICAgICAgICB3ZWlnaHQ6IEludCA9IC0xLAorICAgICAgICBmdmFyOiBTdHJpbmc/ID0gIiIsCiAgICAgICAgIHRleHRTaXplOiBGbG9hdCA9IC0xZiwKICAgICAgICAgY29sb3I6IEludD8gPSBudWxsLAogICAgICAgICBzdHJva2VXaWR0aDogRmxvYXQgPSAtMWYsCkBAIC0yMTcsNDIgKzIxNiwxNiBAQAogICAgICAgICBpZiAodGV4dFNpemUgPj0gMCkgewogICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC50ZXh0U2l6ZSA9IHRleHRTaXplCiAgICAgICAgIH0KLSAgICAgICAgaWYgKHdlaWdodCA+PSAwKSB7Ci0gICAgICAgICAgICB2YWwgZm9udFZhcmlhdGlvbkFycmF5ID0KLSAgICAgICAgICAgICAgICAgICAgRm9udFZhcmlhdGlvbkF4aXMuZnJvbUZvbnRWYXJpYXRpb25TZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnRlcnBvbGF0b3IudGFyZ2V0UGFpbnQuZm9udFZhcmlhdGlvblNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIGlmIChmb250VmFyaWF0aW9uQXJyYXkuaXNOdWxsT3JFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC50eXBlZmFjZSA9Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVmYWNlQ2FjaGUuZ2V0T3JFbHNlKHdlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC5mb250VmFyaWF0aW9uU2V0dGluZ3MgPSAiJyRUQUdfV0dIVCcgJHdlaWdodCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnRlcnBvbGF0b3IudGFyZ2V0UGFpbnQudHlwZWZhY2UKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2YWwgaWR4ID0gZm9udFZhcmlhdGlvbkFycmF5LmluZGV4T2ZGaXJzdCB7IGl0LnRhZyA9PSAiJFRBR19XR0hUIiB9Ci0gICAgICAgICAgICAgICAgaWYgKGlkeCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICB2YWwgdXBkYXRlZEZvbnRWYXJpYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC5mb250VmFyaWF0aW9uU2V0dGluZ3MgKyAiLCckVEFHX1dHSFQnICR3ZWlnaHQiCi0gICAgICAgICAgICAgICAgICAgIHRleHRJbnRlcnBvbGF0b3IudGFyZ2V0UGFpbnQudHlwZWZhY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWZhY2VDYWNoZS5nZXRPckVsc2Uod2VpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC5mb250VmFyaWF0aW9uU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEZvbnRWYXJpYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LnR5cGVmYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9udFZhcmlhdGlvbkFycmF5W2lkeF0gPSBGb250VmFyaWF0aW9uQXhpcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJFRBR19XR0hUIiwgd2VpZ2h0LnRvRmxvYXQoKSkKLSAgICAgICAgICAgICAgICAgICAgdmFsIHVwZGF0ZWRGb250VmFyaWF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250VmFyaWF0aW9uQXhpcy50b0ZvbnRWYXJpYXRpb25TZXR0aW5ncyhmb250VmFyaWF0aW9uQXJyYXkpCi0gICAgICAgICAgICAgICAgICAgIHRleHRJbnRlcnBvbGF0b3IudGFyZ2V0UGFpbnQudHlwZWZhY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWZhY2VDYWNoZS5nZXRPckVsc2Uod2VpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC5mb250VmFyaWF0aW9uU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEZvbnRWYXJpYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LnR5cGVmYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmdmFyLmlzTnVsbE9yQmxhbmsoKSkgeworICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC50eXBlZmFjZSA9CisgICAgICAgICAgICAgICAgdHlwZWZhY2VDYWNoZS5nZXRPckVsc2UoZnZhcikgeworICAgICAgICAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LmZvbnRWYXJpYXRpb25TZXR0aW5ncyA9IGZ2YXIKKyAgICAgICAgICAgICAgICAgICAgdHlwZWZhY2VDYWNoZS5wdXQoZnZhciwgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC50eXBlZmFjZSkKKyAgICAgICAgICAgICAgICAgICAgdGV4dEludGVycG9sYXRvci50YXJnZXRQYWludC50eXBlZmFjZQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIGlmIChjb2xvciAhPSBudWxsKSB7CiAgICAgICAgICAgICB0ZXh0SW50ZXJwb2xhdG9yLnRhcmdldFBhaW50LmNvbG9yID0gY29sb3IKICAgICAgICAgfQpAQCAtMjkxLDEzICsyNjQsNTYgQEAKICAgICAgICAgICAgIGludmFsaWRhdGVDYWxsYmFjaygpCiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGV4dCBzdHlsZSB3aXRoIGFuaW1hdGlvbi4gU2ltaWxhciBhcworICAgICAqIGZ1biBzZXRUZXh0U3R5bGUoCisgICAgICogICAgICBmdmFyOiBTdHJpbmc/ID0gIiIsCisgICAgICogICAgICB0ZXh0U2l6ZTogRmxvYXQgPSAtMWYsCisgICAgICogICAgICBjb2xvcjogSW50PyA9IG51bGwsCisgICAgICogICAgICBzdHJva2VXaWR0aDogRmxvYXQgPSAtMWYsCisgICAgICogICAgICBhbmltYXRlOiBCb29sZWFuID0gdHJ1ZSwKKyAgICAgKiAgICAgIGR1cmF0aW9uOiBMb25nID0gLTFMLAorICAgICAqICAgICAgaW50ZXJwb2xhdG9yOiBUaW1lSW50ZXJwb2xhdG9yPyA9IG51bGwsCisgICAgICogICAgICBkZWxheTogTG9uZyA9IDAsCisgICAgICogICAgICBvbkFuaW1hdGlvbkVuZDogUnVubmFibGU/ID0gbnVsbAorICAgICAqICkKKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWlnaHQgYW4gb3B0aW9uYWwgc3R5bGUgdmFsdWUgZm9yIGB3Z2h0YCBpbiBmb250VmFyaWF0aW9uU2V0dGluZ3MuCisgICAgICogQHBhcmFtIHdpZHRoIGFuIG9wdGlvbmFsIHN0eWxlIHZhbHVlIGZvciBgd2R0aGAgaW4gZm9udFZhcmlhdGlvblNldHRpbmdzLgorICAgICAqIEBwYXJhbSBvcHRpY2FsU2l6ZSBhbiBvcHRpb25hbCBzdHlsZSB2YWx1ZSBmb3IgYG9wc3pgIGluIGZvbnRWYXJpYXRpb25TZXR0aW5ncy4KKyAgICAgKiBAcGFyYW0gcm91bmRuZXNzIGFuIG9wdGlvbmFsIHN0eWxlIHZhbHVlIGZvciBgUk9ORGAgaW4gZm9udFZhcmlhdGlvblNldHRpbmdzLgorICAgICAqLworICAgIGZ1biBzZXRUZXh0U3R5bGUoCisgICAgICAgIHdlaWdodDogSW50ID0gLTEsCisgICAgICAgIHdpZHRoOiBJbnQgPSAtMSwKKyAgICAgICAgb3B0aWNhbFNpemU6IEludCA9IC0xLAorICAgICAgICByb3VuZG5lc3M6IEludCA9IC0xLAorICAgICAgICB0ZXh0U2l6ZTogRmxvYXQgPSAtMWYsCisgICAgICAgIGNvbG9yOiBJbnQ/ID0gbnVsbCwKKyAgICAgICAgc3Ryb2tlV2lkdGg6IEZsb2F0ID0gLTFmLAorICAgICAgICBhbmltYXRlOiBCb29sZWFuID0gdHJ1ZSwKKyAgICAgICAgZHVyYXRpb246IExvbmcgPSAtMUwsCisgICAgICAgIGludGVycG9sYXRvcjogVGltZUludGVycG9sYXRvcj8gPSBudWxsLAorICAgICAgICBkZWxheTogTG9uZyA9IDAsCisgICAgICAgIG9uQW5pbWF0aW9uRW5kOiBSdW5uYWJsZT8gPSBudWxsCisgICAgKSB7CisgICAgICAgIHZhbCBmdmFyID0gZm9udFZhcmlhdGlvblV0aWxzLnVwZGF0ZUZvbnRWYXJpYXRpb24oCisgICAgICAgICAgICB3ZWlnaHQgPSB3ZWlnaHQsCisgICAgICAgICAgICB3aWR0aCA9IHdpZHRoLAorICAgICAgICAgICAgb3B0aWNhbFNpemUgPSBvcHRpY2FsU2l6ZSwKKyAgICAgICAgICAgIHJvdW5kbmVzcyA9IHJvdW5kbmVzcywpCisgICAgICAgIHNldFRleHRTdHlsZSgKKyAgICAgICAgICAgIGZ2YXIgPSBmdmFyLAorICAgICAgICAgICAgdGV4dFNpemUgPSB0ZXh0U2l6ZSwKKyAgICAgICAgICAgIGNvbG9yID0gY29sb3IsCisgICAgICAgICAgICBzdHJva2VXaWR0aCA9IHN0cm9rZVdpZHRoLAorICAgICAgICAgICAgYW5pbWF0ZSA9IGFuaW1hdGUsCisgICAgICAgICAgICBkdXJhdGlvbiA9IGR1cmF0aW9uLAorICAgICAgICAgICAgaW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yLAorICAgICAgICAgICAgZGVsYXkgPSBkZWxheSwKKyAgICAgICAgICAgIG9uQW5pbWF0aW9uRW5kID0gb25BbmltYXRpb25FbmQsCisgICAgICAgICkKKyAgICB9CiB9CiAKLXByaXZhdGUgZnVuIDxWPiBTcGFyc2VBcnJheTxWPi5nZXRPckVsc2Uoa2V5OiBJbnQsIGRlZmF1bHRWYWx1ZTogKCkgLT4gVik6IFYgewotICAgIHZhciB2ID0gZ2V0KGtleSkKLSAgICBpZiAodiA9PSBudWxsKSB7Ci0gICAgICAgIHYgPSBkZWZhdWx0VmFsdWUoKQotICAgICAgICBwdXQoa2V5LCB2KQotICAgIH0KLSAgICByZXR1cm4gdgotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdXJmYWNlZWZmZWN0cy9zaGFkZXJ1dGlsL1NoYWRlclV0aWxMaWJyYXJ5Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdXJmYWNlZWZmZWN0cy9zaGFkZXJ1dGlsL1NoYWRlclV0aWxMaWJyYXJ5Lmt0CmluZGV4IGQ3OGUwYzEuLjIzZmNiNjkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL2FuaW1hdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3VyZmFjZWVmZmVjdHMvc2hhZGVydXRpbC9TaGFkZXJVdGlsTGlicmFyeS5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9hbmltYXRpb24vc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N1cmZhY2VlZmZlY3RzL3NoYWRlcnV0aWwvU2hhZGVyVXRpbExpYnJhcnkua3QKQEAgLTE1LDEzNCArMTUsMTY2IEBACiAgKi8KIHBhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3VyZmFjZWVmZmVjdHMuc2hhZGVydXRpbAogCi0vKiogQSBjb21tb24gdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCBmb3IgY29tcHV0aW5nIHNoYWRlcnMuICovCi1jbGFzcyBTaGFkZXJVdGlsTGlicmFyeSB7CisvKiogQ29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgZm9yIGNvbXB1dGluZyBzaGFkZXJzLiAqLworb2JqZWN0IFNoYWRlclV0aWxMaWJyYXJ5IHsKICAgICAvLyBsYW5ndWFnZT1BR1NMCi0gICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIGNvbnN0IHZhbCBTSEFERVJfTElCID0KLSAgICAgICAgICAgICIiIgotICAgICAgICAgICAgZmxvYXQgdHJpYW5nbGVOb2lzZSh2ZWMyIG4pIHsKLSAgICAgICAgICAgICAgICBuICA9IGZyYWN0KG4gKiB2ZWMyKDUuMzk4NywgNS40NDIxKSk7Ci0gICAgICAgICAgICAgICAgbiArPSBkb3Qobi55eCwgbi54eSArIHZlYzIoMjEuNTM1MSwgMTQuMzEzNykpOwotICAgICAgICAgICAgICAgIGZsb2F0IHh5ID0gbi54ICogbi55OwotICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgaW4gWzAuLjJbIGFuZCByZW1hcCB0byBbLTEuMC4uMS4wWwotICAgICAgICAgICAgICAgIHJldHVybiBmcmFjdCh4eSAqIDk1LjQzMDcpICsgZnJhY3QoeHkgKiA3NS4wNDk2MSkgLSAxLjA7CisgICAgY29uc3QgdmFsIFNIQURFUl9MSUIgPQorICAgICAgICAiIiIKKyAgICAgICAgZmxvYXQgdHJpYW5nbGVOb2lzZSh2ZWMyIG4pIHsKKyAgICAgICAgICAgIG4gID0gZnJhY3QobiAqIHZlYzIoNS4zOTg3LCA1LjQ0MjEpKTsKKyAgICAgICAgICAgIG4gKz0gZG90KG4ueXgsIG4ueHkgKyB2ZWMyKDIxLjUzNTEsIDE0LjMxMzcpKTsKKyAgICAgICAgICAgIGZsb2F0IHh5ID0gbi54ICogbi55OworICAgICAgICAgICAgLy8gY29tcHV0ZSBpbiBbMC4uMlsgYW5kIHJlbWFwIHRvIFstMS4wLi4xLjBbCisgICAgICAgICAgICByZXR1cm4gZnJhY3QoeHkgKiA5NS40MzA3KSArIGZyYWN0KHh5ICogNzUuMDQ5NjEpIC0gMS4wOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY7CisKKyAgICAgICAgZmxvYXQgc3BhcmtsZXModmVjMiB1diwgZmxvYXQgdCkgeworICAgICAgICAgICAgZmxvYXQgbiA9IHRyaWFuZ2xlTm9pc2UodXYpOworICAgICAgICAgICAgZmxvYXQgcyA9IDAuMDsKKyAgICAgICAgICAgIGZvciAoZmxvYXQgaSA9IDA7IGkgPCA0OyBpICs9IDEpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBsID0gaSAqIDAuMDE7CisgICAgICAgICAgICAgICAgZmxvYXQgaCA9IGwgKyAwLjE7CisgICAgICAgICAgICAgICAgZmxvYXQgbyA9IHNtb290aHN0ZXAobiAtIGwsIGgsIG4pOworICAgICAgICAgICAgICAgIG8gKj0gYWJzKHNpbihQSSAqIG8gKiAodCArIDAuNTUgKiBpKSkpOworICAgICAgICAgICAgICAgIHMgKz0gbzsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2OworICAgICAgICB2ZWMyIGRpc3RvcnQodmVjMiBwLCBmbG9hdCB0aW1lLCBmbG9hdCBkaXN0b3J0X2Ftb3VudF9yYWRpYWwsCisgICAgICAgICAgICBmbG9hdCBkaXN0b3J0X2Ftb3VudF94eSkgeworICAgICAgICAgICAgICAgIGZsb2F0IGFuZ2xlID0gYXRhbihwLnksIHAueCk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gcCArIHZlYzIoc2luKGFuZ2xlICogOCArIHRpbWUgKiAwLjAwMyArIDEuNjQxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3MoYW5nbGUgKiA1ICsgMi4xNCArIHRpbWUgKiAwLjAwNDEyKSkgKiBkaXN0b3J0X2Ftb3VudF9yYWRpYWwKKyAgICAgICAgICAgICAgICAgICAgICsgdmVjMihzaW4ocC54ICogMC4wMSArIHRpbWUgKiAwLjAwMjE1ICsgMC44MTIzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3MocC55ICogMC4wMSArIHRpbWUgKiAwLjAwNTkzMSkpICogZGlzdG9ydF9hbW91bnRfeHk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgZmxvYXQgc3BhcmtsZXModmVjMiB1diwgZmxvYXQgdCkgewotICAgICAgICAgICAgICAgIGZsb2F0IG4gPSB0cmlhbmdsZU5vaXNlKHV2KTsKLSAgICAgICAgICAgICAgICBmbG9hdCBzID0gMC4wOwotICAgICAgICAgICAgICAgIGZvciAoZmxvYXQgaSA9IDA7IGkgPCA0OyBpICs9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgbCA9IGkgKiAwLjAxOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoID0gbCArIDAuMTsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgbyA9IHNtb290aHN0ZXAobiAtIGwsIGgsIG4pOwotICAgICAgICAgICAgICAgICAgICBvICo9IGFicyhzaW4oUEkgKiBvICogKHQgKyAwLjU1ICogaSkpKTsKLSAgICAgICAgICAgICAgICAgICAgcyArPSBvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gUGVyY2VpdmVkIGx1bWlub3NpdHkgKEzigLIpLCBub3QgYWJzb2x1dGUgbHVtaW5vc2l0eS4KKyAgICAgICAgaGFsZiBnZXRMdW1pbm9zaXR5KHZlYzMgYykgeworICAgICAgICAgICAgcmV0dXJuIDAuMyAqIGMuciArIDAuNTkgKiBjLmcgKyAwLjExICogYy5iOworICAgICAgICB9CiAKLSAgICAgICAgICAgIHZlYzIgZGlzdG9ydCh2ZWMyIHAsIGZsb2F0IHRpbWUsIGZsb2F0IGRpc3RvcnRfYW1vdW50X3JhZGlhbCwKLSAgICAgICAgICAgICAgICBmbG9hdCBkaXN0b3J0X2Ftb3VudF94eSkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbmdsZSA9IGF0YW4ocC55LCBwLngpOwotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwICsgdmVjMihzaW4oYW5nbGUgKiA4ICsgdGltZSAqIDAuMDAzICsgMS42NDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3MoYW5nbGUgKiA1ICsgMi4xNCArIHRpbWUgKiAwLjAwNDEyKSkgKiBkaXN0b3J0X2Ftb3VudF9yYWRpYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICArIHZlYzIoc2luKHAueCAqIDAuMDEgKyB0aW1lICogMC4wMDIxNSArIDAuODEyMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcyhwLnkgKiAwLjAxICsgdGltZSAqIDAuMDA1OTMxKSkgKiBkaXN0b3J0X2Ftb3VudF94eTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gQ3JlYXRlcyBhIGx1bWlub3NpdHkgbWFzayBhbmQgY2xhbXAgdG8gdGhlIGxlZ2FsIHJhbmdlLgorICAgICAgICB2ZWMzIG1hc2tMdW1pbm9zaXR5KHZlYzMgZGVzdCwgZmxvYXQgbHVtKSB7CisgICAgICAgICAgICBkZXN0LnJnYiAqPSB2ZWMzKGx1bSk7CisgICAgICAgICAgICAvLyBDbGlwIGJhY2sgaW50byB0aGUgbGVnYWwgcmFuZ2UKKyAgICAgICAgICAgIGRlc3QgPSBjbGFtcChkZXN0LCB2ZWMzKDAuKSwgdmVjMygxLjApKTsKKyAgICAgICAgICAgIHJldHVybiBkZXN0OworICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFJldHVybiByYW5nZSBbLTEsIDFdLgotICAgICAgICAgICAgdmVjMyBoYXNoKHZlYzMgcCkgewotICAgICAgICAgICAgICAgIHAgPSBmcmFjdChwICogdmVjMyguMzQ1NiwgLjEyMzQsIC45ODc2KSk7Ci0gICAgICAgICAgICAgICAgcCArPSBkb3QocCwgcC55eHogKyA0My4yMSk7Ci0gICAgICAgICAgICAgICAgcCA9IChwLnh4eSArIHAueXh4KSAqIHAuenl4OwotICAgICAgICAgICAgICAgIHJldHVybiAoZnJhY3Qoc2luKHApICogNDU2Ny4xMjM0NTY3KSAtIC41KSAqIDIuOwotICAgICAgICAgICAgfQorICAgICAgICAvLyBSZXR1cm4gcmFuZ2UgWy0xLCAxXS4KKyAgICAgICAgdmVjMyBoYXNoKHZlYzMgcCkgeworICAgICAgICAgICAgcCA9IGZyYWN0KHAgKiB2ZWMzKC4zNDU2LCAuMTIzNCwgLjk4NzYpKTsKKyAgICAgICAgICAgIHAgKz0gZG90KHAsIHAueXh6ICsgNDMuMjEpOworICAgICAgICAgICAgcCA9IChwLnh4eSArIHAueXh4KSAqIHAuenl4OworICAgICAgICAgICAgcmV0dXJuIChmcmFjdChzaW4ocCkgKiA0NTY3LjEyMzQ1NjcpIC0gLjUpICogMi47CisgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gU2tldyBmYWN0b3JzIChub24tdW5pZm9ybSkuCi0gICAgICAgICAgICBjb25zdCBmbG9hdCBTS0VXID0gMC4zMzMzMzMzOyAgLy8gMS8zCi0gICAgICAgICAgICBjb25zdCBmbG9hdCBVTlNLRVcgPSAwLjE2NjY2Njc7ICAvLyAxLzYKKyAgICAgICAgLy8gU2tldyBmYWN0b3JzIChub24tdW5pZm9ybSkuCisgICAgICAgIGNvbnN0IGhhbGYgU0tFVyA9IDAuMzMzMzMzMzsgIC8vIDEvMworICAgICAgICBjb25zdCBoYWxmIFVOU0tFVyA9IDAuMTY2NjY2NzsgIC8vIDEvNgogCi0gICAgICAgICAgICAvLyBSZXR1cm4gcmFuZ2Ugcm91Z2hseSBbLTEsMV0uCi0gICAgICAgICAgICAvLyBJdCdzIGJlY2F1c2UgdGhlIGhhc2ggZnVuY3Rpb24gKHRoYXQgcmV0dXJucyBhIHJhbmRvbSBncmFkaWVudCB2ZWN0b3IpIHJldHVybnMKLSAgICAgICAgICAgIC8vIGRpZmZlcmVudCBtYWduaXR1ZGUgb2YgdmVjdG9ycy4gTm9pc2UgZG9lc24ndCBoYXZlIHRvIGJlIGluIHRoZSBwcmVjaXNlIHJhbmdlIHRodXMKLSAgICAgICAgICAgIC8vIHNraXBwZWQgbm9ybWFsaXplLgotICAgICAgICAgICAgZmxvYXQgc2ltcGxleDNkKHZlYzMgcCkgewotICAgICAgICAgICAgICAgIC8vIFNrZXcgdGhlIGlucHV0IGNvb3JkaW5hdGUsIHNvIHRoYXQgd2UgZ2V0IHNxdWFzaGVkIGN1YmljYWwgZ3JpZAotICAgICAgICAgICAgICAgIHZlYzMgcyA9IGZsb29yKHAgKyAocC54ICsgcC55ICsgcC56KSAqIFNLRVcpOworICAgICAgICAvLyBSZXR1cm4gcmFuZ2Ugcm91Z2hseSBbLTEsMV0uCisgICAgICAgIC8vIEl0J3MgYmVjYXVzZSB0aGUgaGFzaCBmdW5jdGlvbiAodGhhdCByZXR1cm5zIGEgcmFuZG9tIGdyYWRpZW50IHZlY3RvcikgcmV0dXJucworICAgICAgICAvLyBkaWZmZXJlbnQgbWFnbml0dWRlIG9mIHZlY3RvcnMuIE5vaXNlIGRvZXNuJ3QgaGF2ZSB0byBiZSBpbiB0aGUgcHJlY2lzZSByYW5nZSB0aHVzCisgICAgICAgIC8vIHNraXBwZWQgbm9ybWFsaXplLgorICAgICAgICBoYWxmIHNpbXBsZXgzZCh2ZWMzIHApIHsKKyAgICAgICAgICAgIC8vIFNrZXcgdGhlIGlucHV0IGNvb3JkaW5hdGUsIHNvIHRoYXQgd2UgZ2V0IHNxdWFzaGVkIGN1YmljYWwgZ3JpZAorICAgICAgICAgICAgdmVjMyBzID0gZmxvb3IocCArIChwLnggKyBwLnkgKyBwLnopICogU0tFVyk7CiAKLSAgICAgICAgICAgICAgICAvLyBVbnNrZXcgYmFjawotICAgICAgICAgICAgICAgIHZlYzMgdSA9IHMgLSAocy54ICsgcy55ICsgcy56KSAqIFVOU0tFVzsKKyAgICAgICAgICAgIC8vIFVuc2tldyBiYWNrCisgICAgICAgICAgICB2ZWMzIHUgPSBzIC0gKHMueCArIHMueSArIHMueikgKiBVTlNLRVc7CiAKLSAgICAgICAgICAgICAgICAvLyBVbnNrZXdlZCBjb29yZGluYXRlIHRoYXQgaXMgcmVsYXRpdmUgdG8gcCwgdG8gY29tcHV0ZSB0aGUgbm9pc2UgY29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIGRpc3RhbmNlLgotICAgICAgICAgICAgICAgIHZlYzMgYzAgPSBwIC0gdTsKKyAgICAgICAgICAgIC8vIFVuc2tld2VkIGNvb3JkaW5hdGUgdGhhdCBpcyByZWxhdGl2ZSB0byBwLCB0byBjb21wdXRlIHRoZSBub2lzZSBjb250cmlidXRpb24KKyAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBkaXN0YW5jZS4KKyAgICAgICAgICAgIHZlYzMgYzAgPSBwIC0gdTsKIAotICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgc2l4IHNpbXBsaWNlcyAoaW4gdGhpcyBjYXNlIHRldHJhaGVkcm9uLCBzaW5jZSB3ZSBhcmUgaW4gM0QpIHRoYXQgd2UKLSAgICAgICAgICAgICAgICAvLyBjb3VsZCBwb3NzaWJseSBpbi4KLSAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBhcmUgZmluZGluZyB0aGUgY29ycmVjdCB0ZXRyYWhlZHJvbiAoc2ltcGxleCBzaGFwZSksIGFuZCB0cmF2ZXJzZSBpdHMKLSAgICAgICAgICAgICAgICAvLyBmb3VyIHZlcnRpY2VzIChjMC4uMykgd2hlbiBjb21wdXRpbmcgbm9pc2UgY29udHJpYnV0aW9uLgotICAgICAgICAgICAgICAgIC8vIFRoZSB3YXkgd2UgZmluZCB0aGVtIGlzIGJ5IGNvbXBhcmluZyBjMCdzIHgseSx6IHZhbHVlcy4KLSAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBpbiAyRCwgd2UgY2FuIGZpbmQgdGhlIHRyaWFuZ2xlIChzaW1wbGV4IHNoYXBlIGluIDJEKSB0aGF0IHdlIGFyZSBpbgotICAgICAgICAgICAgICAgIC8vIGJ5IGNvbXBhcmluZyB4IGFuZCB5IHZhbHVlcy4gaS5lLiB4PnkgbG93ZXIsIHg8eSwgdXBwZXIgdHJpYW5nbGUuCi0gICAgICAgICAgICAgICAgLy8gU2FtZSBhcHBsaWVzIGluIDNELgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gQmVsb3cgaW5kaWNhdGVzIHRoZSBvZmZzZXRzIChvciBvZmZzZXQgZGlyZWN0aW9ucykgd2hlbiBjMD0oeDAseTAsejApCi0gICAgICAgICAgICAgICAgLy8geDA+eTA+ejA6ICgxLDAsMCksICgxLDEsMCksICgxLDEsMSkKLSAgICAgICAgICAgICAgICAvLyB4MD56MD55MDogKDEsMCwwKSwgKDEsMCwxKSwgKDEsMSwxKQotICAgICAgICAgICAgICAgIC8vIHowPngwPnkwOiAoMCwwLDEpLCAoMSwwLDEpLCAoMSwxLDEpCi0gICAgICAgICAgICAgICAgLy8gejA+eTA+eDA6ICgwLDAsMSksICgwLDEsMSksICgxLDEsMSkKLSAgICAgICAgICAgICAgICAvLyB5MD56MD54MDogKDAsMSwwKSwgKDAsMSwxKSwgKDEsMSwxKQotICAgICAgICAgICAgICAgIC8vIHkwPngwPnowOiAoMCwxLDApLCAoMSwxLDApLCAoMSwxLDEpCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBUaGUgcnVsZSBpczoKLSAgICAgICAgICAgICAgICAvLyAqIEZvciBvZmZzZXQxLCBzZXQgMSBhdCB0aGUgbWF4IGNvbXBvbmVudCwgb3RoZXJ3aXNlIDAuCi0gICAgICAgICAgICAgICAgLy8gKiBGb3Igb2Zmc2V0Miwgc2V0IDAgYXQgdGhlIG1pbiBjb21wb25lbnQsIG90aGVyd2lzZSAxLgotICAgICAgICAgICAgICAgIC8vICogRm9yIG9mZnNldDMsIHNldCAxIGZvciBhbGwuCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBFbmNvZGUgeDAteTAsIHkwLXowLCB6MC14MCBpbiBhIHZlYzMKLSAgICAgICAgICAgICAgICB2ZWMzIGVuID0gYzAgLSBjMC55eng7Ci0gICAgICAgICAgICAgICAgLy8gRWFjaCByZXByZXNlbnRzIHdoZXRoZXIgeDA+eTAsIHkwPnowLCB6MD54MAotICAgICAgICAgICAgICAgIGVuID0gc3RlcCh2ZWMzKDAuKSwgZW4pOwotICAgICAgICAgICAgICAgIC8vIGVuLnp4eSBlbmNvZGVzIHowPngwLCB4MD55MCwgeTA+eDAKLSAgICAgICAgICAgICAgICB2ZWMzIG9mZnNldDEgPSBlbiAqICgxLiAtIGVuLnp4eSk7IC8vIGZpbmQgbWF4Ci0gICAgICAgICAgICAgICAgdmVjMyBvZmZzZXQyID0gMS4gLSBlbi56eHkgKiAoMS4gLSBlbik7IC8vIDEtKGZpbmQgbWluKQotICAgICAgICAgICAgICAgIHZlYzMgb2Zmc2V0MyA9IHZlYzMoMS4pOworICAgICAgICAgICAgLy8gV2UgaGF2ZSBzaXggc2ltcGxpY2VzIChpbiB0aGlzIGNhc2UgdGV0cmFoZWRyb24sIHNpbmNlIHdlIGFyZSBpbiAzRCkgdGhhdCB3ZQorICAgICAgICAgICAgLy8gY291bGQgcG9zc2libHkgaW4uCisgICAgICAgICAgICAvLyBIZXJlLCB3ZSBhcmUgZmluZGluZyB0aGUgY29ycmVjdCB0ZXRyYWhlZHJvbiAoc2ltcGxleCBzaGFwZSksIGFuZCB0cmF2ZXJzZSBpdHMKKyAgICAgICAgICAgIC8vIGZvdXIgdmVydGljZXMgKGMwLi4zKSB3aGVuIGNvbXB1dGluZyBub2lzZSBjb250cmlidXRpb24uCisgICAgICAgICAgICAvLyBUaGUgd2F5IHdlIGZpbmQgdGhlbSBpcyBieSBjb21wYXJpbmcgYzAncyB4LHkseiB2YWx1ZXMuCisgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBpbiAyRCwgd2UgY2FuIGZpbmQgdGhlIHRyaWFuZ2xlIChzaW1wbGV4IHNoYXBlIGluIDJEKSB0aGF0IHdlIGFyZSBpbgorICAgICAgICAgICAgLy8gYnkgY29tcGFyaW5nIHggYW5kIHkgdmFsdWVzLiBpLmUuIHg+eSBsb3dlciwgeDx5LCB1cHBlciB0cmlhbmdsZS4KKyAgICAgICAgICAgIC8vIFNhbWUgYXBwbGllcyBpbiAzRC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBCZWxvdyBpbmRpY2F0ZXMgdGhlIG9mZnNldHMgKG9yIG9mZnNldCBkaXJlY3Rpb25zKSB3aGVuIGMwPSh4MCx5MCx6MCkKKyAgICAgICAgICAgIC8vIHgwPnkwPnowOiAoMSwwLDApLCAoMSwxLDApLCAoMSwxLDEpCisgICAgICAgICAgICAvLyB4MD56MD55MDogKDEsMCwwKSwgKDEsMCwxKSwgKDEsMSwxKQorICAgICAgICAgICAgLy8gejA+eDA+eTA6ICgwLDAsMSksICgxLDAsMSksICgxLDEsMSkKKyAgICAgICAgICAgIC8vIHowPnkwPngwOiAoMCwwLDEpLCAoMCwxLDEpLCAoMSwxLDEpCisgICAgICAgICAgICAvLyB5MD56MD54MDogKDAsMSwwKSwgKDAsMSwxKSwgKDEsMSwxKQorICAgICAgICAgICAgLy8geTA+eDA+ejA6ICgwLDEsMCksICgxLDEsMCksICgxLDEsMSkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGUgcnVsZSBpczoKKyAgICAgICAgICAgIC8vICogRm9yIG9mZnNldDEsIHNldCAxIGF0IHRoZSBtYXggY29tcG9uZW50LCBvdGhlcndpc2UgMC4KKyAgICAgICAgICAgIC8vICogRm9yIG9mZnNldDIsIHNldCAwIGF0IHRoZSBtaW4gY29tcG9uZW50LCBvdGhlcndpc2UgMS4KKyAgICAgICAgICAgIC8vICogRm9yIG9mZnNldDMsIHNldCAxIGZvciBhbGwuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRW5jb2RlIHgwLXkwLCB5MC16MCwgejAteDAgaW4gYSB2ZWMzCisgICAgICAgICAgICB2ZWMzIGVuID0gYzAgLSBjMC55eng7CisgICAgICAgICAgICAvLyBFYWNoIHJlcHJlc2VudHMgd2hldGhlciB4MD55MCwgeTA+ejAsIHowPngwCisgICAgICAgICAgICBlbiA9IHN0ZXAodmVjMygwLiksIGVuKTsKKyAgICAgICAgICAgIC8vIGVuLnp4eSBlbmNvZGVzIHowPngwLCB4MD55MCwgeTA+eDAKKyAgICAgICAgICAgIHZlYzMgb2Zmc2V0MSA9IGVuICogKDEuIC0gZW4uenh5KTsgLy8gZmluZCBtYXgKKyAgICAgICAgICAgIHZlYzMgb2Zmc2V0MiA9IDEuIC0gZW4uenh5ICogKDEuIC0gZW4pOyAvLyAxLShmaW5kIG1pbikKKyAgICAgICAgICAgIHZlYzMgb2Zmc2V0MyA9IHZlYzMoMS4pOwogCi0gICAgICAgICAgICAgICAgdmVjMyBjMSA9IGMwIC0gb2Zmc2V0MSArIFVOU0tFVzsKLSAgICAgICAgICAgICAgICB2ZWMzIGMyID0gYzAgLSBvZmZzZXQyICsgVU5TS0VXICogMi47Ci0gICAgICAgICAgICAgICAgdmVjMyBjMyA9IGMwIC0gb2Zmc2V0MyArIFVOU0tFVyAqIDMuOworICAgICAgICAgICAgdmVjMyBjMSA9IGMwIC0gb2Zmc2V0MSArIFVOU0tFVzsKKyAgICAgICAgICAgIHZlYzMgYzIgPSBjMCAtIG9mZnNldDIgKyBVTlNLRVcgKiAyLjsKKyAgICAgICAgICAgIHZlYzMgYzMgPSBjMCAtIG9mZnNldDMgKyBVTlNLRVcgKiAzLjsKIAotICAgICAgICAgICAgICAgIC8vIEtlcm5lbCBzdW1tYXRpb246IGRvdChtYXgoMCwgcl4yLWReMikpXjQsIG5vaXNlIGNvbnRyaWJ1dGlvbikKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNvbXB1dGUgZF4yLCBzcXVhcmVkIGRpc3RhbmNlIHRvIHRoZSBwb2ludC4KLSAgICAgICAgICAgICAgICB2ZWM0IHc7IC8vIHcgPSBtYXgoMCwgcl4yIC0gZF4yKSkKLSAgICAgICAgICAgICAgICB3LnggPSBkb3QoYzAsIGMwKTsKLSAgICAgICAgICAgICAgICB3LnkgPSBkb3QoYzEsIGMxKTsKLSAgICAgICAgICAgICAgICB3LnogPSBkb3QoYzIsIGMyKTsKLSAgICAgICAgICAgICAgICB3LncgPSBkb3QoYzMsIGMzKTsKKyAgICAgICAgICAgIC8vIEtlcm5lbCBzdW1tYXRpb246IGRvdChtYXgoMCwgcl4yLWReMikpXjQsIG5vaXNlIGNvbnRyaWJ1dGlvbikKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGaXJzdCBjb21wdXRlIGReMiwgc3F1YXJlZCBkaXN0YW5jZSB0byB0aGUgcG9pbnQuCisgICAgICAgICAgICB2ZWM0IHc7IC8vIHcgPSBtYXgoMCwgcl4yIC0gZF4yKSkKKyAgICAgICAgICAgIHcueCA9IGRvdChjMCwgYzApOworICAgICAgICAgICAgdy55ID0gZG90KGMxLCBjMSk7CisgICAgICAgICAgICB3LnogPSBkb3QoYzIsIGMyKTsKKyAgICAgICAgICAgIHcudyA9IGRvdChjMywgYzMpOwogCi0gICAgICAgICAgICAgICAgLy8gTm9pc2UgY29udHJpYnV0aW9uIHNob3VsZCBkZWNheSB0byB6ZXJvIGJlZm9yZSB0aGV5IGNyb3NzIHRoZSBzaW1wbGV4IGJvdW5kYXJ5LgotICAgICAgICAgICAgICAgIC8vIFVzdWFsbHkgcl4yIGlzIDAuNSBvciAwLjY7Ci0gICAgICAgICAgICAgICAgLy8gMC41IGVuc3VyZXMgY29udGludWl0eSBidXQgMC42IGluY3JlYXNlcyB0aGUgdmlzdWFsIHF1YWxpdHkgZm9yIHRoZSBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgIC8vIHdoZXJlIGRpc2NvbnRpbnVpdHkgaXNuJ3Qgbm90aWNlYWJsZS4KLSAgICAgICAgICAgICAgICB3ID0gbWF4KDAuNiAtIHcsIDAuKTsKKyAgICAgICAgICAgIC8vIE5vaXNlIGNvbnRyaWJ1dGlvbiBzaG91bGQgZGVjYXkgdG8gemVybyBiZWZvcmUgdGhleSBjcm9zcyB0aGUgc2ltcGxleCBib3VuZGFyeS4KKyAgICAgICAgICAgIC8vIFVzdWFsbHkgcl4yIGlzIDAuNSBvciAwLjY7CisgICAgICAgICAgICAvLyAwLjUgZW5zdXJlcyBjb250aW51aXR5IGJ1dCAwLjYgaW5jcmVhc2VzIHRoZSB2aXN1YWwgcXVhbGl0eSBmb3IgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAvLyB3aGVyZSBkaXNjb250aW51aXR5IGlzbid0IG5vdGljZWFibGUuCisgICAgICAgICAgICB3ID0gbWF4KDAuNiAtIHcsIDAuKTsKIAotICAgICAgICAgICAgICAgIC8vIE5vaXNlIGNvbnRyaWJ1dGlvbiBmcm9tIGVhY2ggcG9pbnQuCi0gICAgICAgICAgICAgICAgdmVjNCBuYzsKLSAgICAgICAgICAgICAgICBuYy54ID0gZG90KGhhc2gocyksIGMwKTsKLSAgICAgICAgICAgICAgICBuYy55ID0gZG90KGhhc2gocyArIG9mZnNldDEpLCBjMSk7Ci0gICAgICAgICAgICAgICAgbmMueiA9IGRvdChoYXNoKHMgKyBvZmZzZXQyKSwgYzIpOwotICAgICAgICAgICAgICAgIG5jLncgPSBkb3QoaGFzaChzICsgb2Zmc2V0MyksIGMzKTsKKyAgICAgICAgICAgIC8vIE5vaXNlIGNvbnRyaWJ1dGlvbiBmcm9tIGVhY2ggcG9pbnQuCisgICAgICAgICAgICB2ZWM0IG5jOworICAgICAgICAgICAgbmMueCA9IGRvdChoYXNoKHMpLCBjMCk7CisgICAgICAgICAgICBuYy55ID0gZG90KGhhc2gocyArIG9mZnNldDEpLCBjMSk7CisgICAgICAgICAgICBuYy56ID0gZG90KGhhc2gocyArIG9mZnNldDIpLCBjMik7CisgICAgICAgICAgICBuYy53ID0gZG90KGhhc2gocyArIG9mZnNldDMpLCBjMyk7CiAKLSAgICAgICAgICAgICAgICBuYyAqPSB3Kncqdyp3OworICAgICAgICAgICAgbmMgKj0gdyp3KncqdzsKIAotICAgICAgICAgICAgICAgIC8vIEFkZCBhbGwgdGhlIG5vaXNlIGNvbnRyaWJ1dGlvbnMuCi0gICAgICAgICAgICAgICAgLy8gU2hvdWxkIG11bHRpcGx5IGJ5IHRoZSBwb3NzaWJsZSBtYXggY29udHJpYnV0aW9uIHRvIGFkanVzdCB0aGUgcmFuZ2UgaW4gWy0xLDFdLgotICAgICAgICAgICAgICAgIHJldHVybiBkb3QodmVjNCgzMi4pLCBuYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAiIiIKLSAgICB9CisgICAgICAgICAgICAvLyBBZGQgYWxsIHRoZSBub2lzZSBjb250cmlidXRpb25zLgorICAgICAgICAgICAgLy8gU2hvdWxkIG11bHRpcGx5IGJ5IHRoZSBwb3NzaWJsZSBtYXggY29udHJpYnV0aW9uIHRvIGFkanVzdCB0aGUgcmFuZ2UgaW4gWy0xLDFdLgorICAgICAgICAgICAgcmV0dXJuIGRvdCh2ZWM0KDMyLiksIG5jKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJhbmRvbSByb3RhdGlvbnMuCisgICAgICAgIC8vIFRoZSB3YXkgeW91IGNyZWF0ZSBmcmFjdGFsIG5vaXNlIGlzIGxheWVyaW5nIHNpbXBsZXggbm9pc2Ugd2l0aCBzb21lIHJvdGF0aW9uLgorICAgICAgICAvLyBUbyBtYWtlIHJhbmRvbSBjbG91ZCBsb29raW5nIG5vaXNlLCB0aGUgcm90YXRpb25zIHNob3VsZCBub3QgYWxpZ24uIChPdGhlcndpc2UgaXQKKyAgICAgICAgLy8gY3JlYXRlcyBwYXR0ZXJuZWQgbm9pc2UpLgorICAgICAgICAvLyBCZWxvdyByb3RhdGlvbnMgb25seSByb3RhdGUgaW4gb25lIGF4aXMuCisgICAgICAgIGNvbnN0IG1hdDMgcm90MSA9IG1hdDMoMS4wLCAwLiAsMC4sIDAuLCAwLjE1LCAtMC45OCwgMC4sIDAuOTgsIDAuMTUpOworICAgICAgICBjb25zdCBtYXQzIHJvdDIgPSBtYXQzKC0wLjk1LCAwLiAsLTAuMywgMC4sIDEuLCAwLiwgMC4zLCAwLiwgLTAuOTUpOworICAgICAgICBjb25zdCBtYXQzIHJvdDMgPSBtYXQzKDEuMCwgMC4gLDAuLCAwLiwgLTAuNDQsIC0wLjg5LCAwLiwgMC44OSwgLTAuNDQpOworCisgICAgICAgIC8vIE9jdGF2ZSA9IDQKKyAgICAgICAgLy8gRGl2aWRlIGVhY2ggY29lZmZpY2llbnQgYnkgMyB0byBwcm9kdWNlIG1vcmUgZ3JhaW55IG5vaXNlLgorICAgICAgICBoYWxmIHNpbXBsZXgzZF9mcmFjdGFsKHZlYzMgcCkgeworICAgICAgICAgICAgcmV0dXJuIDAuNjc1ICogc2ltcGxleDNkKHAgKiByb3QxKSArIDAuMjI1ICogc2ltcGxleDNkKDIuMCAqIHAgKiByb3QyKQorICAgICAgICAgICAgICAgICAgICArIDAuMDc1ICogc2ltcGxleDNkKDQuMCAqIHAgKiByb3QzKSArIDAuMDI1ICogc2ltcGxleDNkKDguMCAqIHApOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2NyZWVuIGJsZW5kCisgICAgICAgIHZlYzMgc2NyZWVuKHZlYzMgZGVzdCwgdmVjMyBzcmMpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXN0ICsgc3JjIC0gZGVzdCAqIHNyYzsKKyAgICAgICAgfQorICAgICIiIgogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdXJmYWNlZWZmZWN0cy90dXJidWxlbmNlbm9pc2UvVHVyYnVsZW5jZU5vaXNlU2hhZGVyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvYW5pbWF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdXJmYWNlZWZmZWN0cy90dXJidWxlbmNlbm9pc2UvVHVyYnVsZW5jZU5vaXNlU2hhZGVyLmt0CmluZGV4IDc0NTZjNDMuLmQxYmE3YzQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL2FuaW1hdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3VyZmFjZWVmZmVjdHMvdHVyYnVsZW5jZW5vaXNlL1R1cmJ1bGVuY2VOb2lzZVNoYWRlci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9hbmltYXRpb24vc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N1cmZhY2VlZmZlY3RzL3R1cmJ1bGVuY2Vub2lzZS9UdXJidWxlbmNlTm9pc2VTaGFkZXIua3QKQEAgLTE5LDggKzE5LDEzIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3VyZmFjZWVmZmVjdHMuc2hhZGVydXRpbC5TaGFkZXJVdGlsTGlicmFyeQogaW1wb3J0IGphdmEubGFuZy5GbG9hdC5tYXgKIAotLyoqIFNoYWRlciB0aGF0IHJlbmRlcnMgdHVyYnVsZW5jZSBzaW1wbGV4IG5vaXNlLCB3aXRoIG5vIG9jdGF2ZS4gKi8KLWNsYXNzIFR1cmJ1bGVuY2VOb2lzZVNoYWRlciA6IFJ1bnRpbWVTaGFkZXIoVFVSQlVMRU5DRV9OT0lTRV9TSEFERVIpIHsKKy8qKgorICogU2hhZGVyIHRoYXQgcmVuZGVycyB0dXJidWxlbmNlIHNpbXBsZXggbm9pc2UsIGJ5IGRlZmF1bHQgbm8gb2N0YXZlLgorICoKKyAqIEBwYXJhbSB1c2VGcmFjdGFsIHdoZXRoZXIgdG8gdXNlIGZyYWN0YWwgbm9pc2UgKDQgb2N0YXZlcykuCisgKi8KK2NsYXNzIFR1cmJ1bGVuY2VOb2lzZVNoYWRlcih1c2VGcmFjdGFsOiBCb29sZWFuID0gZmFsc2UpIDoKKyAgICBSdW50aW1lU2hhZGVyKGlmICh1c2VGcmFjdGFsKSBGUkFDVEFMX05PSVNFX1NIQURFUiBlbHNlIFNJTVBMRVhfTk9JU0VfU0hBREVSKSB7CiAgICAgLy8gbGFuZ3VhZ2U9QUdTTAogICAgIGNvbXBhbmlvbiBvYmplY3QgewogICAgICAgICBwcml2YXRlIGNvbnN0IHZhbCBVTklGT1JNUyA9CkBAIC0zMSwzMiArMzYsMTkgQEAKICAgICAgICAgICAgIHVuaWZvcm0gZmxvYXQgaW5fYXNwZWN0UmF0aW87CiAgICAgICAgICAgICB1bmlmb3JtIGZsb2F0IGluX29wYWNpdHk7CiAgICAgICAgICAgICB1bmlmb3JtIGZsb2F0IGluX3BpeGVsRGVuc2l0eTsKKyAgICAgICAgICAgIHVuaWZvcm0gZmxvYXQgaW5faW52ZXJzZUx1bWE7CiAgICAgICAgICAgICBsYXlvdXQoY29sb3IpIHVuaWZvcm0gdmVjNCBpbl9jb2xvcjsKICAgICAgICAgICAgIGxheW91dChjb2xvcikgdW5pZm9ybSB2ZWM0IGluX2JhY2tncm91bmRDb2xvcjsKICAgICAgICAgIiIiCiAKLSAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgU0hBREVSX0xJQiA9Ci0gICAgICAgICAgICAiIiIKLSAgICAgICAgICAgIGZsb2F0IGdldEx1bWlub3NpdHkodmVjMyBjKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAuMypjLnIgKyAwLjU5KmMuZyArIDAuMTEqYy5iOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2ZWMzIG1hc2tMdW1pbm9zaXR5KHZlYzMgZGVzdCwgZmxvYXQgbHVtKSB7Ci0gICAgICAgICAgICAgICAgZGVzdC5yZ2IgKj0gdmVjMyhsdW0pOwotICAgICAgICAgICAgICAgIC8vIENsaXAgYmFjayBpbnRvIHRoZSBsZWdhbCByYW5nZQotICAgICAgICAgICAgICAgIGRlc3QgPSBjbGFtcChkZXN0LCB2ZWMzKDAuKSwgdmVjMygxLjApKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVzdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIiIiCi0KLSAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgTUFJTl9TSEFERVIgPQorICAgICAgICBwcml2YXRlIGNvbnN0IHZhbCBTSU1QTEVYX1NIQURFUiA9CiAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgIHZlYzQgbWFpbih2ZWMyIHApIHsKICAgICAgICAgICAgICAgICB2ZWMyIHV2ID0gcCAvIGluX3NpemUueHk7CiAgICAgICAgICAgICAgICAgdXYueCAqPSBpbl9hc3BlY3RSYXRpbzsKIAogICAgICAgICAgICAgICAgIHZlYzMgbm9pc2VQID0gdmVjMyh1diArIGluX25vaXNlTW92ZS54eSwgaW5fbm9pc2VNb3ZlLnopICogaW5fZ3JpZE51bTsKLSAgICAgICAgICAgICAgICBmbG9hdCBsdW1hID0gc2ltcGxleDNkKG5vaXNlUCkgKiBpbl9vcGFjaXR5OworICAgICAgICAgICAgICAgIGZsb2F0IGx1bWEgPSBhYnMoaW5faW52ZXJzZUx1bWEgLSBzaW1wbGV4M2Qobm9pc2VQKSkgKiBpbl9vcGFjaXR5OwogICAgICAgICAgICAgICAgIHZlYzMgbWFzayA9IG1hc2tMdW1pbm9zaXR5KGluX2NvbG9yLnJnYiwgbHVtYSk7CiAgICAgICAgICAgICAgICAgdmVjMyBjb2xvciA9IGluX2JhY2tncm91bmRDb2xvci5yZ2IgKyBtYXNrICogMC42OwogCkBAIC03MSw4ICs2MywyNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAiIiIKIAotICAgICAgICBwcml2YXRlIGNvbnN0IHZhbCBUVVJCVUxFTkNFX05PSVNFX1NIQURFUiA9Ci0gICAgICAgICAgICBTaGFkZXJVdGlsTGlicmFyeS5TSEFERVJfTElCICsgVU5JRk9STVMgKyBTSEFERVJfTElCICsgTUFJTl9TSEFERVIKKyAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgRlJBQ1RBTF9TSEFERVIgPQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB2ZWM0IG1haW4odmVjMiBwKSB7CisgICAgICAgICAgICAgICAgdmVjMiB1diA9IHAgLyBpbl9zaXplLnh5OworICAgICAgICAgICAgICAgIHV2LnggKj0gaW5fYXNwZWN0UmF0aW87CisKKyAgICAgICAgICAgICAgICB2ZWMzIG5vaXNlUCA9IHZlYzModXYgKyBpbl9ub2lzZU1vdmUueHksIGluX25vaXNlTW92ZS56KSAqIGluX2dyaWROdW07CisgICAgICAgICAgICAgICAgZmxvYXQgbHVtYSA9IGFicyhpbl9pbnZlcnNlTHVtYSAtIHNpbXBsZXgzZF9mcmFjdGFsKG5vaXNlUCkpICogaW5fb3BhY2l0eTsKKyAgICAgICAgICAgICAgICB2ZWMzIG1hc2sgPSBtYXNrTHVtaW5vc2l0eShpbl9jb2xvci5yZ2IsIGx1bWEpOworICAgICAgICAgICAgICAgIHZlYzMgY29sb3IgPSBpbl9iYWNrZ3JvdW5kQ29sb3IucmdiICsgbWFzayAqIDAuNjsKKworICAgICAgICAgICAgICAgIC8vIFNraXAgZGl0aGVyaW5nLgorICAgICAgICAgICAgICAgIHJldHVybiB2ZWM0KGNvbG9yICogaW5fY29sb3IuYSwgaW5fY29sb3IuYSk7CisgICAgICAgICAgICB9CisgICAgICAgICIiIgorCisgICAgICAgIHByaXZhdGUgY29uc3QgdmFsIFNJTVBMRVhfTk9JU0VfU0hBREVSID0KKyAgICAgICAgICAgIFNoYWRlclV0aWxMaWJyYXJ5LlNIQURFUl9MSUIgKyBVTklGT1JNUyArIFNJTVBMRVhfU0hBREVSCisgICAgICAgIHByaXZhdGUgY29uc3QgdmFsIEZSQUNUQUxfTk9JU0VfU0hBREVSID0KKyAgICAgICAgICAgIFNoYWRlclV0aWxMaWJyYXJ5LlNIQURFUl9MSUIgKyBVTklGT1JNUyArIEZSQUNUQUxfU0hBREVSCiAgICAgfQogCiAgICAgLyoqIFNldHMgdGhlIG51bWJlciBvZiBncmlkIGZvciBnZW5lcmF0aW5nIG5vaXNlLiAqLwpAQCAtMTE0LDYgKzEyNCwxNyBAQAogICAgICAgICBzZXRGbG9hdFVuaWZvcm0oImluX2FzcGVjdFJhdGlvIiwgd2lkdGggLyBtYXgoaGVpZ2h0LCAwLjAwMWYpKQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0byBpbnZlcnNlIHRoZSBsdW1pbm9zaXR5IG9mIHRoZSBub2lzZS4KKyAgICAgKgorICAgICAqIEJ5IGRlZmF1bHQgbm9pc2Ugd2lsbCBiZSB1c2VkIGFzIGEgbHVtYSBtYXR0ZSBhcyBpcy4gVGhpcyBtZWFucyB0aGF0IHlvdSB3aWxsIHNlZSBjb2xvciBpbgorICAgICAqIHRoZSBicmlnaHRlciBhcmVhLiBJZiB5b3Ugd2FudCB0byBpbnZlcnQgaXQsIG1lYW5pbmcgYmxlbmQgY29sb3Igb250byB0aGUgZGFya2VyIHNpZGUsIHNldCB0bworICAgICAqIHRydWUuCisgICAgICovCisgICAgZnVuIHNldEludmVyc2VOb2lzZUx1bWlub3NpdHkoaW52ZXJzZTogQm9vbGVhbikgeworICAgICAgICBzZXRGbG9hdFVuaWZvcm0oImluX2ludmVyc2VMdW1hIiwgaWYgKGludmVyc2UpIDFmIGVsc2UgMGYpCisgICAgfQorCiAgICAgLyoqIEN1cnJlbnQgbm9pc2UgbW92ZW1lbnRzIGluIHgsIHksIGFuZCB6IGF4ZXMuICovCiAgICAgdmFyIG5vaXNlT2Zmc2V0WDogRmxvYXQgPSAwZgogICAgICAgICBwcml2YXRlIHNldApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvY2hlY2tzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9zeXN0ZW11aS9saW50L0RlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2NoZWNrcy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3lzdGVtdWkvbGludC9EZW1vdGluZ1Rlc3RXaXRob3V0QnVnRGV0ZWN0b3Iua3QKaW5kZXggNDU5YTM4ZS4uMDk3NjJiMCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvY2hlY2tzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9zeXN0ZW11aS9saW50L0RlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jaGVja3Mvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3N5c3RlbXVpL2xpbnQvRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLmt0CkBAIC0yNSwxMCArMjUsMTIgQEAKIGltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmRldGVjdG9yLmFwaS5TY29wZQogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLlNldmVyaXR5CiBpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5kZXRlY3Rvci5hcGkuU291cmNlQ29kZVNjYW5uZXIKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldAogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuCiBpbXBvcnQgb3JnLmpldGJyYWlucy51YXN0LlVBbm5vdGF0aW9uCiBpbXBvcnQgb3JnLmpldGJyYWlucy51YXN0LlVFbGVtZW50CiAKK0BTdXBwcmVzcygiVW5zdGFibGVBcGlVc2FnZSIpIC8vIEZvciBsaW50ZXIgYXBpCiBjbGFzcyBEZW1vdGluZ1Rlc3RXaXRob3V0QnVnRGV0ZWN0b3IgOiBEZXRlY3RvcigpLCBTb3VyY2VDb2RlU2Nhbm5lciB7CiAgICAgb3ZlcnJpZGUgZnVuIGdldEFwcGxpY2FibGVVYXN0VHlwZXMoKTogTGlzdDxDbGFzczxvdXQgVUVsZW1lbnQ+PiB7CiAgICAgICAgIHJldHVybiBsaXN0T2YoVUFubm90YXRpb246OmNsYXNzLmphdmEpCkBAIC0zOSwxOCArNDEsMTUgQEAKICAgICAgICAgICAgIG92ZXJyaWRlIGZ1biB2aXNpdEFubm90YXRpb24obm9kZTogVUFubm90YXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBBbm5vdGF0aW9ucyBoYXZpbmcgaW50IGJ1Z0lkIGZpZWxkCiAgICAgICAgICAgICAgICAgaWYgKG5vZGUucXVhbGlmaWVkTmFtZSBpbiBERU1PVElOR19BTk5PVEFUSU9OX0JVR19JRCkgewotICAgICAgICAgICAgICAgICAgICB2YWwgYnVnSWQgPSBub2RlLmZpbmRBdHRyaWJ1dGVWYWx1ZSgiYnVnSWQiKSEhLmV2YWx1YXRlKCkgYXMgSW50Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWdJZCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNCdWdJZChub2RlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdmFsIGxvY2F0aW9uID0gY29udGV4dC5nZXRMb2NhdGlvbihub2RlKQogICAgICAgICAgICAgICAgICAgICAgICAgdmFsIG1lc3NhZ2UgPSAiUGxlYXNlIGF0dGFjaCBhIGJ1ZyBpZCB0byB0cmFjayBkZW1vdGVkIHRlc3QiCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydChJU1NVRSwgbm9kZSwgbG9jYXRpb24sIG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQElnbm9yZSBoYXMgYSBTdHJpbmcgZmllbGQgZm9yIHJlYXNvbgorICAgICAgICAgICAgICAgIC8vIEBJZ25vcmUgaGFzIGEgU3RyaW5nIGZpZWxkIGZvciBzcGVjaWZ5aW5nIHJlYXNvbnMKICAgICAgICAgICAgICAgICBpZiAobm9kZS5xdWFsaWZpZWROYW1lID09IERFTU9USU5HX0FOTk9UQVRJT05fSUdOT1JFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCByZWFzb24gPSBub2RlLmZpbmRBdHRyaWJ1dGVWYWx1ZSgidmFsdWUiKSEhLmV2YWx1YXRlKCkgYXMgU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgIHZhbCBidWdQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJiL1xcZCsiKQotICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1Z1BhdHRlcm4ubWF0Y2hlcihyZWFzb24pLmZpbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zQnVnU3RyaW5nKG5vZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgbG9jYXRpb24gPSBjb250ZXh0LmdldExvY2F0aW9uKG5vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgbWVzc2FnZSA9ICJQbGVhc2UgYXR0YWNoIGEgYnVnIChlLmcuIGIvMTIzKSB0byB0cmFjayBkZW1vdGVkIHRlc3QiCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydChJU1NVRSwgbm9kZSwgbG9jYXRpb24sIG1lc3NhZ2UpCkBAIC02MCw2ICs1OSwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBmdW4gY29udGFpbnNCdWdJZChub2RlOiBVQW5ub3RhdGlvbik6IEJvb2xlYW4geworICAgICAgICB2YWwgYnVnSWQgPSBub2RlLmZpbmRBdHRyaWJ1dGVWYWx1ZSgiYnVnSWQiKT8uZXZhbHVhdGUoKSBhcyBJbnQ/CisgICAgICAgIHJldHVybiBidWdJZCAhPSBudWxsICYmIGJ1Z0lkID4gMAorICAgIH0KKworICAgIHByaXZhdGUgZnVuIGNvbnRhaW5zQnVnU3RyaW5nKG5vZGU6IFVBbm5vdGF0aW9uKTogQm9vbGVhbiB7CisgICAgICAgIHZhbCByZWFzb24gPSBub2RlLmZpbmRBdHRyaWJ1dGVWYWx1ZSgidmFsdWUiKT8uZXZhbHVhdGUoKSBhcyBTdHJpbmc/CisgICAgICAgIHZhbCBidWdQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJiL1xcZCsiKQorICAgICAgICByZXR1cm4gcmVhc29uICE9IG51bGwgJiYgYnVnUGF0dGVybi5tYXRjaGVyKHJlYXNvbikuZmluZCgpCisgICAgfQorCiAgICAgY29tcGFuaW9uIG9iamVjdCB7CiAgICAgICAgIHZhbCBERU1PVElOR19BTk5PVEFUSU9OX0JVR19JRCA9CiAgICAgICAgICAgICBsaXN0T2YoCkBAIC04Nyw3ICs5Nyw3IEBACiAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gPQogICAgICAgICAgICAgICAgICAgICBJbXBsZW1lbnRhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgIERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvcjo6Y2xhc3MuamF2YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlLkpBVkFfRklMRV9TQ09QRQorICAgICAgICAgICAgICAgICAgICAgICAgRW51bVNldC5vZihTY29wZS5KQVZBX0ZJTEUsIFNjb3BlLlRFU1RfU09VUkNFUykKICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgKQogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2NoZWNrcy90ZXN0cy9jb20vYW5kcm9pZC9pbnRlcm5hbC9zeXN0ZW11aS9saW50L0RlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3RvclRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jaGVja3MvdGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3lzdGVtdWkvbGludC9EZW1vdGluZ1Rlc3RXaXRob3V0QnVnRGV0ZWN0b3JUZXN0Lmt0CmluZGV4IDYzZWIyNjMuLmExZTZmOTIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL2NoZWNrcy90ZXN0cy9jb20vYW5kcm9pZC9pbnRlcm5hbC9zeXN0ZW11aS9saW50L0RlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3RvclRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvY2hlY2tzL3Rlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3N5c3RlbXVpL2xpbnQvRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yVGVzdC5rdApAQCAtMjAsOCArMjAsMTEgQEAKIGltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmNoZWNrcy5pbmZyYXN0cnVjdHVyZS5UZXN0RmlsZXMKIGltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmRldGVjdG9yLmFwaS5EZXRlY3RvcgogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLklzc3VlCitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5kZXRlY3Rvci5hcGkuU2NvcGUKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0CiAKK0BTdXBwcmVzcygiVW5zdGFibGVBcGlVc2FnZSIpCiBjbGFzcyBEZW1vdGluZ1Rlc3RXaXRob3V0QnVnRGV0ZWN0b3JUZXN0IDogU3lzdGVtVUlMaW50RGV0ZWN0b3JUZXN0KCkgewogCiAgICAgb3ZlcnJpZGUgZnVuIGdldERldGVjdG9yKCk6IERldGVjdG9yID0gRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yKCkKQEAgLTQ1LDYgKzQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLmluZGVudGVkKCksCiAgICAgICAgICAgICAgICAgKnN0dWJzCiAgICAgICAgICAgICApCisgICAgICAgICAgICAuY3VzdG9tU2NvcGUodGVzdFNjb3BlKQogICAgICAgICAgICAgLmlzc3VlcyhEZW1vdGluZ1Rlc3RXaXRob3V0QnVnRGV0ZWN0b3IuSVNTVUUpCiAgICAgICAgICAgICAucnVuKCkKICAgICAgICAgICAgIC5leHBlY3RDbGVhbigpCkBAIC02NSw2ICs2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC5pbmRlbnRlZCgpLAogICAgICAgICAgICAgICAgICpzdHVicwogICAgICAgICAgICAgKQorICAgICAgICAgICAgLmN1c3RvbVNjb3BlKHRlc3RTY29wZSkKICAgICAgICAgICAgIC5pc3N1ZXMoRGVtb3RpbmdUZXN0V2l0aG91dEJ1Z0RldGVjdG9yLklTU1VFKQogICAgICAgICAgICAgLnJ1bigpCiAgICAgICAgICAgICAuZXhwZWN0Q2xlYW4oKQpAQCAtODgsNiArOTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAuaW5kZW50ZWQoKSwKICAgICAgICAgICAgICAgICAqc3R1YnMKICAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5jdXN0b21TY29wZSh0ZXN0U2NvcGUpCiAgICAgICAgICAgICAuaXNzdWVzKERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5JU1NVRSkKICAgICAgICAgICAgIC5ydW4oKQogICAgICAgICAgICAgLmV4cGVjdCgKQEAgLTExNSw2ICsxMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAuaW5kZW50ZWQoKSwKICAgICAgICAgICAgICAgICAqc3R1YnMKICAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5jdXN0b21TY29wZSh0ZXN0U2NvcGUpCiAgICAgICAgICAgICAuaXNzdWVzKERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5JU1NVRSkKICAgICAgICAgICAgIC5ydW4oKQogICAgICAgICAgICAgLmV4cGVjdCgKQEAgLTE0NSw2ICsxNTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAuaW5kZW50ZWQoKSwKICAgICAgICAgICAgICAgICAqc3R1YnMKICAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5jdXN0b21TY29wZSh0ZXN0U2NvcGUpCiAgICAgICAgICAgICAuaXNzdWVzKERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5JU1NVRSkKICAgICAgICAgICAgIC5ydW4oKQogICAgICAgICAgICAgLmV4cGVjdENsZWFuKCkKQEAgLTE2OCw2ICsxNzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAuaW5kZW50ZWQoKSwKICAgICAgICAgICAgICAgICAqc3R1YnMKICAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5jdXN0b21TY29wZSh0ZXN0U2NvcGUpCiAgICAgICAgICAgICAuaXNzdWVzKERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5JU1NVRSkKICAgICAgICAgICAgIC5ydW4oKQogICAgICAgICAgICAgLmV4cGVjdCgKQEAgLTE5OCw2ICsyMDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAuaW5kZW50ZWQoKSwKICAgICAgICAgICAgICAgICAqc3R1YnMKICAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5jdXN0b21TY29wZSh0ZXN0U2NvcGUpCiAgICAgICAgICAgICAuaXNzdWVzKERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5JU1NVRSkKICAgICAgICAgICAgIC5ydW4oKQogICAgICAgICAgICAgLmV4cGVjdENsZWFuKCkKQEAgLTIyMSw2ICsyMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAuaW5kZW50ZWQoKSwKICAgICAgICAgICAgICAgICAqc3R1YnMKICAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5jdXN0b21TY29wZSh0ZXN0U2NvcGUpCiAgICAgICAgICAgICAuaXNzdWVzKERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5JU1NVRSkKICAgICAgICAgICAgIC5ydW4oKQogICAgICAgICAgICAgLmV4cGVjdCgKQEAgLTI0OCw2ICsyNTksNyBAQAogICAgICAgICAgICAgICAgICAgICAuaW5kZW50ZWQoKSwKICAgICAgICAgICAgICAgICAqc3R1YnMKICAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5jdXN0b21TY29wZSh0ZXN0U2NvcGUpCiAgICAgICAgICAgICAuaXNzdWVzKERlbW90aW5nVGVzdFdpdGhvdXRCdWdEZXRlY3Rvci5JU1NVRSkKICAgICAgICAgICAgIC5ydW4oKQogICAgICAgICAgICAgLmV4cGVjdCgKQEAgLTI2MCw2ICsyNzIsNyBAQAogICAgICAgICAgICAgKQogICAgIH0KIAorICAgIHByaXZhdGUgdmFsIHRlc3RTY29wZSA9IEVudW1TZXQub2YoU2NvcGUuSkFWQV9GSUxFLCBTY29wZS5URVNUX1NPVVJDRVMpCiAgICAgcHJpdmF0ZSB2YWwgZmlsdGVyc0ZsYWt5VGVzdFN0dWI6IFRlc3RGaWxlID0KICAgICAgICAgamF2YSgKICAgICAgICAgICAgICIiIgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9jb3JlL3NyYy9jb20vYW5kcm9pZC9jb21wb3NlL3N3aXBlYWJsZS9Td2lwZWFibGUua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2NvcmUvc3JjL2NvbS9hbmRyb2lkL2NvbXBvc2Uvc3dpcGVhYmxlL1N3aXBlYWJsZS5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDZlNzc5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9jb3JlL3NyYy9jb20vYW5kcm9pZC9jb21wb3NlL3N3aXBlYWJsZS9Td2lwZWFibGUua3QKQEAgLTAsMCArMSw4NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jb21wb3NlLnN3aXBlYWJsZQorCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5hbmltYXRpb24uY29yZS5BbmltYXRhYmxlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5hbmltYXRpb24uY29yZS5BbmltYXRpb25TcGVjCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5hbmltYXRpb24uY29yZS5TcHJpbmdTcGVjCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmdlc3R1cmVzLkRyYWdnYWJsZVN0YXRlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmdlc3R1cmVzLk9yaWVudGF0aW9uCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmdlc3R1cmVzLmRyYWdnYWJsZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5pbnRlcmFjdGlvbi5NdXRhYmxlSW50ZXJhY3Rpb25Tb3VyY2UKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuQ29tcG9zYWJsZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5EaXNwb3NhYmxlRWZmZWN0CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLkltbXV0YWJsZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5MYXVuY2hlZEVmZmVjdAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5TdGFibGUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuU3RhdGUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuZ2V0VmFsdWUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUubXV0YWJsZVN0YXRlT2YKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUucmVtZW1iZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuc2F2ZWFibGUuU2F2ZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuc2F2ZWFibGUucmVtZW1iZXJTYXZlYWJsZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5zZXRWYWx1ZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5zbmFwc2hvdEZsb3cKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLk1vZGlmaWVyCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5jb21wb3NlZAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuZ2VvbWV0cnkuT2Zmc2V0CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5pbnB1dC5uZXN0ZWRzY3JvbGwuTmVzdGVkU2Nyb2xsQ29ubmVjdGlvbgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuaW5wdXQubmVzdGVkc2Nyb2xsLk5lc3RlZFNjcm9sbFNvdXJjZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkucGxhdGZvcm0uTG9jYWxEZW5zaXR5CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5wbGF0Zm9ybS5kZWJ1Z0luc3BlY3RvckluZm8KK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLnVuaXQuRGVuc2l0eQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkudW5pdC5EcAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkudW5pdC5WZWxvY2l0eQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkudW5pdC5kcAoraW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBvc2Uuc3dpcGVhYmxlLlN3aXBlYWJsZURlZmF1bHRzLkFuaW1hdGlvblNwZWMKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wb3NlLnN3aXBlYWJsZS5Td2lwZWFibGVEZWZhdWx0cy5TdGFuZGFyZFJlc2lzdGFuY2VGYWN0b3IKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wb3NlLnN3aXBlYWJsZS5Td2lwZWFibGVEZWZhdWx0cy5WZWxvY2l0eVRocmVzaG9sZAoraW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBvc2Uuc3dpcGVhYmxlLlN3aXBlYWJsZURlZmF1bHRzLnJlc2lzdGFuY2VDb25maWcKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wb3NlLnVpLnV0aWwubGVycAoraW1wb3J0IGtvdGxpbi5tYXRoLlBJCitpbXBvcnQga290bGluLm1hdGguYWJzCitpbXBvcnQga290bGluLm1hdGguc2lnbgoraW1wb3J0IGtvdGxpbi5tYXRoLnNpbgoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5DYW5jZWxsYXRpb25FeGNlcHRpb24KK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5GbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuZmlsdGVyCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cudGFrZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5sYXVuY2gKKworLyoqCisgKiBTdGF0ZSBvZiB0aGUgW3N3aXBlYWJsZV0gbW9kaWZpZXIuCisgKgorICogVGhpcyBjb250YWlucyBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgYW55IG9uZ29pbmcgc3dpcGUgb3IgYW5pbWF0aW9uIGFuZCBwcm92aWRlcyBtZXRob2RzIHRvCisgKiBjaGFuZ2UgdGhlIHN0YXRlIGVpdGhlciBpbW1lZGlhdGVseSBvciBieSBzdGFydGluZyBhbiBhbmltYXRpb24uIFRvIGNyZWF0ZSBhbmQgcmVtZW1iZXIgYQorICogW1N3aXBlYWJsZVN0YXRlXSB3aXRoIHRoZSBkZWZhdWx0IGFuaW1hdGlvbiBjbG9jaywgdXNlIFtyZW1lbWJlclN3aXBlYWJsZVN0YXRlXS4KKyAqCisgKiBAcGFyYW0gaW5pdGlhbFZhbHVlIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBzdGF0ZS4KKyAqIEBwYXJhbSBhbmltYXRpb25TcGVjIFRoZSBkZWZhdWx0IGFuaW1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBhbmltYXRlIHRvIGEgbmV3IHN0YXRlLgorICogQHBhcmFtIGNvbmZpcm1TdGF0ZUNoYW5nZSBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIHRvIGNvbmZpcm0gb3IgdmV0byBhIHBlbmRpbmcgc3RhdGUgY2hhbmdlLgorICoKKyAqIFRPRE8oYi8yNzIzMTExMDYpOiB0aGlzIGlzIGEgZm9yayBmcm9tIG1hdGVyaWFsLiBVbmZvcmsgaXQgd2hlbiBTd2lwZWFibGUua3QgcmVhY2hlcyBtYXRlcmlhbDMuCisgKi8KK0BTdGFibGUKK29wZW4gY2xhc3MgU3dpcGVhYmxlU3RhdGU8VD4oCisgICAgaW5pdGlhbFZhbHVlOiBULAorICAgIGludGVybmFsIHZhbCBhbmltYXRpb25TcGVjOiBBbmltYXRpb25TcGVjPEZsb2F0PiA9IEFuaW1hdGlvblNwZWMsCisgICAgaW50ZXJuYWwgdmFsIGNvbmZpcm1TdGF0ZUNoYW5nZTogKG5ld1ZhbHVlOiBUKSAtPiBCb29sZWFuID0geyB0cnVlIH0KKykgeworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdGF0ZS4KKyAgICAgKgorICAgICAqIElmIG5vIHN3aXBlIG9yIGFuaW1hdGlvbiBpcyBpbiBwcm9ncmVzcywgdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYW5jaG9yIGF0IHdoaWNoIHRoZQorICAgICAqIFtzd2lwZWFibGVdIGlzIGN1cnJlbnRseSBzZXR0bGVkLiBJZiBhIHN3aXBlIG9yIGFuaW1hdGlvbiBpcyBpbiBwcm9ncmVzcywgdGhpcyBjb3JyZXNwb25kcworICAgICAqIHRoZSBsYXN0IGFuY2hvciBhdCB3aGljaCB0aGUgW3N3aXBlYWJsZV0gd2FzIHNldHRsZWQgYmVmb3JlIHRoZSBzd2lwZSBvciBhbmltYXRpb24gc3RhcnRlZC4KKyAgICAgKi8KKyAgICB2YXIgY3VycmVudFZhbHVlOiBUIGJ5IG11dGFibGVTdGF0ZU9mKGluaXRpYWxWYWx1ZSkKKyAgICAgICAgcHJpdmF0ZSBzZXQKKworICAgIC8qKiBXaGV0aGVyIHRoZSBzdGF0ZSBpcyBjdXJyZW50bHkgYW5pbWF0aW5nLiAqLworICAgIHZhciBpc0FuaW1hdGlvblJ1bm5pbmc6IEJvb2xlYW4gYnkgbXV0YWJsZVN0YXRlT2YoZmFsc2UpCisgICAgICAgIHByaXZhdGUgc2V0CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBwb3NpdGlvbiAoaW4gcGl4ZWxzKSBvZiB0aGUgW3N3aXBlYWJsZV0uCisgICAgICoKKyAgICAgKiBZb3Ugc2hvdWxkIHVzZSB0aGlzIHN0YXRlIHRvIG9mZnNldCB5b3VyIGNvbnRlbnQgYWNjb3JkaW5nbHkuIFRoZSByZWNvbW1lbmRlZCB3YXkgaXMgdG8gdXNlCisgICAgICogYE1vZGlmaWVyLm9mZnNldFB4YC4gVGhpcyBpbmNsdWRlcyB0aGUgcmVzaXN0YW5jZSBieSBkZWZhdWx0LCBpZiByZXNpc3RhbmNlIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgdmFsIG9mZnNldDogU3RhdGU8RmxvYXQ+CisgICAgICAgIGdldCgpID0gb2Zmc2V0U3RhdGUKKworICAgIC8qKiBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBbc3dpcGVhYmxlXSBoYXMgYmVlbiBzd2lwZWQgcGFzdCBpdHMgYm91bmRzLiAqLworICAgIHZhbCBvdmVyZmxvdzogU3RhdGU8RmxvYXQ+CisgICAgICAgIGdldCgpID0gb3ZlcmZsb3dTdGF0ZQorCisgICAgLy8gVXNlIGBGbG9hdC5OYU5gIGFzIGEgcGxhY2Vob2xkZXIgd2hpbGUgdGhlIHN0YXRlIGlzIHVuaW5pdGlhbGlzZWQuCisgICAgcHJpdmF0ZSB2YWwgb2Zmc2V0U3RhdGUgPSBtdXRhYmxlU3RhdGVPZigwZikKKyAgICBwcml2YXRlIHZhbCBvdmVyZmxvd1N0YXRlID0gbXV0YWJsZVN0YXRlT2YoMGYpCisKKyAgICAvLyB0aGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgInJlYWwiKG5vbiB1aSkgcG9zaXRpb24KKyAgICAvLyBiYXNpY2FsbHkgcG9zaXRpb24gaW4gYm91bmRzICsgb3ZlcmZsb3cKKyAgICBwcml2YXRlIHZhbCBhYnNvbHV0ZU9mZnNldCA9IG11dGFibGVTdGF0ZU9mKDBmKQorCisgICAgLy8gY3VycmVudCBhbmltYXRpb24gdGFyZ2V0LCBpZiBhbmltYXRpbmcsIG90aGVyd2lzZSBudWxsCisgICAgcHJpdmF0ZSB2YWwgYW5pbWF0aW9uVGFyZ2V0ID0gbXV0YWJsZVN0YXRlT2Y8RmxvYXQ/PihudWxsKQorCisgICAgaW50ZXJuYWwgdmFyIGFuY2hvcnMgYnkgbXV0YWJsZVN0YXRlT2YoZW1wdHlNYXA8RmxvYXQsIFQ+KCkpCisKKyAgICBwcml2YXRlIHZhbCBsYXRlc3ROb25FbXB0eUFuY2hvcnNGbG93OiBGbG93PE1hcDxGbG9hdCwgVD4+ID0KKyAgICAgICAgc25hcHNob3RGbG93IHsgYW5jaG9ycyB9LmZpbHRlciB7IGl0LmlzTm90RW1wdHkoKSB9LnRha2UoMSkKKworICAgIGludGVybmFsIHZhciBtaW5Cb3VuZCA9IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZCisgICAgaW50ZXJuYWwgdmFyIG1heEJvdW5kID0gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkKKworICAgIGludGVybmFsIGZ1biBlbnN1cmVJbml0KG5ld0FuY2hvcnM6IE1hcDxGbG9hdCwgVD4pIHsKKyAgICAgICAgaWYgKGFuY2hvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIGRvIGluaXRpYWwgc3luY2hyb25pemF0aW9uIHN5bmNocm9ub3VzbHkgOigKKyAgICAgICAgICAgIHZhbCBpbml0aWFsT2Zmc2V0ID0gbmV3QW5jaG9ycy5nZXRPZmZzZXQoY3VycmVudFZhbHVlKQorICAgICAgICAgICAgcmVxdWlyZU5vdE51bGwoaW5pdGlhbE9mZnNldCkgeyAiVGhlIGluaXRpYWwgdmFsdWUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgYW5jaG9yLiIgfQorICAgICAgICAgICAgb2Zmc2V0U3RhdGUudmFsdWUgPSBpbml0aWFsT2Zmc2V0CisgICAgICAgICAgICBhYnNvbHV0ZU9mZnNldC52YWx1ZSA9IGluaXRpYWxPZmZzZXQKKyAgICAgICAgfQorICAgIH0KKworICAgIGludGVybmFsIHN1c3BlbmQgZnVuIHByb2Nlc3NOZXdBbmNob3JzKG9sZEFuY2hvcnM6IE1hcDxGbG9hdCwgVD4sIG5ld0FuY2hvcnM6IE1hcDxGbG9hdCwgVD4pIHsKKyAgICAgICAgaWYgKG9sZEFuY2hvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoYXQgd2UgcmVjZWl2ZSBhbmNob3JzLCB0aGVuIHdlIG5lZWQgdG8gaW5pdGlhbGlzZQorICAgICAgICAgICAgLy8gdGhlIHN0YXRlIHNvIHdlIHNuYXAgdG8gdGhlIG9mZnNldCBhc3NvY2lhdGVkIHRvIHRoZSBpbml0aWFsIHZhbHVlLgorICAgICAgICAgICAgbWluQm91bmQgPSBuZXdBbmNob3JzLmtleXMubWluT3JOdWxsKCkhIQorICAgICAgICAgICAgbWF4Qm91bmQgPSBuZXdBbmNob3JzLmtleXMubWF4T3JOdWxsKCkhIQorICAgICAgICAgICAgdmFsIGluaXRpYWxPZmZzZXQgPSBuZXdBbmNob3JzLmdldE9mZnNldChjdXJyZW50VmFsdWUpCisgICAgICAgICAgICByZXF1aXJlTm90TnVsbChpbml0aWFsT2Zmc2V0KSB7ICJUaGUgaW5pdGlhbCB2YWx1ZSBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBhbmNob3IuIiB9CisgICAgICAgICAgICBzbmFwSW50ZXJuYWxUb09mZnNldChpbml0aWFsT2Zmc2V0KQorICAgICAgICB9IGVsc2UgaWYgKG5ld0FuY2hvcnMgIT0gb2xkQW5jaG9ycykgeworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSByZWNlaXZlZCBuZXcgYW5jaG9ycywgdGhlbiB0aGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IHZhbHVlIG1pZ2h0CisgICAgICAgICAgICAvLyBoYXZlIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gYW5pbWF0ZSB0byB0aGUgbmV3IG9mZnNldC4gSWYgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgIC8vIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYW5jaG9ycyB0aGVuIHdlIGFuaW1hdGUgdG8gdGhlIGNsb3Nlc3QgYW5jaG9yCisgICAgICAgICAgICAvLyBpbnN0ZWFkLiBOb3RlIHRoYXQgdGhpcyBzdG9wcyBhbnkgb25nb2luZyBhbmltYXRpb24uCisgICAgICAgICAgICBtaW5Cb3VuZCA9IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZCisgICAgICAgICAgICBtYXhCb3VuZCA9IEZsb2F0LlBPU0lUSVZFX0lORklOSVRZCisgICAgICAgICAgICB2YWwgYW5pbWF0aW9uVGFyZ2V0VmFsdWUgPSBhbmltYXRpb25UYXJnZXQudmFsdWUKKyAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIHRoZSBhbmltYXRpb24gYWxyZWFkeSwgbGV0J3MgZmluZCBpdCBhIG5ldyBob21lCisgICAgICAgICAgICB2YWwgdGFyZ2V0T2Zmc2V0ID0KKyAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uVGFyZ2V0VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCwgdHJ5IHRvIG1hcCBvbGQgc3RhdGUgdG8gdGhlIG5ldyBzdGF0ZQorICAgICAgICAgICAgICAgICAgICB2YWwgb2xkU3RhdGUgPSBvbGRBbmNob3JzW2FuaW1hdGlvblRhcmdldFZhbHVlXQorICAgICAgICAgICAgICAgICAgICB2YWwgbmV3U3RhdGUgPSBuZXdBbmNob3JzLmdldE9mZnNldChvbGRTdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIG5ldyBzdGF0ZSBpZiBleGlzdHMsIG9yIGZpbmQgdGhlIGNsb3NlcyBvbmUgYW1vbmcgbmV3IGFuY2hvcnMKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPzogbmV3QW5jaG9ycy5rZXlzLm1pbkJ5T3JOdWxsIHsgYWJzKGl0IC0gYW5pbWF0aW9uVGFyZ2V0VmFsdWUpIH0hIQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBhbmltYXRpbmcsIHByb2NlZWQgYnkgZmluZGluZyB0aGUgbmV3IGFuY2hvcnMgZm9yIGFuIG9sZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICB2YWwgYWN0dWFsT2xkVmFsdWUgPSBvbGRBbmNob3JzW29mZnNldC52YWx1ZV0KKyAgICAgICAgICAgICAgICAgICAgdmFsIHZhbHVlID0gaWYgKGFjdHVhbE9sZFZhbHVlID09IGN1cnJlbnRWYWx1ZSkgY3VycmVudFZhbHVlIGVsc2UgYWN0dWFsT2xkVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgbmV3QW5jaG9ycy5nZXRPZmZzZXQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICA/OiBuZXdBbmNob3JzLmtleXMubWluQnlPck51bGwgeyBhYnMoaXQgLSBvZmZzZXQudmFsdWUpIH0hIQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUludGVybmFsVG9PZmZzZXQodGFyZ2V0T2Zmc2V0LCBhbmltYXRpb25TcGVjKQorICAgICAgICAgICAgfSBjYXRjaCAoYzogQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFuaW1hdGlvbiB3YXMgaW50ZXJydXB0ZWQgZm9yIGFueSByZWFzb24sIHNuYXAgYXMgYSBsYXN0IHJlc29ydC4KKyAgICAgICAgICAgICAgICBzbmFwSW50ZXJuYWxUb09mZnNldCh0YXJnZXRPZmZzZXQpCisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IG5ld0FuY2hvcnMuZ2V0VmFsdWUodGFyZ2V0T2Zmc2V0KQorICAgICAgICAgICAgICAgIG1pbkJvdW5kID0gbmV3QW5jaG9ycy5rZXlzLm1pbk9yTnVsbCgpISEKKyAgICAgICAgICAgICAgICBtYXhCb3VuZCA9IG5ld0FuY2hvcnMua2V5cy5tYXhPck51bGwoKSEhCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnRlcm5hbCB2YXIgdGhyZXNob2xkczogKEZsb2F0LCBGbG9hdCkgLT4gRmxvYXQgYnkgbXV0YWJsZVN0YXRlT2YoeyBfLCBfIC0+IDBmIH0pCisKKyAgICBpbnRlcm5hbCB2YXIgdmVsb2NpdHlUaHJlc2hvbGQgYnkgbXV0YWJsZVN0YXRlT2YoMGYpCisKKyAgICBpbnRlcm5hbCB2YXIgcmVzaXN0YW5jZTogUmVzaXN0YW5jZUNvbmZpZz8gYnkgbXV0YWJsZVN0YXRlT2YobnVsbCkKKworICAgIGludGVybmFsIHZhbCBkcmFnZ2FibGVTdGF0ZSA9IERyYWdnYWJsZVN0YXRlIHsKKyAgICAgICAgdmFsIG5ld0Fic29sdXRlID0gYWJzb2x1dGVPZmZzZXQudmFsdWUgKyBpdAorICAgICAgICB2YWwgY2xhbXBlZCA9IG5ld0Fic29sdXRlLmNvZXJjZUluKG1pbkJvdW5kLCBtYXhCb3VuZCkKKyAgICAgICAgdmFsIG92ZXJmbG93ID0gbmV3QWJzb2x1dGUgLSBjbGFtcGVkCisgICAgICAgIHZhbCByZXNpc3RhbmNlRGVsdGEgPSByZXNpc3RhbmNlPy5jb21wdXRlUmVzaXN0YW5jZShvdmVyZmxvdykgPzogMGYKKyAgICAgICAgb2Zmc2V0U3RhdGUudmFsdWUgPSBjbGFtcGVkICsgcmVzaXN0YW5jZURlbHRhCisgICAgICAgIG92ZXJmbG93U3RhdGUudmFsdWUgPSBvdmVyZmxvdworICAgICAgICBhYnNvbHV0ZU9mZnNldC52YWx1ZSA9IG5ld0Fic29sdXRlCisgICAgfQorCisgICAgcHJpdmF0ZSBzdXNwZW5kIGZ1biBzbmFwSW50ZXJuYWxUb09mZnNldCh0YXJnZXQ6IEZsb2F0KSB7CisgICAgICAgIGRyYWdnYWJsZVN0YXRlLmRyYWcgeyBkcmFnQnkodGFyZ2V0IC0gYWJzb2x1dGVPZmZzZXQudmFsdWUpIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN1c3BlbmQgZnVuIGFuaW1hdGVJbnRlcm5hbFRvT2Zmc2V0KHRhcmdldDogRmxvYXQsIHNwZWM6IEFuaW1hdGlvblNwZWM8RmxvYXQ+KSB7CisgICAgICAgIGRyYWdnYWJsZVN0YXRlLmRyYWcgeworICAgICAgICAgICAgdmFyIHByZXZWYWx1ZSA9IGFic29sdXRlT2Zmc2V0LnZhbHVlCisgICAgICAgICAgICBhbmltYXRpb25UYXJnZXQudmFsdWUgPSB0YXJnZXQKKyAgICAgICAgICAgIGlzQW5pbWF0aW9uUnVubmluZyA9IHRydWUKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQW5pbWF0YWJsZShwcmV2VmFsdWUpLmFuaW1hdGVUbyh0YXJnZXQsIHNwZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgZHJhZ0J5KHRoaXMudmFsdWUgLSBwcmV2VmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZXZWYWx1ZSA9IHRoaXMudmFsdWUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGFuaW1hdGlvblRhcmdldC52YWx1ZSA9IG51bGwKKyAgICAgICAgICAgICAgICBpc0FuaW1hdGlvblJ1bm5pbmcgPSBmYWxzZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCB2YWx1ZSBvZiB0aGUgc3RhdGUuCisgICAgICoKKyAgICAgKiBJZiBhIHN3aXBlIGlzIGluIHByb2dyZXNzLCB0aGlzIGlzIHRoZSB2YWx1ZSB0aGF0IHRoZSBbc3dpcGVhYmxlXSB3b3VsZCBhbmltYXRlIHRvIGlmIHRoZQorICAgICAqIHN3aXBlIGZpbmlzaGVkLiBJZiBhbiBhbmltYXRpb24gaXMgcnVubmluZywgdGhpcyBpcyB0aGUgdGFyZ2V0IHZhbHVlIG9mIHRoYXQgYW5pbWF0aW9uLgorICAgICAqIEZpbmFsbHksIGlmIG5vIHN3aXBlIG9yIGFuaW1hdGlvbiBpcyBpbiBwcm9ncmVzcywgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgW2N1cnJlbnRWYWx1ZV0uCisgICAgICovCisgICAgdmFsIHRhcmdldFZhbHVlOiBUCisgICAgICAgIGdldCgpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oY2FsaW50YXQpOiBUcmFjayBjdXJyZW50IHZlbG9jaXR5IChiLzE0OTU0OTQ4MikgYW5kIHVzZSB0aGF0IGhlcmUuCisgICAgICAgICAgICB2YWwgdGFyZ2V0ID0KKyAgICAgICAgICAgICAgICBhbmltYXRpb25UYXJnZXQudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgPzogY29tcHV0ZVRhcmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldC52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZSA9IGFuY2hvcnMuZ2V0T2Zmc2V0KGN1cnJlbnRWYWx1ZSkgPzogb2Zmc2V0LnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9ycyA9IGFuY2hvcnMua2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgPSB0aHJlc2hvbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHkgPSAwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5VGhyZXNob2xkID0gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIGFuY2hvcnNbdGFyZ2V0XSA/OiBjdXJyZW50VmFsdWUKKyAgICAgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG9uZ29pbmcgc3dpcGUgb3IgYW5pbWF0aW9uLCBpZiBhbnkuIFNlZSBbU3dpcGVQcm9ncmVzc10gZm9yIGRldGFpbHMuCisgICAgICoKKyAgICAgKiBJZiBubyBzd2lwZSBvciBhbmltYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIHRoaXMgcmV0dXJucyBgU3dpcGVQcm9ncmVzcyh2YWx1ZSwgdmFsdWUsIDFmKWAuCisgICAgICovCisgICAgdmFsIHByb2dyZXNzOiBTd2lwZVByb2dyZXNzPFQ+CisgICAgICAgIGdldCgpIHsKKyAgICAgICAgICAgIHZhbCBib3VuZHMgPSBmaW5kQm91bmRzKG9mZnNldC52YWx1ZSwgYW5jaG9ycy5rZXlzKQorICAgICAgICAgICAgdmFsIGZyb206IFQKKyAgICAgICAgICAgIHZhbCB0bzogVAorICAgICAgICAgICAgdmFsIGZyYWN0aW9uOiBGbG9hdAorICAgICAgICAgICAgd2hlbiAoYm91bmRzLnNpemUpIHsKKyAgICAgICAgICAgICAgICAwIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IGN1cnJlbnRWYWx1ZQorICAgICAgICAgICAgICAgICAgICB0byA9IGN1cnJlbnRWYWx1ZQorICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDFmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIDEgLT4geworICAgICAgICAgICAgICAgICAgICBmcm9tID0gYW5jaG9ycy5nZXRWYWx1ZShib3VuZHNbMF0pCisgICAgICAgICAgICAgICAgICAgIHRvID0gYW5jaG9ycy5nZXRWYWx1ZShib3VuZHNbMF0pCisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHZhbCAoYSwgYikgPQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzWzBdIHRvIGJvdW5kc1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNbMV0gdG8gYm91bmRzWzBdCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBhbmNob3JzLmdldFZhbHVlKGEpCisgICAgICAgICAgICAgICAgICAgIHRvID0gYW5jaG9ycy5nZXRWYWx1ZShiKQorICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IChvZmZzZXQudmFsdWUgLSBhKSAvIChiIC0gYSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gU3dpcGVQcm9ncmVzcyhmcm9tLCB0bywgZnJhY3Rpb24pCisgICAgICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIFtzd2lwZWFibGVdIGlzIG1vdmluZywgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgW2N1cnJlbnRWYWx1ZV0uCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgYmUgZWl0aGVyIDFmIGlmIGl0IGlzIGlzIG1vdmluZyBmcm9tIGxlZnQgdG8gcmlnaHQgb3IgdG9wIHRvIGJvdHRvbSwgLTFmIGlmIGl0IGlzCisgICAgICogbW92aW5nIGZyb20gcmlnaHQgdG8gbGVmdCBvciBib3R0b20gdG8gdG9wLCBvciAwZiBpZiBubyBzd2lwZSBvciBhbmltYXRpb24gaXMgaW4gcHJvZ3Jlc3MuCisgICAgICovCisgICAgdmFsIGRpcmVjdGlvbjogRmxvYXQKKyAgICAgICAgZ2V0KCkgPSBhbmNob3JzLmdldE9mZnNldChjdXJyZW50VmFsdWUpPy5sZXQgeyBzaWduKG9mZnNldC52YWx1ZSAtIGl0KSB9ID86IDBmCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0YXRlIHdpdGhvdXQgYW55IGFuaW1hdGlvbiBhbmQgc3VzcGVuZCB1bnRpbCBpdCdzIHNldAorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldFZhbHVlIFRoZSBuZXcgdGFyZ2V0IHZhbHVlIHRvIHNldCBbY3VycmVudFZhbHVlXSB0by4KKyAgICAgKi8KKyAgICBzdXNwZW5kIGZ1biBzbmFwVG8odGFyZ2V0VmFsdWU6IFQpIHsKKyAgICAgICAgbGF0ZXN0Tm9uRW1wdHlBbmNob3JzRmxvdy5jb2xsZWN0IHsgYW5jaG9ycyAtPgorICAgICAgICAgICAgdmFsIHRhcmdldE9mZnNldCA9IGFuY2hvcnMuZ2V0T2Zmc2V0KHRhcmdldFZhbHVlKQorICAgICAgICAgICAgcmVxdWlyZU5vdE51bGwodGFyZ2V0T2Zmc2V0KSB7ICJUaGUgdGFyZ2V0IHZhbHVlIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGFuY2hvci4iIH0KKyAgICAgICAgICAgIHNuYXBJbnRlcm5hbFRvT2Zmc2V0KHRhcmdldE9mZnNldCkKKyAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFZhbHVlCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0YXRlIHRvIHRoZSB0YXJnZXQgdmFsdWUgYnkgc3RhcnRpbmcgYW4gYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldFZhbHVlIFRoZSBuZXcgdmFsdWUgdG8gYW5pbWF0ZSB0by4KKyAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFuaW1hdGUgdG8gdGhlIG5ldyB2YWx1ZS4KKyAgICAgKi8KKyAgICBzdXNwZW5kIGZ1biBhbmltYXRlVG8odGFyZ2V0VmFsdWU6IFQsIGFuaW06IEFuaW1hdGlvblNwZWM8RmxvYXQ+ID0gYW5pbWF0aW9uU3BlYykgeworICAgICAgICBsYXRlc3ROb25FbXB0eUFuY2hvcnNGbG93LmNvbGxlY3QgeyBhbmNob3JzIC0+CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHZhbCB0YXJnZXRPZmZzZXQgPSBhbmNob3JzLmdldE9mZnNldCh0YXJnZXRWYWx1ZSkKKyAgICAgICAgICAgICAgICByZXF1aXJlTm90TnVsbCh0YXJnZXRPZmZzZXQpIHsgIlRoZSB0YXJnZXQgdmFsdWUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgYW5jaG9yLiIgfQorICAgICAgICAgICAgICAgIGFuaW1hdGVJbnRlcm5hbFRvT2Zmc2V0KHRhcmdldE9mZnNldCwgYW5pbSkKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdmFsIGVuZE9mZnNldCA9IGFic29sdXRlT2Zmc2V0LnZhbHVlCisgICAgICAgICAgICAgICAgdmFsIGVuZFZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgYW5jaG9ycworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlnaHRpbmcgcm91bmRpbmcgZXJyb3Igb25jZSBhZ2FpbiwgYW5jaG9yIHNob3VsZCBiZSBhcyBjbG9zZSBhcyAwLjUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVscworICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcktleXMgeyBhbmNob3JPZmZzZXQgLT4gYWJzKGFuY2hvck9mZnNldCAtIGVuZE9mZnNldCkgPCAwLjVmIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdE9yTnVsbCgpCisgICAgICAgICAgICAgICAgICAgICAgICA/OiBjdXJyZW50VmFsdWUKKyAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBlbmRWYWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBmbGluZyB3aXRoIHNldHRsaW5nIHRvIG9uZSBvZiB0aGUgYW5jaG9ycyB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBnaXZlbgorICAgICAqIFt2ZWxvY2l0eV0uIEZsaW5nIHdpdGggc2V0dGxpbmcgW3N3aXBlYWJsZV0gd2lsbCBhbHdheXMgY29uc3VtZSBhbGwgdGhlIHZlbG9jaXR5IHByb3ZpZGVkCisgICAgICogc2luY2UgaXQgd2lsbCBzZXR0bGUgYXQgdGhlIGFuY2hvci4KKyAgICAgKgorICAgICAqIEluIGdlbmVyYWwgY2FzZXMsIFtzd2lwZWFibGVdIGZsaW5ncyBieSBpdHNlbGYgd2hlbiBiZWluZyBzd2lwZWQuIFRoaXMgbWV0aG9kIGlzIHRvIGJlIHVzZWQKKyAgICAgKiBmb3IgbmVzdGVkIHNjcm9sbCBsb2dpYyB0aGF0IHdyYXBzIHRoZSBbc3dpcGVhYmxlXS4gSW4gbmVzdGVkIHNjcm9sbCBkZXZlbG9wZXIgbWF5IHdhbnQgdG8KKyAgICAgKiB0cmlnZ2VyIHNldHRsaW5nIGZsaW5nIHdoZW4gdGhlIGNoaWxkIHNjcm9sbCBjb250YWluZXIgcmVhY2hlcyB0aGUgYm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVsb2NpdHkgdmVsb2NpdHkgdG8gZmxpbmcgYW5kIHNldHRsZSB3aXRoCisgICAgICogQHJldHVybiB0aGUgcmVhc29uIGZsaW5nIGVuZGVkCisgICAgICovCisgICAgc3VzcGVuZCBmdW4gcGVyZm9ybUZsaW5nKHZlbG9jaXR5OiBGbG9hdCkgeworICAgICAgICBsYXRlc3ROb25FbXB0eUFuY2hvcnNGbG93LmNvbGxlY3QgeyBhbmNob3JzIC0+CisgICAgICAgICAgICB2YWwgbGFzdEFuY2hvciA9IGFuY2hvcnMuZ2V0T2Zmc2V0KGN1cnJlbnRWYWx1ZSkhIQorICAgICAgICAgICAgdmFsIHRhcmdldFZhbHVlID0KKyAgICAgICAgICAgICAgICBjb21wdXRlVGFyZ2V0KAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQudmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGxhc3RWYWx1ZSA9IGxhc3RBbmNob3IsCisgICAgICAgICAgICAgICAgICAgIGFuY2hvcnMgPSBhbmNob3JzLmtleXMsCisgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgPSB0aHJlc2hvbGRzLAorICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eSA9IHZlbG9jaXR5LAorICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVRocmVzaG9sZCA9IHZlbG9jaXR5VGhyZXNob2xkCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgdmFsIHRhcmdldFN0YXRlID0gYW5jaG9yc1t0YXJnZXRWYWx1ZV0KKyAgICAgICAgICAgIGlmICh0YXJnZXRTdGF0ZSAhPSBudWxsICYmIGNvbmZpcm1TdGF0ZUNoYW5nZSh0YXJnZXRTdGF0ZSkpIGFuaW1hdGVUbyh0YXJnZXRTdGF0ZSkKKyAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIHZldG9lZCB0aGUgc3RhdGUgY2hhbmdlLCByb2xsYmFjayB0byB0aGUgcHJldmlvdXMgc3RhdGUuCisgICAgICAgICAgICBlbHNlIGFuaW1hdGVJbnRlcm5hbFRvT2Zmc2V0KGxhc3RBbmNob3IsIGFuaW1hdGlvblNwZWMpCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSBbc3dpcGVhYmxlXSB0byBjb25zdW1lIGRyYWcgZGVsdGEgcHJvdmlkZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSByZWd1bGFyIFtzd2lwZWFibGVdCisgICAgICogZ2VzdHVyZSBmbG93LgorICAgICAqCisgICAgICogTm90ZTogVGhpcyBtZXRob2QgcGVyZm9ybXMgZ2VuZXJpYyBkcmFnIGFuZCBpdCB3b24ndCBzZXR0bGUgdG8gYW55IHBhcnRpY3VsYXIgYW5jaG9yLCAqCisgICAgICogbGVhdmluZyBzd2lwZWFibGUgaW4gYmV0d2VlbiBhbmNob3JzLiBXaGVuIGRvbmUgZHJhZ2dpbmcsIFtwZXJmb3JtRmxpbmddIG11c3QgYmUgY2FsbGVkIGFzCisgICAgICogd2VsbCB0byBlbnN1cmUgc3dpcGVhYmxlIHdpbGwgc2V0dGxlIGF0IHRoZSBhbmNob3IuCisgICAgICoKKyAgICAgKiBJbiBnZW5lcmFsIGNhc2VzLCBbc3dpcGVhYmxlXSBkcmFncyBieSBpdHNlbGYgd2hlbiBiZWluZyBzd2lwZWQuIFRoaXMgbWV0aG9kIGlzIHRvIGJlIHVzZWQKKyAgICAgKiBmb3IgbmVzdGVkIHNjcm9sbCBsb2dpYyB0aGF0IHdyYXBzIHRoZSBbc3dpcGVhYmxlXS4gSW4gbmVzdGVkIHNjcm9sbCBkZXZlbG9wZXIgbWF5IHdhbnQgdG8KKyAgICAgKiBmb3JjZSBkcmFnIHdoZW4gdGhlIGNoaWxkIHNjcm9sbCBjb250YWluZXIgcmVhY2hlcyB0aGUgYm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVsdGEgZGVsdGEgaW4gcGl4ZWxzIHRvIGRyYWcgYnkKKyAgICAgKiBAcmV0dXJuIHRoZSBhbW91bnQgb2YgW2RlbHRhXSBjb25zdW1lZAorICAgICAqLworICAgIGZ1biBwZXJmb3JtRHJhZyhkZWx0YTogRmxvYXQpOiBGbG9hdCB7CisgICAgICAgIHZhbCBwb3RlbnRpYWxseUNvbnN1bWVkID0gYWJzb2x1dGVPZmZzZXQudmFsdWUgKyBkZWx0YQorICAgICAgICB2YWwgY2xhbXBlZCA9IHBvdGVudGlhbGx5Q29uc3VtZWQuY29lcmNlSW4obWluQm91bmQsIG1heEJvdW5kKQorICAgICAgICB2YWwgZGVsdGFUb0NvbnN1bWUgPSBjbGFtcGVkIC0gYWJzb2x1dGVPZmZzZXQudmFsdWUKKyAgICAgICAgaWYgKGFicyhkZWx0YVRvQ29uc3VtZSkgPiAwKSB7CisgICAgICAgICAgICBkcmFnZ2FibGVTdGF0ZS5kaXNwYXRjaFJhd0RlbHRhKGRlbHRhVG9Db25zdW1lKQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWx0YVRvQ29uc3VtZQorICAgIH0KKworICAgIGNvbXBhbmlvbiBvYmplY3QgeworICAgICAgICAvKiogVGhlIGRlZmF1bHQgW1NhdmVyXSBpbXBsZW1lbnRhdGlvbiBmb3IgW1N3aXBlYWJsZVN0YXRlXS4gKi8KKyAgICAgICAgZnVuIDxUIDogQW55PiBTYXZlcigKKyAgICAgICAgICAgIGFuaW1hdGlvblNwZWM6IEFuaW1hdGlvblNwZWM8RmxvYXQ+LAorICAgICAgICAgICAgY29uZmlybVN0YXRlQ2hhbmdlOiAoVCkgLT4gQm9vbGVhbgorICAgICAgICApID0KKyAgICAgICAgICAgIFNhdmVyPFN3aXBlYWJsZVN0YXRlPFQ+LCBUPigKKyAgICAgICAgICAgICAgICBzYXZlID0geyBpdC5jdXJyZW50VmFsdWUgfSwKKyAgICAgICAgICAgICAgICByZXN0b3JlID0geyBTd2lwZWFibGVTdGF0ZShpdCwgYW5pbWF0aW9uU3BlYywgY29uZmlybVN0YXRlQ2hhbmdlKSB9CisgICAgICAgICAgICApCisgICAgfQorfQorCisvKioKKyAqIENvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvbmdvaW5nIHN3aXBlIG9yIGFuaW1hdGlvbiBpbiBbc3dpcGVhYmxlXS4KKyAqCisgKiBUbyBhY2Nlc3MgdGhpcyBpbmZvcm1hdGlvbiwgdXNlIFtTd2lwZWFibGVTdGF0ZS5wcm9ncmVzc10uCisgKgorICogQHBhcmFtIGZyb20gVGhlIHN0YXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFuY2hvciB3ZSBhcmUgbW92aW5nIGF3YXkgZnJvbS4KKyAqIEBwYXJhbSB0byBUaGUgc3RhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgYW5jaG9yIHdlIGFyZSBtb3ZpbmcgdG93YXJkcy4KKyAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZnJhY3Rpb24gdGhhdCB0aGUgY3VycmVudCBwb3NpdGlvbiByZXByZXNlbnRzIGJldHdlZW4gW2Zyb21dIGFuZCBbdG9dLiBNdXN0CisgKiAgIGJlIGJldHdlZW4gYDBgIGFuZCBgMWAuCisgKi8KK0BJbW11dGFibGUKK2NsYXNzIFN3aXBlUHJvZ3Jlc3M8VD4oCisgICAgdmFsIGZyb206IFQsCisgICAgdmFsIHRvOiBULAorICAgIC8qQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApKi8KKyAgICB2YWwgZnJhY3Rpb246IEZsb2F0CispIHsKKyAgICBvdmVycmlkZSBmdW4gZXF1YWxzKG90aGVyOiBBbnk/KTogQm9vbGVhbiB7CisgICAgICAgIGlmICh0aGlzID09PSBvdGhlcikgcmV0dXJuIHRydWUKKyAgICAgICAgaWYgKG90aGVyICFpcyBTd2lwZVByb2dyZXNzPCo+KSByZXR1cm4gZmFsc2UKKworICAgICAgICBpZiAoZnJvbSAhPSBvdGhlci5mcm9tKSByZXR1cm4gZmFsc2UKKyAgICAgICAgaWYgKHRvICE9IG90aGVyLnRvKSByZXR1cm4gZmFsc2UKKyAgICAgICAgaWYgKGZyYWN0aW9uICE9IG90aGVyLmZyYWN0aW9uKSByZXR1cm4gZmFsc2UKKworICAgICAgICByZXR1cm4gdHJ1ZQorICAgIH0KKworICAgIG92ZXJyaWRlIGZ1biBoYXNoQ29kZSgpOiBJbnQgeworICAgICAgICB2YXIgcmVzdWx0ID0gZnJvbT8uaGFzaENvZGUoKSA/OiAwCisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHRvPy5oYXNoQ29kZSgpID86IDApCisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZnJhY3Rpb24uaGFzaENvZGUoKQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgfQorCisgICAgb3ZlcnJpZGUgZnVuIHRvU3RyaW5nKCk6IFN0cmluZyB7CisgICAgICAgIHJldHVybiAiU3dpcGVQcm9ncmVzcyhmcm9tPSRmcm9tLCB0bz0kdG8sIGZyYWN0aW9uPSRmcmFjdGlvbikiCisgICAgfQorfQorCisvKioKKyAqIENyZWF0ZSBhbmQgW3JlbWVtYmVyXSBhIFtTd2lwZWFibGVTdGF0ZV0gd2l0aCB0aGUgZGVmYXVsdCBhbmltYXRpb24gY2xvY2suCisgKgorICogQHBhcmFtIGluaXRpYWxWYWx1ZSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc3RhdGUuCisgKiBAcGFyYW0gYW5pbWF0aW9uU3BlYyBUaGUgZGVmYXVsdCBhbmltYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gYW5pbWF0ZSB0byBhIG5ldyBzdGF0ZS4KKyAqIEBwYXJhbSBjb25maXJtU3RhdGVDaGFuZ2UgT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCB0byBjb25maXJtIG9yIHZldG8gYSBwZW5kaW5nIHN0YXRlIGNoYW5nZS4KKyAqLworQENvbXBvc2FibGUKK2Z1biA8VCA6IEFueT4gcmVtZW1iZXJTd2lwZWFibGVTdGF0ZSgKKyAgICBpbml0aWFsVmFsdWU6IFQsCisgICAgYW5pbWF0aW9uU3BlYzogQW5pbWF0aW9uU3BlYzxGbG9hdD4gPSBBbmltYXRpb25TcGVjLAorICAgIGNvbmZpcm1TdGF0ZUNoYW5nZTogKG5ld1ZhbHVlOiBUKSAtPiBCb29sZWFuID0geyB0cnVlIH0KKyk6IFN3aXBlYWJsZVN0YXRlPFQ+IHsKKyAgICByZXR1cm4gcmVtZW1iZXJTYXZlYWJsZSgKKyAgICAgICAgc2F2ZXIgPQorICAgICAgICAgICAgU3dpcGVhYmxlU3RhdGUuU2F2ZXIoCisgICAgICAgICAgICAgICAgYW5pbWF0aW9uU3BlYyA9IGFuaW1hdGlvblNwZWMsCisgICAgICAgICAgICAgICAgY29uZmlybVN0YXRlQ2hhbmdlID0gY29uZmlybVN0YXRlQ2hhbmdlCisgICAgICAgICAgICApCisgICAgKSB7CisgICAgICAgIFN3aXBlYWJsZVN0YXRlKAorICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgYW5pbWF0aW9uU3BlYyA9IGFuaW1hdGlvblNwZWMsCisgICAgICAgICAgICBjb25maXJtU3RhdGVDaGFuZ2UgPSBjb25maXJtU3RhdGVDaGFuZ2UKKyAgICAgICAgKQorICAgIH0KK30KKworLyoqCisgKiBDcmVhdGUgYW5kIFtyZW1lbWJlcl0gYSBbU3dpcGVhYmxlU3RhdGVdIHdoaWNoIGlzIGtlcHQgaW4gc3luYyB3aXRoIGFub3RoZXIgc3RhdGUsIGkuZS46CisgKiAxLiBXaGVuZXZlciB0aGUgW3ZhbHVlXSBjaGFuZ2VzLCB0aGUgW1N3aXBlYWJsZVN0YXRlXSB3aWxsIGJlIGFuaW1hdGVkIHRvIHRoYXQgbmV3IHZhbHVlLgorICogMi4gV2hlbmV2ZXIgdGhlIHZhbHVlIG9mIHRoZSBbU3dpcGVhYmxlU3RhdGVdIGNoYW5nZXMgKGUuZy4gYWZ0ZXIgYSBzd2lwZSksIHRoZSBvd25lciBvZiB0aGUKKyAqICAgIFt2YWx1ZV0gd2lsbCBiZSBub3RpZmllZCB0byB1cGRhdGUgdGhlaXIgc3RhdGUgdG8gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgW1N3aXBlYWJsZVN0YXRlXSBieQorICogICAgaW52b2tpbmcgW29uVmFsdWVDaGFuZ2VdLiBJZiB0aGUgb3duZXIgZG9lcyBub3QgdXBkYXRlIHRoZWlyIHN0YXRlIHRvIHRoZSBwcm92aWRlZCB2YWx1ZSBmb3IKKyAqICAgIHNvbWUgcmVhc29uLCB0aGVuIHRoZSBbU3dpcGVhYmxlU3RhdGVdIHdpbGwgcGVyZm9ybSBhIHJvbGxiYWNrIHRvIHRoZSBwcmV2aW91cywgY29ycmVjdCB2YWx1ZS4KKyAqLworQENvbXBvc2FibGUKK2ludGVybmFsIGZ1biA8VCA6IEFueT4gcmVtZW1iZXJTd2lwZWFibGVTdGF0ZUZvcigKKyAgICB2YWx1ZTogVCwKKyAgICBvblZhbHVlQ2hhbmdlOiAoVCkgLT4gVW5pdCwKKyAgICBhbmltYXRpb25TcGVjOiBBbmltYXRpb25TcGVjPEZsb2F0PiA9IEFuaW1hdGlvblNwZWMKKyk6IFN3aXBlYWJsZVN0YXRlPFQ+IHsKKyAgICB2YWwgc3dpcGVhYmxlU3RhdGUgPSByZW1lbWJlciB7CisgICAgICAgIFN3aXBlYWJsZVN0YXRlKAorICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gdmFsdWUsCisgICAgICAgICAgICBhbmltYXRpb25TcGVjID0gYW5pbWF0aW9uU3BlYywKKyAgICAgICAgICAgIGNvbmZpcm1TdGF0ZUNoYW5nZSA9IHsgdHJ1ZSB9CisgICAgICAgICkKKyAgICB9CisgICAgdmFsIGZvcmNlQW5pbWF0aW9uQ2hlY2sgPSByZW1lbWJlciB7IG11dGFibGVTdGF0ZU9mKGZhbHNlKSB9CisgICAgTGF1bmNoZWRFZmZlY3QodmFsdWUsIGZvcmNlQW5pbWF0aW9uQ2hlY2sudmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IHN3aXBlYWJsZVN0YXRlLmN1cnJlbnRWYWx1ZSkgeworICAgICAgICAgICAgc3dpcGVhYmxlU3RhdGUuYW5pbWF0ZVRvKHZhbHVlKQorICAgICAgICB9CisgICAgfQorICAgIERpc3Bvc2FibGVFZmZlY3Qoc3dpcGVhYmxlU3RhdGUuY3VycmVudFZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBzd2lwZWFibGVTdGF0ZS5jdXJyZW50VmFsdWUpIHsKKyAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2Uoc3dpcGVhYmxlU3RhdGUuY3VycmVudFZhbHVlKQorICAgICAgICAgICAgZm9yY2VBbmltYXRpb25DaGVjay52YWx1ZSA9ICFmb3JjZUFuaW1hdGlvbkNoZWNrLnZhbHVlCisgICAgICAgIH0KKyAgICAgICAgb25EaXNwb3NlIHt9CisgICAgfQorICAgIHJldHVybiBzd2lwZWFibGVTdGF0ZQorfQorCisvKioKKyAqIEVuYWJsZSBzd2lwZSBnZXN0dXJlcyBiZXR3ZWVuIGEgc2V0IG9mIHByZWRlZmluZWQgc3RhdGVzLgorICoKKyAqIFRvIHVzZSB0aGlzLCB5b3UgbXVzdCBwcm92aWRlIGEgbWFwIG9mIGFuY2hvcnMgKGluIHBpeGVscykgdG8gc3RhdGVzIChvZiB0eXBlIFtUXSkuIE5vdGUgdGhhdAorICogdGhpcyBtYXAgY2Fubm90IGJlIGVtcHR5IGFuZCBjYW5ub3QgaGF2ZSB0d28gYW5jaG9ycyBtYXBwZWQgdG8gdGhlIHNhbWUgc3RhdGUuCisgKgorICogV2hlbiBhIHN3aXBlIGlzIGRldGVjdGVkLCB0aGUgb2Zmc2V0IG9mIHRoZSBbU3dpcGVhYmxlU3RhdGVdIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBzd2lwZQorICogZGVsdGEuIFlvdSBzaG91bGQgdXNlIHRoaXMgb2Zmc2V0IHRvIG1vdmUgeW91ciBjb250ZW50IGFjY29yZGluZ2x5IChzZWUgYE1vZGlmaWVyLm9mZnNldFB4YCkuCisgKiBXaGVuIHRoZSBzd2lwZSBlbmRzLCB0aGUgb2Zmc2V0IHdpbGwgYmUgYW5pbWF0ZWQgdG8gb25lIG9mIHRoZSBhbmNob3JzIGFuZCB3aGVuIHRoYXQgYW5jaG9yIGlzCisgKiByZWFjaGVkLCB0aGUgdmFsdWUgb2YgdGhlIFtTd2lwZWFibGVTdGF0ZV0gd2lsbCBhbHNvIGJlIHVwZGF0ZWQgdG8gdGhlIHN0YXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKiBuZXcgYW5jaG9yLiBUaGUgdGFyZ2V0IGFuY2hvciBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwb3NpdGlvbmFsIFt0aHJlc2hvbGRzXS4KKyAqCisgKiBTd2lwaW5nIGlzIGNvbnN0cmFpbmVkIGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYW5jaG9ycy4gSWYgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gc3dpcGUKKyAqIHBhc3QgdGhlc2UgYm91bmRzLCBhIHJlc2lzdGFuY2UgZWZmZWN0IHdpbGwgYmUgYXBwbGllZCBieSBkZWZhdWx0LiBUaGUgYW1vdW50IG9mIHJlc2lzdGFuY2UgYXQKKyAqIGVhY2ggZWRnZSBpcyBzcGVjaWZpZWQgYnkgdGhlIFtyZXNpc3RhbmNlXSBjb25maWcuIFRvIGRpc2FibGUgYWxsIHJlc2lzdGFuY2UsIHNldCBpdCB0byBgbnVsbGAuCisgKgorICogRm9yIGFuIGV4YW1wbGUgb2YgYSBbc3dpcGVhYmxlXSB3aXRoIHRocmVlIHN0YXRlcywgc2VlOgorICoKKyAqIEBwYXJhbSBUIFRoZSB0eXBlIG9mIHRoZSBzdGF0ZS4KKyAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgb2YgdGhlIFtzd2lwZWFibGVdLgorICogQHBhcmFtIGFuY2hvcnMgUGFpcnMgb2YgYW5jaG9ycyBhbmQgc3RhdGVzLCB1c2VkIHRvIG1hcCBhbmNob3JzIHRvIHN0YXRlcyBhbmQgdmljZSB2ZXJzYS4KKyAqIEBwYXJhbSB0aHJlc2hvbGRzIFNwZWNpZmllcyB3aGVyZSB0aGUgdGhyZXNob2xkcyBiZXR3ZWVuIHRoZSBzdGF0ZXMgYXJlLiBUaGUgdGhyZXNob2xkcyB3aWxsIGJlCisgKiAgIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHN0YXRlIHRvIGFuaW1hdGUgdG8gd2hlbiBzd2lwaW5nIHN0b3BzLiBUaGlzIGlzIHJlcHJlc2VudGVkIGFzIGEgbGFtYmRhCisgKiAgIHRoYXQgdGFrZXMgdHdvIHN0YXRlcyBhbmQgcmV0dXJucyB0aGUgdGhyZXNob2xkIGJldHdlZW4gdGhlbSBpbiB0aGUgZm9ybSBvZiBhCisgKiAgIFtUaHJlc2hvbGRDb25maWddLiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBzdGF0ZXMgY29ycmVzcG9uZHMgdG8gdGhlIHN3aXBlIGRpcmVjdGlvbi4KKyAqIEBwYXJhbSBvcmllbnRhdGlvbiBUaGUgb3JpZW50YXRpb24gaW4gd2hpY2ggdGhlIFtzd2lwZWFibGVdIGNhbiBiZSBzd2lwZWQuCisgKiBAcGFyYW0gZW5hYmxlZCBXaGV0aGVyIHRoaXMgW3N3aXBlYWJsZV0gaXMgZW5hYmxlZCBhbmQgc2hvdWxkIHJlYWN0IHRvIHRoZSB1c2VyJ3MgaW5wdXQuCisgKiBAcGFyYW0gcmV2ZXJzZURpcmVjdGlvbiBXaGV0aGVyIHRvIHJldmVyc2UgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3dpcGUsIHNvIGEgdG9wIHRvIGJvdHRvbSBzd2lwZQorICogICB3aWxsIGJlaGF2ZSBsaWtlIGJvdHRvbSB0byB0b3AsIGFuZCBhIGxlZnQgdG8gcmlnaHQgc3dpcGUgd2lsbCBiZWhhdmUgbGlrZSByaWdodCB0byBsZWZ0LgorICogQHBhcmFtIGludGVyYWN0aW9uU291cmNlIE9wdGlvbmFsIFtNdXRhYmxlSW50ZXJhY3Rpb25Tb3VyY2VdIHRoYXQgd2lsbCBwYXNzZWQgb24gdG8gdGhlIGludGVybmFsCisgKiAgIFtNb2RpZmllci5kcmFnZ2FibGVdLgorICogQHBhcmFtIHJlc2lzdGFuY2UgQ29udHJvbHMgaG93IG11Y2ggcmVzaXN0YW5jZSB3aWxsIGJlIGFwcGxpZWQgd2hlbiBzd2lwaW5nIHBhc3QgdGhlIGJvdW5kcy4KKyAqIEBwYXJhbSB2ZWxvY2l0eVRocmVzaG9sZCBUaGUgdGhyZXNob2xkIChpbiBkcCBwZXIgc2Vjb25kKSB0aGF0IHRoZSBlbmQgdmVsb2NpdHkgaGFzIHRvIGV4Y2VlZCBpbgorICogICBvcmRlciB0byBhbmltYXRlIHRvIHRoZSBuZXh0IHN0YXRlLCBldmVuIGlmIHRoZSBwb3NpdGlvbmFsIFt0aHJlc2hvbGRzXSBoYXZlIG5vdCBiZWVuIHJlYWNoZWQuCisgKiBAc2FtcGxlIGFuZHJvaWR4LmNvbXBvc2UubWF0ZXJpYWwuc2FtcGxlcy5Td2lwZWFibGVTYW1wbGUKKyAqLworZnVuIDxUPiBNb2RpZmllci5zd2lwZWFibGUoCisgICAgc3RhdGU6IFN3aXBlYWJsZVN0YXRlPFQ+LAorICAgIGFuY2hvcnM6IE1hcDxGbG9hdCwgVD4sCisgICAgb3JpZW50YXRpb246IE9yaWVudGF0aW9uLAorICAgIGVuYWJsZWQ6IEJvb2xlYW4gPSB0cnVlLAorICAgIHJldmVyc2VEaXJlY3Rpb246IEJvb2xlYW4gPSBmYWxzZSwKKyAgICBpbnRlcmFjdGlvblNvdXJjZTogTXV0YWJsZUludGVyYWN0aW9uU291cmNlPyA9IG51bGwsCisgICAgdGhyZXNob2xkczogKGZyb206IFQsIHRvOiBUKSAtPiBUaHJlc2hvbGRDb25maWcgPSB7IF8sIF8gLT4gRml4ZWRUaHJlc2hvbGQoNTYuZHApIH0sCisgICAgcmVzaXN0YW5jZTogUmVzaXN0YW5jZUNvbmZpZz8gPSByZXNpc3RhbmNlQ29uZmlnKGFuY2hvcnMua2V5cyksCisgICAgdmVsb2NpdHlUaHJlc2hvbGQ6IERwID0gVmVsb2NpdHlUaHJlc2hvbGQKKykgPQorICAgIGNvbXBvc2VkKAorICAgICAgICBpbnNwZWN0b3JJbmZvID0KKyAgICAgICAgICAgIGRlYnVnSW5zcGVjdG9ySW5mbyB7CisgICAgICAgICAgICAgICAgbmFtZSA9ICJzd2lwZWFibGUiCisgICAgICAgICAgICAgICAgcHJvcGVydGllc1sic3RhdGUiXSA9IHN0YXRlCisgICAgICAgICAgICAgICAgcHJvcGVydGllc1siYW5jaG9ycyJdID0gYW5jaG9ycworICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbIm9yaWVudGF0aW9uIl0gPSBvcmllbnRhdGlvbgorICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbImVuYWJsZWQiXSA9IGVuYWJsZWQKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzWyJyZXZlcnNlRGlyZWN0aW9uIl0gPSByZXZlcnNlRGlyZWN0aW9uCisgICAgICAgICAgICAgICAgcHJvcGVydGllc1siaW50ZXJhY3Rpb25Tb3VyY2UiXSA9IGludGVyYWN0aW9uU291cmNlCisgICAgICAgICAgICAgICAgcHJvcGVydGllc1sidGhyZXNob2xkcyJdID0gdGhyZXNob2xkcworICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbInJlc2lzdGFuY2UiXSA9IHJlc2lzdGFuY2UKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzWyJ2ZWxvY2l0eVRocmVzaG9sZCJdID0gdmVsb2NpdHlUaHJlc2hvbGQKKyAgICAgICAgICAgIH0KKyAgICApIHsKKyAgICAgICAgcmVxdWlyZShhbmNob3JzLmlzTm90RW1wdHkoKSkgeyAiWW91IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYW5jaG9yLiIgfQorICAgICAgICByZXF1aXJlKGFuY2hvcnMudmFsdWVzLmRpc3RpbmN0KCkuY291bnQoKSA9PSBhbmNob3JzLnNpemUpIHsKKyAgICAgICAgICAgICJZb3UgY2Fubm90IGhhdmUgdHdvIGFuY2hvcnMgbWFwcGVkIHRvIHRoZSBzYW1lIHN0YXRlLiIKKyAgICAgICAgfQorICAgICAgICB2YWwgZGVuc2l0eSA9IExvY2FsRGVuc2l0eS5jdXJyZW50CisgICAgICAgIHN0YXRlLmVuc3VyZUluaXQoYW5jaG9ycykKKyAgICAgICAgTGF1bmNoZWRFZmZlY3QoYW5jaG9ycywgc3RhdGUpIHsKKyAgICAgICAgICAgIHZhbCBvbGRBbmNob3JzID0gc3RhdGUuYW5jaG9ycworICAgICAgICAgICAgc3RhdGUuYW5jaG9ycyA9IGFuY2hvcnMKKyAgICAgICAgICAgIHN0YXRlLnJlc2lzdGFuY2UgPSByZXNpc3RhbmNlCisgICAgICAgICAgICBzdGF0ZS50aHJlc2hvbGRzID0geyBhLCBiIC0+CisgICAgICAgICAgICAgICAgdmFsIGZyb20gPSBhbmNob3JzLmdldFZhbHVlKGEpCisgICAgICAgICAgICAgICAgdmFsIHRvID0gYW5jaG9ycy5nZXRWYWx1ZShiKQorICAgICAgICAgICAgICAgIHdpdGgodGhyZXNob2xkcyhmcm9tLCB0bykpIHsgZGVuc2l0eS5jb21wdXRlVGhyZXNob2xkKGEsIGIpIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdpdGgoZGVuc2l0eSkgeyBzdGF0ZS52ZWxvY2l0eVRocmVzaG9sZCA9IHZlbG9jaXR5VGhyZXNob2xkLnRvUHgoKSB9CisgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzTmV3QW5jaG9ycyhvbGRBbmNob3JzLCBhbmNob3JzKQorICAgICAgICB9CisKKyAgICAgICAgTW9kaWZpZXIuZHJhZ2dhYmxlKAorICAgICAgICAgICAgb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbiwKKyAgICAgICAgICAgIGVuYWJsZWQgPSBlbmFibGVkLAorICAgICAgICAgICAgcmV2ZXJzZURpcmVjdGlvbiA9IHJldmVyc2VEaXJlY3Rpb24sCisgICAgICAgICAgICBpbnRlcmFjdGlvblNvdXJjZSA9IGludGVyYWN0aW9uU291cmNlLAorICAgICAgICAgICAgc3RhcnREcmFnSW1tZWRpYXRlbHkgPSBzdGF0ZS5pc0FuaW1hdGlvblJ1bm5pbmcsCisgICAgICAgICAgICBvbkRyYWdTdG9wcGVkID0geyB2ZWxvY2l0eSAtPiBsYXVuY2ggeyBzdGF0ZS5wZXJmb3JtRmxpbmcodmVsb2NpdHkpIH0gfSwKKyAgICAgICAgICAgIHN0YXRlID0gc3RhdGUuZHJhZ2dhYmxlU3RhdGUKKyAgICAgICAgKQorICAgIH0KKworLyoqCisgKiBJbnRlcmZhY2UgdG8gY29tcHV0ZSBhIHRocmVzaG9sZCBiZXR3ZWVuIHR3byBhbmNob3JzL3N0YXRlcyBpbiBhIFtzd2lwZWFibGVdLgorICoKKyAqIFRvIGRlZmluZSBhIFtUaHJlc2hvbGRDb25maWddLCBjb25zaWRlciB1c2luZyBbRml4ZWRUaHJlc2hvbGRdIGFuZCBbRnJhY3Rpb25hbFRocmVzaG9sZF0uCisgKi8KK0BTdGFibGUKK2ludGVyZmFjZSBUaHJlc2hvbGRDb25maWcgeworICAgIC8qKiBDb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUgdGhyZXNob2xkIChpbiBwaXhlbHMpLCBvbmNlIHRoZSB2YWx1ZXMgb2YgdGhlIGFuY2hvcnMgYXJlIGtub3duLiAqLworICAgIGZ1biBEZW5zaXR5LmNvbXB1dGVUaHJlc2hvbGQoZnJvbVZhbHVlOiBGbG9hdCwgdG9WYWx1ZTogRmxvYXQpOiBGbG9hdAorfQorCisvKioKKyAqIEEgZml4ZWQgdGhyZXNob2xkIHdpbGwgYmUgYXQgYW4gW29mZnNldF0gYXdheSBmcm9tIHRoZSBmaXJzdCBhbmNob3IuCisgKgorICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IChpbiBkcCkgdGhhdCB0aGUgdGhyZXNob2xkIHdpbGwgYmUgYXQuCisgKi8KK0BJbW11dGFibGUKK2RhdGEgY2xhc3MgRml4ZWRUaHJlc2hvbGQocHJpdmF0ZSB2YWwgb2Zmc2V0OiBEcCkgOiBUaHJlc2hvbGRDb25maWcgeworICAgIG92ZXJyaWRlIGZ1biBEZW5zaXR5LmNvbXB1dGVUaHJlc2hvbGQoZnJvbVZhbHVlOiBGbG9hdCwgdG9WYWx1ZTogRmxvYXQpOiBGbG9hdCB7CisgICAgICAgIHJldHVybiBmcm9tVmFsdWUgKyBvZmZzZXQudG9QeCgpICogc2lnbih0b1ZhbHVlIC0gZnJvbVZhbHVlKQorICAgIH0KK30KKworLyoqCisgKiBBIGZyYWN0aW9uYWwgdGhyZXNob2xkIHdpbGwgYmUgYXQgYSBbZnJhY3Rpb25dIG9mIHRoZSB3YXkgYmV0d2VlbiB0aGUgdHdvIGFuY2hvcnMuCisgKgorICogQHBhcmFtIGZyYWN0aW9uIFRoZSBmcmFjdGlvbiAoYmV0d2VlbiAwIGFuZCAxKSB0aGF0IHRoZSB0aHJlc2hvbGQgd2lsbCBiZSBhdC4KKyAqLworQEltbXV0YWJsZQorZGF0YSBjbGFzcyBGcmFjdGlvbmFsVGhyZXNob2xkKAorICAgIC8qQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApKi8KKyAgICBwcml2YXRlIHZhbCBmcmFjdGlvbjogRmxvYXQKKykgOiBUaHJlc2hvbGRDb25maWcgeworICAgIG92ZXJyaWRlIGZ1biBEZW5zaXR5LmNvbXB1dGVUaHJlc2hvbGQoZnJvbVZhbHVlOiBGbG9hdCwgdG9WYWx1ZTogRmxvYXQpOiBGbG9hdCB7CisgICAgICAgIHJldHVybiBsZXJwKGZyb21WYWx1ZSwgdG9WYWx1ZSwgZnJhY3Rpb24pCisgICAgfQorfQorCisvKioKKyAqIFNwZWNpZmllcyBob3cgcmVzaXN0YW5jZSBpcyBjYWxjdWxhdGVkIGluIFtzd2lwZWFibGVdLgorICoKKyAqIFRoZXJlIGFyZSB0d28gdGhpbmdzIG5lZWRlZCB0byBjYWxjdWxhdGUgcmVzaXN0YW5jZTogdGhlIHJlc2lzdGFuY2UgYmFzaXMgZGV0ZXJtaW5lcyBob3cgbXVjaAorICogb3ZlcmZsb3cgd2lsbCBiZSBjb25zdW1lZCB0byBhY2hpZXZlIG1heGltdW0gcmVzaXN0YW5jZSwgYW5kIHRoZSByZXNpc3RhbmNlIGZhY3RvciBkZXRlcm1pbmVzIHRoZQorICogYW1vdW50IG9mIHJlc2lzdGFuY2UgKHRoZSBsYXJnZXIgdGhlIHJlc2lzdGFuY2UgZmFjdG9yLCB0aGUgc3Ryb25nZXIgdGhlIHJlc2lzdGFuY2UpLgorICoKKyAqIFRoZSByZXNpc3RhbmNlIGJhc2lzIGlzIHVzdWFsbHkgZWl0aGVyIHRoZSBzaXplIG9mIHRoZSBjb21wb25lbnQgd2hpY2ggW3N3aXBlYWJsZV0gaXMgYXBwbGllZCB0bywKKyAqIG9yIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGFuY2hvcnMuIEZvciBhIGNvbnN0cnVjdG9yIGluIHdoaWNoIHRoZQorICogcmVzaXN0YW5jZSBiYXNpcyBkZWZhdWx0cyB0byB0aGUgbGF0dGVyLCBjb25zaWRlciB1c2luZyBbcmVzaXN0YW5jZUNvbmZpZ10uCisgKgorICogWW91IG1heSBzcGVjaWZ5IGRpZmZlcmVudCByZXNpc3RhbmNlIGZhY3RvcnMgZm9yIGVhY2ggYm91bmQuIENvbnNpZGVyIHVzaW5nIG9uZSBvZiB0aGUgZGVmYXVsdAorICogcmVzaXN0YW5jZSBmYWN0b3JzIGluIFtTd2lwZWFibGVEZWZhdWx0c106IGBTdGFuZGFyZFJlc2lzdGFuY2VGYWN0b3JgIHRvIGNvbnZleSB0aGF0IHRoZSB1c2VyIGhhcworICogcnVuIG91dCBvZiB0aGluZ3MgdG8gc2VlLCBhbmQgYFN0aWZmUmVzaXN0YW5jZUZhY3RvcmAgdG8gY29udmV5IHRoYXQgdGhlIHVzZXIgY2Fubm90IHN3aXBlIHRoaXMKKyAqIHJpZ2h0IG5vdy4gQWxzbywgeW91IGNhbiBzZXQgZWl0aGVyIGZhY3RvciB0byAwIHRvIGRpc2FibGUgcmVzaXN0YW5jZSBhdCB0aGF0IGJvdW5kLgorICoKKyAqIEBwYXJhbSBiYXNpcyBTcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIG92ZXJmbG93IHRoYXQgd2lsbCBiZSBjb25zdW1lZC4gTXVzdCBiZSBwb3NpdGl2ZS4KKyAqIEBwYXJhbSBmYWN0b3JBdE1pbiBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRvIHNjYWxlIHRoZSByZXNpc3RhbmNlIGF0IHRoZSBtaW5pbXVtIGJvdW5kLiBNdXN0IG5vdCBiZQorICogICBuZWdhdGl2ZS4KKyAqIEBwYXJhbSBmYWN0b3JBdE1heCBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRvIHNjYWxlIHRoZSByZXNpc3RhbmNlIGF0IHRoZSBtYXhpbXVtIGJvdW5kLiBNdXN0IG5vdCBiZQorICogICBuZWdhdGl2ZS4KKyAqLworQEltbXV0YWJsZQorY2xhc3MgUmVzaXN0YW5jZUNvbmZpZygKKyAgICAvKkBGbG9hdFJhbmdlKGZyb20gPSAwLjAsIGZyb21JbmNsdXNpdmUgPSBmYWxzZSkqLworICAgIHZhbCBiYXNpczogRmxvYXQsCisgICAgLypARmxvYXRSYW5nZShmcm9tID0gMC4wKSovCisgICAgdmFsIGZhY3RvckF0TWluOiBGbG9hdCA9IFN0YW5kYXJkUmVzaXN0YW5jZUZhY3RvciwKKyAgICAvKkBGbG9hdFJhbmdlKGZyb20gPSAwLjApKi8KKyAgICB2YWwgZmFjdG9yQXRNYXg6IEZsb2F0ID0gU3RhbmRhcmRSZXNpc3RhbmNlRmFjdG9yCispIHsKKyAgICBmdW4gY29tcHV0ZVJlc2lzdGFuY2Uob3ZlcmZsb3c6IEZsb2F0KTogRmxvYXQgeworICAgICAgICB2YWwgZmFjdG9yID0gaWYgKG92ZXJmbG93IDwgMCkgZmFjdG9yQXRNaW4gZWxzZSBmYWN0b3JBdE1heAorICAgICAgICBpZiAoZmFjdG9yID09IDBmKSByZXR1cm4gMGYKKyAgICAgICAgdmFsIHByb2dyZXNzID0gKG92ZXJmbG93IC8gYmFzaXMpLmNvZXJjZUluKC0xZiwgMWYpCisgICAgICAgIHJldHVybiBiYXNpcyAvIGZhY3RvciAqIHNpbihwcm9ncmVzcyAqIFBJLnRvRmxvYXQoKSAvIDIpCisgICAgfQorCisgICAgb3ZlcnJpZGUgZnVuIGVxdWFscyhvdGhlcjogQW55Pyk6IEJvb2xlYW4geworICAgICAgICBpZiAodGhpcyA9PT0gb3RoZXIpIHJldHVybiB0cnVlCisgICAgICAgIGlmIChvdGhlciAhaXMgUmVzaXN0YW5jZUNvbmZpZykgcmV0dXJuIGZhbHNlCisKKyAgICAgICAgaWYgKGJhc2lzICE9IG90aGVyLmJhc2lzKSByZXR1cm4gZmFsc2UKKyAgICAgICAgaWYgKGZhY3RvckF0TWluICE9IG90aGVyLmZhY3RvckF0TWluKSByZXR1cm4gZmFsc2UKKyAgICAgICAgaWYgKGZhY3RvckF0TWF4ICE9IG90aGVyLmZhY3RvckF0TWF4KSByZXR1cm4gZmFsc2UKKworICAgICAgICByZXR1cm4gdHJ1ZQorICAgIH0KKworICAgIG92ZXJyaWRlIGZ1biBoYXNoQ29kZSgpOiBJbnQgeworICAgICAgICB2YXIgcmVzdWx0ID0gYmFzaXMuaGFzaENvZGUoKQorICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGZhY3RvckF0TWluLmhhc2hDb2RlKCkKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBmYWN0b3JBdE1heC5oYXNoQ29kZSgpCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICB9CisKKyAgICBvdmVycmlkZSBmdW4gdG9TdHJpbmcoKTogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuICJSZXNpc3RhbmNlQ29uZmlnKGJhc2lzPSRiYXNpcywgZmFjdG9yQXRNaW49JGZhY3RvckF0TWluLCBmYWN0b3JBdE1heD0kZmFjdG9yQXRNYXgpIgorICAgIH0KK30KKworLyoqCisgKiBHaXZlbiBhbiBvZmZzZXQgeCBhbmQgYSBzZXQgb2YgYW5jaG9ycywgcmV0dXJuIGEgbGlzdCBvZiBhbmNob3JzOgorICogMS4gWyBdIGlmIHRoZSBzZXQgb2YgYW5jaG9ycyBpcyBlbXB0eSwKKyAqIDIuIFsgeCcgXSBpZiB4IGlzIGVxdWFsIHRvIG9uZSBvZiB0aGUgYW5jaG9ycywgYWNjb3VudGluZyBmb3IgYSBzbWFsbCByb3VuZGluZyBlcnJvciwgd2hlcmUgeCcgaXMKKyAqICAgIHggcm91bmRlZCB0byB0aGUgZXhhY3QgdmFsdWUgb2YgdGhlIG1hdGNoaW5nIGFuY2hvciwKKyAqIDMuIFsgbWluIF0gaWYgbWluIGlzIHRoZSBtaW5pbXVtIGFuY2hvciBhbmQgeCA8IG1pbiwKKyAqIDQuIFsgbWF4IF0gaWYgbWF4IGlzIHRoZSBtYXhpbXVtIGFuY2hvciBhbmQgeCA+IG1heCwgb3IKKyAqIDUuIFsgYSAsIGIgXSBpZiBhIGFuZCBiIGFyZSBhbmNob3JzIHN1Y2ggdGhhdCBhIDwgeCA8IGIgYW5kIGIgLSBhIGlzIG1pbmltYWwuCisgKi8KK3ByaXZhdGUgZnVuIGZpbmRCb3VuZHMob2Zmc2V0OiBGbG9hdCwgYW5jaG9yczogU2V0PEZsb2F0Pik6IExpc3Q8RmxvYXQ+IHsKKyAgICAvLyBGaW5kIHRoZSBhbmNob3JzIHRoZSB0YXJnZXQgbGllcyBiZXR3ZWVuIHdpdGggYSBsaXR0bGUgYml0IG9mIHJvdW5kaW5nIGVycm9yLgorICAgIHZhbCBhID0gYW5jaG9ycy5maWx0ZXIgeyBpdCA8PSBvZmZzZXQgKyAwLjAwMSB9Lm1heE9yTnVsbCgpCisgICAgdmFsIGIgPSBhbmNob3JzLmZpbHRlciB7IGl0ID49IG9mZnNldCAtIDAuMDAxIH0ubWluT3JOdWxsKCkKKworICAgIHJldHVybiB3aGVuIHsKKyAgICAgICAgYSA9PSBudWxsIC0+CisgICAgICAgICAgICAvLyBjYXNlIDEgb3IgMworICAgICAgICAgICAgbGlzdE9mTm90TnVsbChiKQorICAgICAgICBiID09IG51bGwgLT4KKyAgICAgICAgICAgIC8vIGNhc2UgNAorICAgICAgICAgICAgbGlzdE9mKGEpCisgICAgICAgIGEgPT0gYiAtPgorICAgICAgICAgICAgLy8gY2FzZSAyCisgICAgICAgICAgICAvLyBDYW4ndCByZXR1cm4gb2Zmc2V0IGl0c2VsZiBoZXJlIHNpbmNlIGl0IG1pZ2h0IG5vdCBiZSBleGFjdGx5IGVxdWFsCisgICAgICAgICAgICAvLyB0byB0aGUgYW5jaG9yLCBkZXNwaXRlIGJlaW5nIGNvbnNpZGVyZWQgYW4gZXhhY3QgbWF0Y2guCisgICAgICAgICAgICBsaXN0T2YoYSkKKyAgICAgICAgZWxzZSAtPgorICAgICAgICAgICAgLy8gY2FzZSA1CisgICAgICAgICAgICBsaXN0T2YoYSwgYikKKyAgICB9Cit9CisKK3ByaXZhdGUgZnVuIGNvbXB1dGVUYXJnZXQoCisgICAgb2Zmc2V0OiBGbG9hdCwKKyAgICBsYXN0VmFsdWU6IEZsb2F0LAorICAgIGFuY2hvcnM6IFNldDxGbG9hdD4sCisgICAgdGhyZXNob2xkczogKEZsb2F0LCBGbG9hdCkgLT4gRmxvYXQsCisgICAgdmVsb2NpdHk6IEZsb2F0LAorICAgIHZlbG9jaXR5VGhyZXNob2xkOiBGbG9hdAorKTogRmxvYXQgeworICAgIHZhbCBib3VuZHMgPSBmaW5kQm91bmRzKG9mZnNldCwgYW5jaG9ycykKKyAgICByZXR1cm4gd2hlbiAoYm91bmRzLnNpemUpIHsKKyAgICAgICAgMCAtPiBsYXN0VmFsdWUKKyAgICAgICAgMSAtPiBib3VuZHNbMF0KKyAgICAgICAgZWxzZSAtPiB7CisgICAgICAgICAgICB2YWwgbG93ZXIgPSBib3VuZHNbMF0KKyAgICAgICAgICAgIHZhbCB1cHBlciA9IGJvdW5kc1sxXQorICAgICAgICAgICAgaWYgKGxhc3RWYWx1ZSA8PSBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAvLyBTd2lwaW5nIGZyb20gbG93ZXIgdG8gdXBwZXIgKHBvc2l0aXZlKS4KKyAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPj0gdmVsb2NpdHlUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwcGVyCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsIHRocmVzaG9sZCA9IHRocmVzaG9sZHMobG93ZXIsIHVwcGVyKQorICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgdGhyZXNob2xkKSBsb3dlciBlbHNlIHVwcGVyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTd2lwaW5nIGZyb20gdXBwZXIgdG8gbG93ZXIgKG5lZ2F0aXZlKS4KKyAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPD0gLXZlbG9jaXR5VGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb3dlcgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCB0aHJlc2hvbGQgPSB0aHJlc2hvbGRzKHVwcGVyLCBsb3dlcikKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IHRocmVzaG9sZCkgdXBwZXIgZWxzZSBsb3dlcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworcHJpdmF0ZSBmdW4gPFQ+IE1hcDxGbG9hdCwgVD4uZ2V0T2Zmc2V0KHN0YXRlOiBUKTogRmxvYXQ/IHsKKyAgICByZXR1cm4gZW50cmllcy5maXJzdE9yTnVsbCB7IGl0LnZhbHVlID09IHN0YXRlIH0/LmtleQorfQorCisvKiogQ29udGFpbnMgdXNlZnVsIGRlZmF1bHRzIGZvciBbc3dpcGVhYmxlXSBhbmQgW1N3aXBlYWJsZVN0YXRlXS4gKi8KK29iamVjdCBTd2lwZWFibGVEZWZhdWx0cyB7CisgICAgLyoqIFRoZSBkZWZhdWx0IGFuaW1hdGlvbiB1c2VkIGJ5IFtTd2lwZWFibGVTdGF0ZV0uICovCisgICAgdmFsIEFuaW1hdGlvblNwZWMgPSBTcHJpbmdTcGVjPEZsb2F0PigpCisKKyAgICAvKiogVGhlIGRlZmF1bHQgdmVsb2NpdHkgdGhyZXNob2xkICgxLjggZHAgcGVyIG1pbGxpc2Vjb25kKSB1c2VkIGJ5IFtzd2lwZWFibGVdLiAqLworICAgIHZhbCBWZWxvY2l0eVRocmVzaG9sZCA9IDEyNS5kcAorCisgICAgLyoqIEEgc3RpZmYgcmVzaXN0YW5jZSBmYWN0b3Igd2hpY2ggaW5kaWNhdGVzIHRoYXQgc3dpcGluZyBpc24ndCBhdmFpbGFibGUgcmlnaHQgbm93LiAqLworICAgIGNvbnN0IHZhbCBTdGlmZlJlc2lzdGFuY2VGYWN0b3IgPSAyMGYKKworICAgIC8qKiBBIHN0YW5kYXJkIHJlc2lzdGFuY2UgZmFjdG9yIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIGhhcyBydW4gb3V0IG9mIHRoaW5ncyB0byBzZWUuICovCisgICAgY29uc3QgdmFsIFN0YW5kYXJkUmVzaXN0YW5jZUZhY3RvciA9IDEwZgorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgcmVzaXN0YW5jZSBjb25maWcgdXNlZCBieSBbc3dpcGVhYmxlXS4KKyAgICAgKgorICAgICAqIFRoaXMgcmV0dXJucyBgbnVsbGAgaWYgdGhlcmUgaXMgb25lIGFuY2hvci4gSWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBhbmNob3JzLCBpdCByZXR1cm5zIGEKKyAgICAgKiBbUmVzaXN0YW5jZUNvbmZpZ10gd2l0aCB0aGUgcmVzaXN0YW5jZSBiYXNpcyBlcXVhbCB0byB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIGJvdW5kcy4KKyAgICAgKi8KKyAgICBmdW4gcmVzaXN0YW5jZUNvbmZpZygKKyAgICAgICAgYW5jaG9yczogU2V0PEZsb2F0PiwKKyAgICAgICAgZmFjdG9yQXRNaW46IEZsb2F0ID0gU3RhbmRhcmRSZXNpc3RhbmNlRmFjdG9yLAorICAgICAgICBmYWN0b3JBdE1heDogRmxvYXQgPSBTdGFuZGFyZFJlc2lzdGFuY2VGYWN0b3IKKyAgICApOiBSZXNpc3RhbmNlQ29uZmlnPyB7CisgICAgICAgIHJldHVybiBpZiAoYW5jaG9ycy5zaXplIDw9IDEpIHsKKyAgICAgICAgICAgIG51bGwKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbCBiYXNpcyA9IGFuY2hvcnMubWF4T3JOdWxsKCkhISAtIGFuY2hvcnMubWluT3JOdWxsKCkhIQorICAgICAgICAgICAgUmVzaXN0YW5jZUNvbmZpZyhiYXNpcywgZmFjdG9yQXRNaW4sIGZhY3RvckF0TWF4KQorICAgICAgICB9CisgICAgfQorfQorCisvLyB0ZW1wIGRlZmF1bHQgbmVzdGVkIHNjcm9sbCBjb25uZWN0aW9uIGZvciBzd2lwZWFibGVzIHdoaWNoIGRlc2lyZSBhcyBhbiBvcHQgaW4KKy8vIHJldmlzaXQgaW4gYi8xNzQ3NTY3NDQgYXMgYWxsIHR5cGVzIHdpbGwgaGF2ZSB0aGVpciBvd24gc3BlY2lmaWMgY29ubmVjdGlvbiBwcm9iYWJseQoraW50ZXJuYWwgdmFsIDxUPiBTd2lwZWFibGVTdGF0ZTxUPi5QcmVVcFBvc3REb3duTmVzdGVkU2Nyb2xsQ29ubmVjdGlvbjogTmVzdGVkU2Nyb2xsQ29ubmVjdGlvbgorICAgIGdldCgpID0KKyAgICAgICAgb2JqZWN0IDogTmVzdGVkU2Nyb2xsQ29ubmVjdGlvbiB7CisgICAgICAgICAgICBvdmVycmlkZSBmdW4gb25QcmVTY3JvbGwoYXZhaWxhYmxlOiBPZmZzZXQsIHNvdXJjZTogTmVzdGVkU2Nyb2xsU291cmNlKTogT2Zmc2V0IHsKKyAgICAgICAgICAgICAgICB2YWwgZGVsdGEgPSBhdmFpbGFibGUudG9GbG9hdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlmIChkZWx0YSA8IDAgJiYgc291cmNlID09IE5lc3RlZFNjcm9sbFNvdXJjZS5EcmFnKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1EcmFnKGRlbHRhKS50b09mZnNldCgpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgT2Zmc2V0Llplcm8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG92ZXJyaWRlIGZ1biBvblBvc3RTY3JvbGwoCisgICAgICAgICAgICAgICAgY29uc3VtZWQ6IE9mZnNldCwKKyAgICAgICAgICAgICAgICBhdmFpbGFibGU6IE9mZnNldCwKKyAgICAgICAgICAgICAgICBzb3VyY2U6IE5lc3RlZFNjcm9sbFNvdXJjZQorICAgICAgICAgICAgKTogT2Zmc2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaWYgKHNvdXJjZSA9PSBOZXN0ZWRTY3JvbGxTb3VyY2UuRHJhZykgeworICAgICAgICAgICAgICAgICAgICBwZXJmb3JtRHJhZyhhdmFpbGFibGUudG9GbG9hdCgpKS50b09mZnNldCgpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgT2Zmc2V0Llplcm8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG92ZXJyaWRlIHN1c3BlbmQgZnVuIG9uUHJlRmxpbmcoYXZhaWxhYmxlOiBWZWxvY2l0eSk6IFZlbG9jaXR5IHsKKyAgICAgICAgICAgICAgICB2YWwgdG9GbGluZyA9IE9mZnNldChhdmFpbGFibGUueCwgYXZhaWxhYmxlLnkpLnRvRmxvYXQoKQorICAgICAgICAgICAgICAgIHJldHVybiBpZiAodG9GbGluZyA8IDAgJiYgb2Zmc2V0LnZhbHVlID4gbWluQm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUZsaW5nKHZlbG9jaXR5ID0gdG9GbGluZykKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgZ28gdG8gdGhlIGFuY2hvciB3aXRoIHR3ZWVuIHNldHRsaW5nLCBjb25zdW1lIGFsbCBmb3IgdGhlIGJlc3QgVVgKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgVmVsb2NpdHkuWmVybworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3ZlcnJpZGUgc3VzcGVuZCBmdW4gb25Qb3N0RmxpbmcoY29uc3VtZWQ6IFZlbG9jaXR5LCBhdmFpbGFibGU6IFZlbG9jaXR5KTogVmVsb2NpdHkgeworICAgICAgICAgICAgICAgIHBlcmZvcm1GbGluZyh2ZWxvY2l0eSA9IE9mZnNldChhdmFpbGFibGUueCwgYXZhaWxhYmxlLnkpLnRvRmxvYXQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgZnVuIEZsb2F0LnRvT2Zmc2V0KCk6IE9mZnNldCA9IE9mZnNldCgwZiwgdGhpcykKKworICAgICAgICAgICAgcHJpdmF0ZSBmdW4gT2Zmc2V0LnRvRmxvYXQoKTogRmxvYXQgPSB0aGlzLnkKKyAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9jb3JlL3NyYy9jb20vYW5kcm9pZC9jb21wb3NlL3VpL3V0aWwvTWF0aEhlbHBlcnMua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2NvcmUvc3JjL2NvbS9hbmRyb2lkL2NvbXBvc2UvdWkvdXRpbC9NYXRoSGVscGVycy5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWRlZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9jb3JlL3NyYy9jb20vYW5kcm9pZC9jb21wb3NlL3VpL3V0aWwvTWF0aEhlbHBlcnMua3QKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNvbXBvc2UudWkudXRpbAorCitpbXBvcnQga290bGluLm1hdGgucm91bmRUb0ludAoraW1wb3J0IGtvdGxpbi5tYXRoLnJvdW5kVG9Mb25nCisKKy8vIFRPRE8oYi8yNzIzMTExMDYpOiB0aGlzIGlzIGEgZm9yayBmcm9tIG1hdGVyaWFsLiBVbmZvcmsgaXQgd2hlbiBNYXRoSGVscGVycy5rdCByZWFjaGVzIG1hdGVyaWFsMy4KKworLyoqIExpbmVhcmx5IGludGVycG9sYXRlIGJldHdlZW4gW3N0YXJ0XSBhbmQgW3N0b3BdIHdpdGggW2ZyYWN0aW9uXSBmcmFjdGlvbiBiZXR3ZWVuIHRoZW0uICovCitmdW4gbGVycChzdGFydDogRmxvYXQsIHN0b3A6IEZsb2F0LCBmcmFjdGlvbjogRmxvYXQpOiBGbG9hdCB7CisgICAgcmV0dXJuICgxIC0gZnJhY3Rpb24pICogc3RhcnQgKyBmcmFjdGlvbiAqIHN0b3AKK30KKworLyoqIExpbmVhcmx5IGludGVycG9sYXRlIGJldHdlZW4gW3N0YXJ0XSBhbmQgW3N0b3BdIHdpdGggW2ZyYWN0aW9uXSBmcmFjdGlvbiBiZXR3ZWVuIHRoZW0uICovCitmdW4gbGVycChzdGFydDogSW50LCBzdG9wOiBJbnQsIGZyYWN0aW9uOiBGbG9hdCk6IEludCB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKChzdG9wIC0gc3RhcnQpICogZnJhY3Rpb24udG9Eb3VibGUoKSkucm91bmRUb0ludCgpCit9CisKKy8qKiBMaW5lYXJseSBpbnRlcnBvbGF0ZSBiZXR3ZWVuIFtzdGFydF0gYW5kIFtzdG9wXSB3aXRoIFtmcmFjdGlvbl0gZnJhY3Rpb24gYmV0d2VlbiB0aGVtLiAqLworZnVuIGxlcnAoc3RhcnQ6IExvbmcsIHN0b3A6IExvbmcsIGZyYWN0aW9uOiBGbG9hdCk6IExvbmcgeworICAgIHJldHVybiBzdGFydCArICgoc3RvcCAtIHN0YXJ0KSAqIGZyYWN0aW9uLnRvRG91YmxlKCkpLnJvdW5kVG9Mb25nKCkKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmFjYWRlL2Rpc2FibGVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0NvbXBvc2VGYWNhZGUua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZhY2FkZS9kaXNhYmxlZC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29tcG9zZS9Db21wb3NlRmFjYWRlLmt0CmluZGV4IGUyNTNmYjkuLmNjMzM3NDUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmFjYWRlL2Rpc2FibGVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0NvbXBvc2VGYWNhZGUua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mYWNhZGUvZGlzYWJsZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQ29tcG9zZUZhY2FkZS5rdApAQCAtMjEsOCArMjEsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldwogaW1wb3J0IGFuZHJvaWR4LmFjdGl2aXR5LkNvbXBvbmVudEFjdGl2aXR5CiBpbXBvcnQgYW5kcm9pZHgubGlmZWN5Y2xlLkxpZmVjeWNsZU93bmVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS52aWV3bW9kZWwuTXVsdGlTaGFkZVZpZXdNb2RlbAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBlb3BsZS51aS52aWV3bW9kZWwuUGVvcGxlVmlld01vZGVsCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMuZm9vdGVyLnVpLnZpZXdtb2RlbC5Gb290ZXJBY3Rpb25zVmlld01vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC50aW1lLlN5c3RlbUNsb2NrCiAKIC8qKiBUaGUgQ29tcG9zZSBmYWNhZGUsIHdoZW4gQ29tcG9zZSBpcyAqbm90KiBhdmFpbGFibGUuICovCiBvYmplY3QgQ29tcG9zZUZhY2FkZSA6IEJhc2VDb21wb3NlRmFjYWRlIHsKQEAgLTQ4LDYgKzUwLDE0IEBACiAgICAgICAgIHRocm93Q29tcG9zZVVuYXZhaWxhYmxlRXJyb3IoKQogICAgIH0KIAorICAgIG92ZXJyaWRlIGZ1biBjcmVhdGVNdWx0aVNoYWRlVmlldygKKyAgICAgICAgY29udGV4dDogQ29udGV4dCwKKyAgICAgICAgdmlld01vZGVsOiBNdWx0aVNoYWRlVmlld01vZGVsLAorICAgICAgICBjbG9jazogU3lzdGVtQ2xvY2ssCisgICAgKTogVmlldyB7CisgICAgICAgIHRocm93Q29tcG9zZVVuYXZhaWxhYmxlRXJyb3IoKQorICAgIH0KKwogICAgIHByaXZhdGUgZnVuIHRocm93Q29tcG9zZVVuYXZhaWxhYmxlRXJyb3IoKTogTm90aGluZyB7CiAgICAgICAgIGVycm9yKAogICAgICAgICAgICAgIkNvbXBvc2UgaXMgbm90IGF2YWlsYWJsZS4gTWFrZSBzdXJlIHRvIGNoZWNrIGlzQ29tcG9zZUF2YWlsYWJsZSgpIGJlZm9yZSBjYWxsaW5nIGFueSIgKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mYWNhZGUvZW5hYmxlZC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29tcG9zZS9Db21wb3NlRmFjYWRlLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mYWNhZGUvZW5hYmxlZC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29tcG9zZS9Db21wb3NlRmFjYWRlLmt0CmluZGV4IDFlYTE4ZmUuLjBlNzliMTggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmFjYWRlL2VuYWJsZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQ29tcG9zZUZhY2FkZS5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZhY2FkZS9lbmFibGVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0NvbXBvc2VGYWNhZGUua3QKQEAgLTIzLDEwICsyMywxMyBAQAogaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkucGxhdGZvcm0uQ29tcG9zZVZpZXcKIGltcG9ydCBhbmRyb2lkeC5saWZlY3ljbGUuTGlmZWN5Y2xlT3duZXIKIGltcG9ydCBjb20uYW5kcm9pZC5jb21wb3NlLnRoZW1lLlBsYXRmb3JtVGhlbWUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnVpLmNvbXBvc2FibGUuTXVsdGlTaGFkZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkudmlld21vZGVsLk11bHRpU2hhZGVWaWV3TW9kZWwKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wZW9wbGUudWkuY29tcG9zZS5QZW9wbGVTY3JlZW4KIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wZW9wbGUudWkudmlld21vZGVsLlBlb3BsZVZpZXdNb2RlbAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLmZvb3Rlci51aS5jb21wb3NlLkZvb3RlckFjdGlvbnMKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5mb290ZXIudWkudmlld21vZGVsLkZvb3RlckFjdGlvbnNWaWV3TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnRpbWUuU3lzdGVtQ2xvY2sKIAogLyoqIFRoZSBDb21wb3NlIGZhY2FkZSwgd2hlbiBDb21wb3NlIGlzIGF2YWlsYWJsZS4gKi8KIG9iamVjdCBDb21wb3NlRmFjYWRlIDogQmFzZUNvbXBvc2VGYWNhZGUgewpAQCAtNTEsNCArNTQsMjEgQEAKICAgICAgICAgICAgIHNldENvbnRlbnQgeyBQbGF0Zm9ybVRoZW1lIHsgRm9vdGVyQWN0aW9ucyh2aWV3TW9kZWwsIHFzVmlzaWJpbGl0eUxpZmVjeWNsZU93bmVyKSB9IH0KICAgICAgICAgfQogICAgIH0KKworICAgIG92ZXJyaWRlIGZ1biBjcmVhdGVNdWx0aVNoYWRlVmlldygKKyAgICAgICAgY29udGV4dDogQ29udGV4dCwKKyAgICAgICAgdmlld01vZGVsOiBNdWx0aVNoYWRlVmlld01vZGVsLAorICAgICAgICBjbG9jazogU3lzdGVtQ2xvY2ssCisgICAgKTogVmlldyB7CisgICAgICAgIHJldHVybiBDb21wb3NlVmlldyhjb250ZXh0KS5hcHBseSB7CisgICAgICAgICAgICBzZXRDb250ZW50IHsKKyAgICAgICAgICAgICAgICBQbGF0Zm9ybVRoZW1lIHsKKyAgICAgICAgICAgICAgICAgICAgTXVsdGlTaGFkZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlbCA9IHZpZXdNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrID0gY2xvY2ssCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZhY2FkZS9lbmFibGVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0NvbXBvc2VJbml0aWFsaXplckltcGwua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZhY2FkZS9lbmFibGVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0NvbXBvc2VJbml0aWFsaXplckltcGwua3QKaW5kZXggNzcyYzg5MS4uZmJkN2Y4MyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mYWNhZGUvZW5hYmxlZC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29tcG9zZS9Db21wb3NlSW5pdGlhbGl6ZXJJbXBsLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmFjYWRlL2VuYWJsZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbXBvc2UvQ29tcG9zZUluaXRpYWxpemVySW1wbC5rdApAQCAtNDksMTQgKzQ5LDEyIEBACiAgICAgICAgIC8vIGluaXRpYWxpemVyIGFyZSBjcmVhdGVkIG9uY2UsIHdoZW4gdGhlIHByb2Nlc3MgaXMgc3RhcnRlZC4KICAgICAgICAgdmFsIHNhdmVkU3RhdGVSZWdpc3RyeU93bmVyID0KICAgICAgICAgICAgIG9iamVjdCA6IFNhdmVkU3RhdGVSZWdpc3RyeU93bmVyIHsKLSAgICAgICAgICAgICAgICBwcml2YXRlIHZhbCBzYXZlZFN0YXRlUmVnaXN0cnkgPQorICAgICAgICAgICAgICAgIHByaXZhdGUgdmFsIHNhdmVkU3RhdGVSZWdpc3RyeUNvbnRyb2xsZXIgPQogICAgICAgICAgICAgICAgICAgICBTYXZlZFN0YXRlUmVnaXN0cnlDb250cm9sbGVyLmNyZWF0ZSh0aGlzKS5hcHBseSB7IHBlcmZvcm1SZXN0b3JlKG51bGwpIH0KIAotICAgICAgICAgICAgICAgIG92ZXJyaWRlIGZ1biBnZXRMaWZlY3ljbGUoKTogTGlmZWN5Y2xlID0gbGlmZWN5Y2xlT3duZXIubGlmZWN5Y2xlCisgICAgICAgICAgICAgICAgb3ZlcnJpZGUgdmFsIHNhdmVkU3RhdGVSZWdpc3RyeSA9IHNhdmVkU3RhdGVSZWdpc3RyeUNvbnRyb2xsZXIuc2F2ZWRTdGF0ZVJlZ2lzdHJ5CiAKLSAgICAgICAgICAgICAgICBvdmVycmlkZSBmdW4gZ2V0U2F2ZWRTdGF0ZVJlZ2lzdHJ5KCk6IFNhdmVkU3RhdGVSZWdpc3RyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZFN0YXRlUmVnaXN0cnkuc2F2ZWRTdGF0ZVJlZ2lzdHJ5Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG92ZXJyaWRlIGZ1biBnZXRMaWZlY3ljbGUoKTogTGlmZWN5Y2xlID0gbGlmZWN5Y2xlT3duZXIubGlmZWN5Y2xlCiAgICAgICAgICAgICB9CiAKICAgICAgICAgLy8gV2UgbXVzdCBjYWxsIFtWaWV3TGlmZWN5Y2xlT3duZXIub25DcmVhdGVdIGFmdGVyIGNyZWF0aW5nIHRoZSBbU2F2ZWRTdGF0ZVJlZ2lzdHJ5T3duZXJdCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL2NvbXBvc2FibGUvTXVsdGlTaGFkZS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmVhdHVyZXMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvY29tcG9zYWJsZS9NdWx0aVNoYWRlLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTM4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL2NvbXBvc2FibGUvTXVsdGlTaGFkZS5rdApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkuY29tcG9zYWJsZQorCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmJhY2tncm91bmQKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24uZ2VzdHVyZXMuZGV0ZWN0VGFwR2VzdHVyZXMKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24uZ2VzdHVyZXMuZGV0ZWN0VmVydGljYWxEcmFnR2VzdHVyZXMKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LkJveAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuQm94V2l0aENvbnN0cmFpbnRzCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5Db2x1bW4KK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LmZpbGxNYXhTaXplCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLkNvbXBvc2FibGUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuY29sbGVjdEFzU3RhdGUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuZ2V0VmFsdWUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUubXV0YWJsZVN0YXRlT2YKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUucmVtZW1iZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuc2V0VmFsdWUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLkFsaWdubWVudAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuTW9kaWZpZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLmdyYXBoaWNzLmdyYXBoaWNzTGF5ZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLmlucHV0LnBvaW50ZXIucG9pbnRlcklucHV0CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5sYXlvdXQub25TaXplQ2hhbmdlZAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkucGxhdGZvcm0uTG9jYWxEZW5zaXR5CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5yZXMuY29sb3JSZXNvdXJjZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkudW5pdC5JbnRTaXplCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlByb3hpZWRJbnB1dE1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS52aWV3bW9kZWwuTXVsdGlTaGFkZVZpZXdNb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm5vdGlmaWNhdGlvbnMudWkuY29tcG9zYWJsZS5Ob3RpZmljYXRpb25zCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMuZm9vdGVyLnVpLmNvbXBvc2UuUXVpY2tTZXR0aW5ncworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci51aS5jb21wb3NhYmxlLlN0YXR1c0JhcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwudGltZS5TeXN0ZW1DbG9jaworCitAQ29tcG9zYWJsZQorZnVuIE11bHRpU2hhZGUoCisgICAgdmlld01vZGVsOiBNdWx0aVNoYWRlVmlld01vZGVsLAorICAgIGNsb2NrOiBTeXN0ZW1DbG9jaywKKyAgICBtb2RpZmllcjogTW9kaWZpZXIgPSBNb2RpZmllciwKKykgeworICAgIHZhbCBpc1NjcmltRW5hYmxlZDogQm9vbGVhbiBieSB2aWV3TW9kZWwuaXNTY3JpbUVuYWJsZWQuY29sbGVjdEFzU3RhdGUoKQorCisgICAgLy8gVE9ETyhiLzI3MzI5ODAzMCk6IGZpbmQgYSBkaWZmZXJlbnQgd2F5IHRvIGdldCB0aGUgaGVpZ2h0IGNvbnN0cmFpbnQgZnJvbSBpdHMgcGFyZW50LgorICAgIEJveFdpdGhDb25zdHJhaW50cyhtb2RpZmllciA9IG1vZGlmaWVyKSB7CisgICAgICAgIHZhbCBtYXhIZWlnaHRQeCA9IHdpdGgoTG9jYWxEZW5zaXR5LmN1cnJlbnQpIHsgbWF4SGVpZ2h0LnRvUHgoKSB9CisKKyAgICAgICAgU2NyaW0oCisgICAgICAgICAgICBtb2RpZmllciA9IE1vZGlmaWVyLmZpbGxNYXhTaXplKCksCisgICAgICAgICAgICByZW1vdGVUb3VjaCA9IHZpZXdNb2RlbDo6b25TY3JpbVRvdWNoZWQsCisgICAgICAgICAgICBhbHBoYSA9IHsgdmlld01vZGVsLnNjcmltQWxwaGEudmFsdWUgfSwKKyAgICAgICAgICAgIGlzU2NyaW1FbmFibGVkID0gaXNTY3JpbUVuYWJsZWQsCisgICAgICAgICkKKyAgICAgICAgU2hhZGUoCisgICAgICAgICAgICB2aWV3TW9kZWwgPSB2aWV3TW9kZWwubGVmdFNoYWRlLAorICAgICAgICAgICAgY3VycmVudFRpbWVNaWxsaXMgPSBjbG9jazo6ZWxhcHNlZFJlYWx0aW1lLAorICAgICAgICAgICAgY29udGFpbmVySGVpZ2h0UHggPSBtYXhIZWlnaHRQeCwKKyAgICAgICAgICAgIG1vZGlmaWVyID0gTW9kaWZpZXIuYWxpZ24oQWxpZ25tZW50LlRvcFN0YXJ0KSwKKyAgICAgICAgKSB7CisgICAgICAgICAgICBDb2x1bW4geworICAgICAgICAgICAgICAgIFN0YXR1c0JhcigpCisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9ucygpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU2hhZGUoCisgICAgICAgICAgICB2aWV3TW9kZWwgPSB2aWV3TW9kZWwucmlnaHRTaGFkZSwKKyAgICAgICAgICAgIGN1cnJlbnRUaW1lTWlsbGlzID0gY2xvY2s6OmVsYXBzZWRSZWFsdGltZSwKKyAgICAgICAgICAgIGNvbnRhaW5lckhlaWdodFB4ID0gbWF4SGVpZ2h0UHgsCisgICAgICAgICAgICBtb2RpZmllciA9IE1vZGlmaWVyLmFsaWduKEFsaWdubWVudC5Ub3BFbmQpLAorICAgICAgICApIHsKKyAgICAgICAgICAgIENvbHVtbiB7CisgICAgICAgICAgICAgICAgU3RhdHVzQmFyKCkKKyAgICAgICAgICAgICAgICBRdWlja1NldHRpbmdzKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTaGFkZSgKKyAgICAgICAgICAgIHZpZXdNb2RlbCA9IHZpZXdNb2RlbC5zaW5nbGVTaGFkZSwKKyAgICAgICAgICAgIGN1cnJlbnRUaW1lTWlsbGlzID0gY2xvY2s6OmVsYXBzZWRSZWFsdGltZSwKKyAgICAgICAgICAgIGNvbnRhaW5lckhlaWdodFB4ID0gbWF4SGVpZ2h0UHgsCisgICAgICAgICAgICBtb2RpZmllciA9IE1vZGlmaWVyLAorICAgICAgICApIHsKKyAgICAgICAgICAgIENvbHVtbiB7CisgICAgICAgICAgICAgICAgU3RhdHVzQmFyKCkKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25zKCkKKyAgICAgICAgICAgICAgICBRdWlja1NldHRpbmdzKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworQENvbXBvc2FibGUKK3ByaXZhdGUgZnVuIFNjcmltKAorICAgIHJlbW90ZVRvdWNoOiAoUHJveGllZElucHV0TW9kZWwpIC0+IFVuaXQsCisgICAgYWxwaGE6ICgpIC0+IEZsb2F0LAorICAgIGlzU2NyaW1FbmFibGVkOiBCb29sZWFuLAorICAgIG1vZGlmaWVyOiBNb2RpZmllciA9IE1vZGlmaWVyLAorKSB7CisgICAgdmFyIHNpemUgYnkgcmVtZW1iZXIgeyBtdXRhYmxlU3RhdGVPZihJbnRTaXplLlplcm8pIH0KKworICAgIEJveCgKKyAgICAgICAgbW9kaWZpZXIgPQorICAgICAgICAgICAgbW9kaWZpZXIKKyAgICAgICAgICAgICAgICAuZ3JhcGhpY3NMYXllciB7IHRoaXMuYWxwaGEgPSBhbHBoYSgpIH0KKyAgICAgICAgICAgICAgICAuYmFja2dyb3VuZChjb2xvclJlc291cmNlKFIuY29sb3Iub3BhcXVlX3NjcmltKSkKKyAgICAgICAgICAgICAgICAuZmlsbE1heFNpemUoKQorICAgICAgICAgICAgICAgIC5vblNpemVDaGFuZ2VkIHsgc2l6ZSA9IGl0IH0KKyAgICAgICAgICAgICAgICAudGhlbigKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2NyaW1FbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllci5wb2ludGVySW5wdXQoVW5pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RUYXBHZXN0dXJlcyhvblRhcCA9IHsgcmVtb3RlVG91Y2goUHJveGllZElucHV0TW9kZWwuT25UYXApIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb2ludGVySW5wdXQoVW5pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RWZXJ0aWNhbERyYWdHZXN0dXJlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmVydGljYWxEcmFnID0geyBjaGFuZ2UsIGRyYWdBbW91bnQgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVUb3VjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveGllZElucHV0TW9kZWwuT25EcmFnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeEZyYWN0aW9uID0gY2hhbmdlLnBvc2l0aW9uLnggLyBzaXplLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeURyYWdBbW91bnRQeCA9IGRyYWdBbW91bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EcmFnRW5kID0geyByZW1vdGVUb3VjaChQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWdFbmQpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRyYWdDYW5jZWwgPSB7IHJlbW90ZVRvdWNoKFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZ0NhbmNlbCkgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpZXIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICkKKyAgICApCit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL2NvbXBvc2FibGUvU2hhZGUua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL2NvbXBvc2FibGUvU2hhZGUua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlZjU3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL2NvbXBvc2FibGUvU2hhZGUua3QKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnVpLmNvbXBvc2FibGUKKworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5nZXN0dXJlcy5PcmllbnRhdGlvbgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5pbnRlcmFjdGlvbi5EcmFnSW50ZXJhY3Rpb24KK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24uaW50ZXJhY3Rpb24uSW50ZXJhY3Rpb25Tb3VyY2UKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24uaW50ZXJhY3Rpb24uTXV0YWJsZUludGVyYWN0aW9uU291cmNlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5maWxsTWF4V2lkdGgKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LnBhZGRpbmcKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LndpZHRoCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLnNoYXBlLlJvdW5kZWRDb3JuZXJTaGFwZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UubWF0ZXJpYWwzLlN1cmZhY2UKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuQ29tcG9zYWJsZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5MYXVuY2hlZEVmZmVjdAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5jb2xsZWN0QXNTdGF0ZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5nZXRWYWx1ZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5yZW1lbWJlcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5zbmFwc2hvdEZsb3cKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLk1vZGlmaWVyCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5nZW9tZXRyeS5PZmZzZXQKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLmdyYXBoaWNzLmdyYXBoaWNzTGF5ZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLmlucHV0LnBvaW50ZXIudXRpbC5WZWxvY2l0eVRyYWNrZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLnBsYXRmb3JtLkxvY2FsRGVuc2l0eQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkudW5pdC5EZW5zaXR5CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS51bml0LkRwCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS51bml0LmRwCitpbXBvcnQgY29tLmFuZHJvaWQuY29tcG9zZS5tb2RpZmllcnMuaGVpZ2h0CitpbXBvcnQgY29tLmFuZHJvaWQuY29tcG9zZS5zd2lwZWFibGUuRml4ZWRUaHJlc2hvbGQKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wb3NlLnN3aXBlYWJsZS5Td2lwZWFibGVTdGF0ZQoraW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBvc2Uuc3dpcGVhYmxlLlRocmVzaG9sZENvbmZpZworaW1wb3J0IGNvbS5hbmRyb2lkLmNvbXBvc2Uuc3dpcGVhYmxlLnJlbWVtYmVyU3dpcGVhYmxlU3RhdGUKK2ltcG9ydCBjb20uYW5kcm9pZC5jb21wb3NlLnN3aXBlYWJsZS5zd2lwZWFibGUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5Qcm94aWVkSW5wdXRNb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkudmlld21vZGVsLlNoYWRlVmlld01vZGVsCitpbXBvcnQga290bGluLm1hdGgucm91bmRUb0ludAoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5sYXVuY2gKKworLyoqCisgKiBSZW5kZXJzIGEgc2hhZGUgKGNvbnRhaW5lciBhbmQgY29udGVudCkuCisgKgorICogVGhpcyBzaG91bGQgYmUgYWxsb3dlZCB0byBncm93IHRvIGZpbGwgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgaXRzIGNvbnRhaW5lci4KKyAqCisgKiBAcGFyYW0gdmlld01vZGVsIFRoZSB2aWV3LW1vZGVsIGZvciB0aGlzIHNoYWRlLgorICogQHBhcmFtIGN1cnJlbnRUaW1lTWlsbGlzIEEgcHJvdmlkZXIgZm9yIHRoZSBjdXJyZW50IHRpbWUsIGluIG1pbGxpc2Vjb25kcy4KKyAqIEBwYXJhbSBjb250YWluZXJIZWlnaHRQeCBUaGUgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIgdGhhdCB0aGlzIHNoYWRlIGlzIGJlaW5nIHNob3duIGluLCBpbgorICogICBwaXhlbHMuCisgKiBAcGFyYW0gbW9kaWZpZXIgVGhlIE1vZGlmaWVyLgorICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgb2YgdGhlIHNoYWRlLgorICovCitAQ29tcG9zYWJsZQorZnVuIFNoYWRlKAorICAgIHZpZXdNb2RlbDogU2hhZGVWaWV3TW9kZWwsCisgICAgY3VycmVudFRpbWVNaWxsaXM6ICgpIC0+IExvbmcsCisgICAgY29udGFpbmVySGVpZ2h0UHg6IEZsb2F0LAorICAgIG1vZGlmaWVyOiBNb2RpZmllciA9IE1vZGlmaWVyLAorICAgIGNvbnRlbnQ6IEBDb21wb3NhYmxlICgpIC0+IFVuaXQgPSB7fSwKKykgeworICAgIHZhbCBpc1Zpc2libGU6IEJvb2xlYW4gYnkgdmlld01vZGVsLmlzVmlzaWJsZS5jb2xsZWN0QXNTdGF0ZSgpCisgICAgaWYgKCFpc1Zpc2libGUpIHsKKyAgICAgICAgcmV0dXJuCisgICAgfQorCisgICAgdmFsIGludGVyYWN0aW9uU291cmNlOiBNdXRhYmxlSW50ZXJhY3Rpb25Tb3VyY2UgPSByZW1lbWJlciB7IE11dGFibGVJbnRlcmFjdGlvblNvdXJjZSgpIH0KKyAgICBSZXBvcnROb25Qcm94aWVkSW5wdXQodmlld01vZGVsLCBpbnRlcmFjdGlvblNvdXJjZSkKKworICAgIHZhbCBzd2lwZWFibGVTdGF0ZSA9IHJlbWVtYmVyU3dpcGVhYmxlU3RhdGUoaW5pdGlhbFZhbHVlID0gU2hhZGVTdGF0ZS5GdWxseUNvbGxhcHNlZCkKKyAgICBIYW5kbGVGb3JjZWRDb2xsYXBzZSh2aWV3TW9kZWwsIHN3aXBlYWJsZVN0YXRlKQorICAgIEhhbmRsZVByb3hpZWRJbnB1dCh2aWV3TW9kZWwsIHN3aXBlYWJsZVN0YXRlLCBjdXJyZW50VGltZU1pbGxpcykKKyAgICBSZXBvcnRTaGFkZUV4cGFuc2lvbih2aWV3TW9kZWwsIHN3aXBlYWJsZVN0YXRlLCBjb250YWluZXJIZWlnaHRQeCkKKworICAgIHZhbCBpc1N3aXBpbmdFbmFibGVkOiBCb29sZWFuIGJ5IHZpZXdNb2RlbC5pc1N3aXBpbmdFbmFibGVkLmNvbGxlY3RBc1N0YXRlKCkKKyAgICB2YWwgY29sbGFwc2VUaHJlc2hvbGQ6IEZsb2F0IGJ5IHZpZXdNb2RlbC5zd2lwZUNvbGxhcHNlVGhyZXNob2xkLmNvbGxlY3RBc1N0YXRlKCkKKyAgICB2YWwgZXhwYW5kVGhyZXNob2xkOiBGbG9hdCBieSB2aWV3TW9kZWwuc3dpcGVFeHBhbmRUaHJlc2hvbGQuY29sbGVjdEFzU3RhdGUoKQorCisgICAgdmFsIHdpZHRoOiBTaGFkZVZpZXdNb2RlbC5TaXplIGJ5IHZpZXdNb2RlbC53aWR0aC5jb2xsZWN0QXNTdGF0ZSgpCisgICAgdmFsIGRlbnNpdHkgPSBMb2NhbERlbnNpdHkuY3VycmVudAorCisgICAgdmFsIGFuY2hvcnM6IE1hcDxGbG9hdCwgU2hhZGVTdGF0ZT4gPQorICAgICAgICByZW1lbWJlcihjb250YWluZXJIZWlnaHRQeCkgeyBzd2lwZWFibGVBbmNob3JzKGNvbnRhaW5lckhlaWdodFB4KSB9CisKKyAgICBTaGFkZUNvbnRlbnQoCisgICAgICAgIHNoYWRlSGVpZ2h0UHggPSB7IHN3aXBlYWJsZVN0YXRlLm9mZnNldC52YWx1ZSB9LAorICAgICAgICBvdmVyc3RyZXRjaCA9IHsgc3dpcGVhYmxlU3RhdGUub3ZlcmZsb3cudmFsdWUgLyBjb250YWluZXJIZWlnaHRQeCB9LAorICAgICAgICBpc1N3aXBpbmdFbmFibGVkID0gaXNTd2lwaW5nRW5hYmxlZCwKKyAgICAgICAgc3dpcGVhYmxlU3RhdGUgPSBzd2lwZWFibGVTdGF0ZSwKKyAgICAgICAgaW50ZXJhY3Rpb25Tb3VyY2UgPSBpbnRlcmFjdGlvblNvdXJjZSwKKyAgICAgICAgYW5jaG9ycyA9IGFuY2hvcnMsCisgICAgICAgIHRocmVzaG9sZHMgPSB7IF8sIHRvIC0+CisgICAgICAgICAgICBzd2lwZWFibGVUaHJlc2hvbGRzKAorICAgICAgICAgICAgICAgIHRvID0gdG8sCisgICAgICAgICAgICAgICAgc3dpcGVDb2xsYXBzZVRocmVzaG9sZCA9IGNvbGxhcHNlVGhyZXNob2xkLmZyYWN0aW9uVG9EcChkZW5zaXR5LCBjb250YWluZXJIZWlnaHRQeCksCisgICAgICAgICAgICAgICAgc3dpcGVFeHBhbmRUaHJlc2hvbGQgPSBleHBhbmRUaHJlc2hvbGQuZnJhY3Rpb25Ub0RwKGRlbnNpdHksIGNvbnRhaW5lckhlaWdodFB4KSwKKyAgICAgICAgICAgICkKKyAgICAgICAgfSwKKyAgICAgICAgbW9kaWZpZXIgPSBtb2RpZmllci5zaGFkZVdpZHRoKHdpZHRoLCBkZW5zaXR5KSwKKyAgICAgICAgY29udGVudCA9IGNvbnRlbnQsCisgICAgKQorfQorCisvKioKKyAqIERyYXdzIHRoZSBjb250ZW50IG9mIHRoZSBzaGFkZS4KKyAqCisgKiBAcGFyYW0gc2hhZGVIZWlnaHRQeCBQcm92aWRlciBmb3IgdGhlIGN1cnJlbnQgZXhwYW5zaW9uIG9mIHRoZSBzaGFkZSwgaW4gcGl4ZWxzLCB3aGVyZSBgMGAgaXMKKyAqICAgZnVsbHkgY29sbGFwc2VkLgorICogQHBhcmFtIG92ZXJzdHJldGNoIFByb3ZpZGVyIGZvciB0aGUgY3VycmVudCBhbW91bnQgb2YgdmVydGljYWwgIm92ZXJzdHJldGNoIiB0aGF0IHRoZSBzaGFkZQorICogICBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aC4gVGhpcyBpcyBgMGAgb3IgYSBwb3NpdGl2ZSBudW1iZXIgdGhhdCBpcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsCisgKiAgIGhlaWdodCBvZiB0aGUgc2hhZGUgd2hlbiBmdWxseSBleHBhbmRlZC4gQSB2YWx1ZSBvZiBgMGAgbWVhbnMgdGhhdCB0aGUgc2hhZGUgaXMgbm90IHN0cmV0Y2hlZAorICogICBhdCBhbGwuCisgKiBAcGFyYW0gaXNTd2lwaW5nRW5hYmxlZCBXaGV0aGVyIHN3aXBpbmcgaW5zaWRlIHRoZSBzaGFkZSBpcyBlbmFibGVkIG9yIG5vdC4KKyAqIEBwYXJhbSBzd2lwZWFibGVTdGF0ZSBUaGUgc3RhdGUgdG8gdXNlIGZvciB0aGUgW3N3aXBlYWJsZV0gbW9kaWZpZXIsIGFsbG93aW5nIGV4dGVybmFsIGNvbnRyb2wgaW4KKyAqICAgYWRkaXRpb24gdG8gZGlyZWN0IGNvbnRyb2wgKHByb3hpZWQgdXNlciBpbnB1dCBpbiBhZGRpdGlvbiB0byBub24tcHJveGllZC9kaXJlY3QgdXNlciBpbnB1dCkuCisgKiBAcGFyYW0gYW5jaG9ycyBBIG1hcCBvZiBbU2hhZGVTdGF0ZV0ga2V5ZWQgYnkgdGhlIHZlcnRpY2FsIHBvc2l0aW9uLCBpbiBwaXhlbHMsIHdoZXJlIHRoYXQgc3RhdGUKKyAqICAgb2NjdXJzOyB0aGlzIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBbc3dpcGVhYmxlXSBtb2RpZmllci4KKyAqIEBwYXJhbSB0aHJlc2hvbGRzIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgW1RocmVzaG9sZENvbmZpZ10gZm9yIGdvaW5nIGZyb20gb25lIFtTaGFkZVN0YXRlXSB0bworICogICBhbm90aGVyLiBUaGlzIGNvbnRyb2xzIGhvdyB0aGUgW3N3aXBlYWJsZV0gZGVjaWRlcyB3aGljaCBbU2hhZGVTdGF0ZV0gdG8gYW5pbWF0ZSB0byBvbmNlIHRoZQorICogICB1c2VyIGxldHMgZ28gb2YgdGhlIHNoYWRlOyBlLmcuIGRvZXMgaXQgYW5pbWF0ZSB0byBmdWxseSBjb2xsYXBzZWQgb3IgZnVsbHkgZXhwYW5kZWQuCisgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCB0byByZW5kZXIgaW5zaWRlIHRoZSBzaGFkZS4KKyAqIEBwYXJhbSBtb2RpZmllciBUaGUgW01vZGlmaWVyXS4KKyAqLworQENvbXBvc2FibGUKK3ByaXZhdGUgZnVuIFNoYWRlQ29udGVudCgKKyAgICBzaGFkZUhlaWdodFB4OiAoKSAtPiBGbG9hdCwKKyAgICBvdmVyc3RyZXRjaDogKCkgLT4gRmxvYXQsCisgICAgaXNTd2lwaW5nRW5hYmxlZDogQm9vbGVhbiwKKyAgICBzd2lwZWFibGVTdGF0ZTogU3dpcGVhYmxlU3RhdGU8U2hhZGVTdGF0ZT4sCisgICAgaW50ZXJhY3Rpb25Tb3VyY2U6IE11dGFibGVJbnRlcmFjdGlvblNvdXJjZSwKKyAgICBhbmNob3JzOiBNYXA8RmxvYXQsIFNoYWRlU3RhdGU+LAorICAgIHRocmVzaG9sZHM6IChmcm9tOiBTaGFkZVN0YXRlLCB0bzogU2hhZGVTdGF0ZSkgLT4gVGhyZXNob2xkQ29uZmlnLAorICAgIG1vZGlmaWVyOiBNb2RpZmllciA9IE1vZGlmaWVyLAorICAgIGNvbnRlbnQ6IEBDb21wb3NhYmxlICgpIC0+IFVuaXQgPSB7fSwKKykgeworICAgIFN1cmZhY2UoCisgICAgICAgIHNoYXBlID0gUm91bmRlZENvcm5lclNoYXBlKDMyLmRwKSwKKyAgICAgICAgbW9kaWZpZXIgPQorICAgICAgICAgICAgbW9kaWZpZXIKKyAgICAgICAgICAgICAgICAucGFkZGluZygxMi5kcCkKKyAgICAgICAgICAgICAgICAuZmlsbE1heFdpZHRoKCkKKyAgICAgICAgICAgICAgICAuaGVpZ2h0IHsgc2hhZGVIZWlnaHRQeCgpLnJvdW5kVG9JbnQoKSB9CisgICAgICAgICAgICAgICAgLmdyYXBoaWNzTGF5ZXIgeworICAgICAgICAgICAgICAgICAgICAvLyBBcHBsaWVzIHRoZSB2ZXJ0aWNhbCBvdmVyLXN0cmV0Y2hpbmcgb2YgdGhlIHNoYWRlIGNvbnRlbnQgdGhhdCBtYXkgaGFwcGVuIGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIGtlZXAgZHJhZ2dpbmcgZG93biB3aGVuIHRoZSBzaGFkZSBpcyBhbHJlYWR5IGZ1bGx5LWV4cGFuZGVkLgorICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW4gPSB0cmFuc2Zvcm1PcmlnaW4uY29weShwaXZvdEZyYWN0aW9uWSA9IDBmKQorICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYWxlWSA9IDEgKyBvdmVyc3RyZXRjaCgpLmNvZXJjZUF0TGVhc3QoMGYpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC5zd2lwZWFibGUoCisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgPSBpc1N3aXBpbmdFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3aXBlYWJsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvblNvdXJjZSA9IGludGVyYWN0aW9uU291cmNlLAorICAgICAgICAgICAgICAgICAgICBhbmNob3JzID0gYW5jaG9ycywKKyAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkcyA9IHRocmVzaG9sZHMsCisgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gT3JpZW50YXRpb24uVmVydGljYWwsCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgY29udGVudCA9IGNvbnRlbnQsCisgICAgKQorfQorCisvKiogRnVubmVscyBjdXJyZW50IHNoYWRlIGV4cGFuc2lvbiB2YWx1ZXMgaW50byB0aGUgdmlldy1tb2RlbC4gKi8KK0BDb21wb3NhYmxlCitwcml2YXRlIGZ1biBSZXBvcnRTaGFkZUV4cGFuc2lvbigKKyAgICB2aWV3TW9kZWw6IFNoYWRlVmlld01vZGVsLAorICAgIHN3aXBlYWJsZVN0YXRlOiBTd2lwZWFibGVTdGF0ZTxTaGFkZVN0YXRlPiwKKyAgICBjb250YWluZXJIZWlnaHRQeDogRmxvYXQsCispIHsKKyAgICBMYXVuY2hlZEVmZmVjdChzd2lwZWFibGVTdGF0ZS5vZmZzZXQsIGNvbnRhaW5lckhlaWdodFB4KSB7CisgICAgICAgIHNuYXBzaG90RmxvdyB7IHN3aXBlYWJsZVN0YXRlLm9mZnNldC52YWx1ZSAvIGNvbnRhaW5lckhlaWdodFB4IH0KKyAgICAgICAgICAgIC5jb2xsZWN0IHsgZXhwYW5zaW9uIC0+IHZpZXdNb2RlbC5vbkV4cGFuc2lvbkNoYW5nZWQoZXhwYW5zaW9uKSB9CisgICAgfQorfQorCisvKiogRnVubmVscyBkcmFnIGdlc3R1cmUgc3RhcnQgYW5kIGVuZCBldmVudHMgaW50byB0aGUgdmlldy1tb2RlbC4gKi8KK0BDb21wb3NhYmxlCitwcml2YXRlIGZ1biBSZXBvcnROb25Qcm94aWVkSW5wdXQoCisgICAgdmlld01vZGVsOiBTaGFkZVZpZXdNb2RlbCwKKyAgICBpbnRlcmFjdGlvblNvdXJjZTogSW50ZXJhY3Rpb25Tb3VyY2UsCispIHsKKyAgICBMYXVuY2hlZEVmZmVjdChpbnRlcmFjdGlvblNvdXJjZSkgeworICAgICAgICBpbnRlcmFjdGlvblNvdXJjZS5pbnRlcmFjdGlvbnMuY29sbGVjdCB7CisgICAgICAgICAgICB3aGVuIChpdCkgeworICAgICAgICAgICAgICAgIGlzIERyYWdJbnRlcmFjdGlvbi5TdGFydCAtPiB7CisgICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlbC5vbkRyYWdTdGFydGVkKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXMgRHJhZ0ludGVyYWN0aW9uLlN0b3AgLT4geworICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZWwub25EcmFnRW5kZWQoKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqIFdoZW4gdG9sZCB0byBmb3JjZSBjb2xsYXBzZSwgY29sbGFwc2VzIHRoZSBzaGFkZS4gKi8KK0BDb21wb3NhYmxlCitwcml2YXRlIGZ1biBIYW5kbGVGb3JjZWRDb2xsYXBzZSgKKyAgICB2aWV3TW9kZWw6IFNoYWRlVmlld01vZGVsLAorICAgIHN3aXBlYWJsZVN0YXRlOiBTd2lwZWFibGVTdGF0ZTxTaGFkZVN0YXRlPiwKKykgeworICAgIExhdW5jaGVkRWZmZWN0KHZpZXdNb2RlbCkgeworICAgICAgICB2aWV3TW9kZWwuaXNGb3JjZUNvbGxhcHNlZC5jb2xsZWN0IHsKKyAgICAgICAgICAgIGxhdW5jaCB7IHN3aXBlYWJsZVN0YXRlLmFuaW1hdGVUbyhTaGFkZVN0YXRlLkZ1bGx5Q29sbGFwc2VkKSB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogSGFuZGxlcyBwcm94aWVkIGlucHV0IChpbnB1dCBvcmlnaW5hdGluZyBvdXRzaWRlIG9mIHRoZSBVSSBvZiB0aGUgc2hhZGUpIGJ5IGRyaXZpbmcgdGhlCisgKiBbU3dpcGVhYmxlU3RhdGVdIGFjY29yZGluZ2x5LgorICovCitAQ29tcG9zYWJsZQorcHJpdmF0ZSBmdW4gSGFuZGxlUHJveGllZElucHV0KAorICAgIHZpZXdNb2RlbDogU2hhZGVWaWV3TW9kZWwsCisgICAgc3dpcGVhYmxlU3RhdGU6IFN3aXBlYWJsZVN0YXRlPFNoYWRlU3RhdGU+LAorICAgIGN1cnJlbnRUaW1lTWlsbGlzOiAoKSAtPiBMb25nLAorKSB7CisgICAgdmFsIHZlbG9jaXR5VHJhY2tlcjogVmVsb2NpdHlUcmFja2VyID0gcmVtZW1iZXIgeyBWZWxvY2l0eVRyYWNrZXIoKSB9CisgICAgTGF1bmNoZWRFZmZlY3Qodmlld01vZGVsKSB7CisgICAgICAgIHZpZXdNb2RlbC5wcm94aWVkSW5wdXQuY29sbGVjdCB7CisgICAgICAgICAgICB3aGVuIChpdCkgeworICAgICAgICAgICAgICAgIGlzIFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZyAtPiB7CisgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5VHJhY2tlci5hZGRQb3NpdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVNaWxsaXMgPSBjdXJyZW50VGltZU1pbGxpcy5pbnZva2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gT2Zmc2V0KDBmLCBpdC55RHJhZ0Ftb3VudFB4KSwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBzd2lwZWFibGVTdGF0ZS5wZXJmb3JtRHJhZyhpdC55RHJhZ0Ftb3VudFB4KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcyBQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWdFbmQgLT4geworICAgICAgICAgICAgICAgICAgICBsYXVuY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsIHZlbG9jaXR5ID0gdmVsb2NpdHlUcmFja2VyLmNhbGN1bGF0ZVZlbG9jaXR5KCkueQorICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLnJlc2V0VHJhY2tpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgdXNlIGEgVmVsb2NpdHlUcmFja2VyIHRvIGtlZXAgYSByZWNvcmQgb2YgaG93IGZhc3QgdGhlIHBvaW50ZXIgd2FzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3Zpbmcgc3VjaCB0aGF0IHdlIGtub3cgaG93IGZhciB0byBmbGluZyB0aGUgc2hhZGUgd2hlbiB0aGUgZ2VzdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kcy4gRmxpbmdpbmcgdGhlIFN3aXBlYWJsZVN0YXRlIHVzaW5nIHBlcmZvcm1GbGluZyBpcyByZXF1aXJlZCBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lIG9yIG1vcmUgY2FsbHMgdG8gcGVyZm9ybURyYWcgc3VjaCB0aGF0IHRoZSBzd2lwZWFibGUgc2V0dGxlcyBpbnRvIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHN0YXRlcy4gV2l0aG91dCBkb2luZyB0aGF0LCB0aGUgc2hhZGUgd291bGQgcmVtYWluIHVubW92aW5nIGluIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbi1iZXR3ZWVuIHN0YXRlIG9uIHRoZSBzY3JlZW4uCisgICAgICAgICAgICAgICAgICAgICAgICBzd2lwZWFibGVTdGF0ZS5wZXJmb3JtRmxpbmcodmVsb2NpdHkpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXMgUHJveGllZElucHV0TW9kZWwuT25EcmFnQ2FuY2VsIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGF1bmNoIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5VHJhY2tlci5yZXNldFRyYWNraW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXBlYWJsZVN0YXRlLmFuaW1hdGVUbyhzd2lwZWFibGVTdGF0ZS5wcm9ncmVzcy5mcm9tKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLT4gVW5pdAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBbRmxvYXRdICh3aGljaCBpcyBhc3N1bWVkIHRvIGJlIGEgZnJhY3Rpb24gYmV0d2VlbiBgMGAgYW5kIGAxYCkgdG8gYSB2YWx1ZSBpbiBkcC4KKyAqCisgKiBAcGFyYW0gZGVuc2l0eSBUaGUgW0RlbnNpdHldIG9mIHRoZSBkaXNwbGF5LgorICogQHBhcmFtIHdob2xlUHggVGhlIHdob2xlIGFtb3VudCB0aGF0IHRoZSBnaXZlbiBbRmxvYXRdIGlzIGEgZnJhY3Rpb24gb2YuCisgKiBAcmV0dXJuIFRoZSBkcCBzaXplIHRoYXQncyBhIGZyYWN0aW9uIG9mIHRoZSB3aG9sZSBhbW91bnQuCisgKi8KK3ByaXZhdGUgZnVuIEZsb2F0LmZyYWN0aW9uVG9EcChkZW5zaXR5OiBEZW5zaXR5LCB3aG9sZVB4OiBGbG9hdCk6IERwIHsKKyAgICByZXR1cm4gd2l0aChkZW5zaXR5KSB7ICh0aGlzQGZyYWN0aW9uVG9EcCAqIHdob2xlUHgpLnRvRHAoKSB9Cit9CisKK3ByaXZhdGUgZnVuIE1vZGlmaWVyLnNoYWRlV2lkdGgoCisgICAgc2l6ZTogU2hhZGVWaWV3TW9kZWwuU2l6ZSwKKyAgICBkZW5zaXR5OiBEZW5zaXR5LAorKTogTW9kaWZpZXIgeworICAgIHJldHVybiB0aGVuKAorICAgICAgICB3aGVuIChzaXplKSB7CisgICAgICAgICAgICBpcyBTaGFkZVZpZXdNb2RlbC5TaXplLkZyYWN0aW9uIC0+IE1vZGlmaWVyLmZpbGxNYXhXaWR0aChzaXplLmZyYWN0aW9uKQorICAgICAgICAgICAgaXMgU2hhZGVWaWV3TW9kZWwuU2l6ZS5QaXhlbHMgLT4gTW9kaWZpZXIud2lkdGgod2l0aChkZW5zaXR5KSB7IHNpemUucGl4ZWxzLnRvRHAoKSB9KQorICAgICAgICB9CisgICAgKQorfQorCisvKiogUmV0dXJucyB0aGUgcGl4ZWwgcG9zaXRpb25zIGZvciBlYWNoIG9mIHRoZSBzdXBwb3J0ZWQgc2hhZGUgc3RhdGVzLiAqLworcHJpdmF0ZSBmdW4gc3dpcGVhYmxlQW5jaG9ycyhjb250YWluZXJIZWlnaHRQeDogRmxvYXQpOiBNYXA8RmxvYXQsIFNoYWRlU3RhdGU+IHsKKyAgICByZXR1cm4gbWFwT2YoCisgICAgICAgIDBmIHRvIFNoYWRlU3RhdGUuRnVsbHlDb2xsYXBzZWQsCisgICAgICAgIGNvbnRhaW5lckhlaWdodFB4IHRvIFNoYWRlU3RhdGUuRnVsbHlFeHBhbmRlZCwKKyAgICApCit9CisKKy8qKgorICogUmV0dXJucyB0aGUgW1RocmVzaG9sZENvbmZpZ10gZm9yIGhvdyBmYXIgdGhlIHNoYWRlIHNob3VsZCBiZSBleHBhbmRlZCBvciBjb2xsYXBzZWQgc3VjaCB0aGF0IGl0CisgKiBhY3R1YWxseSBjb21wbGV0ZXMgdGhlIGV4cGFuc2lvbiBvciBjb2xsYXBzZSBhZnRlciB0aGUgdXNlciBsaWZ0cyB0aGVpciBwb2ludGVyLgorICovCitwcml2YXRlIGZ1biBzd2lwZWFibGVUaHJlc2hvbGRzKAorICAgIHRvOiBTaGFkZVN0YXRlLAorICAgIHN3aXBlRXhwYW5kVGhyZXNob2xkOiBEcCwKKyAgICBzd2lwZUNvbGxhcHNlVGhyZXNob2xkOiBEcCwKKyk6IFRocmVzaG9sZENvbmZpZyB7CisgICAgcmV0dXJuIEZpeGVkVGhyZXNob2xkKAorICAgICAgICB3aGVuICh0bykgeworICAgICAgICAgICAgU2hhZGVTdGF0ZS5GdWxseUV4cGFuZGVkIC0+IHN3aXBlRXhwYW5kVGhyZXNob2xkCisgICAgICAgICAgICBTaGFkZVN0YXRlLkZ1bGx5Q29sbGFwc2VkIC0+IHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQKKyAgICAgICAgfQorICAgICkKK30KKworLyoqIEVudW1lcmF0ZXMgdGhlIHNoYWRlIFVJIHN0YXRlcyBmb3IgW1N3aXBlYWJsZVN0YXRlXS4gKi8KK3ByaXZhdGUgZW51bSBjbGFzcyBTaGFkZVN0YXRlIHsKKyAgICBGdWxseUNvbGxhcHNlZCwKKyAgICBGdWxseUV4cGFuZGVkLAorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mZWF0dXJlcy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbm90aWZpY2F0aW9ucy91aS9jb21wb3NhYmxlL05vdGlmaWNhdGlvbnMua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RpZmljYXRpb25zL3VpL2NvbXBvc2FibGUvTm90aWZpY2F0aW9ucy5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTkxYjhhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mZWF0dXJlcy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbm90aWZpY2F0aW9ucy91aS9jb21wb3NhYmxlL05vdGlmaWNhdGlvbnMua3QKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm5vdGlmaWNhdGlvbnMudWkuY29tcG9zYWJsZQorCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5Db2x1bW4KK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LlNwYWNlcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuZGVmYXVsdE1pblNpemUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LmZpbGxNYXhXaWR0aAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQucGFkZGluZworaW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UubWF0ZXJpYWwzLlRleHQKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnJ1bnRpbWUuQ29tcG9zYWJsZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuQWxpZ25tZW50CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5Nb2RpZmllcgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkudW5pdC5kcAorCitAQ29tcG9zYWJsZQorZnVuIE5vdGlmaWNhdGlvbnMoCisgICAgbW9kaWZpZXI6IE1vZGlmaWVyID0gTW9kaWZpZXIsCispIHsKKyAgICAvLyBUT0RPKGIvMjcyNzc5ODI4KTogaW1wbGVtZW50LgorICAgIENvbHVtbigKKyAgICAgICAgbW9kaWZpZXIgPSBtb2RpZmllci5maWxsTWF4V2lkdGgoKS5kZWZhdWx0TWluU2l6ZShtaW5IZWlnaHQgPSAzMDAuZHApLnBhZGRpbmcoNC5kcCksCisgICAgKSB7CisgICAgICAgIFRleHQoIk5vdGlmaWNhdGlvbnMiLCBtb2RpZmllciA9IE1vZGlmaWVyLmFsaWduKEFsaWdubWVudC5DZW50ZXJIb3Jpem9udGFsbHkpKQorICAgICAgICBTcGFjZXIobW9kaWZpZXIgPSBNb2RpZmllci53ZWlnaHQoMWYpKQorICAgICAgICBUZXh0KCJTaGVsZiIsIG1vZGlmaWVyID0gTW9kaWZpZXIuYWxpZ24oQWxpZ25tZW50LkNlbnRlckhvcml6b250YWxseSkpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mZWF0dXJlcy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvZm9vdGVyL3VpL2NvbXBvc2UvUXVpY2tTZXR0aW5ncy5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmVhdHVyZXMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL2Zvb3Rlci91aS9jb21wb3NlL1F1aWNrU2V0dGluZ3Mua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1ZDZkZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL2NvbXBvc2UvZmVhdHVyZXMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL2Zvb3Rlci91aS9jb21wb3NlL1F1aWNrU2V0dGluZ3Mua3QKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLmZvb3Rlci51aS5jb21wb3NlCisKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LkNvbHVtbgoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuU3BhY2VyCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5kZWZhdWx0TWluU2l6ZQoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UuZm91bmRhdGlvbi5sYXlvdXQuZmlsbE1heFdpZHRoCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5wYWRkaW5nCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5tYXRlcmlhbDMuVGV4dAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UucnVudGltZS5Db21wb3NhYmxlCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS5BbGlnbm1lbnQKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLk1vZGlmaWVyCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS51aS51bml0LmRwCisKK0BDb21wb3NhYmxlCitmdW4gUXVpY2tTZXR0aW5ncygKKyAgICBtb2RpZmllcjogTW9kaWZpZXIgPSBNb2RpZmllciwKKykgeworICAgIC8vIFRPRE8oYi8yNzI3ODAwNTgpOiBpbXBsZW1lbnQuCisgICAgQ29sdW1uKAorICAgICAgICBtb2RpZmllciA9IG1vZGlmaWVyLmZpbGxNYXhXaWR0aCgpLmRlZmF1bHRNaW5TaXplKG1pbkhlaWdodCA9IDMwMC5kcCkucGFkZGluZyg0LmRwKSwKKyAgICApIHsKKyAgICAgICAgVGV4dCgiUXVpY2sgc2V0dGluZ3MiLCBtb2RpZmllciA9IE1vZGlmaWVyLmFsaWduKEFsaWdubWVudC5DZW50ZXJIb3Jpem9udGFsbHkpKQorICAgICAgICBTcGFjZXIobW9kaWZpZXIgPSBNb2RpZmllci53ZWlnaHQoMWYpKQorICAgICAgICBUZXh0KCJRUyBmb290ZXIgYWN0aW9ucyIsIG1vZGlmaWVyID0gTW9kaWZpZXIuYWxpZ24oQWxpZ25tZW50LkNlbnRlckhvcml6b250YWxseSkpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mZWF0dXJlcy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3VpL2NvbXBvc2FibGUvU3RhdHVzQmFyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvY29tcG9zZS9mZWF0dXJlcy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3VpL2NvbXBvc2FibGUvU3RhdHVzQmFyLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTRhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jb21wb3NlL2ZlYXR1cmVzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdWkvY29tcG9zYWJsZS9TdGF0dXNCYXIua3QKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci51aS5jb21wb3NhYmxlCisKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LkFycmFuZ2VtZW50CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5Sb3cKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LmRlZmF1bHRNaW5TaXplCitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5mb3VuZGF0aW9uLmxheW91dC5maWxsTWF4V2lkdGgKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLmZvdW5kYXRpb24ubGF5b3V0LnBhZGRpbmcKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLm1hdGVyaWFsMy5UZXh0CitpbXBvcnQgYW5kcm9pZHguY29tcG9zZS5ydW50aW1lLkNvbXBvc2FibGUKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLkFsaWdubWVudAoraW1wb3J0IGFuZHJvaWR4LmNvbXBvc2UudWkuTW9kaWZpZXIKK2ltcG9ydCBhbmRyb2lkeC5jb21wb3NlLnVpLnVuaXQuZHAKKworQENvbXBvc2FibGUKK2Z1biBTdGF0dXNCYXIoCisgICAgbW9kaWZpZXI6IE1vZGlmaWVyID0gTW9kaWZpZXIsCispIHsKKyAgICAvLyBUT0RPKGIvMjcyNzgwMTAxKTogaW1wbGVtZW50LgorICAgIFJvdygKKyAgICAgICAgbW9kaWZpZXIgPSBtb2RpZmllci5maWxsTWF4V2lkdGgoKS5kZWZhdWx0TWluU2l6ZShtaW5IZWlnaHQgPSA0OC5kcCkucGFkZGluZyg0LmRwKSwKKyAgICAgICAgaG9yaXpvbnRhbEFycmFuZ2VtZW50ID0gQXJyYW5nZW1lbnQuQ2VudGVyLAorICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudCA9IEFsaWdubWVudC5DZW50ZXJWZXJ0aWNhbGx5LAorICAgICkgeworICAgICAgICBUZXh0KCJTdGF0dXMgYmFyIikKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9jdXN0b21pemF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFyZWQvY2xvY2tzL0Nsb2NrUmVnaXN0cnkua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9jdXN0b21pemF0aW9uL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFyZWQvY2xvY2tzL0Nsb2NrUmVnaXN0cnkua3QKaW5kZXggMDBjMGEwYi4uZTczYWZlNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvY3VzdG9taXphdGlvbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhcmVkL2Nsb2Nrcy9DbG9ja1JlZ2lzdHJ5Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL2N1c3RvbWl6YXRpb24vc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9jbG9ja3MvQ2xvY2tSZWdpc3RyeS5rdApAQCAtMjksMTQgKzI5LDE1IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5DbG9ja1Byb3ZpZGVyCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5DbG9ja1Byb3ZpZGVyUGx1Z2luCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5DbG9ja1NldHRpbmdzCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5QbHVnaW5MaWZlY3ljbGVNYW5hZ2VyCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5QbHVnaW5MaXN0ZW5lcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuUGx1Z2luTWFuYWdlcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwuQXNzZXJ0CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW4KIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuQ29yb3V0aW5lRGlzcGF0Y2hlcgogaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5Db3JvdXRpbmVTY29wZQogaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5sYXVuY2gKIAotcHJpdmF0ZSB2YWwgVEFHID0gQ2xvY2tSZWdpc3RyeTo6Y2xhc3Muc2ltcGxlTmFtZSEhCiBwcml2YXRlIGNvbnN0IHZhbCBERUJVRyA9IHRydWUKIHByaXZhdGUgdmFsIEtFWV9USU1FU1RBTVAgPSAiYXBwbGllZFRpbWVzdGFtcCIKIApAQCAtNTEsNyArNTIsMTAgQEAKICAgICB2YWwgaGFuZGxlQWxsVXNlcnM6IEJvb2xlYW4sCiAgICAgZGVmYXVsdENsb2NrUHJvdmlkZXI6IENsb2NrUHJvdmlkZXIsCiAgICAgdmFsIGZhbGxiYWNrQ2xvY2tJZDogQ2xvY2tJZCA9IERFRkFVTFRfQ0xPQ0tfSUQsCisgICAgdmFsIGtlZXBBbGxMb2FkZWQ6IEJvb2xlYW4sCisgICAgdmFsIHN1YlRhZzogU3RyaW5nLAogKSB7CisgICAgcHJpdmF0ZSB2YWwgVEFHID0gIiR7Q2xvY2tSZWdpc3RyeTo6Y2xhc3Muc2ltcGxlTmFtZX0gKCRzdWJUYWcpIgogICAgIGludGVyZmFjZSBDbG9ja0NoYW5nZUxpc3RlbmVyIHsKICAgICAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGFjdGl2ZSBjbG9jayBjaGFuZ2VzCiAgICAgICAgIGZ1biBvbkN1cnJlbnRDbG9ja0NoYW5nZWQoKSB7fQpAQCAtNzYsMTEgKzgwLDg1IEBACiAKICAgICBwcml2YXRlIHZhbCBwbHVnaW5MaXN0ZW5lciA9CiAgICAgICAgIG9iamVjdCA6IFBsdWdpbkxpc3RlbmVyPENsb2NrUHJvdmlkZXJQbHVnaW4+IHsKLSAgICAgICAgICAgIG92ZXJyaWRlIGZ1biBvblBsdWdpbkNvbm5lY3RlZChwbHVnaW46IENsb2NrUHJvdmlkZXJQbHVnaW4sIGNvbnRleHQ6IENvbnRleHQpID0KLSAgICAgICAgICAgICAgICBjb25uZWN0Q2xvY2tzKHBsdWdpbikKKyAgICAgICAgICAgIG92ZXJyaWRlIGZ1biBvblBsdWdpbkF0dGFjaGVkKG1hbmFnZXI6IFBsdWdpbkxpZmVjeWNsZU1hbmFnZXI8Q2xvY2tQcm92aWRlclBsdWdpbj4pIHsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmxvYWRQbHVnaW4oKQorICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdmVycmlkZSBmdW4gb25QbHVnaW5EaXNjb25uZWN0ZWQocGx1Z2luOiBDbG9ja1Byb3ZpZGVyUGx1Z2luKSA9Ci0gICAgICAgICAgICAgICAgZGlzY29ubmVjdENsb2NrcyhwbHVnaW4pCisgICAgICAgICAgICBvdmVycmlkZSBmdW4gb25QbHVnaW5Mb2FkZWQoCisgICAgICAgICAgICAgICAgcGx1Z2luOiBDbG9ja1Byb3ZpZGVyUGx1Z2luLAorICAgICAgICAgICAgICAgIHBsdWdpbkNvbnRleHQ6IENvbnRleHQsCisgICAgICAgICAgICAgICAgbWFuYWdlcjogUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcjxDbG9ja1Byb3ZpZGVyUGx1Z2luPgorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgdmFyIGlzQ2xvY2tMaXN0Q2hhbmdlZCA9IGZhbHNlCisgICAgICAgICAgICAgICAgZm9yIChjbG9jayBpbiBwbHVnaW4uZ2V0Q2xvY2tzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsIGlkID0gY2xvY2suY2xvY2tJZAorICAgICAgICAgICAgICAgICAgICB2YXIgaXNOZXcgPSBmYWxzZQorICAgICAgICAgICAgICAgICAgICB2YWwgaW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVDbG9ja3MuZ2V0T3JQdXQoaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05ldyA9IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9ja0luZm8oY2xvY2ssIHBsdWdpbiwgbWFuYWdlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoaXNOZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xvY2tMaXN0Q2hhbmdlZCA9IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29ubmVjdGVkKGlkKQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hbmFnZXIgIT0gaW5mby5tYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsb2NrIElkIGNvbmZsaWN0IG9uIGxvYWQ6ICRpZCBpcyByZWdpc3RlcmVkIHRvIGFub3RoZXIgcHJvdmlkZXIiCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW5mby5wcm92aWRlciA9IHBsdWdpbgorICAgICAgICAgICAgICAgICAgICBvbkxvYWRlZChpZCkKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXNDbG9ja0xpc3RDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJPbkF2YWlsYWJsZUNsb2Nrc0NoYW5nZWQoKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2ZXJpZnlMb2FkZWRQcm92aWRlcnMoKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdmVycmlkZSBmdW4gb25QbHVnaW5VbmxvYWRlZCgKKyAgICAgICAgICAgICAgICBwbHVnaW46IENsb2NrUHJvdmlkZXJQbHVnaW4sCisgICAgICAgICAgICAgICAgbWFuYWdlcjogUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcjxDbG9ja1Byb3ZpZGVyUGx1Z2luPgorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgZm9yIChjbG9jayBpbiBwbHVnaW4uZ2V0Q2xvY2tzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsIGlkID0gY2xvY2suY2xvY2tJZAorICAgICAgICAgICAgICAgICAgICB2YWwgaW5mbyA9IGF2YWlsYWJsZUNsb2Nrc1tpZF0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8/Lm1hbmFnZXIgIT0gbWFuYWdlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbG9jayBJZCBjb25mbGljdCBvbiB1bmxvYWQ6ICRpZCBpcyByZWdpc3RlcmVkIHRvIGFub3RoZXIgcHJvdmlkZXIiCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZm8ucHJvdmlkZXIgPSBudWxsCisgICAgICAgICAgICAgICAgICAgIG9uVW5sb2FkZWQoaWQpCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmVyaWZ5TG9hZGVkUHJvdmlkZXJzKCkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3ZlcnJpZGUgZnVuIG9uUGx1Z2luRGV0YWNoZWQobWFuYWdlcjogUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcjxDbG9ja1Byb3ZpZGVyUGx1Z2luPikgeworICAgICAgICAgICAgICAgIHZhbCByZW1vdmVkID0gbXV0YWJsZUxpc3RPZjxDbG9ja0lkPigpCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlQ2xvY2tzLmVudHJpZXMucmVtb3ZlQWxsIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0LnZhbHVlLm1hbmFnZXIgIT0gbWFuYWdlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQHJlbW92ZUFsbCBmYWxzZQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZC5hZGQoaXQua2V5KQorICAgICAgICAgICAgICAgICAgICByZXR1cm5AcmVtb3ZlQWxsIHRydWUKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZW1vdmVkLmZvckVhY2goOjpvbkRpc2Nvbm5lY3RlZCkKKyAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZC5zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyT25BdmFpbGFibGVDbG9ja3NDaGFuZ2VkKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgIHByaXZhdGUgdmFsIHVzZXJTd2l0Y2hPYnNlcnZlciA9CkBAIC05Niw3ICsxNzQsOCBAQAogICAgICAgICBwcm90ZWN0ZWQgc2V0KHZhbHVlKSB7CiAgICAgICAgICAgICBpZiAoZmllbGQgIT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgICBmaWVsZCA9IHZhbHVlCi0gICAgICAgICAgICAgICAgc2NvcGUubGF1bmNoKG1haW5EaXNwYXRjaGVyKSB7IG9uQ2xvY2tDaGFuZ2VkIHsgaXQub25DdXJyZW50Q2xvY2tDaGFuZ2VkKCkgfSB9CisgICAgICAgICAgICAgICAgdmVyaWZ5TG9hZGVkUHJvdmlkZXJzKCkKKyAgICAgICAgICAgICAgICB0cmlnZ2VyT25DdXJyZW50Q2xvY2tDaGFuZ2VkKCkKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNjgsOSArMjQ3LDM2IEBACiAgICAgICAgIEFzc2VydC5pc05vdE1haW5UaHJlYWQoKQogICAgIH0KIAotICAgIHByaXZhdGUgZnVuIG9uQ2xvY2tDaGFuZ2VkKGZ1bmM6IChDbG9ja0NoYW5nZUxpc3RlbmVyKSAtPiBVbml0KSB7Ci0gICAgICAgIGFzc2VydE1haW5UaHJlYWQoKQotICAgICAgICBjbG9ja0NoYW5nZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmMpCisgICAgcHJpdmF0ZSB2YXIgaXNDbG9ja0NoYW5nZWQgPSBBdG9taWNCb29sZWFuKGZhbHNlKQorICAgIHByaXZhdGUgZnVuIHRyaWdnZXJPbkN1cnJlbnRDbG9ja0NoYW5nZWQoKSB7CisgICAgICAgIHZhbCBzaG91bGRTY2hlZHVsZSA9IGlzQ2xvY2tDaGFuZ2VkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpCisgICAgICAgIGlmICghc2hvdWxkU2NoZWR1bGUpIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJIQVdLIiwgInRyaWdnZXJPbkN1cnJlbnRDbG9ja0NoYW5nZWQiKQorICAgICAgICBzY29wZS5sYXVuY2gobWFpbkRpc3BhdGNoZXIpIHsKKyAgICAgICAgICAgIGFzc2VydE1haW5UaHJlYWQoKQorICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJIQVdLIiwgImlzQ2xvY2tDaGFuZ2VkIikKKyAgICAgICAgICAgIGlzQ2xvY2tDaGFuZ2VkLnNldChmYWxzZSkKKyAgICAgICAgICAgIGNsb2NrQ2hhbmdlTGlzdGVuZXJzLmZvckVhY2ggeyBpdC5vbkN1cnJlbnRDbG9ja0NoYW5nZWQoKSB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZhciBpc0Nsb2NrTGlzdENoYW5nZWQgPSBBdG9taWNCb29sZWFuKGZhbHNlKQorICAgIHByaXZhdGUgZnVuIHRyaWdnZXJPbkF2YWlsYWJsZUNsb2Nrc0NoYW5nZWQoKSB7CisgICAgICAgIHZhbCBzaG91bGRTY2hlZHVsZSA9IGlzQ2xvY2tMaXN0Q2hhbmdlZC5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKQorICAgICAgICBpZiAoIXNob3VsZFNjaGVkdWxlKSB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorCisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgiSEFXSyIsICJ0cmlnZ2VyT25BdmFpbGFibGVDbG9ja3NDaGFuZ2VkIikKKyAgICAgICAgc2NvcGUubGF1bmNoKG1haW5EaXNwYXRjaGVyKSB7CisgICAgICAgICAgICBhc3NlcnRNYWluVGhyZWFkKCkKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgiSEFXSyIsICJpc0Nsb2NrTGlzdENoYW5nZWQiKQorICAgICAgICAgICAgaXNDbG9ja0xpc3RDaGFuZ2VkLnNldChmYWxzZSkKKyAgICAgICAgICAgIGNsb2NrQ2hhbmdlTGlzdGVuZXJzLmZvckVhY2ggeyBpdC5vbkF2YWlsYWJsZUNsb2Nrc0NoYW5nZWQoKSB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgZnVuIG11dGF0ZVNldHRpbmcobXV0YXRvcjogKENsb2NrU2V0dGluZ3MpIC0+IENsb2NrU2V0dGluZ3MpIHsKQEAgLTE5MCw3ICsyOTYsMTIgQEAKICAgICAgICAgfQogCiAgICAgaW5pdCB7Ci0gICAgICAgIGNvbm5lY3RDbG9ja3MoZGVmYXVsdENsb2NrUHJvdmlkZXIpCisgICAgICAgIC8vIFJlZ2lzdGVyIGRlZmF1bHQgY2xvY2sgZGVzaWducworICAgICAgICBmb3IgKGNsb2NrIGluIGRlZmF1bHRDbG9ja1Byb3ZpZGVyLmdldENsb2NrcygpKSB7CisgICAgICAgICAgICBhdmFpbGFibGVDbG9ja3NbY2xvY2suY2xvY2tJZF0gPSBDbG9ja0luZm8oY2xvY2ssIGRlZmF1bHRDbG9ja1Byb3ZpZGVyLCBudWxsKQorICAgICAgICB9CisKKyAgICAgICAgLy8gU29tZXRoaW5nIGhhcyBnb25lIHRlcnJpYmx5IHdyb25nIGlmIHRoZSBkZWZhdWx0IGNsb2NrIGlzbid0IHByZXNlbnQKICAgICAgICAgaWYgKCFhdmFpbGFibGVDbG9ja3MuY29udGFpbnNLZXkoREVGQVVMVF9DTE9DS19JRCkpIHsKICAgICAgICAgICAgIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiJGRlZmF1bHRDbG9ja1Byb3ZpZGVyIGRpZCBub3QgcmVnaXN0ZXIgY2xvY2sgYXQgJERFRkFVTFRfQ0xPQ0tfSUQiCkBAIC0yNDQsNTkgKzM1NSw4NyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmdW4gY29ubmVjdENsb2Nrcyhwcm92aWRlcjogQ2xvY2tQcm92aWRlcikgewotICAgICAgICB2YXIgaXNBdmFpbGFibGVDaGFuZ2VkID0gZmFsc2UKLSAgICAgICAgdmFsIGN1cnJlbnRJZCA9IGN1cnJlbnRDbG9ja0lkCi0gICAgICAgIGZvciAoY2xvY2sgaW4gcHJvdmlkZXIuZ2V0Q2xvY2tzKCkpIHsKLSAgICAgICAgICAgIHZhbCBpZCA9IGNsb2NrLmNsb2NrSWQKLSAgICAgICAgICAgIHZhbCBjdXJyZW50ID0gYXZhaWxhYmxlQ2xvY2tzW2lkXQotICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKAotICAgICAgICAgICAgICAgICAgICBUQUcsCi0gICAgICAgICAgICAgICAgICAgICJDbG9jayBJZCBjb25mbGljdDogJGlkIGlzIHJlZ2lzdGVyZWQgYnkgYm90aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIke3Byb3ZpZGVyOjpjbGFzcy5zaW1wbGVOYW1lfSBhbmQgJHtjdXJyZW50LnByb3ZpZGVyOjpjbGFzcy5zaW1wbGVOYW1lfSIKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXZhaWxhYmxlQ2xvY2tzW2lkXSA9IENsb2NrSW5mbyhjbG9jaywgcHJvdmlkZXIpCi0gICAgICAgICAgICBpc0F2YWlsYWJsZUNoYW5nZWQgPSB0cnVlCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJBZGRlZCAke2Nsb2NrLmNsb2NrSWR9IikKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRJZCA9PSBpZCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDdXJyZW50IGNsb2NrICgkY3VycmVudElkKSB3YXMgY29ubmVjdGVkIikKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb25DbG9ja0NoYW5nZWQgeyBpdC5vbkN1cnJlbnRDbG9ja0NoYW5nZWQoKSB9Ci0gICAgICAgICAgICB9CisgICAgcHJpdmF0ZSB2YXIgaXNWZXJpZnlpbmcgPSBBdG9taWNCb29sZWFuKGZhbHNlKQorICAgIHByaXZhdGUgZnVuIHZlcmlmeUxvYWRlZFByb3ZpZGVycygpIHsKKyAgICAgICAgdmFsIHNob3VsZFNjaGVkdWxlID0gaXNWZXJpZnlpbmcuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkKKyAgICAgICAgaWYgKCFzaG91bGRTY2hlZHVsZSkgeworICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaXNBdmFpbGFibGVDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBvbkNsb2NrQ2hhbmdlZCB7IGl0Lm9uQXZhaWxhYmxlQ2xvY2tzQ2hhbmdlZCgpIH0KKyAgICAgICAgc2NvcGUubGF1bmNoKGJnRGlzcGF0Y2hlcikgeworICAgICAgICAgICAgaWYgKGtlZXBBbGxMb2FkZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBFbmZvcmNlIHRoYXQgYWxsIHBsdWdpbnMgYXJlIGxvYWRlZCBpZiByZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICBmb3IgKChfLCBpbmZvKSBpbiBhdmFpbGFibGVDbG9ja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tYW5hZ2VyPy5sb2FkUGx1Z2luKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNWZXJpZnlpbmcuc2V0KGZhbHNlKQorICAgICAgICAgICAgICAgIHJldHVybkBsYXVuY2gKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsIGN1cnJlbnRDbG9jayA9IGF2YWlsYWJsZUNsb2Nrc1tjdXJyZW50Q2xvY2tJZF0KKyAgICAgICAgICAgIGlmIChjdXJyZW50Q2xvY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgQ2xvY2sgbWlzc2luZywgbG9hZCBubyBwbHVnaW5zIGFuZCB1c2UgZGVmYXVsdAorICAgICAgICAgICAgICAgIGZvciAoKF8sIGluZm8pIGluIGF2YWlsYWJsZUNsb2NrcykgeworICAgICAgICAgICAgICAgICAgICBpbmZvLm1hbmFnZXI/LnVubG9hZFBsdWdpbigpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzVmVyaWZ5aW5nLnNldChmYWxzZSkKKyAgICAgICAgICAgICAgICByZXR1cm5AbGF1bmNoCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhbCBjdXJyZW50TWFuYWdlciA9IGN1cnJlbnRDbG9jay5tYW5hZ2VyCisgICAgICAgICAgICBjdXJyZW50TWFuYWdlcj8ubG9hZFBsdWdpbigpCisKKyAgICAgICAgICAgIGZvciAoKF8sIGluZm8pIGluIGF2YWlsYWJsZUNsb2NrcykgeworICAgICAgICAgICAgICAgIHZhbCBtYW5hZ2VyID0gaW5mby5tYW5hZ2VyCisgICAgICAgICAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyLmlzTG9hZGVkICYmIGN1cnJlbnRNYW5hZ2VyICE9IG1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci51bmxvYWRQbHVnaW4oKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzVmVyaWZ5aW5nLnNldChmYWxzZSkKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgZnVuIGRpc2Nvbm5lY3RDbG9ja3MocHJvdmlkZXI6IENsb2NrUHJvdmlkZXIpIHsKLSAgICAgICAgdmFyIGlzQXZhaWxhYmxlQ2hhbmdlZCA9IGZhbHNlCi0gICAgICAgIHZhbCBjdXJyZW50SWQgPSBjdXJyZW50Q2xvY2tJZAotICAgICAgICBmb3IgKGNsb2NrIGluIHByb3ZpZGVyLmdldENsb2NrcygpKSB7Ci0gICAgICAgICAgICBhdmFpbGFibGVDbG9ja3MucmVtb3ZlKGNsb2NrLmNsb2NrSWQpCi0gICAgICAgICAgICBpc0F2YWlsYWJsZUNoYW5nZWQgPSB0cnVlCi0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlbW92ZWQgJHtjbG9jay5jbG9ja0lkfSIpCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjdXJyZW50SWQgPT0gY2xvY2suY2xvY2tJZCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkN1cnJlbnQgY2xvY2sgKCRjdXJyZW50SWQpIHdhcyBkaXNjb25uZWN0ZWQiKQotICAgICAgICAgICAgICAgIG9uQ2xvY2tDaGFuZ2VkIHsgaXQub25DdXJyZW50Q2xvY2tDaGFuZ2VkKCkgfQotICAgICAgICAgICAgfQorICAgIHByaXZhdGUgZnVuIG9uQ29ubmVjdGVkKGNsb2NrSWQ6IENsb2NrSWQpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJDb25uZWN0ZWQgJGNsb2NrSWQiKQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGlzQXZhaWxhYmxlQ2hhbmdlZCkgewotICAgICAgICAgICAgb25DbG9ja0NoYW5nZWQgeyBpdC5vbkF2YWlsYWJsZUNsb2Nrc0NoYW5nZWQoKSB9CisgICAgICAgIGlmIChjdXJyZW50Q2xvY2tJZCA9PSBjbG9ja0lkKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDdXJyZW50IGNsb2NrICgkY2xvY2tJZCkgd2FzIGNvbm5lY3RlZCIpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1biBvbkxvYWRlZChjbG9ja0lkOiBDbG9ja0lkKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiTG9hZGVkICRjbG9ja0lkIikKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50Q2xvY2tJZCA9PSBjbG9ja0lkKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJDdXJyZW50IGNsb2NrICgkY2xvY2tJZCkgd2FzIGxvYWRlZCIpCisgICAgICAgICAgICB0cmlnZ2VyT25DdXJyZW50Q2xvY2tDaGFuZ2VkKCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuIG9uVW5sb2FkZWQoY2xvY2tJZDogQ2xvY2tJZCkgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlVubG9hZGVkICRjbG9ja0lkIikKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50Q2xvY2tJZCA9PSBjbG9ja0lkKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJDdXJyZW50IGNsb2NrICgkY2xvY2tJZCkgd2FzIHVubG9hZGVkIikKKyAgICAgICAgICAgIHRyaWdnZXJPbkN1cnJlbnRDbG9ja0NoYW5nZWQoKQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gb25EaXNjb25uZWN0ZWQoY2xvY2tJZDogQ2xvY2tJZCkgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkRpc2Nvbm5lY3RlZCAkY2xvY2tJZCIpCisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VycmVudENsb2NrSWQgPT0gY2xvY2tJZCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiQ3VycmVudCBjbG9jayAoJGNsb2NrSWQpIHdhcyBkaXNjb25uZWN0ZWQiKQogICAgICAgICB9CiAgICAgfQogCkBAIC0zNDUsNiArNDg0LDcgQEAKIAogICAgIHByaXZhdGUgZGF0YSBjbGFzcyBDbG9ja0luZm8oCiAgICAgICAgIHZhbCBtZXRhZGF0YTogQ2xvY2tNZXRhZGF0YSwKLSAgICAgICAgdmFsIHByb3ZpZGVyOiBDbG9ja1Byb3ZpZGVyLAorICAgICAgICB2YXIgcHJvdmlkZXI6IENsb2NrUHJvdmlkZXI/LAorICAgICAgICB2YWwgbWFuYWdlcjogUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcjxDbG9ja1Byb3ZpZGVyUGx1Z2luPj8sCiAgICAgKQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9wbHVnaW5zL3FzL1FTVGlsZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvcGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9wbHVnaW5zL3FzL1FTVGlsZS5qYXZhCmluZGV4IDFkMjhjNjMuLmMwYjY5YzEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3BsdWdpbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcGx1Z2lucy9xcy9RU1RpbGUuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3BsdWdpbnMvcXMvUVNUaWxlLmphdmEKQEAgLTE4OSwxMCArMTg5LDEyIEBACiAKICAgICAgICAgLyoqIEdldCB0aGUgdGV4dCBmb3Igc2Vjb25kYXJ5TGFiZWwuICovCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vjb25kYXJ5TGFiZWwoU3RyaW5nIHN0YXRlVGV4dCkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNlY29uZGFyeUxhYmVsKSkgeworICAgICAgICAgICAgLy8gVXNlIGEgbG9jYWwgcmVmZXJlbmNlIGFzIHRoZSB2YWx1ZSBtaWdodCBjaGFuZ2UgZnJvbSBvdGhlciB0aHJlYWRzCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbG9jYWxTZWNvbmRhcnlMYWJlbCA9IHNlY29uZGFyeUxhYmVsOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGxvY2FsU2Vjb25kYXJ5TGFiZWwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlVGV4dDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZWNvbmRhcnlMYWJlbC50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIGxvY2FsU2Vjb25kYXJ5TGFiZWwudG9TdHJpbmcoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvcHlUbyhTdGF0ZSBvdGhlcikgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9wbHVnaW5zL3N0YXR1c2Jhci9TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3BsdWdpbi9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcGx1Z2lucy9zdGF0dXNiYXIvU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmphdmEKaW5kZXggNzBiNWQ3My4uYjcwODhkNSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcGx1Z2luL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9wbHVnaW5zL3N0YXR1c2Jhci9TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3BsdWdpbnMvc3RhdHVzYmFyL1N0YXR1c0JhclN0YXRlQ29udHJvbGxlci5qYXZhCkBAIC01MCw2ICs1MCwxMyBAQAogICAgIGJvb2xlYW4gaXNQdWxzaW5nKCk7CiAKICAgICAvKioKKyAgICAgKiBJcyBkZXZpY2UgZHJlYW1pbmcuIFRoaXMgbWV0aG9kIGlzIG1vcmUgaW5jbHVzaXZlIHRoYW4KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5zZXJ2aWNlLmRyZWFtcy5JRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmd9LCBhcyBpdCB3aWxsIHJldHVybiB0cnVlIGR1cmluZyB0aGUKKyAgICAgKiBkcmVhbSdzIHdha2UtdXAgcGhhc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc0RyZWFtaW5nKCk7CisKKyAgICAvKioKICAgICAgKiBBZGRzIGEgc3RhdGUgbGlzdGVuZXIKICAgICAgKi8KICAgICB2b2lkIGFkZENhbGxiYWNrKFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcGx1Z2luX2NvcmUvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3BsdWdpbnMvUGx1Z2luTGlmZWN5Y2xlTWFuYWdlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvcGx1Z2luX2NvcmUvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3BsdWdpbnMvUGx1Z2luTGlmZWN5Y2xlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNmE0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wbHVnaW5fY29yZS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcGx1Z2lucy9QbHVnaW5MaWZlY3ljbGVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2luczsKKworLyoqCisgKiBQcm92aWRlcyB0aGUgYWJpbGl0eSBmb3IgY29uc3VtZXJzIHRvIGNvbnRyb2wgcGx1Z2luIGxpZmVjeWNsZS4KKyAqCisgKiBAcGFyYW0gPFQ+IGlzIHRoZSB0YXJnZXQgcGx1Z2luIHR5cGUKKyAqLworcHVibGljIGludGVyZmFjZSBQbHVnaW5MaWZlY3ljbGVNYW5hZ2VyPFQgZXh0ZW5kcyBQbHVnaW4+IHsKKyAgICAvKiogUmV0dXJucyB0aGUgY3VycmVudGx5IGxvYWRlZCBwbHVnaW4gaW5zdGFuY2UgKGlmIHBsdWdpbiBpcyBsb2FkZWQpICovCisgICAgVCBnZXRQbHVnaW4oKTsKKworICAgIC8qKiByZXR1cm5zIHRydWUgaWYgdGhlIHBsdWdpbiBpcyBjdXJyZW50bHkgbG9hZGVkICovCisgICAgZGVmYXVsdCBib29sZWFuIGlzTG9hZGVkKCkgeworICAgICAgICByZXR1cm4gZ2V0UGx1Z2luKCkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbmQgY3JlYXRlcyB0aGUgcGx1Z2luIGluc3RhbmNlIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAqCisgICAgICogVGhpcyB3aWxsIHRyaWdnZXIge0BsaW5rIFBsdWdpbkxpc3RlbmVyI29uUGx1Z2luTG9hZGVkfSB3aXRoIHRoZSBuZXcgaW5zdGFuY2UgaWYgaXQgZGlkIG5vdAorICAgICAqIGFscmVhZHkgZXhpc3QuCisgICAgICovCisgICAgdm9pZCBsb2FkUGx1Z2luKCk7CisKKyAgICAvKioKKyAgICAgKiBVbmxvYWRzIGFuZCBkZXN0cm95cyB0aGUgcGx1Z2luIGluc3RhbmNlIGlmIGl0IGV4aXN0cy4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHtAbGluayBQbHVnaW5MaXN0ZW5lciNvblBsdWdpblVubG9hZGVkfSBpZiBhIGNvbmNyZXRlIHBsdWdpbiBpbnN0YW5jZQorICAgICAqIGV4aXN0ZWQgd2hlbiB0aGlzIGNhbGwgd2FzIG1hZGUuCisgICAgICovCisgICAgdm9pZCB1bmxvYWRQbHVnaW4oKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3BsdWdpbl9jb3JlL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9wbHVnaW5zL1BsdWdpbkxpc3RlbmVyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wbHVnaW5fY29yZS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcGx1Z2lucy9QbHVnaW5MaXN0ZW5lci5qYXZhCmluZGV4IGI0ODhkMmEuLmM1ZjUwMzIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3BsdWdpbl9jb3JlL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9wbHVnaW5zL1BsdWdpbkxpc3RlbmVyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcGx1Z2luX2NvcmUvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3BsdWdpbnMvUGx1Z2luTGlzdGVuZXIuamF2YQpAQCAtMTcsNyArMTcsMzIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIAogLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGxpc3RlbmluZyB0byBwbHVnaW5zIGJlaW5nIGNvbm5lY3RlZC4KKyAqIEludGVyZmFjZSBmb3IgbGlzdGVuaW5nIHRvIHBsdWdpbnMgYmVpbmcgY29ubmVjdGVkIGFuZCBkaXNjb25uZWN0ZWQuCisgKgorICogVGhlIGNhbGwgb3JkZXIgZm9yIGEgcGx1Z2luIGlzCisgKiAgMSkge0BsaW5rICNvblBsdWdpbkF0dGFjaGVkfQorICogICAgICAgICAgQ2FsbGVkIHdoZW4gYSBuZXcgcGx1Z2luIGlzIGFkZGVkIHRvIHRoZSBkZXZpY2UsIG9yIGFuIGV4aXN0aW5nIHBsdWdpbiB3YXMgcmVwbGFjZWQgYnkKKyAqICAgICAgICAgIHRoZSBwYWNrYWdlIG1hbmFnZXIuIFdpbGwgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgcGFja2FnZSBtYW5hZ2VyIGV2ZW50LiBJZiBtdWx0aXBsZQorICogICAgICAgICAgbm9uLWNvbmZsaWN0aW5nIHBhY2thZ2VzIHdoaWNoIGhhdmUgdGhlIHNhbWUgcGx1Z2luIGludGVyZmFjZSBhcmUgaW5zdGFsbGVkIG9uIHRoZQorICogICAgICAgICAgZGV2aWNlLCB0aGVuIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mCisgKiAgICAgICAgICB7QGxpbmsgUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcn0gKGFzIGxvbmcgYXMgYGFsbG93TXVsdGlwbGVgIHdhcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZQorICogICAgICAgICAgbGlzdGVuZXIgd2FzIHJlZ2lzdGVyZWQgd2l0aCB7QGxpbmsgUGx1Z2luTWFuYWdlciNhZGRQbHVnaW5MaXN0ZW5lcn0pLgorICogIDIpIHtAbGluayAjb25QbHVnaW5Mb2FkZWR9CisgKiAgICAgICAgICBDYWxsZWQgd2hlbmV2ZXIgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbiBvYmplY3QgaXMgY3JlYXRlZCBhbmQgcmVhZHkgZm9yIHVzZS4gQ2FuIGJlCisgKiAgICAgICAgICBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyIHtAbGluayBQbHVnaW5MaWZlY3ljbGVNYW5hZ2VyfSwgYnV0IHdpbGwgYWx3YXlzIHBhc3MgYSBuZXdseQorICogICAgICAgICAgY3JlYXRlZCBwbHVnaW4gb2JqZWN0LiB7QGxpbmsgI29uUGx1Z2luVW5sb2FkZWR9IHdpdGggdGhlIHByZXZpb3VzIHBsdWdpbiBvYmplY3Qgd2lsbAorICogICAgICAgICAgYmUgY2FsbGVkIGJlZm9yZSBhbm90aGVyIGNhbGwgdG8ge0BsaW5rICNvblBsdWdpbkxvYWRlZH0gaXMgbWFkZS4gVGhpcyBtZXRob2Qgd2lsbCBiZQorICogICAgICAgICAgY2FsbGVkIG9uY2UgYXV0b21hdGljYWxseSBhZnRlciB7QGxpbmsgI29uUGx1Z2luQXR0YWNoZWR9LiBCZXNpZGVzIHRoZSBpbml0aWFsIGNhbGwsCisgKiAgICAgICAgICB7QGxpbmsgI29uUGx1Z2luTG9hZGVkfSB3aWxsIG9jY3VyIGR1ZSB0byB7QGxpbmsgUGx1Z2luTGlmZWN5Y2xlTWFuYWdlciNsb2FkUGx1Z2lufS4KKyAqICAzKSB7QGxpbmsgI29uUGx1Z2luVW5sb2FkZWR9CisgKiAgICAgICAgICBDYWxsZWQgd2hlbiBhIHJlcXVlc3QgdG8gdW5sb2FkIHRoZSBwbHVnaW4gaGFzIGJlZW4gcmVjZWl2ZWQuIFRoaXMgY2FuIGJlIHRyaWdnZXJlZCBmcm9tCisgKiAgICAgICAgICBhIHJlbGF0ZWQgY2FsbCB0byB7QGxpbmsgUGx1Z2luTGlmZWN5Y2xlTWFuYWdlciN1bmxvYWRQbHVnaW59IG9yIGZvciBhbnkgcmVhc29uIHRoYXQKKyAqICAgICAgICAgIHtAbGluayAjb25QbHVnaW5EZXRhY2hlZH0gd291bGQgYmUgdHJpZ2dlcmVkLgorICogIDQpIHtAbGluayAjb25QbHVnaW5EZXRhY2hlZH0KKyAqICAgICAgICAgIENhbGxlZCB3aGVuIHRoZSBwYWNrYWdlIGlzIHJlbW92ZWQgZnJvbSB0aGUgZGV2aWNlLCBkaXNhYmxlZCwgb3IgcmVwbGFjZWQgZHVlIHRvIGFuCisgKiAgICAgICAgICBleHRlcm5hbCB0cmlnZ2VyLiBUaGVzZSBhcmUgZXZlbnRzIGZyb20gdGhlIGFuZHJvaWQgcGFja2FnZSBtYW5hZ2VyLgorICoKKyAqIEBwYXJhbSA8VD4gaXMgdGhlIHRhcmdldCBwbHVnaW4gdHlwZQogICovCiBwdWJsaWMgaW50ZXJmYWNlIFBsdWdpbkxpc3RlbmVyPFQgZXh0ZW5kcyBQbHVnaW4+IHsKICAgICAvKioKQEAgLTI1LDE0ICs1MCw2OSBAQAogICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpZiBtdWx0aXBsZSBwbHVnaW5zIGFyZSBhbGxvd2VkLgogICAgICAqIEl0IG1heSBhbHNvIGJlIGNhbGxlZCBpbiB0aGUgZnV0dXJlIGlmIHRoZSBwbHVnaW4gcGFja2FnZSBjaGFuZ2VzCiAgICAgICogYW5kIG5lZWRzIHRvIGJlIHJlbG9hZGVkLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgTWlncmF0ZSB0byB7QGxpbmsgI29uUGx1Z2luTG9hZGVkfSBvciB7QGxpbmsgI29uUGx1Z2luQXR0YWNoZWR9CiAgICAgICovCi0gICAgdm9pZCBvblBsdWdpbkNvbm5lY3RlZChUIHBsdWdpbiwgQ29udGV4dCBwbHVnaW5Db250ZXh0KTsKKyAgICBARGVwcmVjYXRlZAorICAgIGRlZmF1bHQgdm9pZCBvblBsdWdpbkNvbm5lY3RlZChUIHBsdWdpbiwgQ29udGV4dCBwbHVnaW5Db250ZXh0KSB7CisgICAgICAgIC8vIE9wdGlvbmFsCisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBmaXJzdCBhdHRhY2hlZCB0byB0aGUgaG9zdCBhcHBsaWNhdGlvbi4ge0BsaW5rICNvblBsdWdpbkxvYWRlZH0KKyAgICAgKiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGFzIHdlbGwgd2hlbiBmaXJzdCBhdHRhY2hlZC4gVGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzCisgICAgICogaWYgbXVsdGlwbGUgcGx1Z2lucyBhcmUgYWxsb3dlZC4gSXQgbWF5IGFsc28gYmUgY2FsbGVkIGluIHRoZSBmdXR1cmUgaWYgdGhlIHBsdWdpbiBwYWNrYWdlCisgICAgICogY2hhbmdlcyBhbmQgbmVlZHMgdG8gYmUgcmVsb2FkZWQuIEVhY2ggY2FsbCB0byB7QGxpbmsgI29uUGx1Z2luQXR0YWNoZWR9IHdpbGwgcHJvdmlkZSBhIG5ldworICAgICAqIG9yIGRpZmZlcmVudCB7QGxpbmsgUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcn0uCisgICAgICovCisgICAgZGVmYXVsdCB2b2lkIG9uUGx1Z2luQXR0YWNoZWQoUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcjxUPiBtYW5hZ2VyKSB7CisgICAgICAgIC8vIE9wdGlvbmFsCisgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gYSBwbHVnaW4gaGFzIGJlZW4gdW5pbnN0YWxsZWQvdXBkYXRlZCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQKICAgICAgKiBmcm9tIHVzZS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIE1pZ3JhdGUgdG8ge0BsaW5rICNvblBsdWdpbkRldGFjaGVkfSBvciB7QGxpbmsgI29uUGx1Z2luVW5sb2FkZWR9CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBkZWZhdWx0IHZvaWQgb25QbHVnaW5EaXNjb25uZWN0ZWQoVCBwbHVnaW4pIHsKICAgICAgICAgLy8gT3B0aW9uYWwuCiAgICAgfQotfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBoYXMgYmVlbiBkZXRhY2hlZCBmcm9tIHRoZSBob3N0IGFwcGxpY2F0aW9uLiBJbXBsZW1lbnRlcnMgc2hvdWxkIG5vCisgICAgICogbG9uZ2VyIGF0dGVtcHQgdG8gcmVsb2FkIGl0IHZpYSB0aGlzIHtAbGluayBQbHVnaW5MaWZlY3ljbGVNYW5hZ2VyfS4gSWYgdGhlIHBhY2thZ2Ugd2FzCisgICAgICogdXBkYXRlZCBhbmQgbm90IHJlbW92ZWQsIHRoZW4ge0BsaW5rICNvblBsdWdpbkF0dGFjaGVkfSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aGVuIHRoZSB1cGRhdGVkCisgICAgICogcGFja2FnZSBpcyBhdmFpbGFibGUuCisgICAgICovCisgICAgZGVmYXVsdCB2b2lkIG9uUGx1Z2luRGV0YWNoZWQoUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcjxUPiBtYW5hZ2VyKSB7CisgICAgICAgIC8vIE9wdGlvbmFsLgorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgbG9hZGVkIGludG8gdGhlIGhvc3QncyBwcm9jZXNzIGFuZCBpcyBhdmFpbGFibGUgZm9yIHVzZS4gVGhpcyBjYW4KKyAgICAgKiBoYXBwZW4gc2V2ZXJhbCB0aW1lcyBpZiBjbGllbnRzIGFyZSB1c2luZyB7QGxpbmsgUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcn0gdG8gbWFuaXB1bGF0ZSBhCisgICAgICogcGx1Z2luJ3MgbG9hZCBzdGF0ZS4gRWFjaCBjYWxsIHRvIHtAbGluayAjb25QbHVnaW5Mb2FkZWR9IHdpbGwgaGF2ZSBhIG1hdGNoZWQgY2FsbCB0bworICAgICAqIHtAbGluayAjb25QbHVnaW5VbmxvYWRlZH0gd2hlbiB0aGF0IHBsdWdpbiBvYmplY3Qgc2hvdWxkIG5vIGxvbmdlciBiZSB1c2VkLgorICAgICAqLworICAgIGRlZmF1bHQgdm9pZCBvblBsdWdpbkxvYWRlZCgKKyAgICAgICAgICAgIFQgcGx1Z2luLAorICAgICAgICAgICAgQ29udGV4dCBwbHVnaW5Db250ZXh0LAorICAgICAgICAgICAgUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcjxUPiBtYW5hZ2VyCisgICAgKSB7CisgICAgICAgIC8vIE9wdGlvbmFsLCBkZWZhdWx0IHRvIGRlcHJlY2F0ZWQgdmVyc2lvbgorICAgICAgICBvblBsdWdpbkNvbm5lY3RlZChwbHVnaW4sIHBsdWdpbkNvbnRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2hvdWxkIG5vIGxvbmdlciBiZSB1c2VkLiBMaXN0ZW5lcnMgc2hvdWxkIGNsZWFuIHVwIGFsbCByZWZlcmVuY2VzIHRvCisgICAgICogdGhlIHJlbGV2YW50IHBsdWdpbiBzbyB0aGF0IGl0IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC4gSWYgdGhlIHBsdWdpbiBvYmplY3QgaXMgcmVxdWlyZWQgaW4KKyAgICAgKiB0aGUgZnV0dXJlIGEgY2FsbCBjYW4gYmUgbWFkZSB0byB7QGxpbmsgUGx1Z2luTGlmZWN5Y2xlTWFuYWdlciNsb2FkUGx1Z2lufSB0byBjcmVhdGUgYSBuZXcKKyAgICAgKiBwbHVnaW4gb2JqZWN0IGFuZCB0cmlnZ2VyIHtAbGluayAjb25QbHVnaW5Mb2FkZWR9LgorICAgICAqLworICAgIGRlZmF1bHQgdm9pZCBvblBsdWdpblVubG9hZGVkKFQgcGx1Z2luLCBQbHVnaW5MaWZlY3ljbGVNYW5hZ2VyPFQ+IG1hbmFnZXIpIHsKKyAgICAgICAgLy8gT3B0aW9uYWwsIGRlZmF1bHQgdG8gZGVwcmVjYXRlZCB2ZXJzaW9uCisgICAgICAgIG9uUGx1Z2luRGlzY29ubmVjdGVkKHBsdWdpbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9kcmVhbV9vdmVybGF5X2JvdHRvbV9hZmZvcmRhbmNlX2JnLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9kcmVhbV9vdmVybGF5X2JvdHRvbV9hZmZvcmRhbmNlX2JnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjY3ZGRkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2RyZWFtX292ZXJsYXlfYm90dG9tX2FmZm9yZGFuY2VfYmcueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiBDb3B5cmlnaHQgMjAyMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNoYXBlCisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOmFuZHJvaWRwcnY9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9wcnYvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIj4KKyAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9Ij9hbmRyb2lkcHJ2OmF0dHIvY29sb3JTdXJmYWNlIi8+CisgIDxzaXplCisgICAgICBhbmRyb2lkOndpZHRoPSJAZGltZW4vZHJlYW1fb3ZlcmxheV9ib3R0b21fYWZmb3JkYW5jZV9oZWlnaHQiCisgICAgICBhbmRyb2lkOmhlaWdodD0iQGRpbWVuL2RyZWFtX292ZXJsYXlfYm90dG9tX2FmZm9yZGFuY2Vfd2lkdGgiLz4KKyAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IkBkaW1lbi9kcmVhbV9vdmVybGF5X2JvdHRvbV9hZmZvcmRhbmNlX3JhZGl1cyIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvaWNfaW1wb3J0YW50X291dGxpbmUueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2ljX2ltcG9ydGFudF9vdXRsaW5lLnhtbAppbmRleCA3YTYyOGJiLi42NDI1ODJjIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvaWNfaW1wb3J0YW50X291dGxpbmUueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9pY19pbXBvcnRhbnRfb3V0bGluZS54bWwKQEAgLTIwLDYgKzIwLDcgQEAKICAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCiAgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKICAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDphdXRvTWlycm9yZWQ9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6dGludD0iP2FuZHJvaWQ6YXR0ci9jb2xvckNvbnRyb2xOb3JtYWwiPgogICAgIDxwYXRoCiAgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSJAYW5kcm9pZDpjb2xvci93aGl0ZSIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvZHJlYW1fb3ZlcmxheV9ob21lX2NvbnRyb2xzX2NoaXAueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9kcmVhbV9vdmVybGF5X2hvbWVfY29udHJvbHNfY2hpcC54bWwKaW5kZXggZmI3OGI0OS4uNWIyZWM0OCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9kcmVhbV9vdmVybGF5X2hvbWVfY29udHJvbHNfY2hpcC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9kcmVhbV9vdmVybGF5X2hvbWVfY29udHJvbHNfY2hpcC54bWwKQEAgLTIyLDEzICsyMiwxNCBAQAogCiAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLmFuaW1hdGlvbi52aWV3LkxhdW5jaGFibGVJbWFnZVZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ob21lX2NvbnRyb2xzX2NoaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL2tleWd1YXJkX2FmZm9yZGFuY2VfZml4ZWRfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL2tleWd1YXJkX2FmZm9yZGFuY2VfZml4ZWRfd2lkdGgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL2RyZWFtX292ZXJsYXlfYm90dG9tX2FmZm9yZGFuY2VfaGVpZ2h0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL2RyZWFtX292ZXJsYXlfYm90dG9tX2FmZm9yZGFuY2Vfd2lkdGgiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxzdGFydCIKLSAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSJAZGltZW4vZHJlYW1fb3ZlcmxheV9ib3R0b21fYWZmb3JkYW5jZV9wYWRkaW5nIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9kcmVhbV9vdmVybGF5X2JvdHRvbV9hZmZvcmRhbmNlX2JnIgorICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgogICAgICAgICBhbmRyb2lkOnRpbnQ9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeSIKICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9jb250cm9sc19pY29uIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9rZXlndWFyZF9ib3R0b21fYWZmb3JkYW5jZV9iZyIKICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvcXVpY2tfY29udHJvbHNfdGl0bGUiIC8+CiAKIDwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L21lZGlhX3Nlc3Npb25fdmlldy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L21lZGlhX3Nlc3Npb25fdmlldy54bWwKaW5kZXggOWQ5MTQxOS4uODViNmU4ZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9tZWRpYV9zZXNzaW9uX3ZpZXcueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvbWVkaWFfc2Vzc2lvbl92aWV3LnhtbApAQCAtOTcsNyArOTcsOCBAQAogICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9xc19tZWRpYV9saWdodF9zb3VyY2UiCiAgICAgICAgIGFuZHJvaWQ6Zm9yY2VIYXNPdmVybGFwcGluZ1JlbmRlcmluZz0iZmFsc2UiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21pbl9jbGlja2FibGVfaXRlbV9zaXplIgorICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL21pbl9jbGlja2FibGVfaXRlbV9zaXplIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luU3RhcnQ9IkBkaW1lbi9xc19jZW50ZXJfZ3VpZGVsaW5lX3BhZGRpbmciCiAgICAgICAgIGFwcDpsYXlvdXRfY29uc3RyYWludEVuZF90b0VuZE9mPSJwYXJlbnQiCiAgICAgICAgIGFwcDpsYXlvdXRfY29uc3RyYWludFRvcF90b1RvcE9mPSJwYXJlbnQiCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L211bHRpX3NoYWRlLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvbXVsdGlfc2hhZGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZmY1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L211bHRpX3NoYWRlLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICB+CisgIC0tPgorCis8Y29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS52aWV3Lk11bHRpU2hhZGVWaWV3CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl9jb252ZXJzYXRpb25faW5mby54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl9jb252ZXJzYXRpb25faW5mby54bWwKaW5kZXggOWIyZjBhYy4uNzk5NDhkYSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9ub3RpZmljYXRpb25fY29udmVyc2F0aW9uX2luZm8ueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX2NvbnZlcnNhdGlvbl9pbmZvLnhtbApAQCAtMzExLDcgKzMxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJmYWxzZSIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9ImZhbHNlIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIzIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSI0IgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTm90aWZpY2F0aW9uSW1wb3J0YW5jZURldGFpbCIvPgogICAgICAgICAgICAgPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLnJvdy5CdXR0b25MaW5lYXJMYXlvdXQ+CiAKQEAgLTM2NCw3ICszNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0iZmFsc2UiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJmYWxzZSIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMyIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iNCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk5vdGlmaWNhdGlvbkltcG9ydGFuY2VEZXRhaWwiLz4KICAgICAgICAgICAgIDwvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5yb3cuQnV0dG9uTGluZWFyTGF5b3V0PgogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N1cGVyX25vdGlmaWNhdGlvbl9zaGFkZS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N1cGVyX25vdGlmaWNhdGlvbl9zaGFkZS54bWwKaW5kZXggNGFiYzE3Ni4uZmU5NTQyYiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdXBlcl9ub3RpZmljYXRpb25fc2hhZGUueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3VwZXJfbm90aWZpY2F0aW9uX3NoYWRlLnhtbApAQCAtMTEwLDYgKzExMCwxMyBAQAogICAgICAgICBhbmRyb2lkOmNsaXBDaGlsZHJlbj0iZmFsc2UiCiAgICAgICAgIGFuZHJvaWQ6Y2xpcFRvUGFkZGluZz0iZmFsc2UiIC8+CiAKKyAgICA8Vmlld1N0dWIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdWx0aV9zaGFkZV9zdHViIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL211bHRpX3NoYWRlIgorICAgICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9tdWx0aV9zaGFkZSIgLz4KKwogICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5iaW9tZXRyaWNzLkF1dGhSaXBwbGVWaWV3CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXV0aF9yaXBwbGUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggMzExOTkwYy4uZTVjZDBjNSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtODQ0LDQgKzg0NCw0NCBAQAogCiAgICAgPCEtLSBDb25maWd1cmF0aW9uIHRvIHNldCBMZWFybiBtb3JlIGluIGRldmljZSBsb2dzIGFzIFVSTCBsaW5rIC0tPgogICAgIDxib29sIG5hbWU9ImxvZ19hY2Nlc3NfY29uZmlybWF0aW9uX2xlYXJuX21vcmVfYXNfbGluayI+dHJ1ZTwvYm9vbD4KKworICAgIDwhLS0gW1NUQVJUXSBNVUxUSSBTSEFERSAtLT4KKyAgICA8IS0tIFdoZXRoZXIgdGhlIGRldmljZSBzaG91bGQgdXNlIGR1YWwgc2hhZGUuIElmIGZhbHNlLCB0aGUgZGV2aWNlIHVzZXMgc2luZ2xlIHNoYWRlLiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJkdWFsX3NoYWRlX2VuYWJsZWQiPnRydWU8L2Jvb2w+CisgICAgPCEtLQorICAgIFdoZW4gaW4gZHVhbCBzaGFkZSwgd2hlcmUgc2hvdWxkIHRoZSBob3Jpem9udGFsIHNwbGl0IGJlIG9uIHRoZSBzY3JlZW4gdG8gaGVscCBkZXRlcm1pbmUgd2hldGhlcgorICAgIHRoZSB1c2VyIGlzIHB1bGxpbmcgZG93biB0aGUgbGVmdCBzaGFkZSBvciB0aGUgcmlnaHQgc2hhZGUuIE11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMCwKKyAgICBpbmNsdXNpdmUuIEluIG90aGVyIHdvcmRzOiBob3cgbXVjaCBvZiB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgdGhlIHNjcmVlbiwgd2hlbiBwdWxsZWQgZG93biBvbiwKKyAgICB3b3VsZCByZXZlYWwgdGhlIGxlZnQtaGFuZCBzaWRlIHNoYWRlLgorCisgICAgTW9yZSBjb25jcmV0ZWx5OgorICAgIEEgdmFsdWUgb2YgMC42NyBtZWFucyB0aGF0IHRoZSBsZWZ0IHR3by10aGlyZHMgb2YgdGhlIHNjcmVlbiBhcmUgZGVkaWNhdGVkIHRvIHRoZSBsZWZ0LWhhbmQgc2lkZQorICAgIHNoYWRlIGFuZCB0aGUgcmVtYWluaW5nIG9uZS10aGlyZCBvZiB0aGUgc2NyZWVuIG9uIHRoZSByaWdodCBpcyBkZWRpY2F0ZWQgdG8gdGhlIHJpZ2h0LWhhbmQgc2lkZQorICAgIHNoYWRlLgorICAgIC0tPgorICAgIDxkaW1lbiBuYW1lPSJkdWFsX3NoYWRlX3NwbGl0X2ZyYWN0aW9uIj4wLjY3PC9kaW1lbj4KKyAgICA8IS0tIFdpZHRoIG9mIHRoZSBsZWZ0LWhhbmQgc2lkZSBzaGFkZS4gLS0+CisgICAgPGRpbWVuIG5hbWU9ImxlZnRfc2hhZGVfd2lkdGgiPjQzNmRwPC9kaW1lbj4KKyAgICA8IS0tIFdpZHRoIG9mIHRoZSByaWdodC1oYW5kIHNpZGUgc2hhZGUuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJyaWdodF9zaGFkZV93aWR0aCI+NDM2ZHA8L2RpbWVuPgorICAgIDwhLS0KKyAgICBPcGFxdWUgdmVyc2lvbiBvZiB0aGUgc2NyaW0gdGhhdCBzaG93cyB1cCBiZWhpbmQgZHVhbCBzaGFkZXMuIFRoZSBhbHBoYSBjaGFubmVsIGlzIGRyaXZlbgorICAgIHByb2dyYW1tYXRpY2FsbHkuCisgICAgLS0+CisgICAgPGNvbG9yIG5hbWU9Im9wYXF1ZV9zY3JpbSI+I0Q5RDlEOTwvY29sb3I+CisgICAgPCEtLSBNYXhpbXVtIG9wYWNpdHkgd2hlbiB0aGUgc2NyaW0gdGhhdCBzaG93cyB1cCBiZWhpbmQgdGhlIGR1YWwgc2hhZGVzIGlzIGZ1bGx5IHZpc2libGUuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJkdWFsX3NoYWRlX3NjcmltX2FscGhhIj4wLjE8L2RpbWVuPgorICAgIDwhLS0KKyAgICBUaGUgYW1vdW50IHRoYXQgdGhlIHVzZXIgbXVzdCBzd2lwZSBkb3duIHdoZW4gdGhlIHNoYWRlIGlzIGZ1bGx5IGNvbGxhcHNlZCB0byBhdXRvbWF0aWNhbGx5CisgICAgZXhwYW5kIG9uY2UgdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGUuIElmIHRoZSB1c2VyIHN3aXBlcyBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIHRoZSBzaGFkZQorICAgIHdpbGwgYXV0b21hdGljYWxseSByZXZlcnQgYmFjayB0byBmdWxseSBjb2xsYXBzZWQgb25jZSB0aGUgdXNlciBzdG9wcyBzd2lwaW5nLgorICAgIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzaGFkZV9zd2lwZV9leHBhbmRfdGhyZXNob2xkIj4wLjU8L2RpbWVuPgorICAgIDwhLS0KKyAgICBUaGUgYW1vdW50IHRoYXQgdGhlIHVzZXIgbXVzdCBzd2lwZSB1cCB3aGVuIHRoZSBzaGFkZSBpcyBmdWxseSBleHBhbmRlZCB0byBhdXRvbWF0aWNhbGx5CisgICAgY29sbGFwc2Ugb25jZSB0aGUgdXNlciBsZXRzIGdvIG9mIHRoZSBzaGFkZS4gSWYgdGhlIHVzZXIgc3dpcGVzIGxlc3MgdGhhbiB0aGlzIGFtb3VudCwgdGhlIHNoYWRlCisgICAgd2lsbCBhdXRvbWF0aWNhbGx5IHJldmVydCBiYWNrIHRvIGZ1bGx5IGV4cGFuZGVkIG9uY2UgdGhlIHVzZXIgc3RvcHMgc3dpcGluZy4KKyAgICAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic2hhZGVfc3dpcGVfY29sbGFwc2VfdGhyZXNob2xkIj4wLjU8L2RpbWVuPgorICAgIDwhLS0gW0VORF0gTVVMVEkgU0hBREUgLS0+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvZGltZW5zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAppbmRleCBiZWQ4YTgwLi40ZDM4NTQxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2RpbWVucy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCkBAIC0xNjMwLDYgKzE2MzAsMTAgQEAKICAgICA8IS0tIERyZWFtIG92ZXJsYXkgY29tcGxpY2F0aW9ucyByZWxhdGVkIGRpbWVuc2lvbnMgLS0+CiAgICAgPCEtLSBUaGUgYmx1ciByYWRpdXMgYXBwbGllZCB0byB0aGUgZHJlYW0gb3ZlcmxheSB3aGVuIGVudGVyaW5nIGFuZCBleGl0aW5nIGRyZWFtcyAtLT4KICAgICA8ZGltZW4gbmFtZT0iZHJlYW1fb3ZlcmxheV9hbmltX2JsdXJfcmFkaXVzIj41MGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0iZHJlYW1fb3ZlcmxheV9ib3R0b21fYWZmb3JkYW5jZV9oZWlnaHQiPjY0ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJkcmVhbV9vdmVybGF5X2JvdHRvbV9hZmZvcmRhbmNlX3dpZHRoIj42NGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0iZHJlYW1fb3ZlcmxheV9ib3R0b21fYWZmb3JkYW5jZV9yYWRpdXMiPjMyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJkcmVhbV9vdmVybGF5X2JvdHRvbV9hZmZvcmRhbmNlX3BhZGRpbmciPjE0ZHA8L2RpbWVuPgogICAgIDxkaW1lbiBuYW1lPSJkcmVhbV9vdmVybGF5X2NvbXBsaWNhdGlvbl9jbG9ja190aW1lX3RleHRfc2l6ZSI+ODZkcDwvZGltZW4+CiAgICAgPGRpbWVuIG5hbWU9ImRyZWFtX292ZXJsYXlfY29tcGxpY2F0aW9uX2Nsb2NrX3RpbWVfdHJhbnNsYXRpb25feSI+MjhkcDwvZGltZW4+CiAgICAgPGRpbWVuIG5hbWU9ImRyZWFtX292ZXJsYXlfY29tcGxpY2F0aW9uX2hvbWVfY29udHJvbHNfcGFkZGluZyI+MjhkcDwvZGltZW4+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2ZsYWdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvZmxhZ3MueG1sCmluZGV4IDYzNTQ3NTIuLjc2MzkzMGQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvZmxhZ3MueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvZmxhZ3MueG1sCkBAIC0zMCw5ICszMCw2IEBACiAKICAgICA8Ym9vbCBuYW1lPSJmbGFnX2NoYXJnaW5nX3JpcHBsZSI+ZmFsc2U8L2Jvb2w+CiAKLSAgICA8IS0tIFdoZXRoZXIgdG8gc2hvdyBjaGlwYmFyIFVJIHdoZW5ldmVyIHRoZSBkZXZpY2UgaXMgdW5sb2NrZWQgYnkgQWN0aXZlVW5sb2NrLiAtLT4KLSAgICA8Ym9vbCBuYW1lPSJmbGFnX2FjdGl2ZV91bmxvY2tfY2hpcGJhciI+dHJ1ZTwvYm9vbD4KLQogICAgIDwhLS0gIFdoZXRoZXIgdGhlIHVzZXIgc3dpdGNoZXIgY2hpcCBzaG93cyBpbiB0aGUgc3RhdHVzIGJhci4gV2hlbiB0cnVlLCB0aGUgbXVsdGkgdXNlcgogICAgICAgYXZhdGFyIHdpbGwgbm8gbG9uZ2VyIHNob3cgb24gdGhlIGxvY2tzY3JlZW4gLS0+CiAgICAgPGJvb2wgbmFtZT0iZmxhZ191c2VyX3N3aXRjaGVyX2NoaXAiPmZhbHNlPC9ib29sPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggYTAyYzQyOS4uMmFhOTEyYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0yNDMxLDcgKzI0MzEsNyBAQAogCiAgICAgPCEtLSBTaG93cyBpbiBhIGRpYWxvZyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgdG8gYXV0aG9yaXplIHRoaXMgYXBwIHRvIGRpc3BsYXkgYSBEZXZpY2UgY29udHJvbHMKICAgICAgICAgIHBhbmVsIChlbWJlZGRlZCBhY3Rpdml0eSkgaW5zdGVhZCBvZiBjb250cm9scyByZW5kZXJlZCBieSBTeXN0ZW1VSSBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRyb2xzX3BhbmVsX2F1dGhvcml6YXRpb24iPjx4bGlmZjpnIGlkPSJhcHBOYW1lIiBleGFtcGxlPSJNeSBhcHAiPiVzPC94bGlmZjpnPmNhbiBjaG9vc2Ugd2hpY2ggY29udHJvbHMgYW5kIGNvbnRlbnQgc2hvdyBoZXJlLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29udHJvbHNfcGFuZWxfYXV0aG9yaXphdGlvbiI+PHhsaWZmOmcgaWQ9ImFwcE5hbWUiIGV4YW1wbGU9Ik15IGFwcCI+JXM8L3hsaWZmOmc+IGNhbiBjaG9vc2Ugd2hpY2ggY29udHJvbHMgYW5kIGNvbnRlbnQgc2hvdyBoZXJlLjwvc3RyaW5nPgogCiAgICAgPCEtLSBTaG93cyBpbiBhIGRpYWxvZyBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgdG8gYXV0aG9yaXplIHRoaXMgYXBwIHJlbW92YWwgZnJvbSBhIERldmljZQogICAgICAgICAgY29udHJvbHMgcGFuZWwgW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CkBAIC0yODc3LDcgKzI4NzcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibWFuYWdlX3VzZXJzIj5NYW5hZ2UgdXNlcnM8L3N0cmluZz4KIAogICAgIDwhLS0gVG9hc3Qgc2hvd24gd2hlbiBhIG5vdGlmaWNhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGRyYWdnaW5nIHRvIHNwbGl0IFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZHJhZ19zcGxpdF9ub3Rfc3VwcG9ydGVkIj5UaGlzIG5vdGlmaWNhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGRyYWdnaW5nIHRvIFNwbGl0c2NyZWVuLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZHJhZ19zcGxpdF9ub3Rfc3VwcG9ydGVkIj5UaGlzIG5vdGlmaWNhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGRyYWdnaW5nIHRvIHNwbGl0IHNjcmVlbjwvc3RyaW5nPgogCiAgICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciB0aGUgV2ktRmkgb2ZmIGljb24gaW4gdGhlIGRyZWFtIG92ZXJsYXkgc3RhdHVzIGJhciBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImRyZWFtX292ZXJsYXlfc3RhdHVzX2Jhcl93aWZpX29mZiI+V2lcdTIwMTFGaSB1bmF2YWlsYWJsZTwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc2NyZWVuc2hvdC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvdGVzdGluZy9zY3JlZW5zaG90L1ZpZXdDYXB0dXJlLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc2NyZWVuc2hvdC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvdGVzdGluZy9zY3JlZW5zaG90L1ZpZXdDYXB0dXJlLmt0CmluZGV4IDk3NjY1MTQuLmRlZGYwYTcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NjcmVlbnNob3Qvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3Rlc3Rpbmcvc2NyZWVuc2hvdC9WaWV3Q2FwdHVyZS5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zY3JlZW5zaG90L3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS90ZXN0aW5nL3NjcmVlbnNob3QvVmlld0NhcHR1cmUua3QKQEAgLTUzLDYgKzUzLDcgQEAKIGZ1biBWaWV3LmNhcHR1cmVUb0JpdG1hcCh3aW5kb3c6IFdpbmRvdz8gPSBudWxsKTogTGlzdGVuYWJsZUZ1dHVyZTxCaXRtYXA+IHsKICAgICB2YWwgYml0bWFwRnV0dXJlOiBSZXNvbHZhYmxlRnV0dXJlPEJpdG1hcD4gPSBSZXNvbHZhYmxlRnV0dXJlLmNyZWF0ZSgpCiAgICAgdmFsIG1haW5FeGVjdXRvciA9IEhhbmRsZXJFeGVjdXRvcihIYW5kbGVyKExvb3Blci5nZXRNYWluTG9vcGVyKCkpKQorICAgIHZhbCBpc1JvYm9sZWN0cmljID0gaWYgKEJ1aWxkLkZJTkdFUlBSSU5ULmNvbnRhaW5zKCJyb2JvbGVjdHJpYyIpKSB0cnVlIGVsc2UgZmFsc2UKIAogICAgIC8vIGRpc2FibGUgZHJhd2luZyBhZ2FpbiBpZiBuZWNlc3Nhcnkgb25jZSB3b3JrIGlzIGNvbXBsZXRlCiAgICAgaWYgKCFIYXJkd2FyZVJlbmRlcmVyQ29tcGF0LmlzRHJhd2luZ0VuYWJsZWQoKSkgewpAQCAtNjEsOCArNjIsMTIgQEAKICAgICB9CiAKICAgICBtYWluRXhlY3V0b3IuZXhlY3V0ZSB7Ci0gICAgICAgIHZhbCBmb3JjZVJlZHJhd0Z1dHVyZSA9IGZvcmNlUmVkcmF3KCkKLSAgICAgICAgZm9yY2VSZWRyYXdGdXR1cmUuYWRkTGlzdGVuZXIoeyBnZW5lcmF0ZUJpdG1hcChiaXRtYXBGdXR1cmUsIHdpbmRvdykgfSwgbWFpbkV4ZWN1dG9yKQorICAgICAgICBpZiAoaXNSb2JvbGVjdHJpYykgeworICAgICAgICAgICAgZ2VuZXJhdGVCaXRtYXAoYml0bWFwRnV0dXJlKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsIGZvcmNlUmVkcmF3RnV0dXJlID0gZm9yY2VSZWRyYXcoKQorICAgICAgICAgICAgZm9yY2VSZWRyYXdGdXR1cmUuYWRkTGlzdGVuZXIoeyBnZW5lcmF0ZUJpdG1hcChiaXRtYXBGdXR1cmUsIHdpbmRvdykgfSwgbWFpbkV4ZWN1dG9yKQorICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIGJpdG1hcEZ1dHVyZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc2NyZWVuc2hvdC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvdGVzdGluZy9zY3JlZW5zaG90L1ZpZXdTY3JlZW5zaG90VGVzdFJ1bGUua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zY3JlZW5zaG90L3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS90ZXN0aW5nL3NjcmVlbnNob3QvVmlld1NjcmVlbnNob3RUZXN0UnVsZS5rdAppbmRleCA3MzhiMzdjLi5mOTZkMWUzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zY3JlZW5zaG90L3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS90ZXN0aW5nL3NjcmVlbnNob3QvVmlld1NjcmVlbnNob3RUZXN0UnVsZS5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zY3JlZW5zaG90L3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS90ZXN0aW5nL3NjcmVlbnNob3QvVmlld1NjcmVlbnNob3RUZXN0UnVsZS5rdApAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5CiBpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkCiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwCiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXMKQEAgLTI2LDYgKzI3LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQKIGltcG9ydCBhbmRyb2lkeC5hY3Rpdml0eS5Db21wb25lbnRBY3Rpdml0eQogaW1wb3J0IGFuZHJvaWR4LnRlc3QuZXh0Lmp1bml0LnJ1bGVzLkFjdGl2aXR5U2NlbmFyaW9SdWxlCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFscwogaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5SdWxlQ2hhaW4KIGltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdFJ1bGUKQEAgLTM5LDE0ICs0MSwxNCBAQAogaW1wb3J0IHBsYXRmb3JtLnRlc3Quc2NyZWVuc2hvdC5tYXRjaGVycy5CaXRtYXBNYXRjaGVyCiAKIC8qKiBBIHJ1bGUgZm9yIFZpZXcgc2NyZWVuc2hvdCBkaWZmIHVuaXQgdGVzdHMuICovCi1jbGFzcyBWaWV3U2NyZWVuc2hvdFRlc3RSdWxlKAorb3BlbiBjbGFzcyBWaWV3U2NyZWVuc2hvdFRlc3RSdWxlKAogICAgIGVtdWxhdGlvblNwZWM6IERldmljZUVtdWxhdGlvblNwZWMsCiAgICAgcHJpdmF0ZSB2YWwgbWF0Y2hlcjogQml0bWFwTWF0Y2hlciA9IFVuaXRUZXN0Qml0bWFwTWF0Y2hlciwKICAgICBhc3NldHNQYXRoUmVsYXRpdmVUb0J1aWxkUm9vdDogU3RyaW5nCiApIDogVGVzdFJ1bGUgewogICAgIHByaXZhdGUgdmFsIGNvbG9yc1J1bGUgPSBNYXRlcmlhbFlvdUNvbG9yc1J1bGUoKQogICAgIHByaXZhdGUgdmFsIGRldmljZUVtdWxhdGlvblJ1bGUgPSBEZXZpY2VFbXVsYXRpb25SdWxlKGVtdWxhdGlvblNwZWMpCi0gICAgcHJpdmF0ZSB2YWwgc2NyZWVuc2hvdFJ1bGUgPQorICAgIHByb3RlY3RlZCB2YWwgc2NyZWVuc2hvdFJ1bGUgPQogICAgICAgICBTY3JlZW5zaG90VGVzdFJ1bGUoCiAgICAgICAgICAgICBTeXN0ZW1VSUdvbGRlbkltYWdlUGF0aE1hbmFnZXIoCiAgICAgICAgICAgICAgICAgZ2V0RW11bGF0ZWREZXZpY2VQYXRoQ29uZmlnKGVtdWxhdGlvblNwZWMpLApAQCAtNTQsMjUgKzU2LDIwIEBACiAgICAgICAgICAgICApCiAgICAgICAgICkKICAgICBwcml2YXRlIHZhbCBhY3Rpdml0eVJ1bGUgPSBBY3Rpdml0eVNjZW5hcmlvUnVsZShTY3JlZW5zaG90QWN0aXZpdHk6OmNsYXNzLmphdmEpCi0gICAgcHJpdmF0ZSB2YWwgZGVsZWdhdGVSdWxlID0KLSAgICAgICAgUnVsZUNoYWluLm91dGVyUnVsZShjb2xvcnNSdWxlKQotICAgICAgICAgICAgLmFyb3VuZChkZXZpY2VFbXVsYXRpb25SdWxlKQotICAgICAgICAgICAgLmFyb3VuZChzY3JlZW5zaG90UnVsZSkKLSAgICAgICAgICAgIC5hcm91bmQoYWN0aXZpdHlSdWxlKQorICAgIHByaXZhdGUgdmFsIHJvYm9SdWxlID0KKyAgICAgICAgUnVsZUNoYWluLm91dGVyUnVsZShkZXZpY2VFbXVsYXRpb25SdWxlKS5hcm91bmQoc2NyZWVuc2hvdFJ1bGUpLmFyb3VuZChhY3Rpdml0eVJ1bGUpCisgICAgcHJpdmF0ZSB2YWwgZGVsZWdhdGVSdWxlID0gUnVsZUNoYWluLm91dGVyUnVsZShjb2xvcnNSdWxlKS5hcm91bmQocm9ib1J1bGUpCisgICAgcHJpdmF0ZSB2YWwgaXNSb2JvbGVjdHJpYyA9IGlmIChCdWlsZC5GSU5HRVJQUklOVC5jb250YWlucygicm9ib2xlY3RyaWMiKSkgdHJ1ZSBlbHNlIGZhbHNlCiAKICAgICBvdmVycmlkZSBmdW4gYXBwbHkoYmFzZTogU3RhdGVtZW50LCBkZXNjcmlwdGlvbjogRGVzY3JpcHRpb24pOiBTdGF0ZW1lbnQgewotICAgICAgICByZXR1cm4gZGVsZWdhdGVSdWxlLmFwcGx5KGJhc2UsIGRlc2NyaXB0aW9uKQorICAgICAgICB2YWwgcnVsZVRvQXBwbHkgPSBpZiAoaXNSb2JvbGVjdHJpYykgcm9ib1J1bGUgZWxzZSBkZWxlZ2F0ZVJ1bGUKKyAgICAgICAgcmV0dXJuIHJ1bGVUb0FwcGx5LmFwcGx5KGJhc2UsIGRlc2NyaXB0aW9uKQogICAgIH0KIAotICAgIC8qKgotICAgICAqIENvbXBhcmUgdGhlIGNvbnRlbnQgb2YgdGhlIHZpZXcgcHJvdmlkZWQgYnkgW3ZpZXdQcm92aWRlcl0gd2l0aCB0aGUgZ29sZGVuIGltYWdlIGlkZW50aWZpZWQKLSAgICAgKiBieSBbZ29sZGVuSWRlbnRpZmllcl0gaW4gdGhlIGNvbnRleHQgb2YgW2VtdWxhdGlvblNwZWNdLgotICAgICAqLwotICAgIGZ1biBzY3JlZW5zaG90VGVzdCgKLSAgICAgICAgZ29sZGVuSWRlbnRpZmllcjogU3RyaW5nLAorICAgIHByb3RlY3RlZCBmdW4gdGFrZVNjcmVlbnNob3QoCiAgICAgICAgIG1vZGU6IE1vZGUgPSBNb2RlLldyYXBDb250ZW50LAogICAgICAgICB2aWV3UHJvdmlkZXI6IChDb21wb25lbnRBY3Rpdml0eSkgLT4gVmlldywKLSAgICApIHsKKyAgICApOiBCaXRtYXAgewogICAgICAgICBhY3Rpdml0eVJ1bGUuc2NlbmFyaW8ub25BY3Rpdml0eSB7IGFjdGl2aXR5IC0+CiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgYWN0aXZpdHkgZHJhd3MgZnVsbCBzY3JlZW4gYW5kIGZpdHMgdGhlIHdob2xlIGRpc3BsYXkgaW5zdGVhZCBvZgogICAgICAgICAgICAgLy8gdGhlIHN5c3RlbSBiYXJzLgpAQCAtOTksNyArOTYsMjQgQEAKICAgICAgICAgICAgIGNvbnRlbnRWaWV3ID0gY29udGVudC5nZXRDaGlsZEF0KDApCiAgICAgICAgIH0KIAotICAgICAgICB2YWwgYml0bWFwID0gY29udGVudFZpZXc/LnRvQml0bWFwKCkgPzogZXJyb3IoImNvbnRlbnRWaWV3IGlzIG51bGwiKQorICAgICAgICByZXR1cm4gaWYgKGlzUm9ib2xlY3RyaWMpIHsKKyAgICAgICAgICAgIGNvbnRlbnRWaWV3Py5jYXB0dXJlVG9CaXRtYXAoKT8uZ2V0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKQorICAgICAgICAgICAgICAgID86IGVycm9yKCJ0aW1lb3V0IHdoaWxlIHRyeWluZyB0byBjYXB0dXJlIHZpZXcgdG8gYml0bWFwIikKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRlbnRWaWV3Py50b0JpdG1hcCgpID86IGVycm9yKCJjb250ZW50VmlldyBpcyBudWxsIikKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdGhlIGNvbnRlbnQgb2YgdGhlIHZpZXcgcHJvdmlkZWQgYnkgW3ZpZXdQcm92aWRlcl0gd2l0aCB0aGUgZ29sZGVuIGltYWdlIGlkZW50aWZpZWQKKyAgICAgKiBieSBbZ29sZGVuSWRlbnRpZmllcl0gaW4gdGhlIGNvbnRleHQgb2YgW2VtdWxhdGlvblNwZWNdLgorICAgICAqLworICAgIGZ1biBzY3JlZW5zaG90VGVzdCgKKyAgICAgICAgZ29sZGVuSWRlbnRpZmllcjogU3RyaW5nLAorICAgICAgICBtb2RlOiBNb2RlID0gTW9kZS5XcmFwQ29udGVudCwKKyAgICAgICAgdmlld1Byb3ZpZGVyOiAoQ29tcG9uZW50QWN0aXZpdHkpIC0+IFZpZXcsCisgICAgKSB7CisgICAgICAgIHZhbCBiaXRtYXAgPSB0YWtlU2NyZWVuc2hvdChtb2RlLCB2aWV3UHJvdmlkZXIpCiAgICAgICAgIHNjcmVlbnNob3RSdWxlLmFzc2VydEJpdG1hcEFnYWluc3RHb2xkZW4oCiAgICAgICAgICAgICBiaXRtYXAsCiAgICAgICAgICAgICBnb2xkZW5JZGVudGlmaWVyLApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc2hhcmVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFyZWQvcGx1Z2lucy9QbHVnaW5BY3Rpb25NYW5hZ2VyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zaGFyZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9wbHVnaW5zL1BsdWdpbkFjdGlvbk1hbmFnZXIuamF2YQppbmRleCBjYzNkN2E4Li4zZDA1NTQyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zaGFyZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9wbHVnaW5zL1BsdWdpbkFjdGlvbk1hbmFnZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zaGFyZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9wbHVnaW5zL1BsdWdpbkFjdGlvbk1hbmFnZXIuamF2YQpAQCAtMjEwLDEyICsyMTAsMTIgQEAKICAgICBwcml2YXRlIHZvaWQgb25QbHVnaW5Db25uZWN0ZWQoUGx1Z2luSW5zdGFuY2U8VD4gcGx1Z2luSW5zdGFuY2UpIHsKICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblBsdWdpbkNvbm5lY3RlZCIpOwogICAgICAgICBQbHVnaW5QcmVmcy5zZXRIYXNQbHVnaW5zKG1Db250ZXh0KTsKLSAgICAgICAgcGx1Z2luSW5zdGFuY2Uub25DcmVhdGUobUNvbnRleHQsIG1MaXN0ZW5lcik7CisgICAgICAgIHBsdWdpbkluc3RhbmNlLm9uQ3JlYXRlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG9uUGx1Z2luRGlzY29ubmVjdGVkKFBsdWdpbkluc3RhbmNlPFQ+IHBsdWdpbkluc3RhbmNlKSB7CiAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25QbHVnaW5EaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgcGx1Z2luSW5zdGFuY2Uub25EZXN0cm95KG1MaXN0ZW5lcik7CisgICAgICAgIHBsdWdpbkluc3RhbmNlLm9uRGVzdHJveSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBxdWVyeUFsbCgpIHsKQEAgLTMxMiw3ICszMTIsNyBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gbVBsdWdpbkluc3RhbmNlRmFjdG9yeS5jcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dCwgYXBwSW5mbywgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbVBsdWdpbkNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbHVnaW5DbGFzcywgbUxpc3RlbmVyKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEludmFsaWRWZXJzaW9uRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICByZXBvcnRJbnZhbGlkVmVyc2lvbihjb21wb25lbnQsIGNvbXBvbmVudC5nZXRDbGFzc05hbWUoKSwgZSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zaGFyZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9wbHVnaW5zL1BsdWdpbkluc3RhbmNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zaGFyZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9wbHVnaW5zL1BsdWdpbkluc3RhbmNlLmphdmEKaW5kZXggMmY4NDYwMi4uMDE2ZDU3MyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc2hhcmVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFyZWQvcGx1Z2lucy9QbHVnaW5JbnN0YW5jZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NoYXJlZC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhcmVkL3BsdWdpbnMvUGx1Z2luSW5zdGFuY2UuamF2YQpAQCAtMjEsMTMgKzIxLDE2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuUGx1Z2luOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuUGx1Z2luRnJhZ21lbnQ7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5QbHVnaW5MaWZlY3ljbGVNYW5hZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuUGx1Z2luTGlzdGVuZXI7CiAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlBhdGhDbGFzc0xvYWRlcjsKQEAgLTM1LDcgKzM4LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIAogLyoqCiAgKiBDb250YWlucyBhIHNpbmdsZSBpbnN0YW50aWF0aW9uIG9mIGEgUGx1Z2luLgpAQCAtNDUsNDIgKzQ4LDEwMiBAQAogICoKICAqIEBwYXJhbSA8VD4gVGhlIHR5cGUgb2YgcGx1Z2luIHRoYXQgdGhpcyBjb250YWlucy4KICAqLwotcHVibGljIGNsYXNzIFBsdWdpbkluc3RhbmNlPFQgZXh0ZW5kcyBQbHVnaW4+IHsKK3B1YmxpYyBjbGFzcyBQbHVnaW5JbnN0YW5jZTxUIGV4dGVuZHMgUGx1Z2luPiBpbXBsZW1lbnRzIFBsdWdpbkxpZmVjeWNsZU1hbmFnZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGx1Z2luSW5zdGFuY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzTG9hZGVyPiBzQ2xhc3NMb2FkZXJzID0gbmV3IEFycmF5TWFwPD4oKTsKIAotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtUGx1Z2luQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFZlcnNpb25JbmZvIG1WZXJzaW9uSW5mbzsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUFwcENvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5MaXN0ZW5lcjxUPiBtTGlzdGVuZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOwotICAgIHByaXZhdGUgZmluYWwgVCBtUGx1Z2luOworICAgIHByaXZhdGUgZmluYWwgUGx1Z2luRmFjdG9yeTxUPiBtUGx1Z2luRmFjdG9yeTsKKworICAgIHByaXZhdGUgQ29udGV4dCBtUGx1Z2luQ29udGV4dDsKKyAgICBwcml2YXRlIFQgbVBsdWdpbjsKIAogICAgIC8qKiAqLwotICAgIHB1YmxpYyBQbHVnaW5JbnN0YW5jZShDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUsIFQgcGx1Z2luLCBDb250ZXh0IHBsdWdpbkNvbnRleHQsCi0gICAgICAgICAgICBWZXJzaW9uSW5mbyB2ZXJzaW9uSW5mbykgeworICAgIHB1YmxpYyBQbHVnaW5JbnN0YW5jZSgKKyAgICAgICAgICAgIENvbnRleHQgYXBwQ29udGV4dCwKKyAgICAgICAgICAgIFBsdWdpbkxpc3RlbmVyPFQ+IGxpc3RlbmVyLAorICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgUGx1Z2luRmFjdG9yeTxUPiBwbHVnaW5GYWN0b3J5LAorICAgICAgICAgICAgQE51bGxhYmxlIFQgcGx1Z2luKSB7CisgICAgICAgIG1BcHBDb250ZXh0ID0gYXBwQ29udGV4dDsKKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKKyAgICAgICAgbVBsdWdpbkZhY3RvcnkgPSBwbHVnaW5GYWN0b3J5OwogICAgICAgICBtUGx1Z2luID0gcGx1Z2luOwotICAgICAgICBtUGx1Z2luQ29udGV4dCA9IHBsdWdpbkNvbnRleHQ7Ci0gICAgICAgIG1WZXJzaW9uSW5mbyA9IHZlcnNpb25JbmZvOworCisgICAgICAgIGlmIChtUGx1Z2luICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QbHVnaW5Db250ZXh0ID0gbVBsdWdpbkZhY3RvcnkuY3JlYXRlUGx1Z2luQ29udGV4dCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqIEFsZXJ0cyBsaXN0ZW5lciBhbmQgcGx1Z2luIHRoYXQgdGhlIHBsdWdpbiBoYXMgYmVlbiBjcmVhdGVkLiAqLwotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKENvbnRleHQgYXBwQ29udGV4dCwgUGx1Z2luTGlzdGVuZXI8VD4gbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKCEobVBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbkZyYWdtZW50KSkgewotICAgICAgICAgICAgLy8gT25seSBjYWxsIG9uQ3JlYXRlIGZvciBwbHVnaW5zIHRoYXQgYXJlbid0IGZyYWdtZW50cywgYXMgZnJhZ21lbnRzCi0gICAgICAgICAgICAvLyB3aWxsIGdldCB0aGUgb25DcmVhdGUgYXMgcGFydCBvZiB0aGUgZnJhZ21lbnQgbGlmZWN5Y2xlLgotICAgICAgICAgICAgbVBsdWdpbi5vbkNyZWF0ZShhcHBDb250ZXh0LCBtUGx1Z2luQ29udGV4dCk7CisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIG1MaXN0ZW5lci5vblBsdWdpbkF0dGFjaGVkKHRoaXMpOworICAgICAgICBpZiAobVBsdWdpbiA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2FkUGx1Z2luKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShtUGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luRnJhZ21lbnQpKSB7CisgICAgICAgICAgICAgICAgLy8gT25seSBjYWxsIG9uQ3JlYXRlIGZvciBwbHVnaW5zIHRoYXQgYXJlbid0IGZyYWdtZW50cywgYXMgZnJhZ21lbnRzCisgICAgICAgICAgICAgICAgLy8gd2lsbCBnZXQgdGhlIG9uQ3JlYXRlIGFzIHBhcnQgb2YgdGhlIGZyYWdtZW50IGxpZmVjeWNsZS4KKyAgICAgICAgICAgICAgICBtUGx1Z2luLm9uQ3JlYXRlKG1BcHBDb250ZXh0LCBtUGx1Z2luQ29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTGlzdGVuZXIub25QbHVnaW5Mb2FkZWQobVBsdWdpbiwgbVBsdWdpbkNvbnRleHQsIHRoaXMpOwogICAgICAgICB9Ci0gICAgICAgIGxpc3RlbmVyLm9uUGx1Z2luQ29ubmVjdGVkKG1QbHVnaW4sIG1QbHVnaW5Db250ZXh0KTsKICAgICB9CiAKICAgICAvKiogQWxlcnRzIGxpc3RlbmVyIGFuZCBwbHVnaW4gdGhhdCB0aGUgcGx1Z2luIGlzIGJlaW5nIHNodXRkb3duLiAqLwotICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveShQbHVnaW5MaXN0ZW5lcjxUPiBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lci5vblBsdWdpbkRpc2Nvbm5lY3RlZChtUGx1Z2luKTsKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHVubG9hZFBsdWdpbigpOworICAgICAgICBtTGlzdGVuZXIub25QbHVnaW5EZXRhY2hlZCh0aGlzKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgY3VycmVudCBwbHVnaW4gaW5zdGFuY2UgKGlmIGl0IGlzIGxvYWRlZCkuICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFQgZ2V0UGx1Z2luKCkgeworICAgICAgICByZXR1cm4gbVBsdWdpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbmQgY3JlYXRlcyB0aGUgcGx1Z2luIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWRQbHVnaW4oKSB7CisgICAgICAgIGlmIChtUGx1Z2luICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1QbHVnaW4gPSBtUGx1Z2luRmFjdG9yeS5jcmVhdGVQbHVnaW4oKTsKKyAgICAgICAgbVBsdWdpbkNvbnRleHQgPSBtUGx1Z2luRmFjdG9yeS5jcmVhdGVQbHVnaW5Db250ZXh0KCk7CisgICAgICAgIGlmIChtUGx1Z2luID09IG51bGwgfHwgbVBsdWdpbkNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEobVBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbkZyYWdtZW50KSkgeworICAgICAgICAgICAgLy8gT25seSBjYWxsIG9uQ3JlYXRlIGZvciBwbHVnaW5zIHRoYXQgYXJlbid0IGZyYWdtZW50cywgYXMgZnJhZ21lbnRzCisgICAgICAgICAgICAvLyB3aWxsIGdldCB0aGUgb25DcmVhdGUgYXMgcGFydCBvZiB0aGUgZnJhZ21lbnQgbGlmZWN5Y2xlLgorICAgICAgICAgICAgbVBsdWdpbi5vbkNyZWF0ZShtQXBwQ29udGV4dCwgbVBsdWdpbkNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lci5vblBsdWdpbkxvYWRlZChtUGx1Z2luLCBtUGx1Z2luQ29udGV4dCwgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5sb2FkcyBhbmQgZGVzdHJveXMgdGhlIGN1cnJlbnQgcGx1Z2luIGluc3RhbmNlIGlmIGl0IGV4aXN0cy4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCBmcmVlIHRoZSBhc3NvY2lhdGVkIG1lbW9yeSBpZiB0aGVyZSBhcmUgbm90IG90aGVyIHJlZmVyZW5jZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5sb2FkUGx1Z2luKCkgeworICAgICAgICBpZiAobVBsdWdpbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtTGlzdGVuZXIub25QbHVnaW5VbmxvYWRlZChtUGx1Z2luLCB0aGlzKTsKICAgICAgICAgaWYgKCEobVBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbkZyYWdtZW50KSkgewogICAgICAgICAgICAgLy8gT25seSBjYWxsIG9uRGVzdHJveSBmb3IgcGx1Z2lucyB0aGF0IGFyZW4ndCBmcmFnbWVudHMsIGFzIGZyYWdtZW50cwogICAgICAgICAgICAgLy8gd2lsbCBnZXQgdGhlIG9uRGVzdHJveSBhcyBwYXJ0IG9mIHRoZSBmcmFnbWVudCBsaWZlY3ljbGUuCiAgICAgICAgICAgICBtUGx1Z2luLm9uRGVzdHJveSgpOwogICAgICAgICB9CisgICAgICAgIG1QbHVnaW4gPSBudWxsOworICAgICAgICBtUGx1Z2luQ29udGV4dCA9IG51bGw7CiAgICAgfQogCiAgICAgLyoqCkBAIC04OSw3ICsxNTIsNyBAQAogICAgICAqIEl0IGRvZXMgdGhpcyBieSBzdHJpbmcgY29tcGFyaXNvbiBvZiB0aGUgY2xhc3MgbmFtZXMuCiAgICAgICoqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zUGx1Z2luQ2xhc3MoQ2xhc3MgcGx1Z2luQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIG1QbHVnaW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKHBsdWdpbkNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBtQ29tcG9uZW50TmFtZS5nZXRDbGFzc05hbWUoKS5lcXVhbHMocGx1Z2luQ2xhc3MuZ2V0TmFtZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKCkgewpAQCAtMTAxLDcgKzE2NCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIFZlcnNpb25JbmZvIGdldFZlcnNpb25JbmZvKCkgewotICAgICAgICByZXR1cm4gbVZlcnNpb25JbmZvOworICAgICAgICByZXR1cm4gbVBsdWdpbkZhY3RvcnkuY2hlY2tWZXJzaW9uKG1QbHVnaW4pOwogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwpAQCAtMTM0LDIxICsxOTcsMjAgQEAKICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFwcEluZm8sCiAgICAgICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lLAotICAgICAgICAgICAgICAgIENsYXNzPFQ+IHBsdWdpbkNsYXNzKQorICAgICAgICAgICAgICAgIENsYXNzPFQ+IHBsdWdpbkNsYXNzLAorICAgICAgICAgICAgICAgIFBsdWdpbkxpc3RlbmVyPFQ+IGxpc3RlbmVyKQogICAgICAgICAgICAgICAgIHRocm93cyBQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCiAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CiAKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoYXBwSW5mbywgbUJhc2VDbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICBDb250ZXh0IHBsdWdpbkNvbnRleHQgPSBuZXcgUGx1Z2luQWN0aW9uTWFuYWdlci5QbHVnaW5Db250ZXh0V3JhcHBlcigKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jcmVhdGVBcHBsaWNhdGlvbkNvbnRleHQoYXBwSW5mbywgMCksIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIENsYXNzPFQ+IGluc3RhbmNlQ2xhc3MgPSAoQ2xhc3M8VD4pIENsYXNzLmZvck5hbWUoCi0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuZ2V0Q2xhc3NOYW1lKCksIHRydWUsIGNsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgIFBsdWdpbkZhY3Rvcnk8VD4gcGx1Z2luRmFjdG9yeSA9IG5ldyBQbHVnaW5GYWN0b3J5PFQ+KAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBtSW5zdGFuY2VGYWN0b3J5LCBhcHBJbmZvLCBjb21wb25lbnROYW1lLCBtVmVyc2lvbkNoZWNrZXIsIHBsdWdpbkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAoKSAtPiBnZXRDbGFzc0xvYWRlcihhcHBJbmZvLCBtQmFzZUNsYXNzTG9hZGVyKSk7CiAgICAgICAgICAgICAvLyBUT0RPOiBPbmx5IGNyZWF0ZSB0aGUgcGx1Z2luIGJlZm9yZSB2ZXJzaW9uIGNoZWNrIGlmIHdlIG5lZWQgaXQgZm9yCiAgICAgICAgICAgICAvLyBsZWdhY3kgdmVyc2lvbiBjaGVjay4KLSAgICAgICAgICAgIFQgaW5zdGFuY2UgPSAoVCkgbUluc3RhbmNlRmFjdG9yeS5jcmVhdGUoaW5zdGFuY2VDbGFzcyk7Ci0gICAgICAgICAgICBWZXJzaW9uSW5mbyB2ZXJzaW9uID0gbVZlcnNpb25DaGVja2VyLmNoZWNrVmVyc2lvbigKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDbGFzcywgcGx1Z2luQ2xhc3MsIGluc3RhbmNlKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGx1Z2luSW5zdGFuY2U8VD4oY29tcG9uZW50TmFtZSwgaW5zdGFuY2UsIHBsdWdpbkNvbnRleHQsIHZlcnNpb24pOworICAgICAgICAgICAgVCBpbnN0YW5jZSA9IHBsdWdpbkZhY3RvcnkuY3JlYXRlUGx1Z2luKCk7CisgICAgICAgICAgICBwbHVnaW5GYWN0b3J5LmNoZWNrVmVyc2lvbihpbnN0YW5jZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBsdWdpbkluc3RhbmNlPFQ+KAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBsaXN0ZW5lciwgY29tcG9uZW50TmFtZSwgcGx1Z2luRmFjdG9yeSwgaW5zdGFuY2UpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzUGx1Z2luUGFja2FnZVByaXZpbGVnZWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CkBAIC0xNzksOSArMjQxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgYXBwSW5mby5zb3VyY2VEaXIgKyAiLCBwa2c6ICIgKyBhcHBJbmZvLnBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzQ2xhc3NMb2FkZXJzLmNvbnRhaW5zS2V5KGFwcEluZm8ucGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNDbGFzc0xvYWRlcnMuZ2V0KGFwcEluZm8ucGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBMaXN0PFN0cmluZz4gemlwUGF0aHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBsaWJQYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOwpAQCAtMTkwLDEzICsyNDksMjAgQEAKICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmpvaW4oRmlsZS5wYXRoU2VwYXJhdG9yLCB6aXBQYXRocyksCiAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5qb2luKEZpbGUucGF0aFNlcGFyYXRvciwgbGliUGF0aHMpLAogICAgICAgICAgICAgICAgICAgICBnZXRQYXJlbnRDbGFzc0xvYWRlcihiYXNlQ2xhc3NMb2FkZXIpKTsKLSAgICAgICAgICAgIHNDbGFzc0xvYWRlcnMucHV0KGFwcEluZm8ucGFja2FnZU5hbWUsIGNsYXNzTG9hZGVyKTsKICAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlcjsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKiBDbGFzcyB0aGF0IGNvbXBhcmVzIGEgcGx1Z2luIGNsYXNzIGFnYWluc3QgYW4gaW1wbGVtZW50YXRpb24gZm9yIHZlcnNpb24gbWF0Y2hpbmcuICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBWZXJzaW9uQ2hlY2tlciB7CisgICAgcHVibGljIGludGVyZmFjZSBWZXJzaW9uQ2hlY2tlciB7CisgICAgICAgIC8qKiBDb21wYXJlcyB0d28gcGx1Z2luIGNsYXNzZXMuICovCisgICAgICAgIDxUIGV4dGVuZHMgUGx1Z2luPiBWZXJzaW9uSW5mbyBjaGVja1ZlcnNpb24oCisgICAgICAgICAgICAgICAgQ2xhc3M8VD4gaW5zdGFuY2VDbGFzcywgQ2xhc3M8VD4gcGx1Z2luQ2xhc3MsIFBsdWdpbiBwbHVnaW4pOworICAgIH0KKworICAgIC8qKiBDbGFzcyB0aGF0IGNvbXBhcmVzIGEgcGx1Z2luIGNsYXNzIGFnYWluc3QgYW4gaW1wbGVtZW50YXRpb24gZm9yIHZlcnNpb24gbWF0Y2hpbmcuICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWZXJzaW9uQ2hlY2tlckltcGwgaW1wbGVtZW50cyBWZXJzaW9uQ2hlY2tlciB7CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICAvKiogQ29tcGFyZXMgdHdvIHBsdWdpbiBjbGFzc2VzLiAqLwogICAgICAgICBwdWJsaWMgPFQgZXh0ZW5kcyBQbHVnaW4+IFZlcnNpb25JbmZvIGNoZWNrVmVyc2lvbigKICAgICAgICAgICAgICAgICBDbGFzczxUPiBpbnN0YW5jZUNsYXNzLCBDbGFzczxUPiBwbHVnaW5DbGFzcywgUGx1Z2luIHBsdWdpbikgewpAQCAtMjA0LDcgKzI3MCw3IEBACiAgICAgICAgICAgICBWZXJzaW9uSW5mbyBpbnN0YW5jZVZlcnNpb24gPSBuZXcgVmVyc2lvbkluZm8oKS5hZGRDbGFzcyhpbnN0YW5jZUNsYXNzKTsKICAgICAgICAgICAgIGlmIChpbnN0YW5jZVZlcnNpb24uaGFzVmVyc2lvbkluZm8oKSkgewogICAgICAgICAgICAgICAgIHBsdWdpblZlcnNpb24uY2hlY2tWZXJzaW9uKGluc3RhbmNlVmVyc2lvbik7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgfSBlbHNlIGlmIChwbHVnaW4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGludCBmYWxsYmFja1ZlcnNpb24gPSBwbHVnaW4uZ2V0VmVyc2lvbigpOwogICAgICAgICAgICAgICAgIGlmIChmYWxsYmFja1ZlcnNpb24gIT0gcGx1Z2luVmVyc2lvbi5nZXREZWZhdWx0VmVyc2lvbigpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWZXJzaW9uSW5mby5JbnZhbGlkVmVyc2lvbkV4Y2VwdGlvbigiSW52YWxpZCBsZWdhY3kgdmVyc2lvbiIsIGZhbHNlKTsKQEAgLTIyNSw0ICsyOTEsNzQgQEAKICAgICAgICAgICAgIHJldHVybiAoVCkgY2xzLm5ld0luc3RhbmNlKCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZWQgd3JhcHBlciBvZiBJbnN0YW5jZUZhY3RvcnkKKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gaXMgdGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBvYmplY3QgdG8gYmUgYnVpbHQKKyAgICAgKiovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQbHVnaW5GYWN0b3J5PFQgZXh0ZW5kcyBQbHVnaW4+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIEluc3RhbmNlRmFjdG9yeTw/PiBtSW5zdGFuY2VGYWN0b3J5OworICAgICAgICBwcml2YXRlIGZpbmFsIEFwcGxpY2F0aW9uSW5mbyBtQXBwSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIFZlcnNpb25DaGVja2VyIG1WZXJzaW9uQ2hlY2tlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiBtUGx1Z2luQ2xhc3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3VwcGxpZXI8Q2xhc3NMb2FkZXI+IG1DbGFzc0xvYWRlckZhY3Rvcnk7CisKKyAgICAgICAgcHVibGljIFBsdWdpbkZhY3RvcnkoCisgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgIEluc3RhbmNlRmFjdG9yeTw/PiBpbnN0YW5jZUZhY3RvcnksCisgICAgICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFwcEluZm8sCisgICAgICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgIFZlcnNpb25DaGVja2VyIHZlcnNpb25DaGVja2VyLAorICAgICAgICAgICAgICAgIENsYXNzPFQ+IHBsdWdpbkNsYXNzLAorICAgICAgICAgICAgICAgIFN1cHBsaWVyPENsYXNzTG9hZGVyPiBjbGFzc0xvYWRlckZhY3RvcnkpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIG1JbnN0YW5jZUZhY3RvcnkgPSBpbnN0YW5jZUZhY3Rvcnk7CisgICAgICAgICAgICBtQXBwSW5mbyA9IGFwcEluZm87CisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7CisgICAgICAgICAgICBtVmVyc2lvbkNoZWNrZXIgPSB2ZXJzaW9uQ2hlY2tlcjsKKyAgICAgICAgICAgIG1QbHVnaW5DbGFzcyA9IHBsdWdpbkNsYXNzOworICAgICAgICAgICAgbUNsYXNzTG9hZGVyRmFjdG9yeSA9IGNsYXNzTG9hZGVyRmFjdG9yeTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBDcmVhdGVzIHRoZSByZWxhdGVkIHBsdWdpbiBvYmplY3QgZnJvbSB0aGUgZmFjdG9yeSAqLworICAgICAgICBwdWJsaWMgVCBjcmVhdGVQbHVnaW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IG1DbGFzc0xvYWRlckZhY3RvcnkuZ2V0KCk7CisgICAgICAgICAgICAgICAgQ2xhc3M8VD4gaW5zdGFuY2VDbGFzcyA9IChDbGFzczxUPikgQ2xhc3MuZm9yTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmdldENsYXNzTmFtZSgpLCB0cnVlLCBsb2FkZXIpOworICAgICAgICAgICAgICAgIHJldHVybiAoVCkgbUluc3RhbmNlRmFjdG9yeS5jcmVhdGUoaW5zdGFuY2VDbGFzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxvYWQgcGx1Z2luIiwgZXgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBsb2FkIHBsdWdpbiIsIGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gbG9hZCBwbHVnaW4iLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBDcmVhdGVzIGEgY29udGV4dCB3cmFwcGVyIGZvciB0aGUgcGx1Z2luICovCisgICAgICAgIHB1YmxpYyBDb250ZXh0IGNyZWF0ZVBsdWdpbkNvbnRleHQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IG1DbGFzc0xvYWRlckZhY3RvcnkuZ2V0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbHVnaW5BY3Rpb25NYW5hZ2VyLlBsdWdpbkNvbnRleHRXcmFwcGVyKAorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5jcmVhdGVBcHBsaWNhdGlvbkNvbnRleHQobUFwcEluZm8sIDApLCBsb2FkZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGNyZWF0ZSBwbHVnaW4gY29udGV4dCIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqIENoZWNrIFZlcnNpb24gYW5kIGNyZWF0ZSBWZXJzaW9uSW5mbyBmb3IgaW5zdGFuY2UgKi8KKyAgICAgICAgcHVibGljIFZlcnNpb25JbmZvIGNoZWNrVmVyc2lvbihUIGluc3RhbmNlKSB7CisgICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlID0gY3JlYXRlUGx1Z2luKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbVZlcnNpb25DaGVja2VyLmNoZWNrVmVyc2lvbigKKyAgICAgICAgICAgICAgICAgICAgKENsYXNzPFQ+KSBpbnN0YW5jZS5nZXRDbGFzcygpLCBtUGx1Z2luQ2xhc3MsIGluc3RhbmNlKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NoYXJlZC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhcmVkL3N5c3RlbS9SZW1vdGVUcmFuc2l0aW9uQ29tcGF0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zaGFyZWQvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9zeXN0ZW0vUmVtb3RlVHJhbnNpdGlvbkNvbXBhdC5qYXZhCmluZGV4IDZmN2Q2NmQuLjU4ZTc3NDcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NoYXJlZC9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhcmVkL3N5c3RlbS9SZW1vdGVUcmFuc2l0aW9uQ29tcGF0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc2hhcmVkL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFyZWQvc3lzdGVtL1JlbW90ZVRyYW5zaXRpb25Db21wYXQuamF2YQpAQCAtMzIxLDcgKzMyMSw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcmVjZWl2aW5nIG5ldyBvcGVuaW5nIHRhc2tzLCBzbyBjb252ZXJ0IHRvIG9uVGFza3NBcHBlYXJlZC4KICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHNbaV0gPSBUcmFuc2l0aW9uVXRpbC5uZXdUYXJnZXQoY2hhbmdlLCBsYXllciwgaW5mbywgdCwgbUxlYXNoTWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQucmVwYXJlbnQodGFyZ2V0c1tpXS5sZWFzaCwgbUluZm8uZ2V0Um9vdExlYXNoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwYXJlbnQgaW50byB0aGUgb3JpZ2luYWwgYG1JbmZvYCBzaW5jZSB0aGF0J3Mgd2hlcmUgd2UgYXJlIGFuaW1hdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByb290SWR4ID0gVHJhbnNpdGlvblV0aWwucm9vdEluZGV4Rm9yKGNoYW5nZSwgbUluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgdC5yZXBhcmVudCh0YXJnZXRzW2ldLmxlYXNoLCBtSW5mby5nZXRSb290KHJvb3RJZHgpLmdldExlYXNoKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgdC5zZXRMYXllcih0YXJnZXRzW2ldLmxlYXNoLCBsYXllcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtT3BlbmluZ1Rhc2tzLmFkZChuZXcgVGFza1N0YXRlKGNoYW5nZSwgdGFyZ2V0c1tpXS5sZWFzaCkpOwogICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRNZXNzYWdlQXJlYS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkTWVzc2FnZUFyZWEuamF2YQppbmRleCAwZTVmOGMxLi41NTM0NTNkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRNZXNzYWdlQXJlYS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZE1lc3NhZ2VBcmVhLmphdmEKQEAgLTE4LDEzICsxOCw5IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKQEAgLTMzLDIyICsyOSwxMCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5TeXN0ZW1CYXJVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotCiAvKioqCiAgKiBNYW5hZ2VzIGEgbnVtYmVyIG9mIHZpZXdzIGluc2lkZSBvZiB0aGUgZ2l2ZW4gbGF5b3V0LiBTZWUgYmVsb3cgZm9yIGEgbGlzdCBvZiB3aWRnZXRzLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgS2V5Z3VhcmRNZXNzYWdlQXJlYSBleHRlbmRzIFRleHRWaWV3IGltcGxlbWVudHMgU2VjdXJpdHlNZXNzYWdlRGlzcGxheSB7Ci0gICAgLyoqIEhhbmRsZXIgdG9rZW4gcG9zdGVkIHdpdGggYWNjZXNzaWJpbGl0eSBhbm5vdW5jZW1lbnQgcnVubmFibGVzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBBTk5PVU5DRV9UT0tFTiA9IG5ldyBPYmplY3QoKTsKLQotICAgIC8qKgotICAgICAqIERlbGF5IGJlZm9yZSBzcGVha2luZyBhbiBhY2Nlc3NpYmlsaXR5IGFubm91bmNlbWVudC4gVXNlZCB0byBwcmV2ZW50Ci0gICAgICogbGlmdC10by10eXBlIGZyb20gaW50ZXJydXB0aW5nIGl0c2VsZi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFOTk9VTkNFTUVOVF9ERUxBWSA9IDI1MDsKLQotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKIAogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1NZXNzYWdlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWaXNpYmxlOwpAQCAtNjUsNyArNDksNiBAQAogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CiAgICAgICAgIHNldExheWVyVHlwZShMQVlFUl9UWVBFX0hBUkRXQVJFLCBudWxsKTsgLy8gd29yayBhcm91bmQgbmVzdGVkIHVuY2xpcHBlZCBTYXZlTGF5ZXIgYnVnCiAKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CiAgICAgICAgIG9uVGhlbWVDaGFuZ2VkKCk7CiAgICAgfQogCkBAIC0xMjcsOSArMTEwLDYgQEAKICAgICBwcml2YXRlIHZvaWQgc2VjdXJpdHlNZXNzYWdlQ2hhbmdlZChDaGFyU2VxdWVuY2UgbWVzc2FnZSkgewogICAgICAgICBtTWVzc2FnZSA9IG1lc3NhZ2U7CiAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3NBbmRNZXNzYWdlcyhBTk5PVU5DRV9UT0tFTik7Ci0gICAgICAgIG1IYW5kbGVyLnBvc3RBdFRpbWUobmV3IEFubm91bmNlUnVubmFibGUodGhpcywgZ2V0VGV4dCgpKSwgQU5OT1VOQ0VfVE9LRU4sCi0gICAgICAgICAgICAgICAgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpICsgQU5OT1VOQ0VNRU5UX0RFTEFZKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNsZWFyTWVzc2FnZSgpIHsKQEAgLTE1NiwyNSArMTM2LDQgQEAKIAogICAgIC8qKiBTZXQgdGhlIHRleHQgY29sb3IgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB1cGRhdGVUZXh0Q29sb3IoKTsKLQotICAgIC8qKgotICAgICAqIFJ1bm5hYmxlIHVzZWQgdG8gZGVsYXkgYWNjZXNzaWJpbGl0eSBhbm5vdW5jZW1lbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFubm91bmNlUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxWaWV3PiBtSG9zdDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDaGFyU2VxdWVuY2UgbVRleHRUb0Fubm91bmNlOwotCi0gICAgICAgIEFubm91bmNlUnVubmFibGUoVmlldyBob3N0LCBDaGFyU2VxdWVuY2UgdGV4dFRvQW5ub3VuY2UpIHsKLSAgICAgICAgICAgIG1Ib3N0ID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4oaG9zdCk7Ci0gICAgICAgICAgICBtVGV4dFRvQW5ub3VuY2UgPSB0ZXh0VG9Bbm5vdW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGhvc3QgPSBtSG9zdC5nZXQoKTsKLSAgICAgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBob3N0LmFubm91bmNlRm9yQWNjZXNzaWJpbGl0eShtVGV4dFRvQW5ub3VuY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkTWVzc2FnZUFyZWFDb250cm9sbGVyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRNZXNzYWdlQXJlYUNvbnRyb2xsZXIuamF2YQppbmRleCA2YTkyMTYyLi5jMTg5NmZjIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRNZXNzYWdlQXJlYUNvbnRyb2xsZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRNZXNzYWdlQXJlYUNvbnRyb2xsZXIuamF2YQpAQCAtMTgsMTEgKzE4LDE3IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5WaXNpYmxlRm9yVGVzdGluZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuQ29uZmlndXJhdGlvbkNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5Db25maWd1cmF0aW9uQ29udHJvbGxlci5Db25maWd1cmF0aW9uTGlzdGVuZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5WaWV3Q29udHJvbGxlcjsKIAoraW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKKwogaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CiAKIC8qKgpAQCAtMzEsOCArMzcsMTQgQEAKICAqLwogcHVibGljIGNsYXNzIEtleWd1YXJkTWVzc2FnZUFyZWFDb250cm9sbGVyPFQgZXh0ZW5kcyBLZXlndWFyZE1lc3NhZ2VBcmVhPgogICAgICAgICBleHRlbmRzIFZpZXdDb250cm9sbGVyPFQ+IHsKKyAgICAvKioKKyAgICAgKiBEZWxheSBiZWZvcmUgc3BlYWtpbmcgYW4gYWNjZXNzaWJpbGl0eSBhbm5vdW5jZW1lbnQuIFVzZWQgdG8gcHJldmVudAorICAgICAqIGxpZnQtdG8tdHlwZSBmcm9tIGludGVycnVwdGluZyBpdHNlbGYuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBTk5PVU5DRU1FTlRfREVMQVkgPSAyNTA7CiAgICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFVwZGF0ZU1vbml0b3IgbUtleWd1YXJkVXBkYXRlTW9uaXRvcjsKICAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb25Db250cm9sbGVyIG1Db25maWd1cmF0aW9uQ29udHJvbGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIEFubm91bmNlUnVubmFibGUgbUFubm91bmNlUnVubmFibGU7CiAKICAgICBwcml2YXRlIEtleWd1YXJkVXBkYXRlTW9uaXRvckNhbGxiYWNrIG1JbmZvQ2FsbGJhY2sgPSBuZXcgS2V5Z3VhcmRVcGRhdGVNb25pdG9yQ2FsbGJhY2soKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoZWRHb2luZ1RvU2xlZXAoaW50IHdoeSkgewpAQCAtNjgsNiArODAsNyBAQAogCiAgICAgICAgIG1LZXlndWFyZFVwZGF0ZU1vbml0b3IgPSBrZXlndWFyZFVwZGF0ZU1vbml0b3I7CiAgICAgICAgIG1Db25maWd1cmF0aW9uQ29udHJvbGxlciA9IGNvbmZpZ3VyYXRpb25Db250cm9sbGVyOworICAgICAgICBtQW5ub3VuY2VSdW5uYWJsZSA9IG5ldyBBbm5vdW5jZVJ1bm5hYmxlKG1WaWV3KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEwMCw2ICsxMTMsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKENoYXJTZXF1ZW5jZSBzLCBib29sZWFuIGFuaW1hdGUpIHsKICAgICAgICAgbVZpZXcuc2V0TWVzc2FnZShzLCBhbmltYXRlKTsKKyAgICAgICAgQ2hhclNlcXVlbmNlIG1zZyA9IG1WaWV3LmdldFRleHQoKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtc2cpKSB7CisgICAgICAgICAgICBtVmlldy5yZW1vdmVDYWxsYmFja3MobUFubm91bmNlUnVubmFibGUpOworICAgICAgICAgICAgbUFubm91bmNlUnVubmFibGUuc2V0VGV4dFRvQW5ub3VuY2UobXNnKTsKKyAgICAgICAgICAgIG1WaWV3LnBvc3REZWxheWVkKG1Bbm5vdW5jZVJ1bm5hYmxlLCBBTk5PVU5DRU1FTlRfREVMQVkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShpbnQgcmVzSWQpIHsKQEAgLTEzNCw0ICsxNTMsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgdmlldywgbUtleWd1YXJkVXBkYXRlTW9uaXRvciwgbUNvbmZpZ3VyYXRpb25Db250cm9sbGVyKTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bm5hYmxlIHVzZWQgdG8gZGVsYXkgYWNjZXNzaWJpbGl0eSBhbm5vdW5jZW1lbnRzLgorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW5ub3VuY2VSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPFZpZXc+IG1Ib3N0OworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGV4dFRvQW5ub3VuY2U7CisKKyAgICAgICAgQW5ub3VuY2VSdW5uYWJsZShWaWV3IGhvc3QpIHsKKyAgICAgICAgICAgIG1Ib3N0ID0gbmV3IFdlYWtSZWZlcmVuY2U8Pihob3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBTZXRzIHRoZSB0ZXh0IHRvIGFubm91bmNlLiAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0VG9Bbm5vdW5jZShDaGFyU2VxdWVuY2UgdGV4dFRvQW5ub3VuY2UpIHsKKyAgICAgICAgICAgIG1UZXh0VG9Bbm5vdW5jZSA9IHRleHRUb0Fubm91bmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgaG9zdCA9IG1Ib3N0LmdldCgpOworICAgICAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhvc3QuYW5ub3VuY2VGb3JBY2Nlc3NpYmlsaXR5KG1UZXh0VG9Bbm5vdW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5qYXZhCmluZGV4IDk4ODY2YzYuLjcyNTUzODMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5qYXZhCkBAIC0xMDY2LDIzICsxMDY2LDI4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlbG9hZENvbG9ycygpIHsKLSAgICAgICAgcmVpbmZsYXRlVmlld0ZsaXBwZXIoKTsKLSAgICAgICAgbVZpZXcucmVsb2FkQ29sb3JzKCk7CisgICAgICAgIHJlaW5mbGF0ZVZpZXdGbGlwcGVyKCgpIC0+IG1WaWV3LnJlbG9hZENvbG9ycygpKTsKICAgICB9CiAKICAgICAvKiogSGFuZGxlcyBkZW5zaXR5IG9yIGZvbnQgc2NhbGUgY2hhbmdlcy4gKi8KICAgICBwcml2YXRlIHZvaWQgb25EZW5zaXR5T3JGb250U2NhbGVDaGFuZ2VkKCkgewotICAgICAgICByZWluZmxhdGVWaWV3RmxpcHBlcigpOwotICAgICAgICBtVmlldy5vbkRlbnNpdHlPckZvbnRTY2FsZUNoYW5nZWQoKTsKKyAgICAgICAgcmVpbmZsYXRlVmlld0ZsaXBwZXIoKCkgLT4gbVZpZXcub25EZW5zaXR5T3JGb250U2NhbGVDaGFuZ2VkKCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlaW5mbGF0ZSB0aGUgdmlldyBmbGlwcGVyIGNoaWxkIHZpZXcuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcmVpbmZsYXRlVmlld0ZsaXBwZXIoKSB7CisgICAgcHVibGljIHZvaWQgcmVpbmZsYXRlVmlld0ZsaXBwZXIoCisgICAgICAgICAgICBLZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyLk9uVmlld0luZmxhdGVkTGlzdGVuZXIgb25WaWV3SW5mbGF0ZWRMaXN0ZW5lcikgewogICAgICAgICBtU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIuY2xlYXJWaWV3cygpOwotICAgICAgICBtU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIuZ2V0U2VjdXJpdHlWaWV3KG1DdXJyZW50U2VjdXJpdHlNb2RlLAotICAgICAgICAgICAgICAgIG1LZXlndWFyZFNlY3VyaXR5Q2FsbGJhY2spOworICAgICAgICBpZiAobUZlYXR1cmVGbGFncy5pc0VuYWJsZWQoRmxhZ3MuQVNZTkNfSU5GTEFURV9CT1VOQ0VSKSkgeworICAgICAgICAgICAgbVNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyLmFzeW5jaHJvbm91c2x5SW5mbGF0ZVZpZXcobUN1cnJlbnRTZWN1cml0eU1vZGUsCisgICAgICAgICAgICAgICAgICAgIG1LZXlndWFyZFNlY3VyaXR5Q2FsbGJhY2ssIG9uVmlld0luZmxhdGVkTGlzdGVuZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyLmdldFNlY3VyaXR5VmlldyhtQ3VycmVudFNlY3VyaXR5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgbUtleWd1YXJkU2VjdXJpdHlDYWxsYmFjayk7CisgICAgICAgICAgICBvblZpZXdJbmZsYXRlZExpc3RlbmVyLm9uVmlld0luZmxhdGVkKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlci5qYXZhCmluZGV4IDM5YjU2N2YuLjY4ZTFkZDcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIuamF2YQpAQCAtMTksMTEgKzE5LDE2IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWR4LmFzeW5jbGF5b3V0aW5mbGF0ZXIudmlldy5Bc3luY0xheW91dEluZmxhdGVyOworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuS2V5Z3VhcmRJbnB1dFZpZXdDb250cm9sbGVyLkZhY3Rvcnk7CiBpbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuS2V5Z3VhcmRTZWN1cml0eU1vZGVsLlNlY3VyaXR5TW9kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5rZXlndWFyZC5kYWdnZXIuS2V5Z3VhcmRCb3VuY2VyU2NvcGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5mbGFncy5GZWF0dXJlRmxhZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmxhZ3M7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5WaWV3Q29udHJvbGxlcjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC00NCwxOCArNDksMjQgQEAKICAgICBwcml2YXRlIGZpbmFsIExpc3Q8S2V5Z3VhcmRJbnB1dFZpZXdDb250cm9sbGVyPEtleWd1YXJkSW5wdXRWaWV3Pj4gbUNoaWxkcmVuID0KICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PigpOwogICAgIHByaXZhdGUgZmluYWwgTGF5b3V0SW5mbGF0ZXIgbUxheW91dEluZmxhdGVyOworICAgIHByaXZhdGUgZmluYWwgQXN5bmNMYXlvdXRJbmZsYXRlciBtQXN5bmNMYXlvdXRJbmZsYXRlcjsKICAgICBwcml2YXRlIGZpbmFsIEVtZXJnZW5jeUJ1dHRvbkNvbnRyb2xsZXIuRmFjdG9yeSBtRW1lcmdlbmN5QnV0dG9uQ29udHJvbGxlckZhY3Rvcnk7CiAgICAgcHJpdmF0ZSBmaW5hbCBGYWN0b3J5IG1LZXlndWFyZFNlY3VyaXR5Vmlld0NvbnRyb2xsZXJGYWN0b3J5OworICAgIHByaXZhdGUgZmluYWwgRmVhdHVyZUZsYWdzIG1GZWF0dXJlRmxhZ3M7CiAKICAgICBASW5qZWN0CiAgICAgcHJvdGVjdGVkIEtleWd1YXJkU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIoS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyIHZpZXcsCiAgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBsYXlvdXRJbmZsYXRlciwKKyAgICAgICAgICAgIEFzeW5jTGF5b3V0SW5mbGF0ZXIgYXN5bmNMYXlvdXRJbmZsYXRlciwKICAgICAgICAgICAgIEtleWd1YXJkSW5wdXRWaWV3Q29udHJvbGxlci5GYWN0b3J5IGtleWd1YXJkU2VjdXJpdHlWaWV3Q29udHJvbGxlckZhY3RvcnksCi0gICAgICAgICAgICBFbWVyZ2VuY3lCdXR0b25Db250cm9sbGVyLkZhY3RvcnkgZW1lcmdlbmN5QnV0dG9uQ29udHJvbGxlckZhY3RvcnkpIHsKKyAgICAgICAgICAgIEVtZXJnZW5jeUJ1dHRvbkNvbnRyb2xsZXIuRmFjdG9yeSBlbWVyZ2VuY3lCdXR0b25Db250cm9sbGVyRmFjdG9yeSwKKyAgICAgICAgICAgIEZlYXR1cmVGbGFncyBmZWF0dXJlRmxhZ3MpIHsKICAgICAgICAgc3VwZXIodmlldyk7CiAgICAgICAgIG1LZXlndWFyZFNlY3VyaXR5Vmlld0NvbnRyb2xsZXJGYWN0b3J5ID0ga2V5Z3VhcmRTZWN1cml0eVZpZXdDb250cm9sbGVyRmFjdG9yeTsKICAgICAgICAgbUxheW91dEluZmxhdGVyID0gbGF5b3V0SW5mbGF0ZXI7CiAgICAgICAgIG1FbWVyZ2VuY3lCdXR0b25Db250cm9sbGVyRmFjdG9yeSA9IGVtZXJnZW5jeUJ1dHRvbkNvbnRyb2xsZXJGYWN0b3J5OworICAgICAgICBtQXN5bmNMYXlvdXRJbmZsYXRlciA9IGFzeW5jTGF5b3V0SW5mbGF0ZXI7CisgICAgICAgIG1GZWF0dXJlRmxhZ3MgPSBmZWF0dXJlRmxhZ3M7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05MiwxMyArMTAzLDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoY2hpbGRDb250cm9sbGVyID09IG51bGwKKyAgICAgICAgaWYgKCFtRmVhdHVyZUZsYWdzLmlzRW5hYmxlZChGbGFncy5BU1lOQ19JTkZMQVRFX0JPVU5DRVIpICYmIGNoaWxkQ29udHJvbGxlciA9PSBudWxsCiAgICAgICAgICAgICAgICAgJiYgc2VjdXJpdHlNb2RlICE9IFNlY3VyaXR5TW9kZS5Ob25lICYmIHNlY3VyaXR5TW9kZSAhPSBTZWN1cml0eU1vZGUuSW52YWxpZCkgewotCiAgICAgICAgICAgICBpbnQgbGF5b3V0SWQgPSBnZXRMYXlvdXRJZEZvcihzZWN1cml0eU1vZGUpOwogICAgICAgICAgICAgS2V5Z3VhcmRJbnB1dFZpZXcgdmlldyA9IG51bGw7CiAgICAgICAgICAgICBpZiAobGF5b3V0SWQgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiaW5mbGF0aW5nIGlkID0gIiArIGxheW91dElkKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgImluZmxhdGluZyBvbiBtYWluIHRocmVhZCBpZCA9ICIgKyBsYXlvdXRJZCk7CiAgICAgICAgICAgICAgICAgdmlldyA9IChLZXlndWFyZElucHV0VmlldykgbUxheW91dEluZmxhdGVyLmluZmxhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRJZCwgbVZpZXcsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBtVmlldy5hZGRWaWV3KHZpZXcpOwpAQCAtMTE5LDYgKzEyOSwzNiBAQAogICAgICAgICByZXR1cm4gY2hpbGRDb250cm9sbGVyOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFzeW5jaHJvbm91c2x5IGluZmxhdGUgdmlldyBhbmQgdGhlbiBhZGQgaXQgdG8gdmlldyBmbGlwcGVyIG9uIHRoZSBtYWluIHRocmVhZCB3aGVuIGNvbXBsZXRlLgorICAgICAqCisgICAgICogT25JbmZsYXRlRmluaXNoZWRMaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VjdXJpdHlNb2RlCisgICAgICogQHBhcmFtIGtleWd1YXJkU2VjdXJpdHlDYWxsYmFjaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzeW5jaHJvbm91c2x5SW5mbGF0ZVZpZXcoU2VjdXJpdHlNb2RlIHNlY3VyaXR5TW9kZSwKKyAgICAgICAgICAgIEtleWd1YXJkU2VjdXJpdHlDYWxsYmFjayBrZXlndWFyZFNlY3VyaXR5Q2FsbGJhY2ssCisgICAgICAgICAgICBATnVsbGFibGUgT25WaWV3SW5mbGF0ZWRMaXN0ZW5lciBvblZpZXdJbmZsYXRlZExpc3RlbmVyKSB7CisgICAgICAgIGludCBsYXlvdXRJZCA9IGdldExheW91dElkRm9yKHNlY3VyaXR5TW9kZSk7CisgICAgICAgIGlmIChsYXlvdXRJZCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgImluZmxhdGluZyBvbiBiZyB0aHJlYWQgaWQgPSAiICsgbGF5b3V0SWQpOworICAgICAgICAgICAgbUFzeW5jTGF5b3V0SW5mbGF0ZXIuaW5mbGF0ZShsYXlvdXRJZCwgbVZpZXcsCisgICAgICAgICAgICAgICAgICAgICh2aWV3LCByZXNJZCwgcGFyZW50KSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5hZGRWaWV3KHZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgS2V5Z3VhcmRJbnB1dFZpZXdDb250cm9sbGVyPEtleWd1YXJkSW5wdXRWaWV3PiBjaGlsZENvbnRyb2xsZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtS2V5Z3VhcmRTZWN1cml0eVZpZXdDb250cm9sbGVyRmFjdG9yeS5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEtleWd1YXJkSW5wdXRWaWV3KSB2aWV3LCBzZWN1cml0eU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Z3VhcmRTZWN1cml0eUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQ29udHJvbGxlci5pbml0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hpbGRyZW4uYWRkKGNoaWxkQ29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob25WaWV3SW5mbGF0ZWRMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WaWV3SW5mbGF0ZWRMaXN0ZW5lci5vblZpZXdJbmZsYXRlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgaW50IGdldExheW91dElkRm9yKFNlY3VyaXR5TW9kZSBzZWN1cml0eU1vZGUpIHsKICAgICAgICAgc3dpdGNoIChzZWN1cml0eU1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgUGF0dGVybjogcmV0dXJuIFIubGF5b3V0LmtleWd1YXJkX3BhdHRlcm5fdmlldzsKQEAgLTE2Miw0ICsyMDIsMTAgQEAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqIExpc3RlbmVyIHRvIHdoZW4gdmlldyBoYXMgZmluaXNoZWQgaW5mbGF0aW9uLiAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25WaWV3SW5mbGF0ZWRMaXN0ZW5lciB7CisgICAgICAgIC8qKiBOb3RpZmllcyB0aGF0IHZpZXcgaGFzIGJlZW4gaW5mbGF0ZWQgKi8KKyAgICAgICAgdm9pZCBvblZpZXdJbmZsYXRlZCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFZpZXdDb250cm9sbGVyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRWaWV3Q29udHJvbGxlci5qYXZhCmluZGV4IDZjM2MyNDYuLjc2NjFiOGQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFZpZXdDb250cm9sbGVyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkVmlld0NvbnRyb2xsZXIuamF2YQpAQCAtMTY4LDcgKzE2OCw3IEBACiAgICAgLyoqCiAgICAgICogU3RvcCBzaG93aW5nIHRoZSBhbHRlcm5hdGUgYm91bmNlciwgaWYgc2hvd2luZy4KICAgICAgKi8KLSAgICB2b2lkIGhpZGVBbHRlcm5hdGVCb3VuY2VyKGJvb2xlYW4gZm9yY2VVcGRhdGVTY3JpbSk7CisgICAgdm9pZCBoaWRlQWx0ZXJuYXRlQm91bmNlcihib29sZWFuIHVwZGF0ZVNjcmltKTsKIAogICAgIC8vIFRPRE86IERlcHJlY2F0ZSByZWdpc3RlclN0YXR1c0JhciBpbiBLZXlndWFyZFZpZXdDb250cm9sbGVyIGludGVyZmFjZS4gSXQgaXMgY3VycmVudGx5CiAgICAgLy8gIG9ubHkgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBpbiBTdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyLCBhbmQgaXQgcHJldmVudHMgdXMgZnJvbQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL2RhZ2dlci9DbG9ja1JlZ2lzdHJ5TW9kdWxlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvZGFnZ2VyL0Nsb2NrUmVnaXN0cnlNb2R1bGUuamF2YQppbmRleCBiMWE4M2ZiLi42ZTk4YTE4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvZGFnZ2VyL0Nsb2NrUmVnaXN0cnlNb2R1bGUuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvZGFnZ2VyL0Nsb2NrUmVnaXN0cnlNb2R1bGUuamF2YQpAQCAtNjAsNyArNjAsOSBAQAogICAgICAgICAgICAgICAgIGZlYXR1cmVGbGFncy5pc0VuYWJsZWQoRmxhZ3MuTE9DS1NDUkVFTl9DVVNUT01fQ0xPQ0tTKSwKICAgICAgICAgICAgICAgICAvKiBoYW5kbGVBbGxVc2Vycz0gKi8gdHJ1ZSwKICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENsb2NrUHJvdmlkZXIoY29udGV4dCwgbGF5b3V0SW5mbGF0ZXIsIHJlc291cmNlcyksCi0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9jbG9ja19pZF9mYWxsYmFjaykpOworICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fY2xvY2tfaWRfZmFsbGJhY2spLAorICAgICAgICAgICAgICAgIC8qIGtlZXBBbGxMb2FkZWQgPSAqLyBmYWxzZSwKKyAgICAgICAgICAgICAgICAvKiBzdWJUYWcgPSAqLyAiU3lzdGVtIik7CiAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyTGlzdGVuZXJzKCk7CiAgICAgICAgIHJldHVybiByZWdpc3RyeTsKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKaW5kZXggOWM4NDdiZS4uMDgyMzZiNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL0V2ZW50TG9nVGFncy5sb2d0YWdzCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9FdmVudExvZ1RhZ3MubG9ndGFncwpAQCAtNjEsMyArNjEsOCBAQAogIyMgICAgICAgNDogU1lTVEVNX1JFR0lTVEVSX1VTRVIgICAgIFN5c3RlbSBzeXN1aSByZWdpc3RlcnMgdXNlcidzIGNhbGxiYWNrcwogIyMgICAgICAgNTogU1lTVEVNX1VOUkVHSVNURVJfVVNFUiAgIFN5c3RlbSBzeXN1aSB1bnJlZ2lzdGVycyB1c2VyJ3MgY2FsbGJhY2tzIChhZnRlciBkZWF0aCkKIDM2MDYwIHN5c3VpX3JlY2VudHNfY29ubmVjdGlvbiAodHlwZXwxKSwodXNlcnwxKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBLZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMzYwODAgc3lzdWlfa2V5Z3VhcmQgKGlzT2NjbHVkZWR8MSksKGFuaW1hdGV8MSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9iaW9tZXRyaWNzL0F1dGhCaW9tZXRyaWNWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYmlvbWV0cmljcy9BdXRoQmlvbWV0cmljVmlldy5qYXZhCmluZGV4IGE3YjZlNmEuLjEzYmI2ZDMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9iaW9tZXRyaWNzL0F1dGhCaW9tZXRyaWNWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2Jpb21ldHJpY3MvQXV0aEJpb21ldHJpY1ZpZXcuamF2YQpAQCAtNjU4LDcgKzY1OCw5IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewogICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CiAgICAgICAgIG1JY29uQ29udHJvbGxlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIHVwZGF0ZVN0YXRlKG1TYXZlZFN0YXRlLmdldEludChBdXRoRGlhbG9nLktFWV9CSU9NRVRSSUNfU1RBVEUpKTsKKyAgICAgICAgaWYgKG1TYXZlZFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVwZGF0ZVN0YXRlKG1TYXZlZFN0YXRlLmdldEludChBdXRoRGlhbG9nLktFWV9CSU9NRVRSSUNfU1RBVEUpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2Jpb21ldHJpY3MvQXV0aENvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9iaW9tZXRyaWNzL0F1dGhDb250cm9sbGVyLmphdmEKaW5kZXggYzMxZDQ1Zi4uNGFhOTg1YiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2Jpb21ldHJpY3MvQXV0aENvbnRyb2xsZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYmlvbWV0cmljcy9BdXRoQ29udHJvbGxlci5qYXZhCkBAIC0xOTgsMzIgKzE5OCwzNiBAQAogICAgIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1Ccm9hZGNhc3RSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudERpYWxvZyAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX0NMT1NFX1NZU1RFTV9ESUFMT0dTLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYSgicmVhc29uIik7CiAgICAgICAgICAgICAgICAgcmVhc29uID0gKHJlYXNvbiAhPSBudWxsKSA/IHJlYXNvbiA6ICJ1bmtub3duIjsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJBQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MgcmVjZWl2ZWQsIHJlYXNvbjogIiArIHJlYXNvbik7Ci0KLSAgICAgICAgICAgICAgICBtQ3VycmVudERpYWxvZy5kaXNtaXNzV2l0aG91dENhbGxiYWNrKHRydWUgLyogYW5pbWF0ZSAqLyk7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnREaWFsb2cgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChDYWxsYmFjayBjYiA6IG1DYWxsYmFja3MpIHsKLSAgICAgICAgICAgICAgICAgICAgY2Iub25CaW9tZXRyaWNQcm9tcHREaXNtaXNzZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVJlY2VpdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlci5vbkRpYWxvZ0Rpc21pc3NlZChCaW9tZXRyaWNQcm9tcHQuRElTTUlTU0VEX1JFQVNPTl9VU0VSX0NBTkNFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBjcmVkZW50aWFsQXR0ZXN0YXRpb24gKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZSBleGNlcHRpb24iLCBlKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xvc2VEaW9hbG9nKHJlYXNvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwogCisgICAgcHJpdmF0ZSB2b2lkIGNsb3NlRGlvYWxvZyhTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xvc2UgQlAsIHJlYXNvbiA6IiArIHJlYXNvbik7CisgICAgICAgICAgICBtQ3VycmVudERpYWxvZy5kaXNtaXNzV2l0aG91dENhbGxiYWNrKHRydWUgLyogYW5pbWF0ZSAqLyk7CisgICAgICAgICAgICBtQ3VycmVudERpYWxvZyA9IG51bGw7CisKKyAgICAgICAgICAgIGZvciAoQ2FsbGJhY2sgY2IgOiBtQ2FsbGJhY2tzKSB7CisgICAgICAgICAgICAgICAgY2Iub25CaW9tZXRyaWNQcm9tcHREaXNtaXNzZWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAobVJlY2VpdmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyLm9uRGlhbG9nRGlzbWlzc2VkKEJpb21ldHJpY1Byb21wdC5ESVNNSVNTRURfUkVBU09OX1VTRVJfQ0FOQ0VMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogY3JlZGVudGlhbEF0dGVzdGF0aW9uICovKTsKKyAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZSBleGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBjYW5jZWxJZk93bmVySXNOb3RJbkZvcmVncm91bmQoKSB7CiAgICAgICAgIG1FeGVjdXRpb24uYXNzZXJ0SXNNYWluVGhyZWFkKCk7CiAgICAgICAgIGlmIChtQ3VycmVudERpYWxvZyAhPSBudWxsKSB7CkBAIC01NDYsNiArNTUwLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVTaG93R2xvYmFsQWN0aW9uc01lbnUoKSB7CisgICAgICAgIGNsb3NlRGlvYWxvZygiUG93ZXJNZW51IHNob3duIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQHJldHVybiB3aGVyZSB0aGUgVURGUFMgZXhpc3RzIG9uIHRoZSBzY3JlZW4gaW4gcGl4ZWxzIGluIHBvcnRyYWl0IG1vZGUuCiAgICAgICovCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29tcG9zZS9CYXNlQ29tcG9zZUZhY2FkZS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0Jhc2VDb21wb3NlRmFjYWRlLmt0CmluZGV4IGMwZjg1NDkuLjQxNzNiZGMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0Jhc2VDb21wb3NlRmFjYWRlLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb21wb3NlL0Jhc2VDb21wb3NlRmFjYWRlLmt0CkBAIC0yMSw4ICsyMSwxMCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3CiBpbXBvcnQgYW5kcm9pZHguYWN0aXZpdHkuQ29tcG9uZW50QWN0aXZpdHkKIGltcG9ydCBhbmRyb2lkeC5saWZlY3ljbGUuTGlmZWN5Y2xlT3duZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnVpLnZpZXdtb2RlbC5NdWx0aVNoYWRlVmlld01vZGVsCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGVvcGxlLnVpLnZpZXdtb2RlbC5QZW9wbGVWaWV3TW9kZWwKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5mb290ZXIudWkudmlld21vZGVsLkZvb3RlckFjdGlvbnNWaWV3TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnRpbWUuU3lzdGVtQ2xvY2sKIAogLyoqCiAgKiBBIGZhY2FkZSB0byBpbnRlcmFjdCB3aXRoIENvbXBvc2UsIHdoZW4gaXQgaXMgYXZhaWxhYmxlLgpAQCAtNTcsNCArNTksMTEgQEAKICAgICAgICAgdmlld01vZGVsOiBGb290ZXJBY3Rpb25zVmlld01vZGVsLAogICAgICAgICBxc1Zpc2liaWxpdHlMaWZlY3ljbGVPd25lcjogTGlmZWN5Y2xlT3duZXIsCiAgICAgKTogVmlldworCisgICAgLyoqIENyZWF0ZSBhIFtWaWV3XSB0byByZXByZXNlbnQgW3ZpZXdNb2RlbF0gb24gc2NyZWVuLiAqLworICAgIGZ1biBjcmVhdGVNdWx0aVNoYWRlVmlldygKKyAgICAgICAgY29udGV4dDogQ29udGV4dCwKKyAgICAgICAgdmlld01vZGVsOiBNdWx0aVNoYWRlVmlld01vZGVsLAorICAgICAgICBjbG9jazogU3lzdGVtQ2xvY2ssCisgICAgKTogVmlldwogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3NldHRpbmdzL0NvbnRyb2xzU2V0dGluZ3NEaWFsb2dNYW5hZ2VyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3NldHRpbmdzL0NvbnRyb2xzU2V0dGluZ3NEaWFsb2dNYW5hZ2VyLmt0CmluZGV4IDA2ZDRhMDguLmNlMGYyZTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy9zZXR0aW5ncy9Db250cm9sc1NldHRpbmdzRGlhbG9nTWFuYWdlci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvc2V0dGluZ3MvQ29udHJvbHNTZXR0aW5nc0RpYWxvZ01hbmFnZXIua3QKQEAgLTE1NSwxNyArMTU1LDE4IEBACiAgICAgICAgIGQuc2hvdygpCiAgICAgfQogCi0gICAgcHJpdmF0ZSBmdW4gdHVybk9uU2V0dGluZ1NlY3VyZWx5KHNldHRpbmdzOiBMaXN0PFN0cmluZz4pIHsKKyAgICBwcml2YXRlIGZ1biB0dXJuT25TZXR0aW5nU2VjdXJlbHkoc2V0dGluZ3M6IExpc3Q8U3RyaW5nPiwgb25Db21wbGV0ZTogKCkgLT4gVW5pdCkgewogICAgICAgICB2YWwgYWN0aW9uID0KICAgICAgICAgICAgIEFjdGl2aXR5U3RhcnRlci5PbkRpc21pc3NBY3Rpb24gewogICAgICAgICAgICAgICAgIHNldHRpbmdzLmZvckVhY2ggeyBzZXR0aW5nIC0+CiAgICAgICAgICAgICAgICAgICAgIHNlY3VyZVNldHRpbmdzLnB1dEludEZvclVzZXIoc2V0dGluZywgMSwgdXNlclRyYWNrZXIudXNlcklkKQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCkKICAgICAgICAgICAgICAgICB0cnVlCiAgICAgICAgICAgICB9CiAgICAgICAgIGFjdGl2aXR5U3RhcnRlci5kaXNtaXNzS2V5Z3VhcmRUaGVuRXhlY3V0ZSgKICAgICAgICAgICAgIGFjdGlvbiwKLSAgICAgICAgICAgIC8qIGNhbmNlbCAqLyBudWxsLAorICAgICAgICAgICAgLyogY2FuY2VsICovIG9uQ29tcGxldGUsCiAgICAgICAgICAgICAvKiBhZnRlcktleWd1YXJkR29uZSAqLyB0cnVlCiAgICAgICAgICkKICAgICB9CkBAIC0xODYsNyArMTg3LDExIEBACiAgICAgICAgICAgICAgICAgaWYgKCFzaG93RGV2aWNlQ29udHJvbHNJbkxvY2tzY3JlZW4pIHsKICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuYWRkKFNldHRpbmdzLlNlY3VyZS5MT0NLU0NSRUVOX1NIT1dfQ09OVFJPTFMpCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHR1cm5PblNldHRpbmdTZWN1cmVseShzZXR0aW5ncykKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgdG9nZ2xpbmcgdGhlIGZsYWcsIHdlIHdhbnQgdG8gY2FsbCBvbkNvbXBsZXRlIGFmdGVyIHRoZSBrZXlndWFyZCBpcworICAgICAgICAgICAgICAgIC8vIGRpc21pc3NlZCAoYW5kIHRoZSBzZXR0aW5nIGlzIHR1cm5lZCBvbiksIHRvIHBhc3MgdGhlIGNvcnJlY3QgdmFsdWUuCisgICAgICAgICAgICAgICAgdHVybk9uU2V0dGluZ1NlY3VyZWx5KHNldHRpbmdzLCBvbkNvbXBsZXRlKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvbkNvbXBsZXRlKCkKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhdHRlbXB0cyAhPSBNQVhfTlVNQkVSX0FUVEVNUFRTX0NPTlRST0xTX0RJQUxPRykgewogICAgICAgICAgICAgICAgIHByZWZzCkBAIC0xOTQsNyArMTk5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgLnB1dEludChQUkVGU19TRVRUSU5HU19ESUFMT0dfQVRURU1QVFMsIE1BWF9OVU1CRVJfQVRURU1QVFNfQ09OVFJPTFNfRElBTE9HKQogICAgICAgICAgICAgICAgICAgICAuYXBwbHkoKQogICAgICAgICAgICAgfQotICAgICAgICAgICAgb25Db21wbGV0ZSgpCiAgICAgICAgIH0KIAogICAgICAgICBvdmVycmlkZSBmdW4gb25DYW5jZWwoZGlhbG9nOiBEaWFsb2dJbnRlcmZhY2U/KSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvQ29udHJvbHNBY3Rpdml0eS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9Db250cm9sc0FjdGl2aXR5Lmt0CmluZGV4IGJmMGE2OTIuLjIyNGViMWMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9Db250cm9sc0FjdGl2aXR5Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9Db250cm9sc0FjdGl2aXR5Lmt0CkBAIC0yMCw2ICsyMCw4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcgoraW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8KK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24KIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZQogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uCiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmRyZWFtcy5JRHJlYW1NYW5hZ2VyCkBAIC01Nyw5ICs1OSwxMSBAQAogICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHBhcmVudDogVmlld0dyb3VwCiAgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgYnJvYWRjYXN0UmVjZWl2ZXI6IEJyb2FkY2FzdFJlY2VpdmVyCiAgICAgcHJpdmF0ZSB2YXIgbUV4aXRUb0RyZWFtOiBCb29sZWFuID0gZmFsc2UKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciBsYXN0Q29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbgogCiAgICAgb3ZlcnJpZGUgZnVuIG9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZTogQnVuZGxlPykgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpCisgICAgICAgIGxhc3RDb25maWd1cmF0aW9uID0gcmVzb3VyY2VzLmNvbmZpZ3VyYXRpb24KICAgICAgICAgaWYgKGZlYXR1cmVGbGFncy5pc0VuYWJsZWQoRmxhZ3MuVVNFX0FQUF9QQU5FTFMpKSB7CiAgICAgICAgICAgICB3aW5kb3cuYWRkUHJpdmF0ZUZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlBSSVZBVEVfRkxBR19UUlVTVEVEX09WRVJMQVkpCiAgICAgICAgIH0KQEAgLTkyLDYgKzk2LDE0IEBACiAgICAgICAgIGluaXRCcm9hZGNhc3RSZWNlaXZlcigpCiAgICAgfQogCisgICAgb3ZlcnJpZGUgZnVuIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnOiBDb25maWd1cmF0aW9uKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKQorICAgICAgICBpZiAobGFzdENvbmZpZ3VyYXRpb24uZGlmZihuZXdDb25maWcpIGFuZCBBY3Rpdml0eUluZm8uQ09ORklHX09SSUVOVEFUSU9OICE9IDAgKSB7CisgICAgICAgICAgICB1aUNvbnRyb2xsZXIub25PcmllbnRhdGlvbkNoYW5nZSgpCisgICAgICAgIH0KKyAgICAgICAgbGFzdENvbmZpZ3VyYXRpb24gPSBuZXdDb25maWcKKyAgICB9CisKICAgICBvdmVycmlkZSBmdW4gb25TdGFydCgpIHsKICAgICAgICAgc3VwZXIub25TdGFydCgpCiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9Db250cm9sc1VpQ29udHJvbGxlci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9Db250cm9sc1VpQ29udHJvbGxlci5rdAppbmRleCAwZDUzMTE3Li4zZWNmNDIzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvQ29udHJvbHNVaUNvbnRyb2xsZXIua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVyLmt0CkBAIC02NCw2ICs2NCw4IEBACiAgICAgICogVGhpcyBlbGVtZW50IHdpbGwgYmUgdGhlIG9uZSB0aGF0IGFwcGVhcnMgd2hlbiB0aGUgdXNlciBmaXJzdCBvcGVucyB0aGUgY29udHJvbHMgYWN0aXZpdHkuCiAgICAgICovCiAgICAgZnVuIGdldFByZWZlcnJlZFNlbGVjdGVkSXRlbShzdHJ1Y3R1cmVzOiBMaXN0PFN0cnVjdHVyZUluZm8+KTogU2VsZWN0ZWRJdGVtCisKKyAgICBmdW4gb25PcmllbnRhdGlvbkNoYW5nZSgpCiB9CiAKIHNlYWxlZCBjbGFzcyBTZWxlY3RlZEl0ZW0gewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVySW1wbC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9Db250cm9sc1VpQ29udHJvbGxlckltcGwua3QKaW5kZXggNWRhODZkZTkuLmVlMTJkYjggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9Db250cm9sc1VpQ29udHJvbGxlckltcGwua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVySW1wbC5rdApAQCAtMTI0LDYgKzEyNCw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2YXIgc2VsZWN0ZWRJdGVtOiBTZWxlY3RlZEl0ZW0gPSBTZWxlY3RlZEl0ZW0uRU1QVFlfU0VMRUNUSU9OCisgICAgcHJpdmF0ZSB2YXIgc2VsZWN0aW9uSXRlbTogU2VsZWN0aW9uSXRlbT8gPSBudWxsCiAgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgYWxsU3RydWN0dXJlczogTGlzdDxTdHJ1Y3R1cmVJbmZvPgogICAgIHByaXZhdGUgdmFsIGNvbnRyb2xzQnlJZCA9IG11dGFibGVNYXBPZjxDb250cm9sS2V5LCBDb250cm9sV2l0aFN0YXRlPigpCiAgICAgcHJpdmF0ZSB2YWwgY29udHJvbFZpZXdzQnlJZCA9IG11dGFibGVNYXBPZjxDb250cm9sS2V5LCBDb250cm9sVmlld0hvbGRlcj4oKQpAQCAtMjMwLDYgKzIzMSw3IEBACiAgICAgICAgIHRoaXMub3ZlcmZsb3dNZW51QWRhcHRlciA9IG51bGwKICAgICAgICAgaGlkZGVuID0gZmFsc2UKICAgICAgICAgcmV0YWluQ2FjaGUgPSBmYWxzZQorICAgICAgICBzZWxlY3Rpb25JdGVtID0gbnVsbAogCiAgICAgICAgIGNvbnRyb2xBY3Rpb25Db29yZGluYXRvci5hY3Rpdml0eUNvbnRleHQgPSBhY3Rpdml0eUNvbnRleHQKIApAQCAtMjcyLDcgKzI3NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGZ1biByZWxvYWQocGFyZW50OiBWaWV3R3JvdXApIHsKKyAgICBwcml2YXRlIGZ1biByZWxvYWQocGFyZW50OiBWaWV3R3JvdXAsIGRpc21pc3NUYXNrVmlldzogQm9vbGVhbiA9IHRydWUpIHsKICAgICAgICAgaWYgKGhpZGRlbikgcmV0dXJuCiAKICAgICAgICAgY29udHJvbHNMaXN0aW5nQ29udHJvbGxlci5nZXQoKS5yZW1vdmVDYWxsYmFjayhsaXN0aW5nQ2FsbGJhY2spCkBAIC0zMjcsOCArMzI5LDggQEAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBpbnRlcm5hbCBmdW4gc3RhcnRSZW1vdmluZ0FwcChjb21wb25lbnROYW1lOiBDb21wb25lbnROYW1lLCBhcHBOYW1lOiBDaGFyU2VxdWVuY2UpIHsKICAgICAgICAgcmVtb3ZlQXBwRGlhbG9nPy5jYW5jZWwoKQotICAgICAgICByZW1vdmVBcHBEaWFsb2cgPSBkaWFsb2dzRmFjdG9yeS5jcmVhdGVSZW1vdmVBcHBEaWFsb2coY29udGV4dCwgYXBwTmFtZSkgewotICAgICAgICAgICAgaWYgKCFjb250cm9sc0NvbnRyb2xsZXIuZ2V0KCkucmVtb3ZlRmF2b3JpdGVzKGNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIHJlbW92ZUFwcERpYWxvZyA9IGRpYWxvZ3NGYWN0b3J5LmNyZWF0ZVJlbW92ZUFwcERpYWxvZyhjb250ZXh0LCBhcHBOYW1lKSB7IHNob3VsZFJlbW92ZSAtPgorICAgICAgICAgICAgaWYgKCFzaG91bGRSZW1vdmUgfHwgIWNvbnRyb2xzQ29udHJvbGxlci5nZXQoKS5yZW1vdmVGYXZvcml0ZXMoY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm5AY3JlYXRlUmVtb3ZlQXBwRGlhbG9nCiAgICAgICAgICAgICB9CiAKQEAgLTQyNSw2ICs0MjcsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTG9nLncoQ29udHJvbHNVaUNvbnRyb2xsZXIuVEFHLCAiTm90IFRhc2tWaWV3RmFjdG9yeSB0byBkaXNwbGF5IHBhbmVsICRzZWxlY3Rpb25JdGVtIikKICAgICAgICAgfQorICAgICAgICB0aGlzLnNlbGVjdGlvbkl0ZW0gPSBzZWxlY3Rpb25JdGVtCiAKICAgICAgICAgYmdFeGVjdXRvci5leGVjdXRlIHsKICAgICAgICAgICAgIHZhbCBpbnRlbnQgPSBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOKQpAQCAtNjU3LDYgKzY2MCw3IEBACiAgICAgICAgIHZhbCBtYXhDb2x1bW5zID0gQ29udHJvbEFkYXB0ZXIuZmluZE1heENvbHVtbnMoYWN0aXZpdHlDb250ZXh0LnJlc291cmNlcykKIAogICAgICAgICB2YWwgbGlzdFZpZXcgPSBwYXJlbnQucmVxdWlyZVZpZXdCeUlkKFIuaWQuZ2xvYmFsX2FjdGlvbnNfY29udHJvbHNfbGlzdCkgYXMgVmlld0dyb3VwCisgICAgICAgIGxpc3RWaWV3LnJlbW92ZUFsbFZpZXdzKCkKICAgICAgICAgdmFyIGxhc3RSb3c6IFZpZXdHcm91cCA9IGNyZWF0ZVJvdyhpbmZsYXRlciwgbGlzdFZpZXcpCiAgICAgICAgIHNlbGVjdGVkU3RydWN0dXJlLmNvbnRyb2xzLmZvckVhY2ggewogICAgICAgICAgICAgdmFsIGtleSA9IENvbnRyb2xLZXkoc2VsZWN0ZWRTdHJ1Y3R1cmUuY29tcG9uZW50TmFtZSwgaXQuY29udHJvbElkKQpAQCAtODA0LDYgKzgwOCwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgb3ZlcnJpZGUgZnVuIG9uT3JpZW50YXRpb25DaGFuZ2UoKSB7CisgICAgICAgIHNlbGVjdGlvbkl0ZW0/LmxldCB7CisgICAgICAgICAgICB3aGVuIChzZWxlY3RlZEl0ZW0pIHsKKyAgICAgICAgICAgICAgICBpcyBTZWxlY3RlZEl0ZW0uU3RydWN0dXJlSXRlbSAtPiBjcmVhdGVMaXN0VmlldyhpdCkKKyAgICAgICAgICAgICAgICBpcyBTZWxlY3RlZEl0ZW0uUGFuZWxJdGVtIC0+IHRhc2tWaWV3Q29udHJvbGxlcj8ucmVmcmVzaEJvdW5kcygpID86IHJlbG9hZChwYXJlbnQpCisgICAgICAgICAgICB9CisgICAgICAgIH0gPzogcmVsb2FkKHBhcmVudCkKKyAgICB9CisKICAgICBwcml2YXRlIGZ1biBjcmVhdGVSb3coaW5mbGF0ZXI6IExheW91dEluZmxhdGVyLCBsaXN0VmlldzogVmlld0dyb3VwKTogVmlld0dyb3VwIHsKICAgICAgICAgdmFsIHJvdyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuY29udHJvbHNfcm93LCBsaXN0VmlldywgZmFsc2UpIGFzIFZpZXdHcm91cAogICAgICAgICBsaXN0Vmlldy5hZGRWaWV3KHJvdykKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9QYW5lbFRhc2tWaWV3Q29udHJvbGxlci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9QYW5lbFRhc2tWaWV3Q29udHJvbGxlci5rdAppbmRleCA3OGU4N2NhLi4xZjg5YzkxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvUGFuZWxUYXNrVmlld0NvbnRyb2xsZXIua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL1BhbmVsVGFza1ZpZXdDb250cm9sbGVyLmt0CkBAIC0zNyw3ICszNyw3IEBACiAgICAgcHJpdmF0ZSB2YWwgYWN0aXZpdHlDb250ZXh0OiBDb250ZXh0LAogICAgIHByaXZhdGUgdmFsIHVpRXhlY3V0b3I6IEV4ZWN1dG9yLAogICAgIHByaXZhdGUgdmFsIHBlbmRpbmdJbnRlbnQ6IFBlbmRpbmdJbnRlbnQsCi0gICAgcHJpdmF0ZSB2YWwgdGFza1ZpZXc6IFRhc2tWaWV3LAorICAgIHZhbCB0YXNrVmlldzogVGFza1ZpZXcsCiAgICAgcHJpdmF0ZSB2YWwgaGlkZTogKCkgLT4gVW5pdCA9IHt9CiApIHsKIApAQCAtMTA4LDYgKzEwOCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICBmdW4gcmVmcmVzaEJvdW5kcygpIHsKKyAgICAgICAgdGFza1ZpZXcub25Mb2NhdGlvbkNoYW5nZWQoKQorICAgIH0KKwogICAgIGZ1biBkaXNtaXNzKCkgewogICAgICAgICB0YXNrVmlldy5yZWxlYXNlKCkKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZGFnZ2VyL0ZyYW1ld29ya1NlcnZpY2VzTW9kdWxlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZGFnZ2VyL0ZyYW1ld29ya1NlcnZpY2VzTW9kdWxlLmphdmEKaW5kZXggYjA1NGM3ZS4uMGJlM2JiNiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RhZ2dlci9GcmFtZXdvcmtTZXJ2aWNlc01vZHVsZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kYWdnZXIvRnJhbWV3b3JrU2VydmljZXNNb2R1bGUuamF2YQpAQCAtOTgsNiArOTgsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LnRleHRjbGFzc2lmaWVyLlRleHRDbGFzc2lmaWNhdGlvbk1hbmFnZXI7CiAKK2ltcG9ydCBhbmRyb2lkeC5hc3luY2xheW91dGluZmxhdGVyLnZpZXcuQXN5bmNMYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkeC5jb3JlLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyQ29tcGF0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklCYXR0ZXJ5U3RhdHM7CkBAIC0zOTUsNiArMzk2LDEzIEBACiAgICAgICAgIHJldHVybiBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpOwogICAgIH0KIAorICAgIC8qKiAqLworICAgIEBQcm92aWRlcworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgQXN5bmNMYXlvdXRJbmZsYXRlciBwcm92aWRlQXN5bmNMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3luY0xheW91dEluZmxhdGVyKGNvbnRleHQpOworICAgIH0KKwogICAgIEBQcm92aWRlcwogICAgIHN0YXRpYyBNZWRpYVByb2plY3Rpb25NYW5hZ2VyIHByb3ZpZGVNZWRpYVByb2plY3Rpb25NYW5hZ2VyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICByZXR1cm4gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKE1lZGlhUHJvamVjdGlvbk1hbmFnZXIuY2xhc3MpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RyZWFtcy9EcmVhbU92ZXJsYXlTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL0RyZWFtT3ZlcmxheVNlcnZpY2UuamF2YQppbmRleCA5Mzc0YWQ5Li40NzFjNDQ1IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL0RyZWFtT3ZlcmxheVNlcnZpY2UuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL0RyZWFtT3ZlcmxheVNlcnZpY2UuamF2YQpAQCAtMTU2LDYgKzE1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudE5hbWUgbG93TGlnaHREcmVhbUNvbXBvbmVudCwKICAgICAgICAgICAgIERyZWFtT3ZlcmxheUNhbGxiYWNrQ29udHJvbGxlciBkcmVhbU92ZXJsYXlDYWxsYmFja0NvbnRyb2xsZXIsCiAgICAgICAgICAgICBATmFtZWQoRFJFQU1fT1ZFUkxBWV9XSU5ET1dfVElUTEUpIFN0cmluZyB3aW5kb3dUaXRsZSkgeworICAgICAgICBzdXBlcihleGVjdXRvcik7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUV4ZWN1dG9yID0gZXhlY3V0b3I7CiAgICAgICAgIG1XaW5kb3dNYW5hZ2VyID0gd2luZG93TWFuYWdlcjsKQEAgLTIwMiw1NSArMjAzLDUwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0RHJlYW0oQE5vbk51bGwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbGF5b3V0UGFyYW1zKSB7Ci0gICAgICAgIG1FeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIHNldEN1cnJlbnRTdGF0ZUxvY2tlZChMaWZlY3ljbGUuU3RhdGUuU1RBUlRFRCk7CisgICAgICAgIHNldEN1cnJlbnRTdGF0ZUxvY2tlZChMaWZlY3ljbGUuU3RhdGUuU1RBUlRFRCk7CiAKLSAgICAgICAgICAgIG1VaUV2ZW50TG9nZ2VyLmxvZyhEcmVhbU92ZXJsYXlFdmVudC5EUkVBTV9PVkVSTEFZX0VOVEVSX1NUQVJUKTsKKyAgICAgICAgbVVpRXZlbnRMb2dnZXIubG9nKERyZWFtT3ZlcmxheUV2ZW50LkRSRUFNX09WRVJMQVlfRU5URVJfU1RBUlQpOwogCi0gICAgICAgICAgICBpZiAobURlc3Ryb3llZCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSB0YXNrIGNvdWxkIHN0aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIGRlc3Ryb3llZC4gQmFpbCBpZgotICAgICAgICAgICAgICAgIC8vIHRoYXQgaXMgdGhlIGNhc2UuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobURlc3Ryb3llZCkgeworICAgICAgICAgICAgLy8gVGhlIHRhc2sgY291bGQgc3RpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHNlcnZpY2UgaGFzIGJlZW4gZGVzdHJveWVkLiBCYWlsIGlmCisgICAgICAgICAgICAvLyB0aGF0IGlzIHRoZSBjYXNlLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBjdXJyZW50IGRyZWFtIG92ZXJsYXkgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IG9uZS4gVGhpcyBjYW4gaGFwcGVuCi0gICAgICAgICAgICAgICAgLy8gd2hlbiB0d28gZHJlYW1zIG92ZXJsYXAgKGJyaWVmbHksIGZvciBhIHNtb290aGVyIGRyZWFtIHRyYW5zaXRpb24pIGFuZCBib3RoCi0gICAgICAgICAgICAgICAgLy8gZHJlYW1zIGFyZSBib3VuZCB0byB0aGUgZHJlYW0gb3ZlcmxheSBzZXJ2aWNlLgotICAgICAgICAgICAgICAgIHJlc2V0Q3VycmVudERyZWFtT3ZlcmxheUxvY2tlZCgpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBjdXJyZW50IGRyZWFtIG92ZXJsYXkgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IG9uZS4gVGhpcyBjYW4gaGFwcGVuCisgICAgICAgICAgICAvLyB3aGVuIHR3byBkcmVhbXMgb3ZlcmxhcCAoYnJpZWZseSwgZm9yIGEgc21vb3RoZXIgZHJlYW0gdHJhbnNpdGlvbikgYW5kIGJvdGgKKyAgICAgICAgICAgIC8vIGRyZWFtcyBhcmUgYm91bmQgdG8gdGhlIGRyZWFtIG92ZXJsYXkgc2VydmljZS4KKyAgICAgICAgICAgIHJlc2V0Q3VycmVudERyZWFtT3ZlcmxheUxvY2tlZCgpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIG1EcmVhbU92ZXJsYXlDb250YWluZXJWaWV3Q29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIG1EcmVhbU92ZXJsYXlDb21wb25lbnQuZ2V0RHJlYW1PdmVybGF5Q29udGFpbmVyVmlld0NvbnRyb2xsZXIoKTsKLSAgICAgICAgICAgIG1EcmVhbU92ZXJsYXlUb3VjaE1vbml0b3IgPSBtRHJlYW1PdmVybGF5Q29tcG9uZW50LmdldERyZWFtT3ZlcmxheVRvdWNoTW9uaXRvcigpOwotICAgICAgICAgICAgbURyZWFtT3ZlcmxheVRvdWNoTW9uaXRvci5pbml0KCk7CisgICAgICAgIG1EcmVhbU92ZXJsYXlDb250YWluZXJWaWV3Q29udHJvbGxlciA9CisgICAgICAgICAgICAgICAgbURyZWFtT3ZlcmxheUNvbXBvbmVudC5nZXREcmVhbU92ZXJsYXlDb250YWluZXJWaWV3Q29udHJvbGxlcigpOworICAgICAgICBtRHJlYW1PdmVybGF5VG91Y2hNb25pdG9yID0gbURyZWFtT3ZlcmxheUNvbXBvbmVudC5nZXREcmVhbU92ZXJsYXlUb3VjaE1vbml0b3IoKTsKKyAgICAgICAgbURyZWFtT3ZlcmxheVRvdWNoTW9uaXRvci5pbml0KCk7CiAKLSAgICAgICAgICAgIG1TdGF0ZUNvbnRyb2xsZXIuc2V0U2hvdWxkU2hvd0NvbXBsaWNhdGlvbnMoc2hvdWxkU2hvd0NvbXBsaWNhdGlvbnMoKSk7CisgICAgICAgIG1TdGF0ZUNvbnRyb2xsZXIuc2V0U2hvdWxkU2hvd0NvbXBsaWNhdGlvbnMoc2hvdWxkU2hvd0NvbXBsaWNhdGlvbnMoKSk7CiAKLSAgICAgICAgICAgIC8vIElmIHdlIGFyZSBub3QgYWJsZSB0byBhZGQgdGhlIG92ZXJsYXkgd2luZG93LCByZXNldCB0aGUgb3ZlcmxheS4KLSAgICAgICAgICAgIGlmICghYWRkT3ZlcmxheVdpbmRvd0xvY2tlZChsYXlvdXRQYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDdXJyZW50RHJlYW1PdmVybGF5TG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGFibGUgdG8gYWRkIHRoZSBvdmVybGF5IHdpbmRvdywgcmVzZXQgdGhlIG92ZXJsYXkuCisgICAgICAgIGlmICghYWRkT3ZlcmxheVdpbmRvd0xvY2tlZChsYXlvdXRQYXJhbXMpKSB7CisgICAgICAgICAgICByZXNldEN1cnJlbnREcmVhbU92ZXJsYXlMb2NrZWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCisgICAgICAgIHNldEN1cnJlbnRTdGF0ZUxvY2tlZChMaWZlY3ljbGUuU3RhdGUuUkVTVU1FRCk7CisgICAgICAgIG1TdGF0ZUNvbnRyb2xsZXIuc2V0T3ZlcmxheUFjdGl2ZSh0cnVlKTsKKyAgICAgICAgZmluYWwgQ29tcG9uZW50TmFtZSBkcmVhbUNvbXBvbmVudCA9IGdldERyZWFtQ29tcG9uZW50KCk7CisgICAgICAgIG1TdGF0ZUNvbnRyb2xsZXIuc2V0TG93TGlnaHRBY3RpdmUoCisgICAgICAgICAgICAgICAgZHJlYW1Db21wb25lbnQgIT0gbnVsbCAmJiBkcmVhbUNvbXBvbmVudC5lcXVhbHMobUxvd0xpZ2h0RHJlYW1Db21wb25lbnQpKTsKKyAgICAgICAgbVVpRXZlbnRMb2dnZXIubG9nKERyZWFtT3ZlcmxheUV2ZW50LkRSRUFNX09WRVJMQVlfQ09NUExFVEVfU1RBUlQpOwogCi0gICAgICAgICAgICBzZXRDdXJyZW50U3RhdGVMb2NrZWQoTGlmZWN5Y2xlLlN0YXRlLlJFU1VNRUQpOwotICAgICAgICAgICAgbVN0YXRlQ29udHJvbGxlci5zZXRPdmVybGF5QWN0aXZlKHRydWUpOwotICAgICAgICAgICAgZmluYWwgQ29tcG9uZW50TmFtZSBkcmVhbUNvbXBvbmVudCA9IGdldERyZWFtQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICBtU3RhdGVDb250cm9sbGVyLnNldExvd0xpZ2h0QWN0aXZlKAotICAgICAgICAgICAgICAgICAgICBkcmVhbUNvbXBvbmVudCAhPSBudWxsICYmIGRyZWFtQ29tcG9uZW50LmVxdWFscyhtTG93TGlnaHREcmVhbUNvbXBvbmVudCkpOwotICAgICAgICAgICAgbVVpRXZlbnRMb2dnZXIubG9nKERyZWFtT3ZlcmxheUV2ZW50LkRSRUFNX09WRVJMQVlfQ09NUExFVEVfU1RBUlQpOwotCi0gICAgICAgICAgICBtRHJlYW1PdmVybGF5Q2FsbGJhY2tDb250cm9sbGVyLm9uU3RhcnREcmVhbSgpOwotICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICB9KTsKKyAgICAgICAgbURyZWFtT3ZlcmxheUNhbGxiYWNrQ29udHJvbGxlci5vblN0YXJ0RHJlYW0oKTsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uRW5kRHJlYW0oKSB7Ci0gICAgICAgIG1FeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIHJlc2V0Q3VycmVudERyZWFtT3ZlcmxheUxvY2tlZCgpOwotICAgICAgICB9KTsKKyAgICAgICAgcmVzZXRDdXJyZW50RHJlYW1PdmVybGF5TG9ja2VkKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBMaWZlY3ljbGUuU3RhdGUgZ2V0Q3VycmVudFN0YXRlTG9ja2VkKCkgewpAQCAtMjYzLDEyICsyNTksMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uV2FrZVVwKEBOb25OdWxsIFJ1bm5hYmxlIG9uQ29tcGxldGVkQ2FsbGJhY2spIHsKLSAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKG1EcmVhbU92ZXJsYXlDb250YWluZXJWaWV3Q29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURyZWFtT3ZlcmxheUNhbGxiYWNrQ29udHJvbGxlci5vbldha2VVcCgpOwotICAgICAgICAgICAgICAgIG1EcmVhbU92ZXJsYXlDb250YWluZXJWaWV3Q29udHJvbGxlci53YWtlVXAob25Db21wbGV0ZWRDYWxsYmFjaywgbUV4ZWN1dG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgIGlmIChtRHJlYW1PdmVybGF5Q29udGFpbmVyVmlld0NvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbURyZWFtT3ZlcmxheUNhbGxiYWNrQ29udHJvbGxlci5vbldha2VVcCgpOworICAgICAgICAgICAgbURyZWFtT3ZlcmxheUNvbnRhaW5lclZpZXdDb250cm9sbGVyLndha2VVcChvbkNvbXBsZXRlZENhbGxiYWNrLCBtRXhlY3V0b3IpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL2NvbXBsaWNhdGlvbi9Db21wbGljYXRpb25UeXBlc1VwZGF0ZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL0NvbXBsaWNhdGlvblR5cGVzVXBkYXRlci5qYXZhCmluZGV4IDI0NDIxMmIuLjE3MDJlYWMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL0NvbXBsaWNhdGlvblR5cGVzVXBkYXRlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL0NvbXBsaWNhdGlvblR5cGVzVXBkYXRlci5qYXZhCkBAIC03NSw2ICs3NSwxMCBAQAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TQ1JFRU5TQVZFUl9DT01QTElDQVRJT05TX0VOQUJMRUQsCiAgICAgICAgICAgICAgICAgc2V0dGluZ3NPYnNlcnZlciwKICAgICAgICAgICAgICAgICBVc2VySGFuZGxlLm15VXNlcklkKCkpOworICAgICAgICBtU2VjdXJlU2V0dGluZ3MucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJGb3JVc2VyKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TQ1JFRU5TQVZFUl9IT01FX0NPTlRST0xTX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgc2V0dGluZ3NPYnNlcnZlciwKKyAgICAgICAgICAgICAgICBVc2VySGFuZGxlLm15VXNlcklkKCkpOwogICAgICAgICBzZXR0aW5nc09ic2VydmVyLm9uQ2hhbmdlKGZhbHNlKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL2RhZ2dlci9SZWdpc3RlcmVkQ29tcGxpY2F0aW9uc01vZHVsZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RyZWFtcy9jb21wbGljYXRpb24vZGFnZ2VyL1JlZ2lzdGVyZWRDb21wbGljYXRpb25zTW9kdWxlLmphdmEKaW5kZXggOWI5NTRmNWYuLjYxNmJkODEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL2RhZ2dlci9SZWdpc3RlcmVkQ29tcGxpY2F0aW9uc01vZHVsZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL2RhZ2dlci9SZWdpc3RlcmVkQ29tcGxpY2F0aW9uc01vZHVsZS5qYXZhCkBAIC0yMyw2ICsyMyw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLlN5c3RlbVVJQmluZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRhZ2dlci5xdWFsaWZpZXJzLk1haW47CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZHJlYW1zLmNvbXBsaWNhdGlvbi5Db21wbGljYXRpb25MYXlvdXRQYXJhbXM7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmVhdHVyZUZsYWdzOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZsYWdzOwogCiBpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOwogCkBAIC00NywxNyArNDksMjcgQEAKICAgICBTdHJpbmcgRFJFQU1fTUVESUFfRU5UUllfTEFZT1VUX1BBUkFNUyA9ICJtZWRpYV9lbnRyeV9sYXlvdXRfcGFyYW1zIjsKIAogICAgIGludCBEUkVBTV9DTE9DS19USU1FX0NPTVBMSUNBVElPTl9XRUlHSFQgPSAxOworICAgIGludCBEUkVBTV9DTE9DS19USU1FX0NPTVBMSUNBVElPTl9XRUlHSFRfTk9fU01BUlRTUEFDRSA9IDI7CiAgICAgaW50IERSRUFNX1NNQVJUU1BBQ0VfQ09NUExJQ0FUSU9OX1dFSUdIVCA9IDI7CiAgICAgaW50IERSRUFNX01FRElBX0NPTVBMSUNBVElPTl9XRUlHSFQgPSAwOwogICAgIGludCBEUkVBTV9IT01FX0NPTlRST0xTX0NISVBfQ09NUExJQ0FUSU9OX1dFSUdIVCA9IDQ7CiAgICAgaW50IERSRUFNX01FRElBX0VOVFJZX0NPTVBMSUNBVElPTl9XRUlHSFQgPSAzOworICAgIGludCBEUkVBTV9XRUFUSEVSX0NPTVBMSUNBVElPTl9XRUlHSFQgPSAwOwogCiAgICAgLyoqCiAgICAgICogUHJvdmlkZXMgbGF5b3V0IHBhcmFtZXRlcnMgZm9yIHRoZSBjbG9jayB0aW1lIGNvbXBsaWNhdGlvbi4KICAgICAgKi8KICAgICBAUHJvdmlkZXMKICAgICBATmFtZWQoRFJFQU1fQ0xPQ0tfVElNRV9DT01QTElDQVRJT05fTEFZT1VUX1BBUkFNUykKLSAgICBzdGF0aWMgQ29tcGxpY2F0aW9uTGF5b3V0UGFyYW1zIHByb3ZpZGVDbG9ja1RpbWVMYXlvdXRQYXJhbXMoKSB7CisgICAgc3RhdGljIENvbXBsaWNhdGlvbkxheW91dFBhcmFtcyBwcm92aWRlQ2xvY2tUaW1lTGF5b3V0UGFyYW1zKEZlYXR1cmVGbGFncyBmZWF0dXJlRmxhZ3MpIHsKKyAgICAgICAgaWYgKGZlYXR1cmVGbGFncy5pc0VuYWJsZWQoRmxhZ3MuSElERV9TTUFSVFNQQUNFX09OX0RSRUFNX09WRVJMQVkpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsaWNhdGlvbkxheW91dFBhcmFtcygwLAorICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgQ29tcGxpY2F0aW9uTGF5b3V0UGFyYW1zLlBPU0lUSU9OX0JPVFRPTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29tcGxpY2F0aW9uTGF5b3V0UGFyYW1zLlBPU0lUSU9OX1NUQVJULAorICAgICAgICAgICAgICAgICAgICBDb21wbGljYXRpb25MYXlvdXRQYXJhbXMuRElSRUNUSU9OX0VORCwKKyAgICAgICAgICAgICAgICAgICAgRFJFQU1fQ0xPQ0tfVElNRV9DT01QTElDQVRJT05fV0VJR0hUX05PX1NNQVJUU1BBQ0UpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBuZXcgQ29tcGxpY2F0aW9uTGF5b3V0UGFyYW1zKDAsCiAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCiAgICAgICAgICAgICAgICAgQ29tcGxpY2F0aW9uTGF5b3V0UGFyYW1zLlBPU0lUSU9OX0JPVFRPTQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RyZWFtcy9zbWFydHNwYWNlL0RyZWFtU21hcnRzcGFjZUNvbnRyb2xsZXIua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlci5rdAppbmRleCA2M2Y2M2E1Li43OGUxMzJmIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlci5rdApAQCAtMzAsMTQgKzMwLDE1IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5CY1NtYXJ0c3BhY2VEYXRhUGx1Z2luCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5CY1NtYXJ0c3BhY2VEYXRhUGx1Z2luLlNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuQmNTbWFydHNwYWNlRGF0YVBsdWdpbi5TbWFydHNwYWNlVmlldworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuQmNTbWFydHNwYWNlRGF0YVBsdWdpbi5VSV9TVVJGQUNFX0RSRUFNCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc21hcnRzcGFjZS5TbWFydHNwYWNlUHJlY29uZGl0aW9uCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc21hcnRzcGFjZS5TbWFydHNwYWNlVGFyZ2V0RmlsdGVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc21hcnRzcGFjZS5kYWdnZXIuU21hcnRzcGFjZU1vZHVsZQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNtYXJ0c3BhY2UuZGFnZ2VyLlNtYXJ0c3BhY2VNb2R1bGUuQ29tcGFuaW9uLkRSRUFNX1NNQVJUU1BBQ0VfREFUQV9QTFVHSU4KIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zbWFydHNwYWNlLmRhZ2dlci5TbWFydHNwYWNlTW9kdWxlLkNvbXBhbmlvbi5EUkVBTV9TTUFSVFNQQUNFX1BSRUNPTkRJVElPTgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNtYXJ0c3BhY2UuZGFnZ2VyLlNtYXJ0c3BhY2VNb2R1bGUuQ29tcGFuaW9uLkRSRUFNX1NNQVJUU1BBQ0VfVEFSR0VUX0ZJTFRFUgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNtYXJ0c3BhY2UuZGFnZ2VyLlNtYXJ0c3BhY2VWaWV3Q29tcG9uZW50CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5jb25jdXJyZW5jeS5FeGVjdXRpb24KLWltcG9ydCBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbgogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yCiBpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdApAQCAtNTYsMTMgKzU3LDE2IEBACiAgICAgQE5hbWVkKERSRUFNX1NNQVJUU1BBQ0VfUFJFQ09ORElUSU9OKSBwcml2YXRlIHZhbCBwcmVjb25kaXRpb246IFNtYXJ0c3BhY2VQcmVjb25kaXRpb24sCiAgICAgQE5hbWVkKERSRUFNX1NNQVJUU1BBQ0VfVEFSR0VUX0ZJTFRFUikKICAgICBwcml2YXRlIHZhbCBvcHRpb25hbFRhcmdldEZpbHRlcjogT3B0aW9uYWw8U21hcnRzcGFjZVRhcmdldEZpbHRlcj4sCi0gICAgQE5hbWVkKERSRUFNX1NNQVJUU1BBQ0VfREFUQV9QTFVHSU4pIG9wdGlvbmFsUGx1Z2luOiBPcHRpb25hbDxCY1NtYXJ0c3BhY2VEYXRhUGx1Z2luPgorICAgIEBOYW1lZChEUkVBTV9TTUFSVFNQQUNFX0RBVEFfUExVR0lOKSBvcHRpb25hbFBsdWdpbjogT3B0aW9uYWw8QmNTbWFydHNwYWNlRGF0YVBsdWdpbj4sCisgICAgQE5hbWVkKFNtYXJ0c3BhY2VNb2R1bGUuV0VBVEhFUl9TTUFSVFNQQUNFX0RBVEFfUExVR0lOKQorICAgIG9wdGlvbmFsV2VhdGhlclBsdWdpbjogT3B0aW9uYWw8QmNTbWFydHNwYWNlRGF0YVBsdWdpbj4sCiApIHsKICAgICBjb21wYW5pb24gb2JqZWN0IHsKICAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgVEFHID0gIkRyZWFtU21hcnRzcGFjZUN0cmxyIgogICAgIH0KIAogICAgIHByaXZhdGUgdmFyIHNlc3Npb246IFNtYXJ0c3BhY2VTZXNzaW9uPyA9IG51bGwKKyAgICBwcml2YXRlIHZhbCB3ZWF0aGVyUGx1Z2luOiBCY1NtYXJ0c3BhY2VEYXRhUGx1Z2luPyA9IG9wdGlvbmFsV2VhdGhlclBsdWdpbi5vckVsc2UobnVsbCkKICAgICBwcml2YXRlIHZhbCBwbHVnaW46IEJjU21hcnRzcGFjZURhdGFQbHVnaW4/ID0gb3B0aW9uYWxQbHVnaW4ub3JFbHNlKG51bGwpCiAgICAgcHJpdmF0ZSB2YXIgdGFyZ2V0RmlsdGVyOiBTbWFydHNwYWNlVGFyZ2V0RmlsdGVyPyA9IG9wdGlvbmFsVGFyZ2V0RmlsdGVyLm9yRWxzZShudWxsKQogCkBAIC0xMTYsMzEgKzEyMCw1NCBAQAogICAgIHByaXZhdGUgdmFsIHNlc3Npb25MaXN0ZW5lciA9IFNtYXJ0c3BhY2VTZXNzaW9uLk9uVGFyZ2V0c0F2YWlsYWJsZUxpc3RlbmVyIHsgdGFyZ2V0cyAtPgogICAgICAgICBleGVjdXRpb24uYXNzZXJ0SXNNYWluVGhyZWFkKCkKIAorICAgICAgICAvLyBUaGUgd2VhdGhlciBkYXRhIHBsdWdpbiB0YWtlcyB1bmZpbHRlcmVkIHRhcmdldHMgYW5kIHBlcmZvcm1zIHRoZSBmaWx0ZXJpbmcgaW50ZXJuYWxseS4KKyAgICAgICAgd2VhdGhlclBsdWdpbj8ub25UYXJnZXRzQXZhaWxhYmxlKHRhcmdldHMpCisKICAgICAgICAgb25UYXJnZXRzQXZhaWxhYmxlVW5maWx0ZXJlZCh0YXJnZXRzKQogICAgICAgICB2YWwgZmlsdGVyZWRUYXJnZXRzID0gdGFyZ2V0cy5maWx0ZXIgeyB0YXJnZXRGaWx0ZXI/LmZpbHRlclNtYXJ0c3BhY2VUYXJnZXQoaXQpID86IHRydWUgfQogICAgICAgICBwbHVnaW4/Lm9uVGFyZ2V0c0F2YWlsYWJsZShmaWx0ZXJlZFRhcmdldHMpCiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ29uc3RydWN0cyB0aGUgd2VhdGhlciB2aWV3IHdpdGggY3VzdG9tIGxheW91dCBhbmQgY29ubmVjdHMgaXQgdG8gdGhlIHdlYXRoZXIgcGx1Z2luLgorICAgICAqLworICAgIGZ1biBidWlsZEFuZENvbm5lY3RXZWF0aGVyVmlldyhwYXJlbnQ6IFZpZXdHcm91cCwgY3VzdG9tVmlldzogVmlldz8pOiBWaWV3PyB7CisgICAgICAgIHJldHVybiBidWlsZEFuZENvbm5lY3RWaWV3V2l0aFBsdWdpbihwYXJlbnQsIHdlYXRoZXJQbHVnaW4sIGN1c3RvbVZpZXcpCisgICAgfQorCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyB0aGUgc21hcnRzcGFjZSB2aWV3IGFuZCBjb25uZWN0cyBpdCB0byB0aGUgc21hcnRzcGFjZSBzZXJ2aWNlLgogICAgICAqLwogICAgIGZ1biBidWlsZEFuZENvbm5lY3RWaWV3KHBhcmVudDogVmlld0dyb3VwKTogVmlldz8geworICAgICAgICByZXR1cm4gYnVpbGRBbmRDb25uZWN0Vmlld1dpdGhQbHVnaW4ocGFyZW50LCBwbHVnaW4sIG51bGwpCisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gYnVpbGRBbmRDb25uZWN0Vmlld1dpdGhQbHVnaW4oCisgICAgICAgIHBhcmVudDogVmlld0dyb3VwLAorICAgICAgICBzbWFydHNwYWNlRGF0YVBsdWdpbjogQmNTbWFydHNwYWNlRGF0YVBsdWdpbj8sCisgICAgICAgIGN1c3RvbVZpZXc6IFZpZXc/CisgICAgKTogVmlldz8gewogICAgICAgICBleGVjdXRpb24uYXNzZXJ0SXNNYWluVGhyZWFkKCkKIAogICAgICAgICBpZiAoIXByZWNvbmRpdGlvbi5jb25kaXRpb25zTWV0KCkpIHsKICAgICAgICAgICAgIHRocm93IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBidWlsZCB2aWV3IHdoZW4gbm90IGVuYWJsZWQiKQogICAgICAgICB9CiAKLSAgICAgICAgdmFsIHZpZXcgPSBidWlsZFZpZXcocGFyZW50KQorICAgICAgICB2YWwgdmlldyA9IGJ1aWxkVmlldyhwYXJlbnQsIHNtYXJ0c3BhY2VEYXRhUGx1Z2luLCBjdXN0b21WaWV3KQogCiAgICAgICAgIGNvbm5lY3RTZXNzaW9uKCkKIAogICAgICAgICByZXR1cm4gdmlldwogICAgIH0KIAotICAgIHByaXZhdGUgZnVuIGJ1aWxkVmlldyhwYXJlbnQ6IFZpZXdHcm91cCk6IFZpZXc/IHsKLSAgICAgICAgcmV0dXJuIGlmIChwbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgdmFyIHZpZXcgPSBzbWFydHNwYWNlVmlld0NvbXBvbmVudEZhY3RvcnkuY3JlYXRlKHBhcmVudCwgcGx1Z2luLCBzdGF0ZUNoYW5nZUxpc3RlbmVyKQorICAgIHByaXZhdGUgZnVuIGJ1aWxkVmlldygKKyAgICAgICAgcGFyZW50OiBWaWV3R3JvdXAsCisgICAgICAgIHNtYXJ0c3BhY2VEYXRhUGx1Z2luOiBCY1NtYXJ0c3BhY2VEYXRhUGx1Z2luPywKKyAgICAgICAgY3VzdG9tVmlldzogVmlldz8KKyAgICApOiBWaWV3PyB7CisgICAgICAgIHJldHVybiBpZiAoc21hcnRzcGFjZURhdGFQbHVnaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgdmFsIHZpZXcgPSBzbWFydHNwYWNlVmlld0NvbXBvbmVudEZhY3RvcnkuY3JlYXRlKHBhcmVudCwgc21hcnRzcGFjZURhdGFQbHVnaW4sCisgICAgICAgICAgICAgICAgc3RhdGVDaGFuZ2VMaXN0ZW5lciwgY3VzdG9tVmlldykKICAgICAgICAgICAgICAgICAuZ2V0VmlldygpCiAgICAgICAgICAgICBpZiAodmlldyAhaXMgVmlldykgewogICAgICAgICAgICAgICAgIHJldHVybiBudWxsCkBAIC0xNTcsNyArMTg0LDEwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmdW4gY29ubmVjdFNlc3Npb24oKSB7Ci0gICAgICAgIGlmIChwbHVnaW4gPT0gbnVsbCB8fCBzZXNzaW9uICE9IG51bGwgfHwgIWhhc0FjdGl2ZVNlc3Npb25MaXN0ZW5lcnMoKSkgeworICAgICAgICBpZiAocGx1Z2luID09IG51bGwgJiYgd2VhdGhlclBsdWdpbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsIHx8ICFoYXNBY3RpdmVTZXNzaW9uTGlzdGVuZXJzKCkpIHsKICAgICAgICAgICAgIHJldHVybgogICAgICAgICB9CiAKQEAgLTE2NiwxMyArMTk2LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICB2YWwgbmV3U2Vzc2lvbiA9IHNtYXJ0c3BhY2VNYW5hZ2VyLmNyZWF0ZVNtYXJ0c3BhY2VTZXNzaW9uKAotICAgICAgICAgICAgU21hcnRzcGFjZUNvbmZpZy5CdWlsZGVyKGNvbnRleHQsICJkcmVhbSIpLmJ1aWxkKCkKKyAgICAgICAgICAgIFNtYXJ0c3BhY2VDb25maWcuQnVpbGRlcihjb250ZXh0LCBVSV9TVVJGQUNFX0RSRUFNKS5idWlsZCgpCiAgICAgICAgICkKICAgICAgICAgTG9nLmQoVEFHLCAiU3RhcnRpbmcgc21hcnRzcGFjZSBzZXNzaW9uIGZvciBkcmVhbSIpCiAgICAgICAgIG5ld1Nlc3Npb24uYWRkT25UYXJnZXRzQXZhaWxhYmxlTGlzdGVuZXIodWlFeGVjdXRvciwgc2Vzc2lvbkxpc3RlbmVyKQogICAgICAgICB0aGlzLnNlc3Npb24gPSBuZXdTZXNzaW9uCiAKLSAgICAgICAgcGx1Z2luLnJlZ2lzdGVyU21hcnRzcGFjZUV2ZW50Tm90aWZpZXIgeworICAgICAgICB3ZWF0aGVyUGx1Z2luPy5yZWdpc3RlclNtYXJ0c3BhY2VFdmVudE5vdGlmaWVyIHsgZSAtPiBzZXNzaW9uPy5ub3RpZnlTbWFydHNwYWNlRXZlbnQoZSkgfQorICAgICAgICBwbHVnaW4/LnJlZ2lzdGVyU21hcnRzcGFjZUV2ZW50Tm90aWZpZXIgewogICAgICAgICAgICAgICAgIGUgLT4KICAgICAgICAgICAgIHNlc3Npb24/Lm5vdGlmeVNtYXJ0c3BhY2VFdmVudChlKQogICAgICAgICB9CkBAIC0xOTksMjIgKzIzMCw0NyBAQAogCiAgICAgICAgIHNlc3Npb24gPSBudWxsCiAKKyAgICAgICAgd2VhdGhlclBsdWdpbj8ucmVnaXN0ZXJTbWFydHNwYWNlRXZlbnROb3RpZmllcihudWxsKQorICAgICAgICB3ZWF0aGVyUGx1Z2luPy5vblRhcmdldHNBdmFpbGFibGUoZW1wdHlMaXN0KCkpCisKICAgICAgICAgcGx1Z2luPy5yZWdpc3RlclNtYXJ0c3BhY2VFdmVudE5vdGlmaWVyKG51bGwpCiAgICAgICAgIHBsdWdpbj8ub25UYXJnZXRzQXZhaWxhYmxlKGVtcHR5TGlzdCgpKQogICAgICAgICBMb2cuZChUQUcsICJFbmRpbmcgc21hcnRzcGFjZSBzZXNzaW9uIGZvciBkcmVhbSIpCiAgICAgfQogCiAgICAgZnVuIGFkZExpc3RlbmVyKGxpc3RlbmVyOiBTbWFydHNwYWNlVGFyZ2V0TGlzdGVuZXIpIHsKKyAgICAgICAgYWRkQW5kUmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lciwgcGx1Z2luKQorICAgIH0KKworICAgIGZ1biByZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcjogU21hcnRzcGFjZVRhcmdldExpc3RlbmVyKSB7CisgICAgICAgIHJlbW92ZUFuZFVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lciwgcGx1Z2luKQorICAgIH0KKworICAgIGZ1biBhZGRMaXN0ZW5lckZvcldlYXRoZXJQbHVnaW4obGlzdGVuZXI6IFNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lcikgeworICAgICAgICBhZGRBbmRSZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyLCB3ZWF0aGVyUGx1Z2luKQorICAgIH0KKworICAgIGZ1biByZW1vdmVMaXN0ZW5lckZvcldlYXRoZXJQbHVnaW4obGlzdGVuZXI6IFNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lcikgeworICAgICAgICByZW1vdmVBbmRVbnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIsIHdlYXRoZXJQbHVnaW4pCisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gYWRkQW5kUmVnaXN0ZXJMaXN0ZW5lcigKKyAgICAgICAgbGlzdGVuZXI6IFNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lciwKKyAgICAgICAgc21hcnRzcGFjZURhdGFQbHVnaW46IEJjU21hcnRzcGFjZURhdGFQbHVnaW4/CisgICAgKSB7CiAgICAgICAgIGV4ZWN1dGlvbi5hc3NlcnRJc01haW5UaHJlYWQoKQotICAgICAgICBwbHVnaW4/LnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpCisgICAgICAgIHNtYXJ0c3BhY2VEYXRhUGx1Z2luPy5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKQogICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKQogCiAgICAgICAgIGNvbm5lY3RTZXNzaW9uKCkKICAgICB9CiAKLSAgICBmdW4gcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXI6IFNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lcikgeworICAgIHByaXZhdGUgZnVuIHJlbW92ZUFuZFVucmVnaXN0ZXJMaXN0ZW5lcigKKyAgICAgICAgbGlzdGVuZXI6IFNtYXJ0c3BhY2VUYXJnZXRMaXN0ZW5lciwKKyAgICAgICAgc21hcnRzcGFjZURhdGFQbHVnaW46IEJjU21hcnRzcGFjZURhdGFQbHVnaW4/CisgICAgKSB7CiAgICAgICAgIGV4ZWN1dGlvbi5hc3NlcnRJc01haW5UaHJlYWQoKQotICAgICAgICBwbHVnaW4/LnVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcikKKyAgICAgICAgc21hcnRzcGFjZURhdGFQbHVnaW4/LnVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcikKICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcikKICAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZlYXR1cmVGbGFnc0RlYnVnLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzRGVidWcuamF2YQppbmRleCA1YzMxMGMzLi4yYzExZDc4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzRGVidWcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzRGVidWcuamF2YQpAQCAtODYsOSArODYsMzQgQEAKICAgICBwcml2YXRlIGZpbmFsIFNlcnZlckZsYWdSZWFkZXIuQ2hhbmdlTGlzdGVuZXIgbU9uUHJvcGVydGllc0NoYW5nZWQgPQogICAgICAgICAgICAgbmV3IFNlcnZlckZsYWdSZWFkZXIuQ2hhbmdlTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoRmxhZzw/PiBmbGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXN0YXJ0ZXIucmVzdGFydFN5c3RlbVVJKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgZmxhZyBjaGFuZ2U6ICIgKyBmbGFnLmdldE5hbWVzcGFjZSgpICsgIi4iICsgZmxhZy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKEZsYWc8Pz4gZmxhZywgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkUmVzdGFydCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAobUJvb2xlYW5GbGFnQ2FjaGUuY29udGFpbnNLZXkoZmxhZy5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Cb29sZWFuRmxhZ0NhY2hlLmdldChmbGFnLmdldE5hbWUoKSkgIT0gbmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RyaW5nRmxhZ0NhY2hlLmNvbnRhaW5zS2V5KGZsYWcuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0cmluZ0ZsYWdDYWNoZS5nZXQoZmxhZy5nZXROYW1lKCkpICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUludEZsYWdDYWNoZS5jb250YWluc0tleShmbGFnLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdWYWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IDAgOiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUludEZsYWdDYWNoZS5nZXQoZmxhZy5nZXROYW1lKCkpICE9IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFJlc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXN0YXJ0ZXIucmVzdGFydFN5c3RlbVVJKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIGZsYWcgY2hhbmdlOiAiICsgZmxhZy5nZXROYW1lc3BhY2UoKSArICIuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmxhZy5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OwogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzUmVsZWFzZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZlYXR1cmVGbGFnc1JlbGVhc2UuamF2YQppbmRleCA5ODU5ZmY2Li45ZDE5YTdkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzUmVsZWFzZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GZWF0dXJlRmxhZ3NSZWxlYXNlLmphdmEKQEAgLTUzLDEzICs1MywzOCBAQAogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRmxhZzw/Pj4gbUFsbEZsYWdzOwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQm9vbGVhbj4gbUJvb2xlYW5DYWNoZSA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbVN0cmluZ0NhY2hlID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gbUludENhY2hlID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBTZXJ2ZXJGbGFnUmVhZGVyLkNoYW5nZUxpc3RlbmVyIG1PblByb3BlcnRpZXNDaGFuZ2VkID0KICAgICAgICAgICAgIG5ldyBTZXJ2ZXJGbGFnUmVhZGVyLkNoYW5nZUxpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKEZsYWc8Pz4gZmxhZykgewotICAgICAgICAgICAgICAgICAgICBtUmVzdGFydGVyLnJlc3RhcnRTeXN0ZW1VSSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIGZsYWcgY2hhbmdlOiAiICsgZmxhZy5nZXROYW1lc3BhY2UoKSArICIuIiArIGZsYWcuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShGbGFnPD8+IGZsYWcsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNob3VsZFJlc3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Cb29sZWFuQ2FjaGUuY29udGFpbnNLZXkoZmxhZy5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Cb29sZWFuQ2FjaGUuZ2V0KGZsYWcuZ2V0TmFtZSgpKSAhPSBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdHJpbmdDYWNoZS5jb250YWluc0tleShmbGFnLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdHJpbmdDYWNoZS5nZXQoZmxhZy5nZXROYW1lKCkpICE9IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUludENhY2hlLmNvbnRhaW5zS2V5KGZsYWcuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld1ZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gMCA6IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW50Q2FjaGUuZ2V0KGZsYWcuZ2V0TmFtZSgpKSAhPSBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRSZXN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmVzdGFydGVyLnJlc3RhcnRTeXN0ZW1VSSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBmbGFnIGNoYW5nZTogIiArIGZsYWcuZ2V0TmFtZXNwYWNlKCkgKyAiLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZsYWcuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CiAKQEAgLTk3LDY4ICsxMjIsOTcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChATm90TnVsbCBSZWxlYXNlZEZsYWcgZmxhZykgewotICAgICAgICByZXR1cm4gbVNlcnZlckZsYWdSZWFkZXIucmVhZFNlcnZlck92ZXJyaWRlKGZsYWcuZ2V0TmFtZXNwYWNlKCksIGZsYWcuZ2V0TmFtZSgpLCB0cnVlKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBpc0VuYWJsZWRJbnRlcm5hbChmbGFnLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBtU2VydmVyRmxhZ1JlYWRlci5yZWFkU2VydmVyT3ZlcnJpZGUoZmxhZy5nZXROYW1lc3BhY2UoKSwgZmxhZy5nZXROYW1lKCksIHRydWUpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoUmVzb3VyY2VCb29sZWFuRmxhZyBmbGFnKSB7Ci0gICAgICAgIGlmICghbUJvb2xlYW5DYWNoZS5jb250YWluc0tleShmbGFnLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0VuYWJsZWQoZmxhZy5nZXROYW1lKCksIG1SZXNvdXJjZXMuZ2V0Qm9vbGVhbihmbGFnLmdldFJlc291cmNlSWQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1Cb29sZWFuQ2FjaGUuZ2V0KGZsYWcuZ2V0TmFtZSgpKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBpc0VuYWJsZWRJbnRlcm5hbChmbGFnLmdldE5hbWUoKSwgbVJlc291cmNlcy5nZXRCb29sZWFuKGZsYWcuZ2V0UmVzb3VyY2VJZCgpKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKFN5c1Byb3BCb29sZWFuRmxhZyBmbGFnKSB7Ci0gICAgICAgIGlmICghbUJvb2xlYW5DYWNoZS5jb250YWluc0tleShmbGFnLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0VuYWJsZWQoCi0gICAgICAgICAgICAgICAgICAgIGZsYWcuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKGZsYWcuZ2V0TmFtZSgpLCBmbGFnLmdldERlZmF1bHQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1Cb29sZWFuQ2FjaGUuZ2V0KGZsYWcuZ2V0TmFtZSgpKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBpc0VuYWJsZWRJbnRlcm5hbCgKKyAgICAgICAgICAgICAgICBmbGFnLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBtU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKGZsYWcuZ2V0TmFtZSgpLCBmbGFnLmdldERlZmF1bHQoKSkpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIG1Cb29sZWFuQ2FjaGUucHV0KG5hbWUsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgLyoqCisgICAgICogQ2hlY2tzIGFuZCBmaWxscyB0aGUgYm9vbGVhbiBjYWNoZS4gVGhpcyBpcyBpbXBvcnRhbnQsIEFsd2F5cyBjYWxsIHRocm91Z2ggdG8gdGhpcyBtZXRob2QhCisgICAgICoKKyAgICAgKiBXZSB1c2UgdGhlIGNhY2hlIGFzIGEgd2F5IHRvIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHByb2Nlc3Mgd2hlbiBzZXJ2ZXItc2lkZQorICAgICAqIGNoYW5nZXMgb2NjdXIuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZEludGVybmFsKFN0cmluZyBuYW1lLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICAvLyBGaWxsIHRoZSBjYWNoZS4KKyAgICAgICAgaWYgKCFtQm9vbGVhbkNhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICAgICAgICBtQm9vbGVhbkNhY2hlLnB1dChuYW1lLCBkZWZhdWx0VmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1Cb29sZWFuQ2FjaGUuZ2V0KG5hbWUpOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoQE5vbk51bGwgU3RyaW5nRmxhZyBmbGFnKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoZmxhZy5nZXROYW1lKCksIGZsYWcuZ2V0RGVmYXVsdCgpKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBnZXRTdHJpbmdJbnRlcm5hbChmbGFnLmdldE5hbWUoKSwgZmxhZy5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoQE5vbk51bGwgUmVzb3VyY2VTdHJpbmdGbGFnIGZsYWcpIHsKLSAgICAgICAgaWYgKCFtU3RyaW5nQ2FjaGUuY29udGFpbnNLZXkoZmxhZy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKGZsYWcuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICByZXF1aXJlTm9uTnVsbChtUmVzb3VyY2VzLmdldFN0cmluZyhmbGFnLmdldFJlc291cmNlSWQoKSkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtU3RyaW5nQ2FjaGUuZ2V0KGZsYWcuZ2V0TmFtZSgpKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBnZXRTdHJpbmdJbnRlcm5hbChmbGFnLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICByZXF1aXJlTm9uTnVsbChtUmVzb3VyY2VzLmdldFN0cmluZyhmbGFnLmdldFJlc291cmNlSWQoKSkpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgbVN0cmluZ0NhY2hlLnB1dChuYW1lLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIC8qKgorICAgICAqIENoZWNrcyBhbmQgZmlsbHMgdGhlIFN0cmluZyBjYWNoZS4gVGhpcyBpcyBpbXBvcnRhbnQsIEFsd2F5cyBjYWxsIHRocm91Z2ggdG8gdGhpcyBtZXRob2QhCisgICAgICoKKyAgICAgKiBXZSB1c2UgdGhlIGNhY2hlIGFzIGEgd2F5IHRvIGRlY2lkZSBpZiB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHByb2Nlc3Mgd2hlbiBzZXJ2ZXItc2lkZQorICAgICAqIGNoYW5nZXMgb2NjdXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nSW50ZXJuYWwoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgaWYgKCFtU3RyaW5nQ2FjaGUuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgIG1TdHJpbmdDYWNoZS5wdXQobmFtZSwgZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtU3RyaW5nQ2FjaGUuZ2V0KG5hbWUpOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRJbnQoQE5vbk51bGwgSW50RmxhZyBmbGFnKSB7Ci0gICAgICAgIHJldHVybiBmbGFnLmdldERlZmF1bHQoKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCisgICAgICAgIHJldHVybiBnZXRJbnRJbnRlcm5hbChmbGFnLmdldE5hbWUoKSwgZmxhZy5nZXREZWZhdWx0KCkpOwogICAgIH0KIAogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRJbnQoQE5vbk51bGwgUmVzb3VyY2VJbnRGbGFnIGZsYWcpIHsKKyAgICAgICAgLy8gRmlsbCB0aGUgY2FjaGUuCiAgICAgICAgIHJldHVybiBtUmVzb3VyY2VzLmdldEludGVnZXIoZmxhZy5nZXRSZXNvdXJjZUlkKCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENoZWNrcyBhbmQgZmlsbHMgdGhlIGludGVnZXIgY2FjaGUuIFRoaXMgaXMgaW1wb3J0YW50LCBBbHdheXMgY2FsbCB0aHJvdWdoIHRvIHRoaXMgbWV0aG9kIQorICAgICAqCisgICAgICogV2UgdXNlIHRoZSBjYWNoZSBhcyBhIHdheSB0byBkZWNpZGUgaWYgd2UgbmVlZCB0byByZXN0YXJ0IHRoZSBwcm9jZXNzIHdoZW4gc2VydmVyLXNpZGUKKyAgICAgKiBjaGFuZ2VzIG9jY3VyLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldEludEludGVybmFsKFN0cmluZyBuYW1lLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIGlmICghbUludENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICAgICAgICBtSW50Q2FjaGUucHV0KG5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUludENhY2hlLmdldChuYW1lKTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkdW1wKEBOb25OdWxsIFByaW50V3JpdGVyIHB3LCBATm9uTnVsbCBTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIHB3LnByaW50bG4oImNhbiBvdmVycmlkZTogZmFsc2UiKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GbGFncy5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GbGFncy5rdAppbmRleCAyNjVhOTkwMy4uYTgwZDI4ZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZsYWdzLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GbGFncy5rdApAQCAtMTYyLDEyICsxNjIsNiBAQAogICAgIHZhbCBDVVNUT01JWkFCTEVfTE9DS19TQ1JFRU5fUVVJQ0tfQUZGT1JEQU5DRVMgPQogICAgICAgICByZWxlYXNlZEZsYWcoMjE2LCAiY3VzdG9taXphYmxlX2xvY2tfc2NyZWVuX3F1aWNrX2FmZm9yZGFuY2VzIikKIAotICAgIC8qKiBTaG93cyBjaGlwYmFyIFVJIHdoZW5ldmVyIHRoZSBkZXZpY2UgaXMgdW5sb2NrZWQgYnkgQWN0aXZlVW5sb2NrICh3YXRjaCkuICovCi0gICAgLy8gVE9ETyhiLzI1NjUxMzYwOSk6IFRyYWNraW5nIEJ1ZwotICAgIEBKdm1GaWVsZAotICAgIHZhbCBBQ1RJVkVfVU5MT0NLX0NISVBCQVIgPQotICAgICAgICByZXNvdXJjZUJvb2xlYW5GbGFnKDIxNywgUi5ib29sLmZsYWdfYWN0aXZlX3VubG9ja19jaGlwYmFyLCAiYWN0aXZlX3VubG9ja19jaGlwYmFyIikKLQogICAgIC8qKgogICAgICAqIE1pZ3JhdGVzIGNvbnRyb2wgb2YgdGhlIExpZ2h0UmV2ZWFsU2NyaW0ncyByZXZlYWwgZWZmZWN0IGFuZCBhbW91bnQgZnJvbSBsZWdhY3kgY29kZSB0byB0aGUKICAgICAgKiBuZXcgS2V5Z3VhcmRUcmFuc2l0aW9uUmVwb3NpdG9yeS4KQEAgLTI0Miw3ICsyMzYsMjEgQEAKIAogICAgIC8vIFRPRE8oYi8yNzAyMjMzNTIpOiBUcmFja2luZyBCdWcKICAgICBASnZtRmllbGQKLSAgICB2YWwgSElERV9TTUFSVFNQQUNFX09OX0RSRUFNX09WRVJMQVkgPSB1bnJlbGVhc2VkRmxhZyg0MDQsICJoaWRlX3NtYXJ0c3BhY2Vfb25fZHJlYW1fb3ZlcmxheSIpCisgICAgdmFsIEhJREVfU01BUlRTUEFDRV9PTl9EUkVBTV9PVkVSTEFZID0KKyAgICAgICAgdW5yZWxlYXNlZEZsYWcoCisgICAgICAgICAgICA0MDQsCisgICAgICAgICAgICAiaGlkZV9zbWFydHNwYWNlX29uX2RyZWFtX292ZXJsYXkiLAorICAgICAgICAgICAgdGVhbWZvb2QgPSB0cnVlCisgICAgKQorCisgICAgLy8gVE9ETyhiLzI3MTQ2MDk1OCk6IFRyYWNraW5nIEJ1ZworICAgIEBKdm1GaWVsZAorICAgIHZhbCBTSE9XX1dFQVRIRVJfQ09NUExJQ0FUSU9OX09OX0RSRUFNX09WRVJMQVkgPQorICAgICAgICB1bnJlbGVhc2VkRmxhZygKKyAgICAgICAgICAgIDQwNSwKKyAgICAgICAgICAgICJzaG93X3dlYXRoZXJfY29tcGxpY2F0aW9uX29uX2RyZWFtX292ZXJsYXkiLAorICAgICAgICAgICAgdGVhbWZvb2QgPSB0cnVlCisgICAgICAgICkKIAogICAgIC8vIDUwMCAtIHF1aWNrIHNldHRpbmdzCiAKQEAgLTI3OSw4ICsyODcsNyBAQAogICAgIC8qKiBFbmFibGVzIG5ldyBRUyBFZGl0IE1vZGUgdmlzdWFsIHJlZnJlc2ggKi8KICAgICAvLyBUT0RPKGIvMjY5Nzg3NzQyKTogVHJhY2tpbmcgQnVnCiAgICAgQEp2bUZpZWxkCi0gICAgdmFsIEVOQUJMRV9ORVdfUVNfRURJVF9NT0RFID0KLSAgICAgICAgdW5yZWxlYXNlZEZsYWcoNTEwLCAiZW5hYmxlX25ld19xc19lZGl0X21vZGUiLCB0ZWFtZm9vZCA9IGZhbHNlKQorICAgIHZhbCBFTkFCTEVfTkVXX1FTX0VESVRfTU9ERSA9IHVucmVsZWFzZWRGbGFnKDUxMCwgImVuYWJsZV9uZXdfcXNfZWRpdF9tb2RlIiwgdGVhbWZvb2QgPSBmYWxzZSkKIAogICAgIC8vIDYwMC0gc3RhdHVzIGJhcgogCkBAIC0zMDgsNyArMzE1LDggQEAKICAgICAgICAgdW5yZWxlYXNlZEZsYWcoNjExLCAibmV3X3N0YXR1c19iYXJfaWNvbnNfZGVidWdfY29sb3JpbmciKQogCiAgICAgLy8gVE9ETyhiLzI2NTg5MjM0NSk6IFRyYWNraW5nIEJ1ZwotICAgIHZhbCBQTFVHX0lOX1NUQVRVU19CQVJfQ0hJUCA9IHVucmVsZWFzZWRGbGFnKDI2NTg5MjM0NSwgInBsdWdfaW5fc3RhdHVzX2Jhcl9jaGlwIikKKyAgICB2YWwgUExVR19JTl9TVEFUVVNfQkFSX0NISVAgPQorICAgICAgICAgICAgdW5yZWxlYXNlZEZsYWcoMjY1ODkyMzQ1LCAicGx1Z19pbl9zdGF0dXNfYmFyX2NoaXAiLCB0ZWFtZm9vZCA9IHRydWUpCiAKICAgICAvLyA3MDAgLSBkaWFsZXIvY2FsbHMKICAgICAvLyBUT0RPKGIvMjU0NTEyNzM0KTogVHJhY2tpbmcgQnVnCkBAIC01OTAsOCArNTk4LDcgQEAKICAgICAvLyAxNzAwIC0gY2xpcGJvYXJkCiAgICAgQEp2bUZpZWxkIHZhbCBDTElQQk9BUkRfUkVNT1RFX0JFSEFWSU9SID0gcmVsZWFzZWRGbGFnKDE3MDEsICJjbGlwYm9hcmRfcmVtb3RlX2JlaGF2aW9yIikKICAgICAvLyBUT0RPKGIvMjY3MTYyOTQ0KTogVHJhY2tpbmcgYnVnCi0gICAgQEp2bUZpZWxkCi0gICAgdmFsIENMSVBCT0FSRF9NSU5JTUlaRURfTEFZT1VUID0gdW5yZWxlYXNlZEZsYWcoMTcwMiwgImNsaXBib2FyZF9kYXRhX21vZGVsIiwgdGVhbWZvb2QgPSB0cnVlKQorICAgIEBKdm1GaWVsZCB2YWwgQ0xJUEJPQVJEX01JTklNSVpFRF9MQVlPVVQgPSByZWxlYXNlZEZsYWcoMTcwMiwgImNsaXBib2FyZF9kYXRhX21vZGVsIikKIAogICAgIC8vIDE4MDAgLSBzaGFkZSBjb250YWluZXIKICAgICBASnZtRmllbGQKQEAgLTY2MywxNSArNjcwLDIwIEBACiAKICAgICAvLyAyNjAwIC0ga2V5Ym9hcmQKICAgICAvLyBUT0RPKGIvMjU5MzUyNTc5KTogVHJhY2tpbmcgQnVnCi0gICAgQEp2bUZpZWxkIHZhbCBTSE9SVENVVF9MSVNUX1NFQVJDSF9MQVlPVVQgPQotICAgICAgICAgICAgdW5yZWxlYXNlZEZsYWcoMjYwMCwgInNob3J0Y3V0X2xpc3Rfc2VhcmNoX2xheW91dCIsIHRlYW1mb29kID0gdHJ1ZSkKKyAgICBASnZtRmllbGQgdmFsIFNIT1JUQ1VUX0xJU1RfU0VBUkNIX0xBWU9VVCA9IHJlbGVhc2VkRmxhZygyNjAwLCAic2hvcnRjdXRfbGlzdF9zZWFyY2hfbGF5b3V0IikKIAogICAgIC8vIFRPRE8oYi8yNTk0Mjg2NzgpOiBUcmFja2luZyBCdWcKICAgICBASnZtRmllbGQKLSAgICB2YWwgS0VZQk9BUkRfQkFDS0xJR0hUX0lORElDQVRPUiA9IHVucmVsZWFzZWRGbGFnKDI2MDEsICJrZXlib2FyZF9iYWNrbGlnaHRfaW5kaWNhdG9yIikKKyAgICB2YWwgS0VZQk9BUkRfQkFDS0xJR0hUX0lORElDQVRPUiA9CisgICAgICAgICAgICB1bnJlbGVhc2VkRmxhZygyNjAxLCAia2V5Ym9hcmRfYmFja2xpZ2h0X2luZGljYXRvciIsIHRlYW1mb29kID0gdHJ1ZSkKIAogICAgIC8vIFRPRE8oYi8yNzIwMzYyOTIpOiBUcmFja2luZyBCdWcKICAgICBASnZtRmllbGQKICAgICB2YWwgTEFSR0VfU0hBREVfR1JBTlVMQVJfQUxQSEFfSU5URVJQT0xBVElPTiA9CiAgICAgICAgICAgICB1bnJlbGVhc2VkRmxhZygyNjAyLCAibGFyZ2Vfc2hhZGVfZ3JhbnVsYXJfYWxwaGFfaW50ZXJwb2xhdGlvbiIsIHRlYW1mb29kID0gdHJ1ZSkKKworICAgIC8vIFRPRE8oYi8yNzI4MDUwMzcpOiBUcmFja2luZyBCdWcKKyAgICBASnZtRmllbGQKKyAgICB2YWwgQURWQU5DRURfVlBOX0VOQUJMRUQgPSB1bnJlbGVhc2VkRmxhZygyODAwLCBuYW1lID0gIkFkdmFuY2VkVnBuX19lbmFibGVfZmVhdHVyZSIsCisgICAgICAgICAgICBuYW1lc3BhY2UgPSAidnBuIiwgdGVhbWZvb2QgPSBmYWxzZSkKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9TZXJ2ZXJGbGFnUmVhZGVyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL1NlcnZlckZsYWdSZWFkZXIua3QKaW5kZXggOWI3NDhkMC4uZWFmNWVhYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL1NlcnZlckZsYWdSZWFkZXIua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL1NlcnZlckZsYWdSZWFkZXIua3QKQEAgLTM3LDcgKzM3LDcgQEAKICAgICBmdW4gbGlzdGVuRm9yQ2hhbmdlcyh2YWx1ZXM6IENvbGxlY3Rpb248RmxhZzwqPj4sIGxpc3RlbmVyOiBDaGFuZ2VMaXN0ZW5lcikKIAogICAgIGludGVyZmFjZSBDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgICAgIGZ1biBvbkNoYW5nZShmbGFnOiBGbGFnPCo+KQorICAgICAgICBmdW4gb25DaGFuZ2UoZmxhZzogRmxhZzwqPiwgdmFsdWU6IFN0cmluZz8pCiAgICAgfQogfQogCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICAgICAgICAgICAgcHJvcExvb3BAIGZvciAocHJvcE5hbWUgaW4gcHJvcGVydGllcy5rZXlzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChmbGFnIGluIGZsYWdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgPT0gZmxhZy5uYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25DaGFuZ2UoZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkNoYW5nZShmbGFnLCBwcm9wZXJ0aWVzLmdldFN0cmluZyhwcm9wTmFtZSwgbnVsbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtAcHJvcExvb3AKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgIGZvciAoKGxpc3RlbmVyLCBmbGFncykgaW4gbGlzdGVuZXJzKSB7CiAgICAgICAgICAgICBmbGFnTG9vcEAgZm9yIChmbGFnIGluIGZsYWdzKSB7CiAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gZmxhZy5uYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQ2hhbmdlKGZsYWcpCisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQ2hhbmdlKGZsYWcsIGlmICh2YWx1ZSkgInRydWUiIGVsc2UgImZhbHNlIikKICAgICAgICAgICAgICAgICAgICAgYnJlYWtAZmxhZ0xvb3AKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNTksNSArMTU5LDYgQEAKICAgICAgICAgZmxhZ3M6IENvbGxlY3Rpb248RmxhZzwqPj4sCiAgICAgICAgIGxpc3RlbmVyOiBTZXJ2ZXJGbGFnUmVhZGVyLkNoYW5nZUxpc3RlbmVyCiAgICAgKSB7CisgICAgICAgIGxpc3RlbmVycy5hZGQoUGFpcihsaXN0ZW5lciwgZmxhZ3MpKQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL0tleWd1YXJkVmlld01lZGlhdG9yLmphdmEKaW5kZXggMzc3YTEzNi4uNWVjYzAwZiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL0tleWd1YXJkVmlld01lZGlhdG9yLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL0tleWd1YXJkVmlld01lZGlhdG9yLmphdmEKQEAgLTExOCw2ICsxMTgsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLkNvcmVTdGFydGFibGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuRGVqYW5rVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuRHVtcGFibGU7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuRXZlbnRMb2dUYWdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuYW5pbWF0aW9uLkFjdGl2aXR5TGF1bmNoQW5pbWF0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuYW5pbWF0aW9uLkludGVycG9sYXRvcnM7CkBAIC0xODQ5LDYgKzE4NTAsOCBAQAogICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZXRPY2NsdWRlZChib29sZWFuIGlzT2NjbHVkZWQsIGJvb2xlYW4gYW5pbWF0ZSkgewogICAgICAgICBUcmFjZS5iZWdpblNlY3Rpb24oIktleWd1YXJkVmlld01lZGlhdG9yI2hhbmRsZVNldE9jY2x1ZGVkIik7CiAgICAgICAgIExvZy5kKFRBRywgImhhbmRsZVNldE9jY2x1ZGVkKCIgKyBpc09jY2x1ZGVkICsgIikiKTsKKyAgICAgICAgRXZlbnRMb2dUYWdzLndyaXRlU3lzdWlLZXlndWFyZChpc09jY2x1ZGVkID8gMSA6IDAsIGFuaW1hdGUgPyAxIDogMCk7CisKICAgICAgICAgbUludGVyYWN0aW9uSmFua01vbml0b3IuY2FuY2VsKENVSl9MT0NLU0NSRUVOX1RSQU5TSVRJT05fRlJPTV9BT0QpOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAoS2V5Z3VhcmRWaWV3TWVkaWF0b3IudGhpcykgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL1dvcmtMb2NrQWN0aXZpdHkuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9Xb3JrTG9ja0FjdGl2aXR5LmphdmEKaW5kZXggNDUwZmExNC4uODJiZTAwOSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL1dvcmtMb2NrQWN0aXZpdHkuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvV29ya0xvY2tBY3Rpdml0eS5qYXZhCkBAIC0xNzYsMTAgKzE3NiwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgSW50ZW50IGNyZWRlbnRpYWwgPSBnZXRLZXlndWFyZE1hbmFnZXIoKQorICAgICAgICBmaW5hbCBJbnRlbnQgY29uZmlybUNyZWRlbnRpYWxJbnRlbnQgPSBnZXRLZXlndWFyZE1hbmFnZXIoKQogICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maXJtRGV2aWNlQ3JlZGVudGlhbEludGVudChudWxsLCBudWxsLCBnZXRUYXJnZXRVc2VySWQoKSwKICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpc2FsbG93QmlvbWV0cmljc0lmUG9saWN5RXhpc3RzICovKTsKLSAgICAgICAgaWYgKGNyZWRlbnRpYWwgPT0gbnVsbCkgeworICAgICAgICBpZiAoY29uZmlybUNyZWRlbnRpYWxJbnRlbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTE5MywxNCArMTkzLDE4IEBACiAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudC5GTEFHX0lNTVVUQUJMRSwgb3B0aW9ucy50b0J1bmRsZSgpKTsKIAogICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNyZWRlbnRpYWwucHV0RXh0cmEoSW50ZW50LkVYVFJBX0lOVEVOVCwgdGFyZ2V0LmdldEludGVudFNlbmRlcigpKTsKKyAgICAgICAgICAgIGNvbmZpcm1DcmVkZW50aWFsSW50ZW50LnB1dEV4dHJhKEludGVudC5FWFRSQV9JTlRFTlQsIHRhcmdldC5nZXRJbnRlbnRTZW5kZXIoKSk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBXb3JrTG9ja0FjdGl2aXR5IGlzIHN0YXJ0ZWQgYXMgYSB0YXNrIG92ZXJsYXksIHNvIHVubGVzcyBjcmVkZW50aWFsIGNvbmZpcm1hdGlvbiBpcyBhbHNvCisgICAgICAgIC8vIHN0YXJ0ZWQgYXMgYW4gb3ZlcmxheSwgaXQgd29uJ3QgYmUgdmlzaWJsZS4KICAgICAgICAgZmluYWwgQWN0aXZpdHlPcHRpb25zIGxhdW5jaE9wdGlvbnMgPSBBY3Rpdml0eU9wdGlvbnMubWFrZUJhc2ljKCk7CiAgICAgICAgIGxhdW5jaE9wdGlvbnMuc2V0TGF1bmNoVGFza0lkKGdldFRhc2tJZCgpKTsKICAgICAgICAgbGF1bmNoT3B0aW9ucy5zZXRUYXNrT3ZlcmxheSh0cnVlIC8qIHRhc2tPdmVybGF5ICovLCB0cnVlIC8qIGNhblJlc3VtZSAqLyk7CisgICAgICAgIC8vIFByb3BhZ2F0ZSBpdCBpbiBjYXNlIG1vcmUgdGhhbiBvbmUgYWN0aXZpdHkgaXMgbGF1bmNoZWQuCisgICAgICAgIGNvbmZpcm1DcmVkZW50aWFsSW50ZW50LnB1dEV4dHJhKEtleWd1YXJkTWFuYWdlci5FWFRSQV9GT1JDRV9UQVNLX09WRVJMQVksIHRydWUpOwogCi0gICAgICAgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoY3JlZGVudGlhbCwgUkVRVUVTVF9DT0RFX0NPTkZJUk1fQ1JFREVOVElBTFMsCisgICAgICAgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoY29uZmlybUNyZWRlbnRpYWxJbnRlbnQsIFJFUVVFU1RfQ09ERV9DT05GSVJNX0NSRURFTlRJQUxTLAogICAgICAgICAgICAgICAgIGxhdW5jaE9wdGlvbnMudG9CdW5kbGUoKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZGF0YS9Cb3VuY2VyVmlldy5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kYXRhL0JvdW5jZXJWaWV3Lmt0CmluZGV4IGEyNTg5ZDMuLjg3MWEzZmYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kYXRhL0JvdW5jZXJWaWV3Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kYXRhL0JvdW5jZXJWaWV3Lmt0CkBAIC01NSw0ICs1NSw1IEBACiAgICAgZnVuIHdpbGxSdW5EaXNtaXNzRnJvbUtleWd1YXJkKCk6IEJvb2xlYW4KICAgICAvKiogQHJldHVybiB0aGUge0BsaW5rIE9uQmFja0FuaW1hdGlvbkNhbGxiYWNrfSB0byBhbmltYXRlIEJvdW5jZXIgZHVyaW5nIGEgYmFjayBnZXN0dXJlLiAqLwogICAgIGZ1biBnZXRCYWNrQ2FsbGJhY2soKTogT25CYWNrQW5pbWF0aW9uQ2FsbGJhY2sKKyAgICBmdW4gc2hvd1Byb21wdFJlYXNvbihyZWFzb246IEludCkKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kYXRhL3JlcG9zaXRvcnkvS2V5Z3VhcmRCb3VuY2VyUmVwb3NpdG9yeS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kYXRhL3JlcG9zaXRvcnkvS2V5Z3VhcmRCb3VuY2VyUmVwb3NpdG9yeS5rdAppbmRleCA4NmU1Y2Q3Li5hZTViNzk5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZGF0YS9yZXBvc2l0b3J5L0tleWd1YXJkQm91bmNlclJlcG9zaXRvcnkua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RhdGEvcmVwb3NpdG9yeS9LZXlndWFyZEJvdW5jZXJSZXBvc2l0b3J5Lmt0CkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLnF1YWxpZmllcnMuQXBwbGljYXRpb24KIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQuY29uc3RhbnRzLktleWd1YXJkQm91bmNlckNvbnN0YW50cy5FWFBBTlNJT05fSElEREVOCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuc2hhcmVkLm1vZGVsLkJvdW5jZXJTaG93TWVzc2FnZU1vZGVsCi1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuc2hhcmVkLm1vZGVsLktleWd1YXJkQm91bmNlck1vZGVsCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubG9nLmRhZ2dlci5Cb3VuY2VyTG9nCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubG9nLnRhYmxlLlRhYmxlTG9nQnVmZmVyCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubG9nLnRhYmxlLmxvZ0RpZmZzRm9yVGFibGUKQEAgLTQzLDEwICs0Miw4IEBACiAgKi8KIGludGVyZmFjZSBLZXlndWFyZEJvdW5jZXJSZXBvc2l0b3J5IHsKICAgICAvKiogVmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUHJpbWFyeUJvdW5jZXIgKHBpbi9wYXR0ZXJuL3Bhc3N3b3JkKSBpbnB1dC4gKi8KLSAgICB2YWwgcHJpbWFyeUJvdW5jZXJWaXNpYmxlOiBTdGF0ZUZsb3c8Qm9vbGVhbj4KLSAgICB2YWwgcHJpbWFyeUJvdW5jZXJTaG93OiBTdGF0ZUZsb3c8S2V5Z3VhcmRCb3VuY2VyTW9kZWw/PgorICAgIHZhbCBwcmltYXJ5Qm91bmNlclNob3c6IFN0YXRlRmxvdzxCb29sZWFuPgogICAgIHZhbCBwcmltYXJ5Qm91bmNlclNob3dpbmdTb29uOiBTdGF0ZUZsb3c8Qm9vbGVhbj4KLSAgICB2YWwgcHJpbWFyeUJvdW5jZXJIaWRlOiBTdGF0ZUZsb3c8Qm9vbGVhbj4KICAgICB2YWwgcHJpbWFyeUJvdW5jZXJTdGFydGluZ1RvSGlkZTogU3RhdGVGbG93PEJvb2xlYW4+CiAgICAgdmFsIHByaW1hcnlCb3VuY2VyU3RhcnRpbmdEaXNhcHBlYXJBbmltYXRpb246IFN0YXRlRmxvdzxSdW5uYWJsZT8+CiAgICAgLyoqIERldGVybWluZXMgaWYgd2Ugd2FudCB0byBpbnN0YW50YW5lb3VzbHkgc2hvdyB0aGUgcHJpbWFyeSBib3VuY2VyIGluc3RlYWQgb2YgdHJhbnNsYXRpbmcuICovCkBAIC03NiwxNCArNzMsMTAgQEAKIAogICAgIGZ1biBzZXRQcmltYXJ5U2NyaW1tZWQoaXNTY3JpbW1lZDogQm9vbGVhbikKIAotICAgIGZ1biBzZXRQcmltYXJ5VmlzaWJsZShpc1Zpc2libGU6IEJvb2xlYW4pCi0KLSAgICBmdW4gc2V0UHJpbWFyeVNob3coa2V5Z3VhcmRCb3VuY2VyTW9kZWw6IEtleWd1YXJkQm91bmNlck1vZGVsPykKKyAgICBmdW4gc2V0UHJpbWFyeVNob3coaXNTaG93aW5nOiBCb29sZWFuKQogCiAgICAgZnVuIHNldFByaW1hcnlTaG93aW5nU29vbihzaG93aW5nU29vbjogQm9vbGVhbikKIAotICAgIGZ1biBzZXRQcmltYXJ5SGlkZShoaWRlOiBCb29sZWFuKQotCiAgICAgZnVuIHNldFByaW1hcnlTdGFydGluZ1RvSGlkZShzdGFydGluZ1RvSGlkZTogQm9vbGVhbikKIAogICAgIGZ1biBzZXRQcmltYXJ5U3RhcnREaXNhcHBlYXJBbmltYXRpb24ocnVubmFibGU6IFJ1bm5hYmxlPykKQEAgLTExNywxNCArMTEwLDEwIEBACiAgICAgQEJvdW5jZXJMb2cgcHJpdmF0ZSB2YWwgYnVmZmVyOiBUYWJsZUxvZ0J1ZmZlciwKICkgOiBLZXlndWFyZEJvdW5jZXJSZXBvc2l0b3J5IHsKICAgICAvKiogVmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUHJpbWFyeUJvdW5jZXIgKHBpbi9wYXR0ZXJuL3Bhc3N3b3JkKSBpbnB1dC4gKi8KLSAgICBwcml2YXRlIHZhbCBfcHJpbWFyeUJvdW5jZXJWaXNpYmxlID0gTXV0YWJsZVN0YXRlRmxvdyhmYWxzZSkKLSAgICBvdmVycmlkZSB2YWwgcHJpbWFyeUJvdW5jZXJWaXNpYmxlID0gX3ByaW1hcnlCb3VuY2VyVmlzaWJsZS5hc1N0YXRlRmxvdygpCi0gICAgcHJpdmF0ZSB2YWwgX3ByaW1hcnlCb3VuY2VyU2hvdyA9IE11dGFibGVTdGF0ZUZsb3c8S2V5Z3VhcmRCb3VuY2VyTW9kZWw/PihudWxsKQorICAgIHByaXZhdGUgdmFsIF9wcmltYXJ5Qm91bmNlclNob3cgPSBNdXRhYmxlU3RhdGVGbG93KGZhbHNlKQogICAgIG92ZXJyaWRlIHZhbCBwcmltYXJ5Qm91bmNlclNob3cgPSBfcHJpbWFyeUJvdW5jZXJTaG93LmFzU3RhdGVGbG93KCkKICAgICBwcml2YXRlIHZhbCBfcHJpbWFyeUJvdW5jZXJTaG93aW5nU29vbiA9IE11dGFibGVTdGF0ZUZsb3coZmFsc2UpCiAgICAgb3ZlcnJpZGUgdmFsIHByaW1hcnlCb3VuY2VyU2hvd2luZ1Nvb24gPSBfcHJpbWFyeUJvdW5jZXJTaG93aW5nU29vbi5hc1N0YXRlRmxvdygpCi0gICAgcHJpdmF0ZSB2YWwgX3ByaW1hcnlCb3VuY2VySGlkZSA9IE11dGFibGVTdGF0ZUZsb3coZmFsc2UpCi0gICAgb3ZlcnJpZGUgdmFsIHByaW1hcnlCb3VuY2VySGlkZSA9IF9wcmltYXJ5Qm91bmNlckhpZGUuYXNTdGF0ZUZsb3coKQogICAgIHByaXZhdGUgdmFsIF9wcmltYXJ5Qm91bmNlclN0YXJ0aW5nVG9IaWRlID0gTXV0YWJsZVN0YXRlRmxvdyhmYWxzZSkKICAgICBvdmVycmlkZSB2YWwgcHJpbWFyeUJvdW5jZXJTdGFydGluZ1RvSGlkZSA9IF9wcmltYXJ5Qm91bmNlclN0YXJ0aW5nVG9IaWRlLmFzU3RhdGVGbG93KCkKICAgICBwcml2YXRlIHZhbCBfcHJpbWFyeUJvdW5jZXJEaXNhcHBlYXJBbmltYXRpb24gPSBNdXRhYmxlU3RhdGVGbG93PFJ1bm5hYmxlPz4obnVsbCkKQEAgLTE3NywxMCArMTY2LDYgQEAKICAgICAgICAgX3ByaW1hcnlCb3VuY2VyU2NyaW1tZWQudmFsdWUgPSBpc1NjcmltbWVkCiAgICAgfQogCi0gICAgb3ZlcnJpZGUgZnVuIHNldFByaW1hcnlWaXNpYmxlKGlzVmlzaWJsZTogQm9vbGVhbikgewotICAgICAgICBfcHJpbWFyeUJvdW5jZXJWaXNpYmxlLnZhbHVlID0gaXNWaXNpYmxlCi0gICAgfQotCiAgICAgb3ZlcnJpZGUgZnVuIHNldEFsdGVybmF0ZVZpc2libGUoaXNWaXNpYmxlOiBCb29sZWFuKSB7CiAgICAgICAgIGlmIChpc1Zpc2libGUgJiYgIV9hbHRlcm5hdGVCb3VuY2VyVmlzaWJsZS52YWx1ZSkgewogICAgICAgICAgICAgbGFzdEFsdGVybmF0ZUJvdW5jZXJWaXNpYmxlVGltZSA9IGNsb2NrLnVwdGltZU1pbGxpcygpCkBAIC0xOTQsMTggKzE3OSwxNCBAQAogICAgICAgICBfYWx0ZXJuYXRlQm91bmNlclVJQXZhaWxhYmxlLnZhbHVlID0gaXNBdmFpbGFibGUKICAgICB9CiAKLSAgICBvdmVycmlkZSBmdW4gc2V0UHJpbWFyeVNob3coa2V5Z3VhcmRCb3VuY2VyTW9kZWw6IEtleWd1YXJkQm91bmNlck1vZGVsPykgewotICAgICAgICBfcHJpbWFyeUJvdW5jZXJTaG93LnZhbHVlID0ga2V5Z3VhcmRCb3VuY2VyTW9kZWwKKyAgICBvdmVycmlkZSBmdW4gc2V0UHJpbWFyeVNob3coaXNTaG93aW5nOiBCb29sZWFuKSB7CisgICAgICAgIF9wcmltYXJ5Qm91bmNlclNob3cudmFsdWUgPSBpc1Nob3dpbmcKICAgICB9CiAKICAgICBvdmVycmlkZSBmdW4gc2V0UHJpbWFyeVNob3dpbmdTb29uKHNob3dpbmdTb29uOiBCb29sZWFuKSB7CiAgICAgICAgIF9wcmltYXJ5Qm91bmNlclNob3dpbmdTb29uLnZhbHVlID0gc2hvd2luZ1Nvb24KICAgICB9CiAKLSAgICBvdmVycmlkZSBmdW4gc2V0UHJpbWFyeUhpZGUoaGlkZTogQm9vbGVhbikgewotICAgICAgICBfcHJpbWFyeUJvdW5jZXJIaWRlLnZhbHVlID0gaGlkZQotICAgIH0KLQogICAgIG92ZXJyaWRlIGZ1biBzZXRQcmltYXJ5U3RhcnRpbmdUb0hpZGUoc3RhcnRpbmdUb0hpZGU6IEJvb2xlYW4pIHsKICAgICAgICAgX3ByaW1hcnlCb3VuY2VyU3RhcnRpbmdUb0hpZGUudmFsdWUgPSBzdGFydGluZ1RvSGlkZQogICAgIH0KQEAgLTI0OCwxOSArMjI5LDEyIEBACiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgfQogCi0gICAgICAgIHByaW1hcnlCb3VuY2VyVmlzaWJsZQotICAgICAgICAgICAgLmxvZ0RpZmZzRm9yVGFibGUoYnVmZmVyLCAiIiwgIlByaW1hcnlCb3VuY2VyVmlzaWJsZSIsIGZhbHNlKQotICAgICAgICAgICAgLmxhdW5jaEluKGFwcGxpY2F0aW9uU2NvcGUpCiAgICAgICAgIHByaW1hcnlCb3VuY2VyU2hvdwotICAgICAgICAgICAgLm1hcCB7IGl0ICE9IG51bGwgfQogICAgICAgICAgICAgLmxvZ0RpZmZzRm9yVGFibGUoYnVmZmVyLCAiIiwgIlByaW1hcnlCb3VuY2VyU2hvdyIsIGZhbHNlKQogICAgICAgICAgICAgLmxhdW5jaEluKGFwcGxpY2F0aW9uU2NvcGUpCiAgICAgICAgIHByaW1hcnlCb3VuY2VyU2hvd2luZ1Nvb24KICAgICAgICAgICAgIC5sb2dEaWZmc0ZvclRhYmxlKGJ1ZmZlciwgIiIsICJQcmltYXJ5Qm91bmNlclNob3dpbmdTb29uIiwgZmFsc2UpCiAgICAgICAgICAgICAubGF1bmNoSW4oYXBwbGljYXRpb25TY29wZSkKLSAgICAgICAgcHJpbWFyeUJvdW5jZXJIaWRlCi0gICAgICAgICAgICAubG9nRGlmZnNGb3JUYWJsZShidWZmZXIsICIiLCAiUHJpbWFyeUJvdW5jZXJIaWRlIiwgZmFsc2UpCi0gICAgICAgICAgICAubGF1bmNoSW4oYXBwbGljYXRpb25TY29wZSkKICAgICAgICAgcHJpbWFyeUJvdW5jZXJTdGFydGluZ1RvSGlkZQogICAgICAgICAgICAgLmxvZ0RpZmZzRm9yVGFibGUoYnVmZmVyLCAiIiwgIlByaW1hcnlCb3VuY2VyU3RhcnRpbmdUb0hpZGUiLCBmYWxzZSkKICAgICAgICAgICAgIC5sYXVuY2hJbihhcHBsaWNhdGlvblNjb3BlKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RvbWFpbi9pbnRlcmFjdG9yL0tleWd1YXJkSW50ZXJhY3Rvci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9LZXlndWFyZEludGVyYWN0b3Iua3QKaW5kZXggYzQyZTUwMi4uMWFjMGM1MiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RvbWFpbi9pbnRlcmFjdG9yL0tleWd1YXJkSW50ZXJhY3Rvci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZG9tYWluL2ludGVyYWN0b3IvS2V5Z3VhcmRJbnRlcmFjdG9yLmt0CkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICAvKiogV2hldGhlciB0aGUga2V5Z3VhcmQgaXMgZ29pbmcgYXdheS4gKi8KICAgICB2YWwgaXNLZXlndWFyZEdvaW5nQXdheTogRmxvdzxCb29sZWFuPiA9IHJlcG9zaXRvcnkuaXNLZXlndWFyZEdvaW5nQXdheQogICAgIC8qKiBXaGV0aGVyIHRoZSBwcmltYXJ5IGJvdW5jZXIgaXMgc2hvd2luZyBvciBub3QuICovCi0gICAgdmFsIHByaW1hcnlCb3VuY2VyU2hvd2luZzogRmxvdzxCb29sZWFuPiA9IGJvdW5jZXJSZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VyVmlzaWJsZQorICAgIHZhbCBwcmltYXJ5Qm91bmNlclNob3dpbmc6IEZsb3c8Qm9vbGVhbj4gPSBib3VuY2VyUmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclNob3cKICAgICAvKiogV2hldGhlciB0aGUgYWx0ZXJuYXRlIGJvdW5jZXIgaXMgc2hvd2luZyBvciBub3QuICovCiAgICAgdmFsIGFsdGVybmF0ZUJvdW5jZXJTaG93aW5nOiBGbG93PEJvb2xlYW4+ID0gYm91bmNlclJlcG9zaXRvcnkuYWx0ZXJuYXRlQm91bmNlclZpc2libGUKICAgICAvKiogT2JzZXJ2YWJsZSBmb3IgdGhlIFtTdGF0dXNCYXJTdGF0ZV0gKi8KQEAgLTE1OSw3ICsxNTksNyBAQAogICAgICAgICBpZiAoZmVhdHVyZUZsYWdzLmlzRW5hYmxlZChGbGFncy5GQUNFX0FVVEhfUkVGQUNUT1IpKSB7CiAgICAgICAgICAgICBjb21iaW5lKAogICAgICAgICAgICAgICAgICAgICBpc0tleWd1YXJkVmlzaWJsZSwKLSAgICAgICAgICAgICAgICAgICAgYm91bmNlclJlcG9zaXRvcnkucHJpbWFyeUJvdW5jZXJWaXNpYmxlLAorICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Qm91bmNlclNob3dpbmcsCiAgICAgICAgICAgICAgICAgICAgIG9uQ2FtZXJhTGF1bmNoRGV0ZWN0ZWQsCiAgICAgICAgICAgICAgICAgKSB7IGlzS2V5Z3VhcmRWaXNpYmxlLCBpc1ByaW1hcnlCb3VuY2VyU2hvd2luZywgY2FtZXJhTGF1bmNoRXZlbnQgLT4KICAgICAgICAgICAgICAgICAgICAgd2hlbiB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZG9tYWluL2ludGVyYWN0b3IvUHJpbWFyeUJvdW5jZXJJbnRlcmFjdG9yLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RvbWFpbi9pbnRlcmFjdG9yL1ByaW1hcnlCb3VuY2VySW50ZXJhY3Rvci5rdAppbmRleCAzZDJjNDcyLi5iMTBhYTkwIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZG9tYWluL2ludGVyYWN0b3IvUHJpbWFyeUJvdW5jZXJJbnRlcmFjdG9yLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9QcmltYXJ5Qm91bmNlckludGVyYWN0b3Iua3QKQEAgLTIxLDEyICsyMSwxNSBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuYmlvbWV0cmljcy5CaW9tZXRyaWNTb3VyY2VUeXBlCiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyCiBpbXBvcnQgYW5kcm9pZC5vcy5UcmFjZQotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlCitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VyTWFuYWdlcgogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2cKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldwogaW1wb3J0IGNvbS5hbmRyb2lkLmtleWd1YXJkLktleWd1YXJkQ29uc3RhbnRzCiBpbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuS2V5Z3VhcmRTZWN1cml0eU1vZGVsCiBpbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuS2V5Z3VhcmRVcGRhdGVNb25pdG9yCiBpbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuS2V5Z3VhcmRVcGRhdGVNb25pdG9yQ2FsbGJhY2sKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5VdGlscwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLkRlamFua1V0aWxzCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNsYXNzaWZpZXIuRmFsc2luZ0NvbGxlY3RvcgpAQCAtMzcsNyArNDAsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLmRhdGEucmVwb3NpdG9yeS5LZXlndWFyZEJvdW5jZXJSZXBvc2l0b3J5CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuc2hhcmVkLmNvbnN0YW50cy5LZXlndWFyZEJvdW5jZXJDb25zdGFudHMKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQubW9kZWwuQm91bmNlclNob3dNZXNzYWdlTW9kZWwKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQubW9kZWwuS2V5Z3VhcmRCb3VuY2VyTW9kZWwKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLkFjdGl2aXR5U3RhcnRlcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNoYXJlZC5zeXN0ZW0uU3lzVWlTdGF0c0xvZwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waG9uZS5LZXlndWFyZEJ5cGFzc0NvbnRyb2xsZXIKQEAgLTgxLDIzICs4MywyMSBAQAogCiAgICAgLyoqIFJ1bm5hYmxlIHRvIHNob3cgdGhlIHByaW1hcnkgYm91bmNlci4gKi8KICAgICB2YWwgc2hvd1J1bm5hYmxlID0gUnVubmFibGUgewotICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlWaXNpYmxlKHRydWUpCi0gICAgICAgIHJlcG9zaXRvcnkuc2V0UHJpbWFyeVNob3coCi0gICAgICAgICAgICBLZXlndWFyZEJvdW5jZXJNb2RlbCgKLSAgICAgICAgICAgICAgICBwcm9tcHRSZWFzb24gPSByZXBvc2l0b3J5LmJvdW5jZXJQcm9tcHRSZWFzb24gPzogMCwKLSAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSByZXBvc2l0b3J5LmJvdW5jZXJFcnJvck1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgZXhwYW5zaW9uQW1vdW50ID0gcmVwb3NpdG9yeS5wYW5lbEV4cGFuc2lvbkFtb3VudC52YWx1ZQorICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KHRydWUpCisgICAgICAgIHByaW1hcnlCb3VuY2VyVmlldy5kZWxlZ2F0ZT8uc2hvd1Byb21wdFJlYXNvbihyZXBvc2l0b3J5LmJvdW5jZXJQcm9tcHRSZWFzb24pCisgICAgICAgIChyZXBvc2l0b3J5LmJvdW5jZXJFcnJvck1lc3NhZ2UgYXM/IFN0cmluZyk/LmxldCB7CisgICAgICAgICAgICByZXBvc2l0b3J5LnNldFNob3dNZXNzYWdlKAorICAgICAgICAgICAgICAgIEJvdW5jZXJTaG93TWVzc2FnZU1vZGVsKG1lc3NhZ2UgPSBpdCwgVXRpbHMuZ2V0Q29sb3JFcnJvcihjb250ZXh0KSkKICAgICAgICAgICAgICkKLSAgICAgICAgKQorICAgICAgICB9CiAgICAgICAgIHJlcG9zaXRvcnkuc2V0UHJpbWFyeVNob3dpbmdTb29uKGZhbHNlKQogICAgICAgICBwcmltYXJ5Qm91bmNlckNhbGxiYWNrSW50ZXJhY3Rvci5kaXNwYXRjaFZpc2liaWxpdHlDaGFuZ2VkKFZpZXcuVklTSUJMRSkKICAgICB9CiAKICAgICB2YWwga2V5Z3VhcmRBdXRoZW50aWNhdGVkOiBGbG93PEJvb2xlYW4+ID0gcmVwb3NpdG9yeS5rZXlndWFyZEF1dGhlbnRpY2F0ZWQuZmlsdGVyTm90TnVsbCgpCi0gICAgdmFsIHNob3c6IEZsb3c8S2V5Z3VhcmRCb3VuY2VyTW9kZWw+ID0gcmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclNob3cuZmlsdGVyTm90TnVsbCgpCi0gICAgdmFsIGhpZGU6IEZsb3c8VW5pdD4gPSByZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VySGlkZS5maWx0ZXIgeyBpdCB9Lm1hcCB7fQorICAgIHZhbCBzaG93OiBGbG93PFVuaXQ+ID0gcmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclNob3cuZmlsdGVyIHsgaXQgfS5tYXAge30KKyAgICB2YWwgaGlkZTogRmxvdzxVbml0PiA9IHJlcG9zaXRvcnkucHJpbWFyeUJvdW5jZXJTaG93LmZpbHRlciB7ICFpdCB9Lm1hcCB7fQogICAgIHZhbCBzdGFydGluZ1RvSGlkZTogRmxvdzxVbml0PiA9IHJlcG9zaXRvcnkucHJpbWFyeUJvdW5jZXJTdGFydGluZ1RvSGlkZS5maWx0ZXIgeyBpdCB9Lm1hcCB7fQotICAgIHZhbCBpc1Zpc2libGU6IEZsb3c8Qm9vbGVhbj4gPSByZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VyVmlzaWJsZQogICAgIHZhbCBpc0JhY2tCdXR0b25FbmFibGVkOiBGbG93PEJvb2xlYW4+ID0gcmVwb3NpdG9yeS5pc0JhY2tCdXR0b25FbmFibGVkLmZpbHRlck5vdE51bGwoKQogICAgIHZhbCBzaG93TWVzc2FnZTogRmxvdzxCb3VuY2VyU2hvd01lc3NhZ2VNb2RlbD4gPSByZXBvc2l0b3J5LnNob3dNZXNzYWdlLmZpbHRlck5vdE51bGwoKQogICAgIHZhbCBzdGFydGluZ0Rpc2FwcGVhckFuaW1hdGlvbjogRmxvdzxSdW5uYWJsZT4gPQpAQCAtMTA3LDEwICsxMDcsMTEgQEAKICAgICB2YWwgcGFuZWxFeHBhbnNpb25BbW91bnQ6IEZsb3c8RmxvYXQ+ID0gcmVwb3NpdG9yeS5wYW5lbEV4cGFuc2lvbkFtb3VudAogICAgIC8qKiAwZiA9IGJvdW5jZXIgZnVsbHkgaGlkZGVuLiAxZiA9IGJvdW5jZXIgZnVsbHkgdmlzaWJsZS4gKi8KICAgICB2YWwgYm91bmNlckV4cGFuc2lvbjogRmxvdzxGbG9hdD4gPQotICAgICAgICBjb21iaW5lKHJlcG9zaXRvcnkucGFuZWxFeHBhbnNpb25BbW91bnQsIHJlcG9zaXRvcnkucHJpbWFyeUJvdW5jZXJWaXNpYmxlKSB7Ci0gICAgICAgICAgICBwYW5lbEV4cGFuc2lvbiwKLSAgICAgICAgICAgIHByaW1hcnlCb3VuY2VyVmlzaWJsZSAtPgotICAgICAgICAgICAgaWYgKHByaW1hcnlCb3VuY2VyVmlzaWJsZSkgeworICAgICAgICBjb21iaW5lKAorICAgICAgICAgICAgcmVwb3NpdG9yeS5wYW5lbEV4cGFuc2lvbkFtb3VudCwKKyAgICAgICAgICAgIHJlcG9zaXRvcnkucHJpbWFyeUJvdW5jZXJTaG93CisgICAgICAgICkgeyBwYW5lbEV4cGFuc2lvbiwgcHJpbWFyeUJvdW5jZXJJc1Nob3dpbmcgLT4KKyAgICAgICAgICAgIGlmIChwcmltYXJ5Qm91bmNlcklzU2hvd2luZykgewogICAgICAgICAgICAgICAgIDFmIC0gcGFuZWxFeHBhbnNpb24KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgMGYKQEAgLTEyMCwyMSArMTIxLDIwIEBACiAgICAgdmFsIGlzSW50ZXJhY3RhYmxlOiBGbG93PEJvb2xlYW4+ID0gYm91bmNlckV4cGFuc2lvbi5tYXAgeyBpdCA+IDAuOSB9CiAgICAgdmFsIHNpZGVGcHNTaG93aW5nOiBGbG93PEJvb2xlYW4+ID0gcmVwb3NpdG9yeS5zaWRlRnBzU2hvd2luZwogCi0gICAgLyoqCi0gICAgICogVGhpcyBjYWxsYmFjayBuZWVkcyB0byBiZSBhIGNsYXNzIGZpZWxkIHNvIGl0IGRvZXMgbm90IGdldCBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgICAgKi8KLSAgICB2YWwga2V5Z3VhcmRVcGRhdGVNb25pdG9yQ2FsbGJhY2sgPSBvYmplY3QgOiBLZXlndWFyZFVwZGF0ZU1vbml0b3JDYWxsYmFjaygpIHsKLSAgICAgICAgb3ZlcnJpZGUgZnVuIG9uQmlvbWV0cmljUnVubmluZ1N0YXRlQ2hhbmdlZCgKLSAgICAgICAgICAgIHJ1bm5pbmc6IEJvb2xlYW4sCi0gICAgICAgICAgICBiaW9tZXRyaWNTb3VyY2VUeXBlOiBCaW9tZXRyaWNTb3VyY2VUeXBlPwotICAgICAgICApIHsKLSAgICAgICAgICAgIHVwZGF0ZVNpZGVGcHNWaXNpYmlsaXR5KCkKLSAgICAgICAgfQorICAgIC8qKiBUaGlzIGNhbGxiYWNrIG5lZWRzIHRvIGJlIGEgY2xhc3MgZmllbGQgc28gaXQgZG9lcyBub3QgZ2V0IGdhcmJhZ2UgY29sbGVjdGVkLiAqLworICAgIHZhbCBrZXlndWFyZFVwZGF0ZU1vbml0b3JDYWxsYmFjayA9CisgICAgICAgIG9iamVjdCA6IEtleWd1YXJkVXBkYXRlTW9uaXRvckNhbGxiYWNrKCkgeworICAgICAgICAgICAgb3ZlcnJpZGUgZnVuIG9uQmlvbWV0cmljUnVubmluZ1N0YXRlQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICBydW5uaW5nOiBCb29sZWFuLAorICAgICAgICAgICAgICAgIGJpb21ldHJpY1NvdXJjZVR5cGU6IEJpb21ldHJpY1NvdXJjZVR5cGU/CisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVTaWRlRnBzVmlzaWJpbGl0eSgpCisgICAgICAgICAgICB9CiAKLSAgICAgICAgb3ZlcnJpZGUgZnVuIG9uU3Ryb25nQXV0aFN0YXRlQ2hhbmdlZCh1c2VySWQ6IEludCkgewotICAgICAgICAgICAgdXBkYXRlU2lkZUZwc1Zpc2liaWxpdHkoKQorICAgICAgICAgICAgb3ZlcnJpZGUgZnVuIG9uU3Ryb25nQXV0aFN0YXRlQ2hhbmdlZCh1c2VySWQ6IEludCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVNpZGVGcHNWaXNpYmlsaXR5KCkKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KIAogICAgIGluaXQgewogICAgICAgICBrZXlndWFyZFVwZGF0ZU1vbml0b3IucmVnaXN0ZXJDYWxsYmFjayhrZXlndWFyZFVwZGF0ZU1vbml0b3JDYWxsYmFjaykKQEAgLTE0NywxNCArMTQ3LDEzIEBACiAgICAgZnVuIHNob3coaXNTY3JpbW1lZDogQm9vbGVhbikgewogICAgICAgICAvLyBSZXNldCBzb21lIHN0YXRlcyBhcyB3ZSBzaG93IHRoZSBib3VuY2VyLgogICAgICAgICByZXBvc2l0b3J5LnNldEtleWd1YXJkQXV0aGVudGljYXRlZChudWxsKQotICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlIaWRlKGZhbHNlKQogICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlTdGFydGluZ1RvSGlkZShmYWxzZSkKIAogICAgICAgICB2YWwgcmVzdW1lQm91bmNlciA9Ci0gICAgICAgICAgICAocmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclZpc2libGUudmFsdWUgfHwKLSAgICAgICAgICAgICAgICByZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VyU2hvd2luZ1Nvb24udmFsdWUpICYmIG5lZWRzRnVsbHNjcmVlbkJvdW5jZXIoKQorICAgICAgICAgICAgKGlzQm91bmNlclNob3dpbmcoKSB8fCByZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VyU2hvd2luZ1Nvb24udmFsdWUpICYmCisgICAgICAgICAgICAgICAgbmVlZHNGdWxsc2NyZWVuQm91bmNlcigpCiAKLSAgICAgICAgaWYgKCFyZXN1bWVCb3VuY2VyICYmIHJlcG9zaXRvcnkucHJpbWFyeUJvdW5jZXJTaG93LnZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKCFyZXN1bWVCb3VuY2VyICYmIGlzQm91bmNlclNob3dpbmcoKSkgewogICAgICAgICAgICAgLy8gSWYgYm91bmNlciBpcyB2aXNpYmxlLCB0aGUgYm91bmNlciBpcyBhbHJlYWR5IHNob3dpbmcuCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgfQpAQCAtMjAxLDkgKzIwMCw3IEBACiAgICAgICAgIGtleWd1YXJkU3RhdGVDb250cm9sbGVyLm5vdGlmeVByaW1hcnlCb3VuY2VyU2hvd2luZyhmYWxzZSAvKiBzaG93aW5nICovKQogICAgICAgICBjYW5jZWxTaG93UnVubmFibGUoKQogICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlTaG93aW5nU29vbihmYWxzZSkKLSAgICAgICAgcmVwb3NpdG9yeS5zZXRQcmltYXJ5VmlzaWJsZShmYWxzZSkKLSAgICAgICAgcmVwb3NpdG9yeS5zZXRQcmltYXJ5SGlkZSh0cnVlKQotICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KG51bGwpCisgICAgICAgIHJlcG9zaXRvcnkuc2V0UHJpbWFyeVNob3coZmFsc2UpCiAgICAgICAgIHByaW1hcnlCb3VuY2VyQ2FsbGJhY2tJbnRlcmFjdG9yLmRpc3BhdGNoVmlzaWJpbGl0eUNoYW5nZWQoVmlldy5JTlZJU0lCTEUpCiAgICAgICAgIFRyYWNlLmVuZFNlY3Rpb24oKQogICAgIH0KQEAgLTMyMCw5ICszMTcsOCBAQAogICAgICAgICB2YWwgZnBzRGV0ZWN0aW9uUnVubmluZzogQm9vbGVhbiA9IGtleWd1YXJkVXBkYXRlTW9uaXRvci5pc0ZpbmdlcnByaW50RGV0ZWN0aW9uUnVubmluZwogICAgICAgICB2YWwgaXNVbmxvY2tpbmdXaXRoRnBBbGxvd2VkOiBCb29sZWFuID0KICAgICAgICAgICAgIGtleWd1YXJkVXBkYXRlTW9uaXRvci5pc1VubG9ja2luZ1dpdGhGaW5nZXJwcmludEFsbG93ZWQKLSAgICAgICAgdmFsIGJvdW5jZXJWaXNpYmxlID0gcmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclZpc2libGUudmFsdWUKICAgICAgICAgdmFsIHRvU2hvdyA9Ci0gICAgICAgICAgICAocmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclZpc2libGUudmFsdWUgJiYKKyAgICAgICAgICAgIChpc0JvdW5jZXJTaG93aW5nKCkgJiYKICAgICAgICAgICAgICAgICBzZnBzRW5hYmxlZCAmJgogICAgICAgICAgICAgICAgIGZwc0RldGVjdGlvblJ1bm5pbmcgJiYKICAgICAgICAgICAgICAgICBpc1VubG9ja2luZ1dpdGhGcEFsbG93ZWQgJiYKQEAgLTMzMiw3ICszMjgsNyBAQAogICAgICAgICAgICAgTG9nLmQoCiAgICAgICAgICAgICAgICAgVEFHLAogICAgICAgICAgICAgICAgICgic2lkZUZwc1RvU2hvdz0kdG9TaG93XG4iICsKLSAgICAgICAgICAgICAgICAgICAgImJvdW5jZXJWaXNpYmxlPSRib3VuY2VyVmlzaWJsZVxuIiArCisgICAgICAgICAgICAgICAgICAgICJpc0JvdW5jZXJTaG93aW5nPSR7aXNCb3VuY2VyU2hvd2luZygpfVxuIiArCiAgICAgICAgICAgICAgICAgICAgICJjb25maWdFbmFibGVkPSRzZnBzRW5hYmxlZFxuIiArCiAgICAgICAgICAgICAgICAgICAgICJmcHNEZXRlY3Rpb25SdW5uaW5nPSRmcHNEZXRlY3Rpb25SdW5uaW5nXG4iICsKICAgICAgICAgICAgICAgICAgICAgImlzVW5sb2NraW5nV2l0aEZwQWxsb3dlZD0kaXNVbmxvY2tpbmdXaXRoRnBBbGxvd2VkXG4iICsKQEAgLTM0NCw4ICszNDAsNyBAQAogCiAgICAgLyoqIFJldHVybnMgd2hldGhlciBib3VuY2VyIGlzIGZ1bGx5IHNob3dpbmcuICovCiAgICAgZnVuIGlzRnVsbHlTaG93aW5nKCk6IEJvb2xlYW4gewotICAgICAgICByZXR1cm4gKHJlcG9zaXRvcnkucHJpbWFyeUJvdW5jZXJTaG93aW5nU29vbi52YWx1ZSB8fAotICAgICAgICAgICAgcmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclZpc2libGUudmFsdWUpICYmCisgICAgICAgIHJldHVybiAocmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclNob3dpbmdTb29uLnZhbHVlIHx8IGlzQm91bmNlclNob3dpbmcoKSkgJiYKICAgICAgICAgICAgIHJlcG9zaXRvcnkucGFuZWxFeHBhbnNpb25BbW91bnQudmFsdWUgPT0gS2V5Z3VhcmRCb3VuY2VyQ29uc3RhbnRzLkVYUEFOU0lPTl9WSVNJQkxFICYmCiAgICAgICAgICAgICByZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VyU3RhcnRpbmdEaXNhcHBlYXJBbmltYXRpb24udmFsdWUgPT0gbnVsbAogICAgIH0KQEAgLTM5MSw2ICszODYsMTAgQEAKICAgICAgICAgbWFpbkhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKHNob3dSdW5uYWJsZSkKICAgICB9CiAKKyAgICBwcml2YXRlIGZ1biBpc0JvdW5jZXJTaG93aW5nKCk6IEJvb2xlYW4geworICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclNob3cudmFsdWUKKyAgICB9CisKICAgICBjb21wYW5pb24gb2JqZWN0IHsKICAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgVEFHID0gIlByaW1hcnlCb3VuY2VySW50ZXJhY3RvciIKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvdWkvYmluZGVyL0tleWd1YXJkQm91bmNlclZpZXdCaW5kZXIua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvdWkvYmluZGVyL0tleWd1YXJkQm91bmNlclZpZXdCaW5kZXIua3QKaW5kZXggYmI2MTdiZC4uNWZjZjEwNSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3VpL2JpbmRlci9LZXlndWFyZEJvdW5jZXJWaWV3QmluZGVyLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC91aS9iaW5kZXIvS2V5Z3VhcmRCb3VuY2VyVmlld0JpbmRlci5rdApAQCAtMjcsNyArMjcsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmtleWd1YXJkLktleWd1YXJkU2VjdXJpdHlWaWV3CiBpbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuS2V5Z3VhcmRVcGRhdGVNb25pdG9yCiBpbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuZGFnZ2VyLktleWd1YXJkQm91bmNlckNvbXBvbmVudAotaW1wb3J0IGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLlV0aWxzCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuZGF0YS5Cb3VuY2VyVmlld0RlbGVnYXRlCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuc2hhcmVkLmNvbnN0YW50cy5LZXlndWFyZEJvdW5jZXJDb25zdGFudHMuRVhQQU5TSU9OX1ZJU0lCTEUKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC51aS52aWV3bW9kZWwuS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsCkBAIC0zNSw3ICszNCw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubGlmZWN5Y2xlLnJlcGVhdFdoZW5BdHRhY2hlZAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuQWN0aXZpdHlTdGFydGVyCiBpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmF3YWl0Q2FuY2VsbGF0aW9uCi1pbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuY29sbGVjdAogaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmZpbHRlcgogaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5sYXVuY2gKIApAQCAtMTAxLDYgKzk5LDEwIEBACiAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgZnVuIHdpbGxSdW5EaXNtaXNzRnJvbUtleWd1YXJkKCk6IEJvb2xlYW4gewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLndpbGxSdW5EaXNtaXNzRnJvbUtleWd1YXJkKCkKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvdmVycmlkZSBmdW4gc2hvd1Byb21wdFJlYXNvbihyZWFzb246IEludCkgeworICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIuc2hvd1Byb21wdFJlYXNvbihyZWFzb24pCisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB2aWV3LnJlcGVhdFdoZW5BdHRhY2hlZCB7CiAgICAgICAgICAgICByZXBlYXRPbkxpZmVjeWNsZShMaWZlY3ljbGUuU3RhdGUuQ1JFQVRFRCkgewpAQCAtMTA5LDI2ICsxMTEsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgbGF1bmNoIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlbC5zaG93LmNvbGxlY3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IFNlY3VyaXR5IENvbnRhaW5lciBlbnRpcmVseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIucmVpbmZsYXRlVmlld0ZsaXBwZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5zaG93UHJvbXB0UmVhc29uKGl0LnByb21wdFJlYXNvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5lcnJvck1lc3NhZ2U/LmxldCB7IGVycm9yTWVzc2FnZSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIuc2hvd01lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5nZXRDb2xvckVycm9yKHZpZXcuY29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIucmVpbmZsYXRlVmlld0ZsaXBwZXIgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBTZWN1cml0eSBDb250YWluZXIgZW50aXJlbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcudmlzaWJpbGl0eSA9IFZpZXcuVklTSUJMRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIub25Cb3VuY2VyVmlzaWJpbGl0eUNoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpc1Zpc2libGU9ICovIHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIuc2hvd1ByaW1hcnlTZWN1cml0eVNjcmVlbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHR1cm5pbmdPZmY9ICovIGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLmFwcGVhcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5vblJlc3VtZShLZXlndWFyZFNlY3VyaXR5Vmlldy5TQ1JFRU5fT04pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5zaG93UHJpbWFyeVNlY3VyaXR5U2NyZWVuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0dXJuaW5nT2ZmPSAqLyBmYWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIuYXBwZWFyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIub25SZXN1bWUoS2V5Z3VhcmRTZWN1cml0eVZpZXcuU0NSRUVOX09OKQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbGF1bmNoIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlbC5oaWRlLmNvbGxlY3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcudmlzaWJpbGl0eSA9IFZpZXcuSU5WSVNJQkxFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLm9uQm91bmNlclZpc2liaWxpdHlDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpc1Zpc2libGU9ICovIGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5jYW5jZWxEaXNtaXNzQWN0aW9uKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIucmVzZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5vblBhdXNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0xNjYsMTkgKzE3Miw2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBsYXVuY2ggewotICAgICAgICAgICAgICAgICAgICAgICAgdmlld01vZGVsLmlzQm91bmNlclZpc2libGUuY29sbGVjdCB7IGlzVmlzaWJsZSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcudmlzaWJpbGl0eSA9IGlmIChpc1Zpc2libGUpIFZpZXcuVklTSUJMRSBlbHNlIFZpZXcuSU5WSVNJQkxFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLm9uQm91bmNlclZpc2liaWxpdHlDaGFuZ2VkKGlzVmlzaWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGxhdW5jaCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZWwuaXNCb3VuY2VyVmlzaWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIgeyAhaXQgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0IHsgc2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLm9uUGF1c2UoKSB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBsYXVuY2ggewogICAgICAgICAgICAgICAgICAgICAgICAgdmlld01vZGVsLmlzSW50ZXJhY3RhYmxlLmNvbGxlY3QgeyBpc0ludGVyYWN0YWJsZSAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci5zZXRJbnRlcmFjdGFibGUoaXNJbnRlcmFjdGFibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvdWkvcHJldmlldy9LZXlndWFyZFJlbW90ZVByZXZpZXdNYW5hZ2VyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3VpL3ByZXZpZXcvS2V5Z3VhcmRSZW1vdGVQcmV2aWV3TWFuYWdlci5rdAppbmRleCA1MDcyMmQ1Li42ZDk1ODgyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvdWkvcHJldmlldy9LZXlndWFyZFJlbW90ZVByZXZpZXdNYW5hZ2VyLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC91aS9wcmV2aWV3L0tleWd1YXJkUmVtb3RlUHJldmlld01hbmFnZXIua3QKQEAgLTI2LDE4ICsyNiwyMSBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2cKIGltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLlZpc2libGVGb3JUZXN0aW5nCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLlN5c1VJU2luZ2xldG9uCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLnF1YWxpZmllcnMuQXBwbGljYXRpb24KIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5kYWdnZXIucXVhbGlmaWVycy5CYWNrZ3JvdW5kCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLnF1YWxpZmllcnMuTWFpbgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNoYXJlZC5xdWlja2FmZm9yZGFuY2Uuc2hhcmVkLm1vZGVsLktleWd1YXJkUXVpY2tBZmZvcmRhbmNlUHJldmlld0NvbnN0YW50cwogaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3QKIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuQ29yb3V0aW5lRGlzcGF0Y2hlcgotaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5ydW5CbG9ja2luZworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5Db3JvdXRpbmVTY29wZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5sYXVuY2gKIAogQFN5c1VJU2luZ2xldG9uCiBjbGFzcyBLZXlndWFyZFJlbW90ZVByZXZpZXdNYW5hZ2VyCiBASW5qZWN0CiBjb25zdHJ1Y3RvcigKICAgICBwcml2YXRlIHZhbCBwcmV2aWV3UmVuZGVyZXJGYWN0b3J5OiBLZXlndWFyZFByZXZpZXdSZW5kZXJlckZhY3RvcnksCisgICAgQEFwcGxpY2F0aW9uIHByaXZhdGUgdmFsIGFwcGxpY2F0aW9uU2NvcGU6IENvcm91dGluZVNjb3BlLAogICAgIEBNYWluIHByaXZhdGUgdmFsIG1haW5EaXNwYXRjaGVyOiBDb3JvdXRpbmVEaXNwYXRjaGVyLAogICAgIEBCYWNrZ3JvdW5kIHByaXZhdGUgdmFsIGJhY2tncm91bmRIYW5kbGVyOiBIYW5kbGVyLAogKSB7CkBAIC01NSw3ICs1OCwxMyBAQAogCiAgICAgICAgICAgICAvLyBEZXN0cm95IGFueSBwcmV2aW91cyByZW5kZXJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b2tlbi4KICAgICAgICAgICAgIGFjdGl2ZVByZXZpZXdzW3JlbmRlcmVyLmhvc3RUb2tlbl0/LmxldCB7IGRlc3Ryb3lPYnNlcnZlcihpdCkgfQotICAgICAgICAgICAgb2JzZXJ2ZXIgPSBQcmV2aWV3TGlmZWN5Y2xlT2JzZXJ2ZXIocmVuZGVyZXIsIG1haW5EaXNwYXRjaGVyLCA6OmRlc3Ryb3lPYnNlcnZlcikKKyAgICAgICAgICAgIG9ic2VydmVyID0KKyAgICAgICAgICAgICAgICBQcmV2aWV3TGlmZWN5Y2xlT2JzZXJ2ZXIoCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLAorICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvblNjb3BlLAorICAgICAgICAgICAgICAgICAgICBtYWluRGlzcGF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgOjpkZXN0cm95T2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgYWN0aXZlUHJldmlld3NbcmVuZGVyZXIuaG9zdFRva2VuXSA9IG9ic2VydmVyCiAgICAgICAgICAgICByZW5kZXJlci5yZW5kZXIoKQogICAgICAgICAgICAgcmVuZGVyZXIuaG9zdFRva2VuPy5saW5rVG9EZWF0aChvYnNlcnZlciwgMCkKQEAgLTkyLDEzICsxMDEsMTggQEAKIAogICAgIHByaXZhdGUgY2xhc3MgUHJldmlld0xpZmVjeWNsZU9ic2VydmVyKAogICAgICAgICBwcml2YXRlIHZhbCByZW5kZXJlcjogS2V5Z3VhcmRQcmV2aWV3UmVuZGVyZXIsCisgICAgICAgIHByaXZhdGUgdmFsIHNjb3BlOiBDb3JvdXRpbmVTY29wZSwKICAgICAgICAgcHJpdmF0ZSB2YWwgbWFpbkRpc3BhdGNoZXI6IENvcm91dGluZURpc3BhdGNoZXIsCiAgICAgICAgIHByaXZhdGUgdmFsIHJlcXVlc3REZXN0cnVjdGlvbjogKFByZXZpZXdMaWZlY3ljbGVPYnNlcnZlcikgLT4gVW5pdCwKICAgICApIDogSGFuZGxlci5DYWxsYmFjaywgSUJpbmRlci5EZWF0aFJlY2lwaWVudCB7CiAKLSAgICAgICAgcHJpdmF0ZSB2YXIgaXNEZXN0cm95ZWQgPSBmYWxzZQorICAgICAgICBwcml2YXRlIHZhciBpc0Rlc3Ryb3llZE9yRGVzdHJveWluZyA9IGZhbHNlCiAKICAgICAgICAgb3ZlcnJpZGUgZnVuIGhhbmRsZU1lc3NhZ2UobWVzc2FnZTogTWVzc2FnZSk6IEJvb2xlYW4geworICAgICAgICAgICAgaWYgKGlzRGVzdHJveWVkT3JEZXN0cm95aW5nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgd2hlbiAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgS2V5Z3VhcmRRdWlja0FmZm9yZGFuY2VQcmV2aWV3Q29uc3RhbnRzLk1FU1NBR0VfSURfU0xPVF9TRUxFQ1RFRCAtPiB7CiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YQpAQCAtMTE4LDE0ICsxMzIsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZ1biBvbkRlc3Ryb3koKTogSUJpbmRlcj8gewotICAgICAgICAgICAgaWYgKGlzRGVzdHJveWVkKSB7CisgICAgICAgICAgICBpZiAoaXNEZXN0cm95ZWRPckRlc3Ryb3lpbmcpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWUKKyAgICAgICAgICAgIGlzRGVzdHJveWVkT3JEZXN0cm95aW5nID0gdHJ1ZQogICAgICAgICAgICAgdmFsIGhvc3RUb2tlbiA9IHJlbmRlcmVyLmhvc3RUb2tlbgogICAgICAgICAgICAgaG9zdFRva2VuPy51bmxpbmtUb0RlYXRoKHRoaXMsIDApCi0gICAgICAgICAgICBydW5CbG9ja2luZyhtYWluRGlzcGF0Y2hlcikgeyByZW5kZXJlci5kZXN0cm95KCkgfQorICAgICAgICAgICAgc2NvcGUubGF1bmNoKG1haW5EaXNwYXRjaGVyKSB7IHJlbmRlcmVyLmRlc3Ryb3koKSB9CiAgICAgICAgICAgICByZXR1cm4gaG9zdFRva2VuCiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvdWkvdmlld21vZGVsL0tleWd1YXJkQm91bmNlclZpZXdNb2RlbC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC91aS92aWV3bW9kZWwvS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsLmt0CmluZGV4IDk3ZTk0ZDhmMy4uMDY1NmM5YiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3VpL3ZpZXdtb2RlbC9LZXlndWFyZEJvdW5jZXJWaWV3TW9kZWwua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3VpL3ZpZXdtb2RlbC9LZXlndWFyZEJvdW5jZXJWaWV3TW9kZWwua3QKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5kYXRhLkJvdW5jZXJWaWV3RGVsZWdhdGUKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5kb21haW4uaW50ZXJhY3Rvci5QcmltYXJ5Qm91bmNlckludGVyYWN0b3IKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQubW9kZWwuQm91bmNlclNob3dNZXNzYWdlTW9kZWwKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQubW9kZWwuS2V5Z3VhcmRCb3VuY2VyTW9kZWwKIGltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0CiBpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuRmxvdwogaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmZpbHRlck5vdE51bGwKQEAgLTM4LDE0ICszNywxMSBAQAogICAgIC8qKiBPYnNlcnZlIG9uIGJvdW5jZXIgZXhwYW5zaW9uIGFtb3VudC4gKi8KICAgICB2YWwgYm91bmNlckV4cGFuc2lvbkFtb3VudDogRmxvdzxGbG9hdD4gPSBpbnRlcmFjdG9yLnBhbmVsRXhwYW5zaW9uQW1vdW50CiAKLSAgICAvKiogT2JzZXJ2ZSBvbiBib3VuY2VyIHZpc2liaWxpdHkuICovCi0gICAgdmFsIGlzQm91bmNlclZpc2libGU6IEZsb3c8Qm9vbGVhbj4gPSBpbnRlcmFjdG9yLmlzVmlzaWJsZQotCiAgICAgLyoqIENhbiB0aGUgdXNlciBpbnRlcmFjdCB3aXRoIHRoZSB2aWV3PyAqLwogICAgIHZhbCBpc0ludGVyYWN0YWJsZTogRmxvdzxCb29sZWFuPiA9IGludGVyYWN0b3IuaXNJbnRlcmFjdGFibGUKIAogICAgIC8qKiBPYnNlcnZlIHdoZXRoZXIgYm91bmNlciBpcyBzaG93aW5nLiAqLwotICAgIHZhbCBzaG93OiBGbG93PEtleWd1YXJkQm91bmNlck1vZGVsPiA9IGludGVyYWN0b3Iuc2hvdworICAgIHZhbCBzaG93OiBGbG93PFVuaXQ+ID0gaW50ZXJhY3Rvci5zaG93CiAKICAgICAvKiogT2JzZXJ2ZSB3aGV0aGVyIGJvdW5jZXIgaXMgaGlkaW5nLiAqLwogICAgIHZhbCBoaWRlOiBGbG93PFVuaXQ+ID0gaW50ZXJhY3Rvci5oaWRlCkBAIC03NCw4ICs3MCw4IEBACiAgICAgLyoqIE9ic2VydmUgd2hldGhlciB3ZSBzaG91bGQgdXBkYXRlIGZwcyBpcyBzaG93aW5nLiAqLwogICAgIHZhbCBzaG91bGRVcGRhdGVTaWRlRnBzOiBGbG93PFVuaXQ+ID0KICAgICAgICAgbWVyZ2UoCi0gICAgICAgICAgICBpbnRlcmFjdG9yLnN0YXJ0aW5nVG9IaWRlLAotICAgICAgICAgICAgaW50ZXJhY3Rvci5pc1Zpc2libGUubWFwIHt9LAorICAgICAgICAgICAgaW50ZXJhY3Rvci5oaWRlLAorICAgICAgICAgICAgaW50ZXJhY3Rvci5zaG93LAogICAgICAgICAgICAgaW50ZXJhY3Rvci5zdGFydGluZ0Rpc2FwcGVhckFuaW1hdGlvbi5maWx0ZXJOb3ROdWxsKCkubWFwIHt9CiAgICAgICAgICkKIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2xvZy9kYWdnZXIvTG9nTW9kdWxlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbG9nL2RhZ2dlci9Mb2dNb2R1bGUuamF2YQppbmRleCBkMjQ2YjM1ZS4uODg5YWRjNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2xvZy9kYWdnZXIvTG9nTW9kdWxlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2xvZy9kYWdnZXIvTG9nTW9kdWxlLmphdmEKQEAgLTEzNiw2ICsxMzYsMTQgQEAKICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlKCJOb3RpZlNlY3Rpb25Mb2ciLCAxMDAwIC8qIG1heFNpemUgKi8sIGZhbHNlIC8qIHN5c3RyYWNlICovKTsKICAgICB9CiAKKyAgICAvKiogUHJvdmlkZXMgYSBsb2dnaW5nIGJ1ZmZlciBmb3IgYWxsIGxvZ3MgcmVsYXRlZCB0byByZW1vdGUgaW5wdXQgY29udHJvbGxlci4gKi8KKyAgICBAUHJvdmlkZXMKKyAgICBAU3lzVUlTaW5nbGV0b24KKyAgICBATm90aWZpY2F0aW9uUmVtb3RlSW5wdXRMb2cKKyAgICBwdWJsaWMgc3RhdGljIExvZ0J1ZmZlciBwcm92aWRlTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRMb2dCdWZmZXIoTG9nQnVmZmVyRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZSgiTm90aWZSZW1vdGVJbnB1dExvZyIsIDUwIC8qIG1heFNpemUgKi8sIGZhbHNlIC8qIHN5c3RyYWNlICovKTsKKyAgICB9CisKICAgICAvKiogUHJvdmlkZXMgYSBsb2dnaW5nIGJ1ZmZlciBmb3IgYWxsIGxvZ3MgcmVsYXRlZCB0byB0aGUgZGF0YSBsYXllciBvZiBub3RpZmljYXRpb25zLiAqLwogICAgIEBQcm92aWRlcwogICAgIEBTeXNVSVNpbmdsZXRvbgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3NoYXJlZC9tb2RlbC9LZXlndWFyZEJvdW5jZXJNb2RlbC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9sb2cvZGFnZ2VyL05vdGlmaWNhdGlvblJlbW90ZUlucHV0TG9nLmt0CnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvc2hhcmVkL21vZGVsL0tleWd1YXJkQm91bmNlck1vZGVsLmt0CmNvcHkgdG8gcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2xvZy9kYWdnZXIvTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRMb2cua3QKaW5kZXggYWQ3ODNkYS4uM2E2MzlhMCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3NoYXJlZC9tb2RlbC9LZXlndWFyZEJvdW5jZXJNb2RlbC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbG9nL2RhZ2dlci9Ob3RpZmljYXRpb25SZW1vdGVJbnB1dExvZy5rdApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTExLDE0ICsxMSwxNSBAQAogICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuc2hhcmVkLm1vZGVsCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLmxvZy5kYWdnZXIKIAotLyoqIE1vZGVscyB0aGUgc3RhdGUgb2YgdGhlIGxvY2stc2NyZWVuIGJvdW5jZXIgKi8KLWRhdGEgY2xhc3MgS2V5Z3VhcmRCb3VuY2VyTW9kZWwoCi0gICAgdmFsIHByb21wdFJlYXNvbjogSW50ID0gMCwKLSAgICB2YWwgZXJyb3JNZXNzYWdlOiBDaGFyU2VxdWVuY2U/ID0gbnVsbCwKLSAgICB2YWwgZXhwYW5zaW9uQW1vdW50OiBGbG9hdCA9IDBmLAotKQoraW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXIKKworLyoqIEEgW2NvbS5hbmRyb2lkLnN5c3RlbXVpLmxvZy5Mb2dCdWZmZXJdIGZvciBOb3RpZmljYXRpb25SZW1vdGVJbnB1dC4gKi8KK0BRdWFsaWZpZXIKK0BNdXN0QmVEb2N1bWVudGVkCitAUmV0ZW50aW9uKEFubm90YXRpb25SZXRlbnRpb24uUlVOVElNRSkKK2Fubm90YXRpb24gY2xhc3MgTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRMb2cKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9jb250cm9scy91aS9NZWRpYUNvbnRyb2xQYW5lbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhQ29udHJvbFBhbmVsLmphdmEKaW5kZXggYTMxYzFlNS4uMDBlNWFhYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhQ29udHJvbFBhbmVsLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhQ29udHJvbFBhbmVsLmphdmEKQEAgLTUxOSwxNiArNTE5LDE1IEBACiAgICAgICAgICAgICAgICAgbUxvZ2dlci5sb2dUYXBDb250ZW50VmlldyhtVWlkLCBtUGFja2FnZU5hbWUsIG1JbnN0YW5jZUlkKTsKICAgICAgICAgICAgICAgICBsb2dTbWFydHNwYWNlQ2FyZFJlcG9ydGVkKFNNQVJUU1BBQ0VfQ0FSRF9DTElDS19FVkVOVCk7CiAKLSAgICAgICAgICAgICAgICAvLyBTZWUgU3RhdHVzQmFyTm90aWZpY2F0aW9uQWN0aXZpdHlTdGFydGVyI29uTm90aWZpY2F0aW9uQ2xpY2tlZAogICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvd092ZXJMb2Nrc2NyZWVuID0gbUtleWd1YXJkU3RhdGVDb250cm9sbGVyLmlzU2hvd2luZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZpdHlJbnRlbnRIZWxwZXIud291bGRTaG93T3ZlckxvY2tzY3JlZW4oY2xpY2tJbnRlbnQuZ2V0SW50ZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZpdHlJbnRlbnRIZWxwZXIud291bGRQZW5kaW5nU2hvd092ZXJMb2Nrc2NyZWVuKGNsaWNrSW50ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2tzY3JlZW5Vc2VyTWFuYWdlci5nZXRDdXJyZW50VXNlcklkKCkpOwotCiAgICAgICAgICAgICAgICAgaWYgKHNob3dPdmVyTG9ja3NjcmVlbikgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlTdGFydGVyLnN0YXJ0QWN0aXZpdHkoY2xpY2tJbnRlbnQuZ2V0SW50ZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzbWlzc1NoYWRlICovIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5pbWF0aW9uQ29udHJvbGxlciAqLyBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3dPdmVyTG9ja3NjcmVlbldoZW5Mb2NrZWQgKi8gdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlja0ludGVudC5zZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGVuZGluZyBpbnRlbnQgZm9yICIgKyBrZXkgKyAiIHdhcyBjYW5jZWxsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eVN0YXJ0ZXIucG9zdFN0YXJ0QWN0aXZpdHlEaXNtaXNzaW5nS2V5Z3VhcmQoY2xpY2tJbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRMYXVuY2hBbmltYXRvckNvbnRyb2xsZXIobU1lZGlhVmlld0hvbGRlci5nZXRQbGF5ZXIoKSkpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhSGllcmFyY2h5TWFuYWdlci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9jb250cm9scy91aS9NZWRpYUhpZXJhcmNoeU1hbmFnZXIua3QKaW5kZXggN2ZjN2JkYi4uZTEwZDc0ZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhSGllcmFyY2h5TWFuYWdlci5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvY29udHJvbHMvdWkvTWVkaWFIaWVyYXJjaHlNYW5hZ2VyLmt0CkBAIC02MzksNyArNjM5LDkgQEAKICAgICApID0KICAgICAgICAgdHJhY2VTZWN0aW9uKCJNZWRpYUhpZXJhcmNoeU1hbmFnZXIjdXBkYXRlRGVzaXJlZExvY2F0aW9uIikgewogICAgICAgICAgICAgdmFsIGRlc2lyZWRMb2NhdGlvbiA9IGNhbGN1bGF0ZUxvY2F0aW9uKCkKLSAgICAgICAgICAgIGlmIChkZXNpcmVkTG9jYXRpb24gIT0gdGhpcy5kZXNpcmVkTG9jYXRpb24gfHwgZm9yY2VTdGF0ZVVwZGF0ZSkgeworICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGRlc2lyZWRMb2NhdGlvbiAhPSB0aGlzLmRlc2lyZWRMb2NhdGlvbiB8fCBmb3JjZVN0YXRlVXBkYXRlICYmICFibG9ja0xvY2F0aW9uQ2hhbmdlcworICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVzaXJlZExvY2F0aW9uID49IDAgJiYgZGVzaXJlZExvY2F0aW9uICE9IHRoaXMuZGVzaXJlZExvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHByZXZpb3VzIGxvY2F0aW9uIHdoZW4gaXQgYWN0dWFsbHkgY2hhbmdlcwogICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0xvY2F0aW9uID0gdGhpcy5kZXNpcmVkTG9jYXRpb24KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRBZGFwdGVyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0QWRhcHRlci5qYXZhCmluZGV4IDAwZTlhNzkuLmI3MWE5MTkzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0QWRhcHRlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRBZGFwdGVyLmphdmEKQEAgLTE2LDE3ICsxNiwxNiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm1lZGlhLmRpYWxvZzsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TRUxFQ1RJT05fQkVIQVZJT1JfR09fVE9fQVBQOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TRUxFQ1RJT05fQkVIQVZJT1JfTk9ORTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uU0VMRUNUSU9OX0JFSEFWSU9SX1RSQU5TRkVSOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TVUJURVhUX0FEX1JPVVRJTkdfRElTQUxMT1dFRDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uU1VCVEVYVF9ET1dOTE9BREVEX0NPTlRFTlRfUk9VVElOR19ESVNBTExPV0VEOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TVUJURVhUX1NVQlNDUklQVElPTl9SRVFVSVJFRDsKIAoraW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5tZWRpYS5NZWRpYURldmljZS5TZWxlY3Rpb25CZWhhdmlvci5TRUxFQ1RJT05fQkVIQVZJT1JfR09fVE9fQVBQOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXR0aW5nc2xpYi5tZWRpYS5NZWRpYURldmljZS5TZWxlY3Rpb25CZWhhdmlvci5TRUxFQ1RJT05fQkVIQVZJT1JfTk9ORTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIubWVkaWEuTWVkaWFEZXZpY2UuU2VsZWN0aW9uQmVoYXZpb3IuU0VMRUNUSU9OX0JFSEFWSU9SX1RSQU5TRkVSOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRlZFZlY3RvckRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKQEAgLTI5Niw2ICsyOTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Db250cm9sbGVyLmlzQWR2YW5jZWRMYXlvdXRTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCB0aGVyZSdzIG90aGVyIHNlbGVjdGFibGUgZGV2aWNlcywgbGF5b3V0IGFzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgb2Ygc2VsZWN0ZWQgZGV2aWNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRpdGxlSWNvbihSLmRyYXdhYmxlLm1lZGlhX291dHB1dF9pY29uX3ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQ29udGVudCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNEZXZpY2VEZXNlbGVjdGFibGUgPSBpc0RldmljZUluY2x1ZGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5nZXREZXNlbGVjdGFibGVNZWRpYURldmljZSgpLCBkZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlR3JvdXBhYmxlQ2hlY2tCb3godHJ1ZSwgaXNEZXZpY2VEZXNlbGVjdGFibGUsIGRldmljZSk7CkBAIC0zNzEsNyArMzcyLDggQEAKICAgICAgICAgICAgIG1FbmRDbGlja0ljb24uc2V0T25DbGlja0xpc3RlbmVyKG51bGwpOwogICAgICAgICAgICAgbUVuZFRvdWNoQXJlYS5zZXRPbkNsaWNrTGlzdGVuZXIobnVsbCk7CiAgICAgICAgICAgICB1cGRhdGVFbmRDbGlja0FyZWFDb2xvcihtQ29udHJvbGxlci5nZXRDb2xvclNlZWtiYXJQcm9ncmVzcygpKTsKLSAgICAgICAgICAgIG1FbmRDbGlja0ljb24uc2V0Q29sb3JGaWx0ZXIobUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQ29udGVudCgpKTsKKyAgICAgICAgICAgIG1FbmRDbGlja0ljb24uc2V0SW1hZ2VUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpKTsKICAgICAgICAgICAgIG1FbmRDbGlja0ljb24uc2V0T25DbGlja0xpc3RlbmVyKAogICAgICAgICAgICAgICAgICAgICB2IC0+IG1Db250cm9sbGVyLnRyeVRvTGF1bmNoSW5BcHBSb3V0aW5nSW50ZW50KGRldmljZS5nZXRJZCgpLCB2KSk7CiAgICAgICAgICAgICBtRW5kVG91Y2hBcmVhLnNldE9uQ2xpY2tMaXN0ZW5lcih2IC0+IG1DaGVja0JveC5wZXJmb3JtQ2xpY2soKSk7CkBAIC0zNzksOCArMzgxLDggQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVFbmRDbGlja0FyZWFDb2xvcihpbnQgY29sb3IpIHsKICAgICAgICAgICAgIGlmIChtQ29udHJvbGxlci5pc0FkdmFuY2VkTGF5b3V0U3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICBtRW5kVG91Y2hBcmVhLmdldEJhY2tncm91bmQoKS5zZXRDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoY29sb3IsIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pKTsKKyAgICAgICAgICAgICAgICBtRW5kVG91Y2hBcmVhLnNldEJhY2tncm91bmRUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yU3RhdGVMaXN0LnZhbHVlT2YoY29sb3IpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zOTQsMjIgKzM5NiwyMiBAQAogICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29ubmVjdGlvbkZhaWxlZFN0YXR1c0ljb24oKSB7CiAgICAgICAgICAgICBtU3RhdHVzSWNvbi5zZXRJbWFnZURyYXdhYmxlKAogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm1lZGlhX291dHB1dF9zdGF0dXNfZmFpbGVkKSk7Ci0gICAgICAgICAgICBtU3RhdHVzSWNvbi5zZXRDb2xvckZpbHRlcihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpOworICAgICAgICAgICAgbVN0YXR1c0ljb24uc2V0SW1hZ2VUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEZXZpY2VTdGF0dXNJY29uKERyYXdhYmxlIGRyYXdhYmxlKSB7CiAgICAgICAgICAgICBtU3RhdHVzSWNvbi5zZXRJbWFnZURyYXdhYmxlKGRyYXdhYmxlKTsKLSAgICAgICAgICAgIG1TdGF0dXNJY29uLnNldENvbG9yRmlsdGVyKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSk7CisgICAgICAgICAgICBtU3RhdHVzSWNvbi5zZXRJbWFnZVRpbnRMaXN0KAorICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSkpOwogICAgICAgICAgICAgaWYgKGRyYXdhYmxlIGluc3RhbmNlb2YgQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZSkgewogICAgICAgICAgICAgICAgICgoQW5pbWF0ZWRWZWN0b3JEcmF3YWJsZSkgZHJhd2FibGUpLnN0YXJ0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUHJvZ3Jlc3NCYXJDb2xvcigpIHsKLSAgICAgICAgICAgIG1Qcm9ncmVzc0Jhci5nZXRJbmRldGVybWluYXRlRHJhd2FibGUoKS5zZXRDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTikpOworICAgICAgICAgICAgbVByb2dyZXNzQmFyLmdldEluZGV0ZXJtaW5hdGVEcmF3YWJsZSgpLnNldFRpbnRMaXN0KAorICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRW5kQ2xpY2tBcmVhKE1lZGlhRGV2aWNlIGRldmljZSwgYm9vbGVhbiBpc0RldmljZURlc2VsZWN0YWJsZSkgewpAQCAtNDE5LDkgKzQyMSw4IEBACiAgICAgICAgICAgICBtRW5kVG91Y2hBcmVhLnNldEltcG9ydGFudEZvckFjY2Vzc2liaWxpdHkoCiAgICAgICAgICAgICAgICAgICAgIFZpZXcuSU1QT1JUQU5UX0ZPUl9BQ0NFU1NJQklMSVRZX1lFUyk7CiAgICAgICAgICAgICBpZiAobUNvbnRyb2xsZXIuaXNBZHZhbmNlZExheW91dFN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbUVuZFRvdWNoQXJlYS5nZXRCYWNrZ3JvdW5kKCkuc2V0Q29sb3JGaWx0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTikpOworICAgICAgICAgICAgICAgIG1FbmRUb3VjaEFyZWEuc2V0QmFja2dyb3VuZFRpbnRMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1CYWNrZ3JvdW5kKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNldFVwQ29udGVudERlc2NyaXB0aW9uRm9yVmlldyhtRW5kVG91Y2hBcmVhLCB0cnVlLCBkZXZpY2UpOwogICAgICAgICB9CkBAIC00NTAsMTEgKzQ1MSwxMSBAQAogICAgICAgICAgICAgICAgIHNldFNpbmdsZUxpbmVMYXlvdXQobUNvbnRleHQuZ2V0VGV4dChSLnN0cmluZy5tZWRpYV9vdXRwdXRfZGlhbG9nX3BhaXJpbmdfbmV3KSk7CiAgICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgYWRkRHJhd2FibGUgPSBtQ29udGV4dC5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2FkZCk7CiAgICAgICAgICAgICAgICAgbVRpdGxlSWNvbi5zZXRJbWFnZURyYXdhYmxlKGFkZERyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICBtVGl0bGVJY29uLnNldENvbG9yRmlsdGVyKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSk7CisgICAgICAgICAgICAgICAgbVRpdGxlSWNvbi5zZXRJbWFnZVRpbnRMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpKTsKICAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xsZXIuaXNBZHZhbmNlZExheW91dFN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JY29uQXJlYUxheW91dC5nZXRCYWNrZ3JvdW5kKCkuc2V0Q29sb3JGaWx0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1CYWNrZ3JvdW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7CisgICAgICAgICAgICAgICAgICAgIG1JY29uQXJlYUxheW91dC5zZXRCYWNrZ3JvdW5kVGludExpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1CYWNrZ3JvdW5kKCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUNvbnRhaW5lckxheW91dC5zZXRPbkNsaWNrTGlzdGVuZXIobUNvbnRyb2xsZXI6OmxhdW5jaEJsdWV0b290aFBhaXJpbmcpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2RpYWxvZy9NZWRpYU91dHB1dEJhc2VBZGFwdGVyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0QmFzZUFkYXB0ZXIuamF2YQppbmRleCAyYTJjZjYzLi5mNzZmMDQ5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0QmFzZUFkYXB0ZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0QmFzZUFkYXB0ZXIuamF2YQpAQCAtMjMsOCArMjMsNyBAQAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5EcmF3YWJsZVJlczsKIGltcG9ydCBhbmRyb2lkLmFwcC5XYWxscGFwZXJDb2xvcnM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNsaXBEcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwpAQCAtMTk2LDkgKzE5NSw4IEBACiAgICAgICAgICAgICAgICAgbUljb25BcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihudWxsKTsKICAgICAgICAgICAgICAgICBtVm9sdW1lVmFsdWVUZXh0LnNldFRleHRDb2xvcihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlZWtCYXIuZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldENvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKG1Db250cm9sbGVyLmdldENvbG9yU2Vla2JhclByb2dyZXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTikpOworICAgICAgICAgICAgbVNlZWtCYXIuc2V0UHJvZ3Jlc3NUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihtQ29udHJvbGxlci5nZXRDb2xvclNlZWtiYXJQcm9ncmVzcygpKSk7CiAgICAgICAgIH0KIAogICAgICAgICBhYnN0cmFjdCB2b2lkIG9uQmluZChpbnQgY3VzdG9taXplZEl0ZW0pOwpAQCAtMjI0LDE2ICsyMjIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2Vla2JhclByb2dyZXNzQmFja2dyb3VuZCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JdGVtTGF5b3V0LmdldEJhY2tncm91bmQoKS5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZSA/IG1Db250cm9sbGVyLmdldENvbG9yQ29ubmVjdGVkSXRlbUJhY2tncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQmFja2dyb3VuZCgpLAotICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7CisgICAgICAgICAgICBtSXRlbUxheW91dC5zZXRCYWNrZ3JvdW5kVGludExpc3QoCisgICAgICAgICAgICAgICAgICAgIENvbG9yU3RhdGVMaXN0LnZhbHVlT2YoaXNBY3RpdmUgPyBtQ29udHJvbGxlci5nZXRDb2xvckNvbm5lY3RlZEl0ZW1CYWNrZ3JvdW5kKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSkpOwogICAgICAgICAgICAgaWYgKG1Db250cm9sbGVyLmlzQWR2YW5jZWRMYXlvdXRTdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgIG1JY29uQXJlYUxheW91dC5nZXRCYWNrZ3JvdW5kKCkuc2V0Q29sb3JGaWx0ZXIobmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3dTZWVrQmFyID8gbUNvbnRyb2xsZXIuZ2V0Q29sb3JTZWVrYmFyUHJvZ3Jlc3MoKQorICAgICAgICAgICAgICAgIG1JY29uQXJlYUxheW91dC5zZXRCYWNrZ3JvdW5kVGludExpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKHNob3dTZWVrQmFyID8gbUNvbnRyb2xsZXIuZ2V0Q29sb3JTZWVrYmFyUHJvZ3Jlc3MoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNob3dQcm9ncmVzc0JhciA/IG1Db250cm9sbGVyLmdldENvbG9yQ29ubmVjdGVkSXRlbUJhY2tncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQmFja2dyb3VuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQmFja2dyb3VuZCgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUHJvZ3Jlc3NCYXIuc2V0VmlzaWJpbGl0eShzaG93UHJvZ3Jlc3NCYXIgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwogICAgICAgICAgICAgbVNlZWtCYXIuc2V0QWxwaGEoMSk7CkBAIC0yNTEsNyArMjQ3LDggQEAKICAgICAgICAgICAgICAgICBwYXJhbXMucmlnaHRNYXJnaW4gPSBzaG93RW5kVG91Y2hBcmVhID8gbUNvbnRyb2xsZXIuZ2V0SXRlbU1hcmdpbkVuZFNlbGVjdGFibGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ29udHJvbGxlci5nZXRJdGVtTWFyZ2luRW5kRGVmYXVsdCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRpdGxlSWNvbi5zZXRDb2xvckZpbHRlcihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpOworICAgICAgICAgICAgbVRpdGxlSWNvbi5zZXRCYWNrZ3JvdW5kVGludExpc3QoCisgICAgICAgICAgICAgICAgICAgIENvbG9yU3RhdGVMaXN0LnZhbHVlT2YobUNvbnRyb2xsZXIuZ2V0Q29sb3JJdGVtQ29udGVudCgpKSk7CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHNldFR3b0xpbmVMYXlvdXQoTWVkaWFEZXZpY2UgZGV2aWNlLCBib29sZWFuIGJGb2N1c2VkLCBib29sZWFuIHNob3dTZWVrQmFyLApAQCAtMjc0LDE1ICsyNzEsMTQgQEAKICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kRHJhd2FibGUgPSBtQ29udGV4dC5nZXREcmF3YWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dTZWVrQmFyID8gUi5kcmF3YWJsZS5tZWRpYV9vdXRwdXRfaXRlbV9iYWNrZ3JvdW5kX2FjdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUubWVkaWFfb3V0cHV0X2l0ZW1fYmFja2dyb3VuZCkubXV0YXRlKCk7Ci0gICAgICAgICAgICAgICAgYmFja2dyb3VuZERyYXdhYmxlLnNldENvbG9yRmlsdGVyKG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoCisgICAgICAgICAgICAgICAgYmFja2dyb3VuZERyYXdhYmxlLnNldFRpbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICBzaG93U2Vla0JhciA/IG1Db250cm9sbGVyLmdldENvbG9yQ29ubmVjdGVkSXRlbUJhY2tncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTikpOwotICAgICAgICAgICAgICAgIG1JY29uQXJlYUxheW91dC5nZXRCYWNrZ3JvdW5kKCkuc2V0Q29sb3JGaWx0ZXIobmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3dQcm9ncmVzc0JhciB8fCBpc0Zha2VBY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1CYWNrZ3JvdW5kKCkpOworICAgICAgICAgICAgICAgIG1JY29uQXJlYUxheW91dC5zZXRCYWNrZ3JvdW5kVGludExpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclN0YXRlTGlzdC52YWx1ZU9mKHNob3dQcm9ncmVzc0JhciB8fCBpc0Zha2VBY3RpdmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtQ29udHJvbGxlci5nZXRDb2xvckNvbm5lY3RlZEl0ZW1CYWNrZ3JvdW5kKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzaG93U2Vla0JhciA/IG1Db250cm9sbGVyLmdldENvbG9yU2Vla2JhclByb2dyZXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSkpOwogICAgICAgICAgICAgICAgIGlmIChzaG93U2Vla0JhcikgewogICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZWVrYmFyUHJvZ3Jlc3NCYWNrZ3JvdW5kKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjk3LDkgKzI5Myw3IEBACiAgICAgICAgICAgICAgICAgYmFja2dyb3VuZERyYXdhYmxlID0gbUNvbnRleHQuZ2V0RHJhd2FibGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUubWVkaWFfb3V0cHV0X2l0ZW1fYmFja2dyb3VuZCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5tdXRhdGUoKTsKLSAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIobmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLmdldENvbG9ySXRlbUJhY2tncm91bmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pKTsKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kRHJhd2FibGUuc2V0VGludChtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1CYWNrZ3JvdW5kKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUl0ZW1MYXlvdXQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kRHJhd2FibGUpOwogICAgICAgICAgICAgbVByb2dyZXNzQmFyLnNldFZpc2liaWxpdHkoc2hvd1Byb2dyZXNzQmFyID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKQEAgLTQ0MiwxMSArNDM2LDEwIEBACiAKICAgICAgICAgdm9pZCB1cGRhdGVUaXRsZUljb24oQERyYXdhYmxlUmVzIGludCBpZCwgaW50IGNvbG9yKSB7CiAgICAgICAgICAgICBtVGl0bGVJY29uLnNldEltYWdlRHJhd2FibGUobUNvbnRleHQuZ2V0RHJhd2FibGUoaWQpKTsKLSAgICAgICAgICAgIG1UaXRsZUljb24uc2V0Q29sb3JGaWx0ZXIoY29sb3IpOworICAgICAgICAgICAgbVRpdGxlSWNvbi5zZXRJbWFnZVRpbnRMaXN0KENvbG9yU3RhdGVMaXN0LnZhbHVlT2YoY29sb3IpKTsKICAgICAgICAgICAgIGlmIChtQ29udHJvbGxlci5pc0FkdmFuY2VkTGF5b3V0U3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICBtSWNvbkFyZWFMYXlvdXQuZ2V0QmFja2dyb3VuZCgpLnNldENvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcihtQ29udHJvbGxlci5nZXRDb2xvclNlZWtiYXJQcm9ncmVzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7CisgICAgICAgICAgICAgICAgbUljb25BcmVhTGF5b3V0LnNldEJhY2tncm91bmRUaW50TGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yU3RhdGVMaXN0LnZhbHVlT2YobUNvbnRyb2xsZXIuZ2V0Q29sb3JTZWVrYmFyUHJvZ3Jlc3MoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTQ2Miw5ICs0NTUsNyBAQAogICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgYmFja2dyb3VuZERyYXdhYmxlID0gbUNvbnRleHQuZ2V0RHJhd2FibGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLm1lZGlhX291dHB1dF9pdGVtX2JhY2tncm91bmRfYWN0aXZlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tdXRhdGUoKTsKLSAgICAgICAgICAgIGJhY2tncm91bmREcmF3YWJsZS5zZXRDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcihtQ29udHJvbGxlci5nZXRDb2xvckNvbm5lY3RlZEl0ZW1CYWNrZ3JvdW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTikpOworICAgICAgICAgICAgYmFja2dyb3VuZERyYXdhYmxlLnNldFRpbnQobUNvbnRyb2xsZXIuZ2V0Q29sb3JDb25uZWN0ZWRJdGVtQmFja2dyb3VuZCgpKTsKICAgICAgICAgICAgIG1JdGVtTGF5b3V0LnNldEJhY2tncm91bmQoYmFja2dyb3VuZERyYXdhYmxlKTsKICAgICAgICAgfQogCkBAIC01MzksMTAgKzUzMCw4IEBACiAgICAgICAgIERyYXdhYmxlIGdldFNwZWFrZXJEcmF3YWJsZSgpIHsKICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGRyYXdhYmxlID0gbUNvbnRleHQuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zcGVha2VyX2dyb3VwX2JsYWNrXzI0ZHApCiAgICAgICAgICAgICAgICAgICAgIC5tdXRhdGUoKTsKLSAgICAgICAgICAgIGRyYXdhYmxlLnNldENvbG9yRmlsdGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKFV0aWxzLmdldENvbG9yU3RhdGVMaXN0RGVmYXVsdENvbG9yKG1Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuY29sb3IubWVkaWFfZGlhbG9nX2l0ZW1fbWFpbl9jb250ZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKSk7CisgICAgICAgICAgICBkcmF3YWJsZS5zZXRUaW50KFV0aWxzLmdldENvbG9yU3RhdGVMaXN0RGVmYXVsdENvbG9yKG1Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICBSLmNvbG9yLm1lZGlhX2RpYWxvZ19pdGVtX21haW5fY29udGVudCkpOwogICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwogICAgICAgICB9CiAKQEAgLTU3NCw3ICs1NjMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1UaXRsZUljb24uc2V0SW1hZ2VJY29uKGljb24pOwotICAgICAgICAgICAgICAgICAgICBtVGl0bGVJY29uLnNldENvbG9yRmlsdGVyKG1Db250cm9sbGVyLmdldENvbG9ySXRlbUNvbnRlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGljb24uc2V0VGludChtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVJY29uLnNldEltYWdlVGludExpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3QudmFsdWVPZihtQ29udHJvbGxlci5nZXRDb2xvckl0ZW1Db250ZW50KCkpKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgIH0pOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0TWV0cmljTG9nZ2VyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0TWV0cmljTG9nZ2VyLmphdmEKaW5kZXggMjI1MGQ3Mi4uMzlkNGU2ZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2RpYWxvZy9NZWRpYU91dHB1dE1ldHJpY0xvZ2dlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9kaWFsb2cvTWVkaWFPdXRwdXRNZXRyaWNMb2dnZXIuamF2YQpAQCAtODAsNiArODAsMTAgQEAKICAgICAgICAgICAgIExvZy5kKFRBRywgImxvZ091dHB1dFN1Y2Nlc3MgLSBzZWxlY3RlZCBkZXZpY2U6ICIgKyBzZWxlY3RlZERldmljZVR5cGUpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1Tb3VyY2VEZXZpY2UgPT0gbnVsbCAmJiBtVGFyZ2V0RGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIHVwZGF0ZUxvZ2dpbmdEZXZpY2VDb3VudChkZXZpY2VMaXN0KTsKIAogICAgICAgICBTeXNVaVN0YXRzTG9nLndyaXRlKApAQCAtMTA1LDYgKzEwOSwxMCBAQAogICAgICAgICAgICAgTG9nLmQoVEFHLCAibG9nT3V0cHV0U3VjY2VzcyAtIHNlbGVjdGVkIGRldmljZTogIiArIHNlbGVjdGVkRGV2aWNlVHlwZSk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobVNvdXJjZURldmljZSA9PSBudWxsICYmIG1UYXJnZXREZXZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgdXBkYXRlTG9nZ2luZ01lZGlhSXRlbUNvdW50KGRldmljZUl0ZW1MaXN0KTsKIAogICAgICAgICBTeXNVaVN0YXRzTG9nLndyaXRlKApAQCAtMTc2LDYgKzE4NCwxMCBAQAogICAgICAgICAgICAgTG9nLmUoVEFHLCAibG9nUmVxdWVzdEZhaWxlZCAtICIgKyByZWFzb24pOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1Tb3VyY2VEZXZpY2UgPT0gbnVsbCAmJiBtVGFyZ2V0RGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIHVwZGF0ZUxvZ2dpbmdEZXZpY2VDb3VudChkZXZpY2VMaXN0KTsKIAogICAgICAgICBTeXNVaVN0YXRzTG9nLndyaXRlKApAQCAtMjAxLDYgKzIxMywxMCBAQAogICAgICAgICAgICAgTG9nLmUoVEFHLCAibG9nUmVxdWVzdEZhaWxlZCAtICIgKyByZWFzb24pOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1Tb3VyY2VEZXZpY2UgPT0gbnVsbCAmJiBtVGFyZ2V0RGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIHVwZGF0ZUxvZ2dpbmdNZWRpYUl0ZW1Db3VudChkZXZpY2VJdGVtTGlzdCk7CiAKICAgICAgICAgU3lzVWlTdGF0c0xvZy53cml0ZSgKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS90YXB0b3RyYW5zZmVyL3JlY2VpdmVyL01lZGlhVHR0Q2hpcENvbnRyb2xsZXJSZWNlaXZlci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS90YXB0b3RyYW5zZmVyL3JlY2VpdmVyL01lZGlhVHR0Q2hpcENvbnRyb2xsZXJSZWNlaXZlci5rdAppbmRleCBmYWI4YzA2Li43ODA4MmMzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvdGFwdG90cmFuc2Zlci9yZWNlaXZlci9NZWRpYVR0dENoaXBDb250cm9sbGVyUmVjZWl2ZXIua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL3RhcHRvdHJhbnNmZXIvcmVjZWl2ZXIvTWVkaWFUdHRDaGlwQ29udHJvbGxlclJlY2VpdmVyLmt0CkBAIC0yMjUsOCArMjI1LDEwIEBACiAgICAgICAgIHZhbCBpY29uUmlwcGxlVmlldzogUmVjZWl2ZXJDaGlwUmlwcGxlVmlldyA9IHZpZXcucmVxdWlyZVZpZXdCeUlkKFIuaWQuaWNvbl9nbG93X3JpcHBsZSkKICAgICAgICAgdmFsIHJpcHBsZVZpZXc6IFJlY2VpdmVyQ2hpcFJpcHBsZVZpZXcgPSB2aWV3LnJlcXVpcmVWaWV3QnlJZChSLmlkLnJpcHBsZSkKICAgICAgICAgdmFsIHRyYW5zbGF0aW9uWUJ5ID0gZ2V0VHJhbnNsYXRpb25BbW91bnQoKQorICAgICAgICAvLyBFeHBhbmQgcmlwcGxlIGJlZm9yZSB0cmFuc2xhdGluZyBpY29uIGNvbnRhaW5lciB0byBtYWtlIHN1cmUgYm90aCB2aWV3cyBoYXZlIHNhbWUgYm91bmRzLgorICAgICAgICByaXBwbGVDb250cm9sbGVyLmV4cGFuZFRvSW5Qcm9ncmVzc1N0YXRlKHJpcHBsZVZpZXcsIGljb25SaXBwbGVWaWV3KQogICAgICAgICAvLyBNYWtlIHRoZSBpY29uIGNvbnRhaW5lciB2aWV3IHN0YXJ0cyBhbmltYXRpb24gZnJvbSBib3R0b20gb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgaWNvbkNvbnRhaW5lclZpZXcudHJhbnNsYXRpb25ZICs9IHJpcHBsZUNvbnRyb2xsZXIuZ2V0UmVjZWl2ZXJJY29uU2l6ZSgpCisgICAgICAgIGljb25Db250YWluZXJWaWV3LnRyYW5zbGF0aW9uWSA9IHJpcHBsZUNvbnRyb2xsZXIuZ2V0UmVjZWl2ZXJJY29uU2l6ZSgpLnRvRmxvYXQoKQogICAgICAgICBhbmltYXRlVmlld1RyYW5zbGF0aW9uQW5kRmFkZSgKICAgICAgICAgICAgIGljb25Db250YWluZXJWaWV3LAogICAgICAgICAgICAgdHJhbnNsYXRpb25ZQnkgPSAtMSAqIHRyYW5zbGF0aW9uWUJ5LApAQCAtMjM1LDcgKzIzNyw2IEBACiAgICAgICAgICkgewogICAgICAgICAgICAgYW5pbWF0ZUJvdW5jaW5nVmlldyhpY29uQ29udGFpbmVyVmlldywgdHJhbnNsYXRpb25ZQnkgKiBCT1VOQ0VfVFJBTlNMQVRJT05fUkFUSU8pCiAgICAgICAgIH0KLSAgICAgICAgcmlwcGxlQ29udHJvbGxlci5leHBhbmRUb0luUHJvZ3Jlc3NTdGF0ZShyaXBwbGVWaWV3LCBpY29uUmlwcGxlVmlldykKICAgICB9CiAKICAgICBvdmVycmlkZSBmdW4gYW5pbWF0ZVZpZXdPdXQodmlldzogVmlld0dyb3VwLCByZW1vdmFsUmVhc29uOiBTdHJpbmc/LCBvbkFuaW1hdGlvbkVuZDogUnVubmFibGUpIHsKQEAgLTI5Myw3ICsyOTQsNyBAQAogCiAgICAgLyoqIFJldHVybnMgdGhlIGFtb3VudCB0aGF0IHRoZSBjaGlwIHdpbGwgYmUgdHJhbnNsYXRlZCBieSBpbiBpdHMgaW50cm8gYW5pbWF0aW9uLiAqLwogICAgIHByaXZhdGUgZnVuIGdldFRyYW5zbGF0aW9uQW1vdW50KCk6IEZsb2F0IHsKLSAgICAgICAgcmV0dXJuIHJpcHBsZUNvbnRyb2xsZXIuZ2V0UmlwcGxlU2l6ZSgpICogMC41ZgorICAgICAgICByZXR1cm4gcmlwcGxlQ29udHJvbGxlci5nZXRSZWNlaXZlckljb25TaXplKCkgKiAyZgogICAgIH0KIAogICAgIHByaXZhdGUgZnVuIFZpZXcuZ2V0QXBwSWNvblZpZXcoKTogQ2FjaGluZ0ljb25WaWV3IHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvbW9kZWwvTXVsdGlTaGFkZUludGVyYWN0aW9uTW9kZWwua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9kYXRhL21vZGVsL011bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODAyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9kYXRhL21vZGVsL011bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsLmt0CkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEubW9kZWwKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlNoYWRlSWQKKworLyoqIE1vZGVscyB0aGUgY3VycmVudCBpbnRlcmFjdGlvbiB3aXRoIG9uZSBvZiB0aGUgc2hhZGVzLiAqLworZGF0YSBjbGFzcyBNdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbCgKKyAgICAvKiogVGhlIElEIG9mIHRoZSBzaGFkZSB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBpbnRlcmFjdGluZyB3aXRoLiAqLworICAgIHZhbCBzaGFkZUlkOiBTaGFkZUlkLAorICAgIC8qKiBXaGV0aGVyIHRoZSBpbnRlcmFjdGlvbiBpcyBwcm94aWVkIChhcyBpbjogY29taW5nIGZyb20gYW4gZXh0ZXJuYWwgYXBwIG9yIGRpZmZlcmVudCBVSSkuICovCisgICAgdmFsIGlzUHJveGllZDogQm9vbGVhbiwKKykKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvcmVtb3RlcHJveHkvTXVsdGlTaGFkZUlucHV0UHJveHkua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9kYXRhL3JlbW90ZXByb3h5L011bHRpU2hhZGVJbnB1dFByb3h5Lmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZjBjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9kYXRhL3JlbW90ZXByb3h5L011bHRpU2hhZGVJbnB1dFByb3h5Lmt0CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVtb3RlcHJveHkKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlByb3hpZWRJbnB1dE1vZGVsCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdAoraW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b24KK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuY2hhbm5lbHMuQnVmZmVyT3ZlcmZsb3cKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5GbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuTXV0YWJsZVNoYXJlZEZsb3cKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5hc1NoYXJlZEZsb3cKKworLyoqCisgKiBBY3RzIGFzIGEgaHViIGZvciByb3V0aW5nIHByb3hpZWQgdXNlciBpbnB1dCBpbnRvIHRoZSBtdWx0aSBzaGFkZSBzeXN0ZW0uCisgKgorICogIlByb3hpZWQiIHVzZXIgaW5wdXQgaXMgY29taW5nIHRocm91Z2ggYSBwcm94eTsgdHlwaWNhbGx5IGZyb20gYW4gZXh0ZXJuYWwgYXBwIG9yIGRpZmZlcmVudCBVSS4KKyAqIEluIG90aGVyIHdvcmRzOiBpdCdzIG5vdCB1c2VyIGlucHV0IHRoYXQncyBvY2N1cnJpbmcgZGlyZWN0bHkgb24gdGhlIHNoYWRlIFVJIGl0c2VsZi4gVGhpcyBjbGFzcworICogaXMgdGhhdCBwcm94eS4KKyAqLworQFNpbmdsZXRvbgorY2xhc3MgTXVsdGlTaGFkZUlucHV0UHJveHkgQEluamVjdCBjb25zdHJ1Y3RvcigpIHsKKyAgICBwcml2YXRlIHZhbCBfcHJveGllZFRvdWNoID0KKyAgICAgICAgTXV0YWJsZVNoYXJlZEZsb3c8UHJveGllZElucHV0TW9kZWw+KAorICAgICAgICAgICAgcmVwbGF5ID0gMSwKKyAgICAgICAgICAgIG9uQnVmZmVyT3ZlcmZsb3cgPSBCdWZmZXJPdmVyZmxvdy5EUk9QX09MREVTVCwKKyAgICAgICAgKQorICAgIHZhbCBwcm94aWVkSW5wdXQ6IEZsb3c8UHJveGllZElucHV0TW9kZWw+ID0gX3Byb3hpZWRUb3VjaC5hc1NoYXJlZEZsb3coKQorCisgICAgZnVuIG9uUHJveGllZElucHV0KHByb3hpZWRJbnB1dDogUHJveGllZElucHV0TW9kZWwpIHsKKyAgICAgICAgX3Byb3hpZWRUb3VjaC50cnlFbWl0KHByb3hpZWRJbnB1dCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9kYXRhL3JlcG9zaXRvcnkvTXVsdGlTaGFkZVJlcG9zaXRvcnkua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9kYXRhL3JlcG9zaXRvcnkvTXVsdGlTaGFkZVJlcG9zaXRvcnkua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3MjAzMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvcmVwb3NpdG9yeS9NdWx0aVNoYWRlUmVwb3NpdG9yeS5rdApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZXBvc2l0b3J5CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dAoraW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uRmxvYXRSYW5nZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5kYWdnZXIuU3lzVUlTaW5nbGV0b24KK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5kYWdnZXIucXVhbGlmaWVycy5BcHBsaWNhdGlvbgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5tb2RlbC5NdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZW1vdGVwcm94eS5NdWx0aVNoYWRlSW5wdXRQcm94eQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlByb3hpZWRJbnB1dE1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVDb25maWcKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5TaGFkZUlkCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVNb2RlbAoraW1wb3J0IGphdmF4LmluamVjdC5JbmplY3QKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5GbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuTXV0YWJsZVN0YXRlRmxvdworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LlN0YXRlRmxvdworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmFzU3RhdGVGbG93CisKKy8qKiBFbmNhcHN1bGF0ZXMgYXBwbGljYXRpb24gc3RhdGUgZm9yIGFsbCBzaGFkZXMuICovCitAU3lzVUlTaW5nbGV0b24KK2NsYXNzIE11bHRpU2hhZGVSZXBvc2l0b3J5CitASW5qZWN0Citjb25zdHJ1Y3RvcigKKyAgICBAQXBwbGljYXRpb24gcHJpdmF0ZSB2YWwgYXBwbGljYXRpb25Db250ZXh0OiBDb250ZXh0LAorICAgIGlucHV0UHJveHk6IE11bHRpU2hhZGVJbnB1dFByb3h5LAorKSB7CisgICAgLyoqCisgICAgICogUmVtb3RlIGlucHV0IGNvbWluZyBmcm9tIHNvdXJjZXMgb3V0c2lkZSBvZiBzeXN0ZW0gVUkgKGZvciBleGFtcGxlLCBzd2lwaW5nIGRvd24gb24gdGhlCisgICAgICogTGF1bmNoZXIgb3IgZnJvbSB0aGUgc3RhdHVzIGJhcikuCisgICAgICovCisgICAgdmFsIHByb3hpZWRJbnB1dDogRmxvdzxQcm94aWVkSW5wdXRNb2RlbD4gPSBpbnB1dFByb3h5LnByb3hpZWRJbnB1dAorCisgICAgLyoqIFdpZHRoIG9mIHRoZSBsZWZ0LWhhbmQgc2lkZSBzaGFkZSwgaW4gcGl4ZWxzLiAqLworICAgIHByaXZhdGUgdmFsIGxlZnRTaGFkZVdpZHRoUHggPQorICAgICAgICBhcHBsaWNhdGlvbkNvbnRleHQucmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLmxlZnRfc2hhZGVfd2lkdGgpCisKKyAgICAvKiogV2lkdGggb2YgdGhlIHJpZ2h0LWhhbmQgc2lkZSBzaGFkZSwgaW4gcGl4ZWxzLiAqLworICAgIHByaXZhdGUgdmFsIHJpZ2h0U2hhZGVXaWR0aFB4ID0KKyAgICAgICAgYXBwbGljYXRpb25Db250ZXh0LnJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5yaWdodF9zaGFkZV93aWR0aCkKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdXNlciBtdXN0IHN3aXBlIHVwIHdoZW4gdGhlIHNoYWRlIGlzIGZ1bGx5IGV4cGFuZGVkIHRvIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBjb2xsYXBzZSBvbmNlIHRoZSB1c2VyIGxldHMgZ28gb2YgdGhlIHNoYWRlLiBJZiB0aGUgdXNlciBzd2lwZXMgbGVzcyB0aGFuIHRoaXMgYW1vdW50LCB0aGUKKyAgICAgKiBzaGFkZSB3aWxsIGF1dG9tYXRpY2FsbHkgcmV2ZXJ0IGJhY2sgdG8gZnVsbHkgZXhwYW5kZWQgb25jZSB0aGUgdXNlciBzdG9wcyBzd2lwaW5nLgorICAgICAqCisgICAgICogVGhpcyBpcyBhIGZyYWN0aW9uIGJldHdlZW4gYDBgIGFuZCBgMWAuCisgICAgICovCisgICAgcHJpdmF0ZSB2YWwgc3dpcGVDb2xsYXBzZVRocmVzaG9sZCA9CisgICAgICAgIGNoZWNrSW5Cb3VuZHMoYXBwbGljYXRpb25Db250ZXh0LnJlc291cmNlcy5nZXRGbG9hdChSLmRpbWVuLnNoYWRlX3N3aXBlX2NvbGxhcHNlX3RocmVzaG9sZCkpCisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IHRoYXQgdGhlIHVzZXIgbXVzdCBzd2lwZSBkb3duIHdoZW4gdGhlIHNoYWRlIGlzIGZ1bGx5IGNvbGxhcHNlZCB0byBhdXRvbWF0aWNhbGx5CisgICAgICogZXhwYW5kIG9uY2UgdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGUuIElmIHRoZSB1c2VyIHN3aXBlcyBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIHRoZQorICAgICAqIHNoYWRlIHdpbGwgYXV0b21hdGljYWxseSByZXZlcnQgYmFjayB0byBmdWxseSBjb2xsYXBzZWQgb25jZSB0aGUgdXNlciBzdG9wcyBzd2lwaW5nLgorICAgICAqCisgICAgICogVGhpcyBpcyBhIGZyYWN0aW9uIGJldHdlZW4gYDBgIGFuZCBgMWAuCisgICAgICovCisgICAgcHJpdmF0ZSB2YWwgc3dpcGVFeHBhbmRUaHJlc2hvbGQgPQorICAgICAgICBjaGVja0luQm91bmRzKGFwcGxpY2F0aW9uQ29udGV4dC5yZXNvdXJjZXMuZ2V0RmxvYXQoUi5kaW1lbi5zaGFkZV9zd2lwZV9leHBhbmRfdGhyZXNob2xkKSkKKworICAgIC8qKgorICAgICAqIE1heGltdW0gb3BhY2l0eSB3aGVuIHRoZSBzY3JpbSB0aGF0IHNob3dzIHVwIGJlaGluZCB0aGUgZHVhbCBzaGFkZXMgaXMgZnVsbHkgdmlzaWJsZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgYSBmcmFjdGlvbiBiZXR3ZWVuIGAwYCBhbmQgYDFgLgorICAgICAqLworICAgIHByaXZhdGUgdmFsIGR1YWxTaGFkZVNjcmltQWxwaGEgPQorICAgICAgICBjaGVja0luQm91bmRzKGFwcGxpY2F0aW9uQ29udGV4dC5yZXNvdXJjZXMuZ2V0RmxvYXQoUi5kaW1lbi5kdWFsX3NoYWRlX3NjcmltX2FscGhhKSkKKworICAgIC8qKiBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBzaGFkZSBzeXN0ZW0uICovCisgICAgdmFsIHNoYWRlQ29uZmlnOiBTdGF0ZUZsb3c8U2hhZGVDb25maWc+ID0KKyAgICAgICAgTXV0YWJsZVN0YXRlRmxvdygKKyAgICAgICAgICAgICAgICBpZiAoYXBwbGljYXRpb25Db250ZXh0LnJlc291cmNlcy5nZXRCb29sZWFuKFIuYm9vbC5kdWFsX3NoYWRlX2VuYWJsZWQpKSB7CisgICAgICAgICAgICAgICAgICAgIFNoYWRlQ29uZmlnLkR1YWxTaGFkZUNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaGFkZVdpZHRoUHggPSBsZWZ0U2hhZGVXaWR0aFB4LAorICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRTaGFkZVdpZHRoUHggPSByaWdodFNoYWRlV2lkdGhQeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQgPSBzd2lwZUNvbGxhcHNlVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3dpcGVFeHBhbmRUaHJlc2hvbGQgPSBzd2lwZUV4cGFuZFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0RnJhY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uQ29udGV4dC5yZXNvdXJjZXMuZ2V0RmxvYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZGltZW4uZHVhbF9zaGFkZV9zcGxpdF9mcmFjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpbUFscGhhID0gZHVhbFNoYWRlU2NyaW1BbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFNoYWRlQ29uZmlnLlNpbmdsZVNoYWRlQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgc3dpcGVDb2xsYXBzZVRocmVzaG9sZCA9IHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBzd2lwZUV4cGFuZFRocmVzaG9sZCA9IHN3aXBlRXhwYW5kVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKQorICAgICAgICAgICAgLmFzU3RhdGVGbG93KCkKKworICAgIHByaXZhdGUgdmFsIF9mb3JjZUNvbGxhcHNlQWxsID0gTXV0YWJsZVN0YXRlRmxvdyhmYWxzZSkKKyAgICAvKiogV2hldGhlciBhbGwgc2hhZGVzIHNob3VsZCBiZSBjb2xsYXBzZWQuICovCisgICAgdmFsIGZvcmNlQ29sbGFwc2VBbGw6IFN0YXRlRmxvdzxCb29sZWFuPiA9IF9mb3JjZUNvbGxhcHNlQWxsLmFzU3RhdGVGbG93KCkKKworICAgIHByaXZhdGUgdmFsIF9zaGFkZUludGVyYWN0aW9uID0gTXV0YWJsZVN0YXRlRmxvdzxNdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbD8+KG51bGwpCisgICAgLyoqIFRoZSBjdXJyZW50IHNoYWRlIGludGVyYWN0aW9uIG9yIGBudWxsYCBpZiBubyBzaGFkZSBpcyBpbnRlcmFjdGVkIHdpdGggY3VycmVudGx5LiAqLworICAgIHZhbCBzaGFkZUludGVyYWN0aW9uOiBTdGF0ZUZsb3c8TXVsdGlTaGFkZUludGVyYWN0aW9uTW9kZWw/PiA9IF9zaGFkZUludGVyYWN0aW9uLmFzU3RhdGVGbG93KCkKKworICAgIHByaXZhdGUgdmFsIHN0YXRlQnlTaGFkZSA9IG11dGFibGVNYXBPZjxTaGFkZUlkLCBNdXRhYmxlU3RhdGVGbG93PFNoYWRlTW9kZWw+PigpCisKKyAgICAvKiogVGhlIG1vZGVsIGZvciB0aGUgc2hhZGUgd2l0aCB0aGUgZ2l2ZW4gSUQuICovCisgICAgZnVuIGdldFNoYWRlKAorICAgICAgICBzaGFkZUlkOiBTaGFkZUlkLAorICAgICk6IFN0YXRlRmxvdzxTaGFkZU1vZGVsPiB7CisgICAgICAgIHJldHVybiBnZXRNdXRhYmxlU2hhZGUoc2hhZGVJZCkuYXNTdGF0ZUZsb3coKQorICAgIH0KKworICAgIC8qKiBTZXRzIHRoZSBleHBhbnNpb24gYW1vdW50IGZvciB0aGUgc2hhZGUgd2l0aCB0aGUgZ2l2ZW4gSUQuICovCisgICAgZnVuIHNldEV4cGFuc2lvbigKKyAgICAgICAgc2hhZGVJZDogU2hhZGVJZCwKKyAgICAgICAgQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApIGV4cGFuc2lvbjogRmxvYXQsCisgICAgKSB7CisgICAgICAgIGdldE11dGFibGVTaGFkZShzaGFkZUlkKS5sZXQgeyBtdXRhYmxlU3RhdGUgLT4KKyAgICAgICAgICAgIG11dGFibGVTdGF0ZS52YWx1ZSA9IG11dGFibGVTdGF0ZS52YWx1ZS5jb3B5KGV4cGFuc2lvbiA9IGV4cGFuc2lvbikKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBTZXRzIHdoZXRoZXIgYWxsIHNoYWRlcyBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZm9yY2VkIHRvIGNvbGxhcHNlLiAqLworICAgIGZ1biBzZXRGb3JjZUNvbGxhcHNlQWxsKGlzRm9yY2VkOiBCb29sZWFuKSB7CisgICAgICAgIF9mb3JjZUNvbGxhcHNlQWxsLnZhbHVlID0gaXNGb3JjZWQKKyAgICB9CisKKyAgICAvKiogU2V0cyB0aGUgY3VycmVudCBzaGFkZSBpbnRlcmFjdGlvbjsgdXNlIGBudWxsYCBpZiBubyBzaGFkZSBpcyBpbnRlcmFjdGVkIHdpdGggY3VycmVudGx5LiAqLworICAgIGZ1biBzZXRTaGFkZUludGVyYWN0aW9uKHNoYWRlSW50ZXJhY3Rpb246IE11bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsPykgeworICAgICAgICBfc2hhZGVJbnRlcmFjdGlvbi52YWx1ZSA9IHNoYWRlSW50ZXJhY3Rpb24KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1biBnZXRNdXRhYmxlU2hhZGUoaWQ6IFNoYWRlSWQpOiBNdXRhYmxlU3RhdGVGbG93PFNoYWRlTW9kZWw+IHsKKyAgICAgICAgcmV0dXJuIHN0YXRlQnlTaGFkZS5nZXRPclB1dChpZCkgeyBNdXRhYmxlU3RhdGVGbG93KFNoYWRlTW9kZWwoaWQpKSB9CisgICAgfQorCisgICAgLyoqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gW0Zsb2F0XSBpcyBpbiB0aGUgcmFuZ2Ugb2YgYDBgIGFuZCBgMWAsIGluY2x1c2l2ZS4gKi8KKyAgICBwcml2YXRlIGZ1biBjaGVja0luQm91bmRzKGZsb2F0OiBGbG9hdCk6IEZsb2F0IHsKKyAgICAgICAgY2hlY2soZmxvYXQgaW4gMGYuLjFmKSB7ICIkZmxvYXQgaXNuJ3QgYmV0d2VlbiAwIGFuZCAxLiIgfQorICAgICAgICByZXR1cm4gZmxvYXQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9kb21haW4vaW50ZXJhY3Rvci9NdWx0aVNoYWRlSW50ZXJhY3Rvci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RvbWFpbi9pbnRlcmFjdG9yL011bHRpU2hhZGVJbnRlcmFjdG9yLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjZkODMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9kb21haW4vaW50ZXJhY3Rvci9NdWx0aVNoYWRlSW50ZXJhY3Rvci5rdApAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZG9tYWluLmludGVyYWN0b3IKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uRmxvYXRSYW5nZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRhZ2dlci5TeXNVSVNpbmdsZXRvbgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRhZ2dlci5xdWFsaWZpZXJzLkFwcGxpY2F0aW9uCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kYXRhLm1vZGVsLk11bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kYXRhLnJlbW90ZXByb3h5Lk11bHRpU2hhZGVJbnB1dFByb3h5CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kYXRhLnJlcG9zaXRvcnkuTXVsdGlTaGFkZVJlcG9zaXRvcnkKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5Qcm94aWVkSW5wdXRNb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlNoYWRlQ29uZmlnCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVJZAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlNoYWRlTW9kZWwKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkNvcm91dGluZVNjb3BlCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkV4cGVyaW1lbnRhbENvcm91dGluZXNBcGkKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5GbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuU2hhcmVkRmxvdworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LlNoYXJpbmdTdGFydGVkCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuU3RhdGVGbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuY29tYmluZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmRpc3RpbmN0VW50aWxDaGFuZ2VkCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuZmxhdE1hcExhdGVzdAoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93Lm1hcAoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93Lm9uRWFjaAoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LnNoYXJlSW4KK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMueWllbGQKKworLyoqIEVuY2Fwc3VsYXRlcyBidXNpbmVzcyBsb2dpYyByZWxhdGVkIHRvIGludGVyYWN0aW9ucyB3aXRoIHRoZSBtdWx0aS1zaGFkZSBzeXN0ZW0uICovCitAT3B0SW4oRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaTo6Y2xhc3MpCitAU3lzVUlTaW5nbGV0b24KK2NsYXNzIE11bHRpU2hhZGVJbnRlcmFjdG9yCitASW5qZWN0Citjb25zdHJ1Y3RvcigKKyAgICBAQXBwbGljYXRpb24gcHJpdmF0ZSB2YWwgYXBwbGljYXRpb25TY29wZTogQ29yb3V0aW5lU2NvcGUsCisgICAgcHJpdmF0ZSB2YWwgcmVwb3NpdG9yeTogTXVsdGlTaGFkZVJlcG9zaXRvcnksCisgICAgcHJpdmF0ZSB2YWwgaW5wdXRQcm94eTogTXVsdGlTaGFkZUlucHV0UHJveHksCispIHsKKyAgICAvKiogVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgc2hhZGUgc3lzdGVtLiAqLworICAgIHZhbCBzaGFkZUNvbmZpZzogU3RhdGVGbG93PFNoYWRlQ29uZmlnPiA9IHJlcG9zaXRvcnkuc2hhZGVDb25maWcKKworICAgIC8qKiBUaGUgZXhwYW5zaW9uIG9mIHRoZSBzaGFkZSB0aGF0J3MgbW9zdCBleHBhbmRlZC4gKi8KKyAgICB2YWwgbWF4U2hhZGVFeHBhbnNpb246IEZsb3c8RmxvYXQ+ID0KKyAgICAgICAgcmVwb3NpdG9yeS5zaGFkZUNvbmZpZy5mbGF0TWFwTGF0ZXN0IHsgc2hhZGVDb25maWcgLT4KKyAgICAgICAgICAgIGNvbWJpbmUoYWxsU2hhZGVzKHNoYWRlQ29uZmlnKSkgeyBzaGFkZU1vZGVscyAtPgorICAgICAgICAgICAgICAgIHNoYWRlTW9kZWxzLm1heE9mT3JOdWxsIHsgaXQuZXhwYW5zaW9uIH0gPzogMGYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgLyoqCisgICAgICogQSBfcHJvY2Vzc2VkXyB2ZXJzaW9uIG9mIHRoZSBwcm94aWVkIGlucHV0IGZsb3cuCisgICAgICoKKyAgICAgKiBBbGwgaW50ZXJuYWwgZGVwZW5kZW5jaWVzIG9uIHRoZSBwcm94aWVkIGlucHV0IGZsb3cgKm11c3QqIHVzZSB0aGlzIG9uZSBmb3IgdHdvIHJlYXNvbnM6CisgICAgICogMS4gSXQncyBhIFtTaGFyZWRGbG93XSBzbyB3ZSBvbmx5IGRvIHRoZSB1cHN0cmVhbSB3b3JrIG9uY2UsIG5vIG1hdHRlciBob3cgbWFueSB1c2FnZXMgd2UKKyAgICAgKiAgICBhY3R1YWxseSBoYXZlLgorICAgICAqIDIuIEl0IGFjdHVhbGx5IGRvZXMgc29tZSBwcmVwcm9jZXNzaW5nIGFzIHRoZSBwcm94aWVkIGlucHV0IGV2ZW50cyBzdHJlYW0gdGhyb3VnaCwgaGFuZGxpbmcKKyAgICAgKiAgICBjb21tb24gdGhpbmdzIGxpa2UgcmVjb3JkaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXN0ZW0gYmFzZWQgb24gaW5jb21pbmcgaW5wdXQKKyAgICAgKiAgICBldmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2YWwgcHJvY2Vzc2VkUHJveGllZElucHV0OiBTaGFyZWRGbG93PFByb3hpZWRJbnB1dE1vZGVsPiA9CisgICAgICAgIGNvbWJpbmUoCisgICAgICAgICAgICAgICAgcmVwb3NpdG9yeS5zaGFkZUNvbmZpZywKKyAgICAgICAgICAgICAgICByZXBvc2l0b3J5LnByb3hpZWRJbnB1dC5kaXN0aW5jdFVudGlsQ2hhbmdlZCgpLAorICAgICAgICAgICAgICAgIDo6UGFpciwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIC5tYXAgeyAoc2hhZGVDb25maWcsIHByb3hpZWRJbnB1dCkgLT4KKyAgICAgICAgICAgICAgICBpZiAocHJveGllZElucHV0ICFpcyBQcm94aWVkSW5wdXRNb2RlbC5PblRhcCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBpcyBpbnRlcmFjdGluZyB3aXRoIGFueSBvdGhlciBnZXN0dXJlIHR5cGUgKGZvciBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgLy8gZHJhZ2dpbmcpLAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBubyBsb25nZXIgd2FudCB0byBmb3JjZSBjb2xsYXBzZSBhbGwgc2hhZGVzLgorICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5LnNldEZvcmNlQ29sbGFwc2VBbGwoZmFsc2UpCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hlbiAocHJveGllZElucHV0KSB7CisgICAgICAgICAgICAgICAgICAgIGlzIFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZyAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgYWZmZWN0ZWRTaGFkZUlkID0gYWZmZWN0ZWRTaGFkZUlkKHNoYWRlQ29uZmlnLCBwcm94aWVkSW5wdXQueEZyYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBiZSB0aGUgc3RhcnQgb2YgYSBuZXcgZHJhZyBnZXN0dXJlLCBsZXQncyB1cGRhdGUgb3VyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUgdG8gcmVjb3JkIHRoYXQgZmFjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG9uVXNlckludGVyYWN0aW9uU3RhcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZUlkID0gYWZmZWN0ZWRTaGFkZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJveGllZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXMgUHJveGllZElucHV0TW9kZWwuT25UYXAgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFwcGluZyBvdXRzaWRlIGFueSBzaGFkZSBjb2xsYXBzZXMgYWxsIHNoYWRlcy4gVGhpcyBjb2RlIHBhdGggaXMgbm90IGhpdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXBzIHRoYXQgaGFwcGVuIF9pbnNpZGVfIGEgc2hhZGUgYXMgdGhhdCBpbnB1dCBldmVudCBpcyBkaXJlY3RseSBhcHBsaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSBVSSBhbmQgaXMsIGhlbmNlLCBub3QgYSBwcm94aWVkIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VBbGwoKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLT4gVW5pdAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb3hpZWRJbnB1dAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLnNoYXJlSW4oCisgICAgICAgICAgICAgICAgc2NvcGUgPSBhcHBsaWNhdGlvblNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5FYWdlcmx5LAorICAgICAgICAgICAgICAgIHJlcGxheSA9IDEsCisgICAgICAgICAgICApCisKKyAgICAvKiogV2hldGhlciB0aGUgc2hhZGUgd2l0aCB0aGUgZ2l2ZW4gSUQgc2hvdWxkIGJlIHZpc2libGUuICovCisgICAgZnVuIGlzVmlzaWJsZShzaGFkZUlkOiBTaGFkZUlkKTogRmxvdzxCb29sZWFuPiB7CisgICAgICAgIHJldHVybiByZXBvc2l0b3J5LnNoYWRlQ29uZmlnLm1hcCB7IHNoYWRlQ29uZmlnIC0+IHNoYWRlQ29uZmlnLnNoYWRlSWRzLmNvbnRhaW5zKHNoYWRlSWQpIH0KKyAgICB9CisKKyAgICAvKiogV2hldGhlciBkaXJlY3QgdXNlciBpbnB1dCBpcyBhbGxvd2VkIG9uIHRoZSBzaGFkZSB3aXRoIHRoZSBnaXZlbiBJRC4gKi8KKyAgICBmdW4gaXNOb25Qcm94aWVkSW5wdXRBbGxvd2VkKHNoYWRlSWQ6IFNoYWRlSWQpOiBGbG93PEJvb2xlYW4+IHsKKyAgICAgICAgcmV0dXJuIGNvbWJpbmUoCisgICAgICAgICAgICAgICAgaXNGb3JjZUNvbGxhcHNlZChzaGFkZUlkKSwKKyAgICAgICAgICAgICAgICByZXBvc2l0b3J5LnNoYWRlSW50ZXJhY3Rpb24sCisgICAgICAgICAgICAgICAgOjpQYWlyLAorICAgICAgICAgICAgKQorICAgICAgICAgICAgLm1hcCB7IChpc0ZvcmNlQ29sbGFwc2VkLCBzaGFkZUludGVyYWN0aW9uKSAtPgorICAgICAgICAgICAgICAgICFpc0ZvcmNlQ29sbGFwc2VkICYmIHNoYWRlSW50ZXJhY3Rpb24/LmlzUHJveGllZCAhPSB0cnVlCisgICAgICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFdoZXRoZXIgdGhlIHNoYWRlIHdpdGggdGhlIGdpdmVuIElEIGlzIGZvcmNlZCB0byBjb2xsYXBzZS4gKi8KKyAgICBmdW4gaXNGb3JjZUNvbGxhcHNlZChzaGFkZUlkOiBTaGFkZUlkKTogRmxvdzxCb29sZWFuPiB7CisgICAgICAgIHJldHVybiBjb21iaW5lKAorICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuZm9yY2VDb2xsYXBzZUFsbCwKKyAgICAgICAgICAgICAgICByZXBvc2l0b3J5LnNoYWRlSW50ZXJhY3Rpb24ubWFwIHsgaXQ/LnNoYWRlSWQgfSwKKyAgICAgICAgICAgICAgICA6OlBhaXIsCisgICAgICAgICAgICApCisgICAgICAgICAgICAubWFwIHsgKGNvbGxhcHNlQWxsLCB1c2VySW50ZXJhY3RlZFNoYWRlSWRPck51bGwpIC0+CisgICAgICAgICAgICAgICAgdmFsIGNvdW50ZXJwYXJ0U2hhZGVJZE9yTnVsbCA9CisgICAgICAgICAgICAgICAgICAgIHdoZW4gKHNoYWRlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRlSWQuU0lOR0xFIC0+IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRlSWQuTEVGVCAtPiBTaGFkZUlkLlJJR0hUCisgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZUlkLlJJR0hUIC0+IFNoYWRlSWQuTEVGVAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGVuIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgYWxsIHNoYWRlcyBoYXZlIGJlZW4gdG9sZCB0byBjb2xsYXBzZSAoYnkgYSB0YXAgb3V0c2lkZSwgZm9yIGV4YW1wbGUpLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHRoaXMgc2hhZGUgaXMgY29sbGFwc2VkLgorICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUFsbCAtPiB0cnVlCisgICAgICAgICAgICAgICAgICAgIC8vIEEgc2hhZGUgdGhhdCBkb2Vzbid0IGhhdmUgYSBjb3VudGVycGFydCBzaGFkZSBjYW5ub3QgYmUgZm9yY2UtY29sbGFwc2VkIGJ5CisgICAgICAgICAgICAgICAgICAgIC8vIGludGVyYWN0aW9ucyBvbiB0aGUgY291bnRlcnBhcnQgc2hhZGUuCisgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJwYXJ0U2hhZGVJZE9yTnVsbCA9PSBudWxsIC0+IGZhbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IHVzZXIgaW50ZXJhY3Rpb24gaXMgb24gdGhlIGNvdW50ZXJwYXJ0IHNoYWRlLCB0aGVuIHRoaXMgc2hhZGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGZvcmNlLWNvbGxhcHNlZC4KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAtPiB1c2VySW50ZXJhY3RlZFNoYWRlSWRPck51bGwgPT0gY291bnRlcnBhcnRTaGFkZUlkT3JOdWxsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3hpZWQgaW5wdXQgYWZmZWN0aW5nIHRoZSBzaGFkZSB3aXRoIHRoZSBnaXZlbiBJRC4gVGhpcyBpcyBpbnB1dCBjb21pbmcgZnJvbSBzb3VyY2VzCisgICAgICogb3V0c2lkZSBvZiBzeXN0ZW0gVUkgKGZvciBleGFtcGxlLCBzd2lwaW5nIGRvd24gb24gdGhlIExhdW5jaGVyIG9yIGZyb20gdGhlIHN0YXR1cyBiYXIpIG9yCisgICAgICogb3V0c2lkZSB0aGUgVUkgb2YgYW55IHNoYWRlIChmb3IgZXhhbXBsZSwgdGhlIHNjcmltIHRoYXQncyBzaG93biBiZWhpbmQgdGhlIHNoYWRlcykuCisgICAgICovCisgICAgZnVuIHByb3hpZWRJbnB1dChzaGFkZUlkOiBTaGFkZUlkKTogRmxvdzxQcm94aWVkSW5wdXRNb2RlbD8+IHsKKyAgICAgICAgcmV0dXJuIGNvbWJpbmUoCisgICAgICAgICAgICAgICAgcHJvY2Vzc2VkUHJveGllZElucHV0LAorICAgICAgICAgICAgICAgIGlzRm9yY2VDb2xsYXBzZWQoc2hhZGVJZCkuZGlzdGluY3RVbnRpbENoYW5nZWQoKSwKKyAgICAgICAgICAgICAgICByZXBvc2l0b3J5LnNoYWRlSW50ZXJhY3Rpb24sCisgICAgICAgICAgICAgICAgOjpUcmlwbGUsCisgICAgICAgICAgICApCisgICAgICAgICAgICAubWFwIHsgKHByb3hpZWRJbnB1dCwgaXNGb3JjZUNvbGxhcHNlZCwgc2hhZGVJbnRlcmFjdGlvbikgLT4KKyAgICAgICAgICAgICAgICB3aGVuIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNoYWRlIGlzIGZvcmNlLWNvbGxhcHNlZCwgd2UgaWdub3JlZCBwcm94aWVkIGlucHV0IG9uIGl0LgorICAgICAgICAgICAgICAgICAgICBpc0ZvcmNlQ29sbGFwc2VkIC0+IG51bGwKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHByb3hpZWQgaW5wdXQgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgc2hhZGUsIGlnbm9yZSBpdC4KKyAgICAgICAgICAgICAgICAgICAgc2hhZGVJbnRlcmFjdGlvbj8uc2hhZGVJZCAhPSBzaGFkZUlkIC0+IG51bGwKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25nb2luZyBub24tcHJveGllZCB1c2VyIGlucHV0IG9uIGFueSBzaGFkZSwgaWdub3JlIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBwcm94aWVkIGlucHV0LgorICAgICAgICAgICAgICAgICAgICAhc2hhZGVJbnRlcmFjdGlvbi5pc1Byb3hpZWQgLT4gbnVsbAorICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNlbmQgdGhlIHByb3hpZWQgaW5wdXQgZG93bnN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAtPiBwcm94aWVkSW5wdXQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAub25FYWNoIHsgcHJveGllZElucHV0IC0+CisgICAgICAgICAgICAgICAgLy8gV2UgdXNlIHlpZWxkKCkgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGZvbGxvd2luZyBibG9jayBvZiBjb2RlIGhhcHBlbnMgX2FmdGVyXworICAgICAgICAgICAgICAgIC8vIGRvd25zdHJlYW0gY29sbGVjdG9ycyBoYWQgYSBjaGFuY2UgdG8gcHJvY2VzcyB0aGUgcHJveGllZCBpbnB1dC4gT3RoZXJ3aXNlLCB3ZQorICAgICAgICAgICAgICAgIC8vIG1pZ2h0IGNoYW5nZSBvdXIgc3RhdGUgdG8gY2xlYXIgdGhlIGN1cnJlbnQgVXNlckludGVyYWN0aW9uIF9iZWZvcmVfIHRob3NlCisgICAgICAgICAgICAgICAgLy8gZG93bnN0cmVhbSBjb2xsZWN0b3JzIGdldCBhIGNoYW5jZSB0byBwcm9jZXNzIHRoZSBwcm94aWVkIGlucHV0LCB3aGljaCB3aWxsIG1ha2UKKyAgICAgICAgICAgICAgICAvLyB0aGVtIGlnbm9yZSBpdCAoc2luY2UgdGhleSBpZ25vcmUgcHJveGllZCBpbnB1dCB3aGVuIHRoZSBjdXJyZW50IHVzZXIgaW50ZXJhY3Rpb24KKyAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IG1hdGNoIHRoZWlyIHNoYWRlKS4KKyAgICAgICAgICAgICAgICB5aWVsZCgpCisKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgIHByb3hpZWRJbnB1dCBpcyBQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWdFbmQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3hpZWRJbnB1dCBpcyBQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWdDYW5jZWwKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgb25Vc2VySW50ZXJhY3Rpb25FbmRlZChzaGFkZUlkID0gc2hhZGVJZCwgaXNQcm94aWVkID0gdHJ1ZSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFNldHMgdGhlIGV4cGFuc2lvbiBhbW91bnQgZm9yIHRoZSBzaGFkZSB3aXRoIHRoZSBnaXZlbiBJRC4gKi8KKyAgICBmdW4gc2V0RXhwYW5zaW9uKAorICAgICAgICBzaGFkZUlkOiBTaGFkZUlkLAorICAgICAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgZXhwYW5zaW9uOiBGbG9hdCwKKyAgICApIHsKKyAgICAgICAgcmVwb3NpdG9yeS5zZXRFeHBhbnNpb24oc2hhZGVJZCwgZXhwYW5zaW9uKQorICAgIH0KKworICAgIC8qKiBDb2xsYXBzZXMgYWxsIHNoYWRlcy4gKi8KKyAgICBmdW4gY29sbGFwc2VBbGwoKSB7CisgICAgICAgIHJlcG9zaXRvcnkuc2V0Rm9yY2VDb2xsYXBzZUFsbCh0cnVlKQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoYXQgYSBuZXcgbm9uLXByb3hpZWQgaW50ZXJhY3Rpb24gbWF5IGhhdmUgc3RhcnRlZC4gU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIGZvcgorICAgICAqIHRoZSBzYW1lIGludGVyYWN0aW9uIGFzIGl0IHdvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBpbnRlcmFjdGlvbi4KKyAgICAgKgorICAgICAqIEV4aXN0aW5nIGludGVyYWN0aW9ucyBjYW4gYmUgY2xlYXJlZCBieSBjYWxsaW5nIFtvblVzZXJJbnRlcmFjdGlvbkVuZGVkXS4KKyAgICAgKi8KKyAgICBmdW4gb25Vc2VySW50ZXJhY3Rpb25TdGFydGVkKHNoYWRlSWQ6IFNoYWRlSWQpIHsKKyAgICAgICAgb25Vc2VySW50ZXJhY3Rpb25TdGFydGVkKAorICAgICAgICAgICAgc2hhZGVJZCA9IHNoYWRlSWQsCisgICAgICAgICAgICBpc1Byb3hpZWQgPSBmYWxzZSwKKyAgICAgICAgKQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgbm9uLXByb3hpZWQgaW50ZXJhY3Rpb24gaGFzIGVuZGVkLgorICAgICAqCisgICAgICogU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLCBldmVuIGlmIHRoZXJlJ3Mgbm8gY3VycmVudCBpbnRlcmFjdGlvbiBvciBldmVuIGlmIHRoZSBjdXJyZW50CisgICAgICogaW50ZXJhY3Rpb24gZG9lc24ndCBiZWxvbmcgdG8gdGhlIGdpdmVuIHNoYWRlIG9yIGlzIHByb3hpZWQgYXMgdGhlIGNvZGUgaXMgYSBuby1vcCB1bmxlc3MKKyAgICAgKiB0aGVyZSdzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcGFyYW1ldGVycyBhbmQgdGhlIGN1cnJlbnQgaW50ZXJhY3Rpb24uCisgICAgICovCisgICAgZnVuIG9uVXNlckludGVyYWN0aW9uRW5kZWQoCisgICAgICAgIHNoYWRlSWQ6IFNoYWRlSWQsCisgICAgKSB7CisgICAgICAgIG9uVXNlckludGVyYWN0aW9uRW5kZWQoCisgICAgICAgICAgICBzaGFkZUlkID0gc2hhZGVJZCwKKyAgICAgICAgICAgIGlzUHJveGllZCA9IGZhbHNlLAorICAgICAgICApCisgICAgfQorCisgICAgZnVuIHNlbmRQcm94aWVkSW5wdXQocHJveGllZElucHV0OiBQcm94aWVkSW5wdXRNb2RlbCkgeworICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KHByb3hpZWRJbnB1dCkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGF0IGEgbmV3IGludGVyYWN0aW9uIG1heSBoYXZlIHN0YXJ0ZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUKKyAgICAgKiBpbnRlcmFjdGlvbiBhcyBpdCB3b24ndCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgaW50ZXJhY3Rpb24uCisgICAgICoKKyAgICAgKiBFeGlzdGluZyBpbnRlcmFjdGlvbnMgY2FuIGJlIGNsZWFyZWQgYnkgY2FsbGluZyBbb25Vc2VySW50ZXJhY3Rpb25FbmRlZF0uCisgICAgICovCisgICAgcHJpdmF0ZSBmdW4gb25Vc2VySW50ZXJhY3Rpb25TdGFydGVkKAorICAgICAgICBzaGFkZUlkOiBTaGFkZUlkLAorICAgICAgICBpc1Byb3hpZWQ6IEJvb2xlYW4sCisgICAgKSB7CisgICAgICAgIGlmIChyZXBvc2l0b3J5LnNoYWRlSW50ZXJhY3Rpb24udmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIH0KKworICAgICAgICByZXBvc2l0b3J5LnNldFNoYWRlSW50ZXJhY3Rpb24oCisgICAgICAgICAgICBNdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbCgKKyAgICAgICAgICAgICAgICBzaGFkZUlkID0gc2hhZGVJZCwKKyAgICAgICAgICAgICAgICBpc1Byb3hpZWQgPSBpc1Byb3hpZWQsCisgICAgICAgICAgICApCisgICAgICAgICkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGF0IHRoZSBjdXJyZW50IGludGVyYWN0aW9uIGhhcyBlbmRlZC4KKyAgICAgKgorICAgICAqIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcywgZXZlbiBpZiB0aGVyZSdzIG5vIGN1cnJlbnQgaW50ZXJhY3Rpb24gb3IgZXZlbiBpZiB0aGUgY3VycmVudAorICAgICAqIGludGVyYWN0aW9uIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBnaXZlbiBzaGFkZSBvciBbaXNQcm94aWVkXSB2YWx1ZSBhcyB0aGUgY29kZSBpcyBhIG5vLW9wCisgICAgICogdW5sZXNzIHRoZXJlJ3MgYSBtYXRjaCBiZXR3ZWVuIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGUgY3VycmVudCBpbnRlcmFjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1biBvblVzZXJJbnRlcmFjdGlvbkVuZGVkKAorICAgICAgICBzaGFkZUlkOiBTaGFkZUlkLAorICAgICAgICBpc1Byb3hpZWQ6IEJvb2xlYW4sCisgICAgKSB7CisgICAgICAgIHJlcG9zaXRvcnkuc2hhZGVJbnRlcmFjdGlvbi52YWx1ZT8ubGV0IHsgKGludGVyYWN0aW9uU2hhZGVJZCwgaXNJbnRlcmFjdGlvblByb3hpZWQpIC0+CisgICAgICAgICAgICBpZiAoc2hhZGVJZCA9PSBpbnRlcmFjdGlvblNoYWRlSWQgJiYgaXNQcm94aWVkID09IGlzSW50ZXJhY3Rpb25Qcm94aWVkKSB7CisgICAgICAgICAgICAgICAgcmVwb3NpdG9yeS5zZXRTaGFkZUludGVyYWN0aW9uKG51bGwpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgc2hhZGUgdGhhdCdzIGFmZmVjdGVkIGJ5IHVzZXIgaW5wdXQgYXQgYSBnaXZlbiBjb29yZGluYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBUaGUgc2hhZGUgY29uZmlndXJhdGlvbiBiZWluZyB1c2VkLgorICAgICAqIEBwYXJhbSB4RnJhY3Rpb24gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHVzZXIgaW5wdXQgYXMgYSBmcmFjdGlvbiBhbG9uZyB0aGUgd2lkdGggb2YKKyAgICAgKiAgIGl0cyBjb250YWluZXIgd2hlcmUgYDBgIGlzIGFsbCB0aGUgd2F5IHRvIHRoZSBsZWZ0IGFuZCBgMWAgaXMgYWxsIHRoZSB3YXkgdG8gdGhlIHJpZ2h0LgorICAgICAqLworICAgIHByaXZhdGUgZnVuIGFmZmVjdGVkU2hhZGVJZCgKKyAgICAgICAgY29uZmlnOiBTaGFkZUNvbmZpZywKKyAgICAgICAgQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApIHhGcmFjdGlvbjogRmxvYXQsCisgICAgKTogU2hhZGVJZCB7CisgICAgICAgIHJldHVybiBpZiAoY29uZmlnIGlzIFNoYWRlQ29uZmlnLkR1YWxTaGFkZUNvbmZpZykgeworICAgICAgICAgICAgaWYgKHhGcmFjdGlvbiA8PSBjb25maWcuc3BsaXRGcmFjdGlvbikgeworICAgICAgICAgICAgICAgIFNoYWRlSWQuTEVGVAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTaGFkZUlkLlJJR0hUCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTaGFkZUlkLlNJTkdMRQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIGxpc3Qgb2YgZmxvd3Mgb2YgYWxsIHRoZSBzaGFkZXMgaW4gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uICovCisgICAgcHJpdmF0ZSBmdW4gYWxsU2hhZGVzKAorICAgICAgICBjb25maWc6IFNoYWRlQ29uZmlnLAorICAgICk6IExpc3Q8RmxvdzxTaGFkZU1vZGVsPj4geworICAgICAgICByZXR1cm4gY29uZmlnLnNoYWRlSWRzLm1hcCB7IHNoYWRlSWQgLT4gcmVwb3NpdG9yeS5nZXRTaGFkZShzaGFkZUlkKSB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvc2hhcmVkL21vZGVsL1Byb3hpZWRJbnB1dE1vZGVsLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvc2hhcmVkL21vZGVsL1Byb3hpZWRJbnB1dE1vZGVsLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMWRkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9zaGFyZWQvbW9kZWwvUHJveGllZElucHV0TW9kZWwua3QKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsCisKK2ltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLkZsb2F0UmFuZ2UKKworLyoqCisgKiBNb2RlbHMgYSBwYXJ0IG9mIGFuIG9uZ29pbmcgcHJveGllZCB1c2VyIGlucHV0IGdlc3R1cmUuCisgKgorICogIlByb3hpZWQiIHVzZXIgaW5wdXQgaXMgY29taW5nIHRocm91Z2ggYSBwcm94eTsgdHlwaWNhbGx5IGZyb20gYW4gZXh0ZXJuYWwgYXBwIG9yIGRpZmZlcmVudCBVSS4KKyAqIEluIG90aGVyIHdvcmRzOiBpdCdzIG5vdCB1c2VyIGlucHV0IHRoYXQncyBvY2N1cnJpbmcgZGlyZWN0bHkgb24gdGhlIHNoYWRlIFVJIGl0c2VsZi4KKyAqLworc2VhbGVkIGNsYXNzIFByb3hpZWRJbnB1dE1vZGVsIHsKKyAgICAvKiogVGhlIHVzZXIgaXMgZHJhZ2dpbmcgdGhlaXIgcG9pbnRlci4gKi8KKyAgICBkYXRhIGNsYXNzIE9uRHJhZygKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgcG9pbnRlciBhcyBhIGZyYWN0aW9uIG9mIGl0cyBjb250YWluZXIgd2lkdGggd2hlcmUgYDBgIGlzCisgICAgICAgICAqIGFsbCB0aGUgd2F5IHRvIHRoZSBsZWZ0IGFuZCBgMWAgaXMgYWxsIHRoZSB3YXkgdG8gdGhlIHJpZ2h0LgorICAgICAgICAgKi8KKyAgICAgICAgQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApIHZhbCB4RnJhY3Rpb246IEZsb2F0LAorICAgICAgICAvKiogVGhlIGFtb3VudCB0aGF0IHRoZSBwb2ludGVyIHdhcyBkcmFnZ2VkLCBpbiBwaXhlbHMuICovCisgICAgICAgIHZhbCB5RHJhZ0Ftb3VudFB4OiBGbG9hdCwKKyAgICApIDogUHJveGllZElucHV0TW9kZWwoKQorCisgICAgLyoqIFRoZSB1c2VyIGZpbmlzaGVkIGRyYWdnaW5nIGJ5IGxpZnRpbmcgdXAgdGhlaXIgcG9pbnRlci4gKi8KKyAgICBvYmplY3QgT25EcmFnRW5kIDogUHJveGllZElucHV0TW9kZWwoKQorCisgICAgLyoqCisgICAgICogVGhlIGRyYWcgZ2VzdHVyZSBoYXMgYmVlbiBjYW5jZWxlZC4gVXN1YWxseSBiZWNhdXNlIHRoZSBwb2ludGVyIGV4aXRlZCB0aGUgZHJhZ2dhYmxlIGFyZWEuCisgICAgICovCisgICAgb2JqZWN0IE9uRHJhZ0NhbmNlbCA6IFByb3hpZWRJbnB1dE1vZGVsKCkKKworICAgIC8qKiBUaGUgdXNlciBoYXMgdGFwcGVkIChjbGlja2VkKS4gKi8KKyAgICBvYmplY3QgT25UYXAgOiBQcm94aWVkSW5wdXRNb2RlbCgpCit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9zaGFyZWQvbW9kZWwvU2hhZGVDb25maWcua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9zaGFyZWQvbW9kZWwvU2hhZGVDb25maWcua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjZDM1YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3NoYXJlZC9tb2RlbC9TaGFkZUNvbmZpZy5rdApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uRmxvYXRSYW5nZQorCisvKiogRW51bWVyYXRlcyB0aGUgdmFyaW91cyBwb3NzaWJsZSBjb25maWd1cmF0aW9ucyBvZiB0aGUgc2hhZGUgc3lzdGVtLiAqLworc2VhbGVkIGNsYXNzIFNoYWRlQ29uZmlnKAorCisgICAgLyoqIElEcyBvZiB0aGUgc2hhZGUocykgaW4gdGhpcyBjb25maWd1cmF0aW9uLiAqLworICAgIG9wZW4gdmFsIHNoYWRlSWRzOiBMaXN0PFNoYWRlSWQ+LAorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB1c2VyIG11c3Qgc3dpcGUgdXAgd2hlbiB0aGUgc2hhZGUgaXMgZnVsbHkgZXhwYW5kZWQgdG8gYXV0b21hdGljYWxseQorICAgICAqIGNvbGxhcHNlIG9uY2UgdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGUuIElmIHRoZSB1c2VyIHN3aXBlcyBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIHRoZQorICAgICAqIHNoYWRlIHdpbGwgYXV0b21hdGljYWxseSByZXZlcnQgYmFjayB0byBmdWxseSBleHBhbmRlZCBvbmNlIHRoZSB1c2VyIHN0b3BzIHN3aXBpbmcuCisgICAgICovCisgICAgQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApIG9wZW4gdmFsIHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQ6IEZsb2F0LAorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB1c2VyIG11c3Qgc3dpcGUgZG93biB3aGVuIHRoZSBzaGFkZSBpcyBmdWxseSBjb2xsYXBzZWQgdG8gYXV0b21hdGljYWxseQorICAgICAqIGV4cGFuZCBvbmNlIHRoZSB1c2VyIGxldHMgZ28gb2YgdGhlIHNoYWRlLiBJZiB0aGUgdXNlciBzd2lwZXMgbGVzcyB0aGFuIHRoaXMgYW1vdW50LCB0aGUKKyAgICAgKiBzaGFkZSB3aWxsIGF1dG9tYXRpY2FsbHkgcmV2ZXJ0IGJhY2sgdG8gZnVsbHkgY29sbGFwc2VkIG9uY2UgdGhlIHVzZXIgc3RvcHMgc3dpcGluZy4KKyAgICAgKi8KKyAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgb3BlbiB2YWwgc3dpcGVFeHBhbmRUaHJlc2hvbGQ6IEZsb2F0LAorKSB7CisKKyAgICAvKiogVGhlcmUgaXMgYSBzaW5nbGUgc2hhZGUuICovCisgICAgZGF0YSBjbGFzcyBTaW5nbGVTaGFkZUNvbmZpZygKKyAgICAgICAgQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApIG92ZXJyaWRlIHZhbCBzd2lwZUNvbGxhcHNlVGhyZXNob2xkOiBGbG9hdCwKKyAgICAgICAgQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApIG92ZXJyaWRlIHZhbCBzd2lwZUV4cGFuZFRocmVzaG9sZDogRmxvYXQsCisgICAgKSA6CisgICAgICAgIFNoYWRlQ29uZmlnKAorICAgICAgICAgICAgc2hhZGVJZHMgPSBsaXN0T2YoU2hhZGVJZC5TSU5HTEUpLAorICAgICAgICAgICAgc3dpcGVDb2xsYXBzZVRocmVzaG9sZCA9IHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQsCisgICAgICAgICAgICBzd2lwZUV4cGFuZFRocmVzaG9sZCA9IHN3aXBlRXhwYW5kVGhyZXNob2xkLAorICAgICAgICApCisKKyAgICAvKiogVGhlcmUgYXJlIHR3byBzaGFkZXMgYXJyYW5nZWQgc2lkZS1ieS1zaWRlLiAqLworICAgIGRhdGEgY2xhc3MgRHVhbFNoYWRlQ29uZmlnKAorICAgICAgICAvKiogV2lkdGggb2YgdGhlIGxlZnQtaGFuZCBzaWRlIHNoYWRlLiAqLworICAgICAgICB2YWwgbGVmdFNoYWRlV2lkdGhQeDogSW50LAorICAgICAgICAvKiogV2lkdGggb2YgdGhlIHJpZ2h0LWhhbmQgc2lkZSBzaGFkZS4gKi8KKyAgICAgICAgdmFsIHJpZ2h0U2hhZGVXaWR0aFB4OiBJbnQsCisgICAgICAgIEBGbG9hdFJhbmdlKGZyb20gPSAwLjAsIHRvID0gMS4wKSBvdmVycmlkZSB2YWwgc3dpcGVDb2xsYXBzZVRocmVzaG9sZDogRmxvYXQsCisgICAgICAgIEBGbG9hdFJhbmdlKGZyb20gPSAwLjAsIHRvID0gMS4wKSBvdmVycmlkZSB2YWwgc3dpcGVFeHBhbmRUaHJlc2hvbGQ6IEZsb2F0LAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSAic3BsaXQiIGJldHdlZW4gaW50ZXJhY3Rpb24gYXJlYXMgZm9yIGVhY2ggb2YgdGhlIHNoYWRlcywgYXMgYQorICAgICAgICAgKiBmcmFjdGlvbiBvZiB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5lci4KKyAgICAgICAgICoKKyAgICAgICAgICogSW50ZXJhY3Rpb25zIHRoYXQgb2NjdXIgb24gdGhlIHN0YXJ0LXNpZGUgKGxlZnQtaGFuZCBzaWRlIGluIGxlZnQtdG8tcmlnaHQgbGFuZ3VhZ2VzIGxpa2UKKyAgICAgICAgICogRW5nbGlzaCkgYWZmZWN0IHRoZSBzdGFydC1zaWRlIHNoYWRlLiBJbnRlcmFjdGlvbnMgdGhhdCBvY2N1ciBvbiB0aGUgZW5kLXNpZGUgKHJpZ2h0LWhhbmQKKyAgICAgICAgICogc2lkZSBpbiBsZWZ0LXRvLXJpZ2h0IGxhbmd1YWdlcyBsaWtlIEVuZ2xpc2gpIGFmZmVjdCB0aGUgZW5kLXNpZGUgc2hhZGUuCisgICAgICAgICAqLworICAgICAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgdmFsIHNwbGl0RnJhY3Rpb246IEZsb2F0LAorICAgICAgICAvKiogTWF4aW11bSBvcGFjaXR5IHdoZW4gdGhlIHNjcmltIHRoYXQgc2hvd3MgdXAgYmVoaW5kIHRoZSBkdWFsIHNoYWRlcyBpcyBmdWxseSB2aXNpYmxlLiAqLworICAgICAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgdmFsIHNjcmltQWxwaGE6IEZsb2F0LAorICAgICkgOgorICAgICAgICBTaGFkZUNvbmZpZygKKyAgICAgICAgICAgIHNoYWRlSWRzID0gbGlzdE9mKFNoYWRlSWQuTEVGVCwgU2hhZGVJZC5SSUdIVCksCisgICAgICAgICAgICBzd2lwZUNvbGxhcHNlVGhyZXNob2xkID0gc3dpcGVDb2xsYXBzZVRocmVzaG9sZCwKKyAgICAgICAgICAgIHN3aXBlRXhwYW5kVGhyZXNob2xkID0gc3dpcGVFeHBhbmRUaHJlc2hvbGQsCisgICAgICAgICkKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3NoYXJlZC9tb2RlbC9TaGFkZUlkLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvc2hhcmVkL21vZGVsL1NoYWRlSWQua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwMjY1NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3NoYXJlZC9tb2RlbC9TaGFkZUlkLmt0CkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbAorCisvKiogRW51bWVyYXRlcyBhbGwga25vd24gc2hhZGUgSURzLiAqLworZW51bSBjbGFzcyBTaGFkZUlkIHsKKyAgICAvKiogSUQgb2YgdGhlIHNoYWRlIG9uIHRoZSBsZWZ0IGluIGR1YWwgc2hhZGUgY29uZmlndXJhdGlvbnMuICovCisgICAgTEVGVCwKKyAgICAvKiogSUQgb2YgdGhlIHNoYWRlIG9uIHRoZSByaWdodCBpbiBkdWFsIHNoYWRlIGNvbmZpZ3VyYXRpb25zLiAqLworICAgIFJJR0hULAorICAgIC8qKiBJRCBvZiB0aGUgc2luZ2xlIHNoYWRlIGluIHNpbmdsZSBzaGFkZSBjb25maWd1cmF0aW9ucy4gKi8KKyAgICBTSU5HTEUsCit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvc2hhcmVkL21vZGVsL0tleWd1YXJkQm91bmNlck1vZGVsLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvc2hhcmVkL21vZGVsL1NoYWRlTW9kZWwua3QKc2ltaWxhcml0eSBpbmRleCA2MSUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3NoYXJlZC9tb2RlbC9LZXlndWFyZEJvdW5jZXJNb2RlbC5rdApyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvc2hhcmVkL21vZGVsL1NoYWRlTW9kZWwua3QKaW5kZXggYWQ3ODNkYS4uNDlhYzY0YyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3NoYXJlZC9tb2RlbC9LZXlndWFyZEJvdW5jZXJNb2RlbC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS9zaGFyZWQvbW9kZWwvU2hhZGVNb2RlbC5rdApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTExLDE0ICsxMSwxNiBAQAogICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLnNoYXJlZC5tb2RlbAorcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbAogCi0vKiogTW9kZWxzIHRoZSBzdGF0ZSBvZiB0aGUgbG9jay1zY3JlZW4gYm91bmNlciAqLwotZGF0YSBjbGFzcyBLZXlndWFyZEJvdW5jZXJNb2RlbCgKLSAgICB2YWwgcHJvbXB0UmVhc29uOiBJbnQgPSAwLAotICAgIHZhbCBlcnJvck1lc3NhZ2U6IENoYXJTZXF1ZW5jZT8gPSBudWxsLAotICAgIHZhbCBleHBhbnNpb25BbW91bnQ6IEZsb2F0ID0gMGYsCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5GbG9hdFJhbmdlCisKKy8qKiBNb2RlbHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBzaGFkZS4gKi8KK2RhdGEgY2xhc3MgU2hhZGVNb2RlbCgKKyAgICB2YWwgaWQ6IFNoYWRlSWQsCisgICAgQEZsb2F0UmFuZ2UoZnJvbSA9IDAuMCwgdG8gPSAxLjApIHZhbCBleHBhbnNpb246IEZsb2F0ID0gMGYsCiApCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3L011bHRpU2hhZGVWaWV3Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvdmlldy9NdWx0aVNoYWRlVmlldy5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNlYzM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvdmlldy9NdWx0aVNoYWRlVmlldy5rdApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS52aWV3CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dAoraW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dAoraW1wb3J0IGFuZHJvaWR4LmxpZmVjeWNsZS5MaWZlY3ljbGUKK2ltcG9ydCBhbmRyb2lkeC5saWZlY3ljbGUubGlmZWN5Y2xlU2NvcGUKK2ltcG9ydCBhbmRyb2lkeC5saWZlY3ljbGUucmVwZWF0T25MaWZlY3ljbGUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jb21wb3NlLkNvbXBvc2VGYWNhZGUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5saWZlY3ljbGUucmVwZWF0V2hlbkF0dGFjaGVkCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kb21haW4uaW50ZXJhY3Rvci5NdWx0aVNoYWRlSW50ZXJhY3RvcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkudmlld21vZGVsLk11bHRpU2hhZGVWaWV3TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnRpbWUuU3lzdGVtQ2xvY2sKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMubGF1bmNoCisKKy8qKgorICogVmlldyB0aGF0IGhvc3RzIHRoZSBtdWx0aS1zaGFkZSBzeXN0ZW0gYW5kIGFjdHMgYXMgZ2x1ZSBiZXR3ZWVuIGxlZ2FjeSBjb2RlIGFuZCB0aGUKKyAqIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBNdWx0aVNoYWRlVmlldygKKyAgICBjb250ZXh0OiBDb250ZXh0LAorICAgIGF0dHJzOiBBdHRyaWJ1dGVTZXQ/LAorKSA6CisgICAgRnJhbWVMYXlvdXQoCisgICAgICAgIGNvbnRleHQsCisgICAgICAgIGF0dHJzLAorICAgICkgeworCisgICAgZnVuIGluaXQoCisgICAgICAgIGludGVyYWN0b3I6IE11bHRpU2hhZGVJbnRlcmFjdG9yLAorICAgICAgICBjbG9jazogU3lzdGVtQ2xvY2ssCisgICAgKSB7CisgICAgICAgIHJlcGVhdFdoZW5BdHRhY2hlZCB7CisgICAgICAgICAgICBsaWZlY3ljbGVTY29wZS5sYXVuY2ggeworICAgICAgICAgICAgICAgIHJlcGVhdE9uTGlmZWN5Y2xlKExpZmVjeWNsZS5TdGF0ZS5DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFZpZXcoCisgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NlRmFjYWRlLmNyZWF0ZU11bHRpU2hhZGVWaWV3KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpU2hhZGVWaWV3TW9kZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZWxTY29wZSA9IHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdG9yID0gaW50ZXJhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jayA9IGNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSGVyZSB3aGVuIGRlc3Ryb3llZC4KKyAgICAgICAgICAgICAgICByZW1vdmVBbGxWaWV3cygpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3bW9kZWwvTXVsdGlTaGFkZVZpZXdNb2RlbC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL3ZpZXdtb2RlbC9NdWx0aVNoYWRlVmlld01vZGVsLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmFiOTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3bW9kZWwvTXVsdGlTaGFkZVZpZXdNb2RlbC5rdApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkudmlld21vZGVsCisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRvbWFpbi5pbnRlcmFjdG9yLk11bHRpU2hhZGVJbnRlcmFjdG9yCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuUHJveGllZElucHV0TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5TaGFkZUNvbmZpZworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlNoYWRlSWQKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuQ29yb3V0aW5lU2NvcGUKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LlNoYXJpbmdTdGFydGVkCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuU3RhdGVGbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuY29tYmluZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmRpc3RpbmN0VW50aWxDaGFuZ2VkCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuZmxhdE1hcExhdGVzdAoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmZsb3dPZgoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93Lm1hcAoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LnN0YXRlSW4KKworLyoqIE1vZGVscyBVSSBzdGF0ZSBmb3IgVUkgdGhhdCBzdXBwb3J0cyBtdWx0aSAob3Igc2luZ2xlKSBzaGFkZS4gKi8KK0BPcHRJbihFeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpOjpjbGFzcykKK2NsYXNzIE11bHRpU2hhZGVWaWV3TW9kZWwoCisgICAgdmlld01vZGVsU2NvcGU6IENvcm91dGluZVNjb3BlLAorICAgIHByaXZhdGUgdmFsIGludGVyYWN0b3I6IE11bHRpU2hhZGVJbnRlcmFjdG9yLAorKSB7CisgICAgLyoqIE1vZGVscyBVSSBzdGF0ZSBmb3IgdGhlIHNpbmdsZSBzaGFkZS4gKi8KKyAgICB2YWwgc2luZ2xlU2hhZGUgPQorICAgICAgICBTaGFkZVZpZXdNb2RlbCgKKyAgICAgICAgICAgIHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgU2hhZGVJZC5TSU5HTEUsCisgICAgICAgICAgICBpbnRlcmFjdG9yLAorICAgICAgICApCisKKyAgICAvKiogTW9kZWxzIFVJIHN0YXRlIGZvciB0aGUgc2hhZGUgb24gdGhlIGxlZnQtaGFuZCBzaWRlLiAqLworICAgIHZhbCBsZWZ0U2hhZGUgPQorICAgICAgICBTaGFkZVZpZXdNb2RlbCgKKyAgICAgICAgICAgIHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgU2hhZGVJZC5MRUZULAorICAgICAgICAgICAgaW50ZXJhY3RvciwKKyAgICAgICAgKQorCisgICAgLyoqIE1vZGVscyBVSSBzdGF0ZSBmb3IgdGhlIHNoYWRlIG9uIHRoZSByaWdodC1oYW5kIHNpZGUuICovCisgICAgdmFsIHJpZ2h0U2hhZGUgPQorICAgICAgICBTaGFkZVZpZXdNb2RlbCgKKyAgICAgICAgICAgIHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgU2hhZGVJZC5SSUdIVCwKKyAgICAgICAgICAgIGludGVyYWN0b3IsCisgICAgICAgICkKKworICAgIC8qKiBUaGUgYW1vdW50IG9mIGFscGhhIHRoYXQgdGhlIHNjcmltIHNob3VsZCBoYXZlLiBUaGlzIGlzIGEgdmFsdWUgYmV0d2VlbiBgMGAgYW5kIGAxYC4gKi8KKyAgICB2YWwgc2NyaW1BbHBoYTogU3RhdGVGbG93PEZsb2F0PiA9CisgICAgICAgIGNvbWJpbmUoCisgICAgICAgICAgICAgICAgaW50ZXJhY3Rvci5tYXhTaGFkZUV4cGFuc2lvbiwKKyAgICAgICAgICAgICAgICBpbnRlcmFjdG9yLnNoYWRlQ29uZmlnCisgICAgICAgICAgICAgICAgICAgIC5tYXAgeyBpdCBhcz8gU2hhZGVDb25maWcuRHVhbFNoYWRlQ29uZmlnIH0KKyAgICAgICAgICAgICAgICAgICAgLm1hcCB7IGR1YWxTaGFkZUNvbmZpZ09yTnVsbCAtPiBkdWFsU2hhZGVDb25maWdPck51bGw/LnNjcmltQWxwaGEgPzogMGYgfSwKKyAgICAgICAgICAgICAgICA6OlBhaXIsCisgICAgICAgICAgICApCisgICAgICAgICAgICAubWFwIHsgKGFueVNoYWRlRXhwYW5zaW9uLCBzY3JpbUFscGhhKSAtPgorICAgICAgICAgICAgICAgIChhbnlTaGFkZUV4cGFuc2lvbiAqIHNjcmltQWxwaGEpLmNvZXJjZUluKDBmLCAxZikKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC5zdGF0ZUluKAorICAgICAgICAgICAgICAgIHNjb3BlID0gdmlld01vZGVsU2NvcGUsCisgICAgICAgICAgICAgICAgc3RhcnRlZCA9IFNoYXJpbmdTdGFydGVkLldoaWxlU3Vic2NyaWJlZCgpLAorICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IDBmLAorICAgICAgICAgICAgKQorCisgICAgLyoqIFdoZXRoZXIgdGhlIHNjcmltIHNob3VsZCBhY2NlcHQgdG91Y2ggZXZlbnRzLiAqLworICAgIHZhbCBpc1NjcmltRW5hYmxlZDogU3RhdGVGbG93PEJvb2xlYW4+ID0KKyAgICAgICAgaW50ZXJhY3Rvci5zaGFkZUNvbmZpZworICAgICAgICAgICAgLmZsYXRNYXBMYXRlc3QgeyBzaGFkZUNvbmZpZyAtPgorICAgICAgICAgICAgICAgIHdoZW4gKHNoYWRlQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoZSBkdWFsIHNoYWRlIGNvbmZpZ3VyYXRpb24sIHRoZSBzY3JpbSBpcyBlbmFibGVkIHdoZW4gdGhlIGV4cGFuc2lvbiBpcworICAgICAgICAgICAgICAgICAgICAvLyBncmVhdGVyIHRoYW4gemVybyBvbiBhbnkgb25lIG9mIHRoZSBzaGFkZXMuCisgICAgICAgICAgICAgICAgICAgIGlzIFNoYWRlQ29uZmlnLkR1YWxTaGFkZUNvbmZpZyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rvci5tYXhTaGFkZUV4cGFuc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAgeyBleHBhbnNpb24gLT4gZXhwYW5zaW9uID4gMCB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpc3RpbmN0VW50aWxDaGFuZ2VkKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8gc2NyaW0gaW4gdGhlIHNpbmdsZSBzaGFkZSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICBpcyBTaGFkZUNvbmZpZy5TaW5nbGVTaGFkZUNvbmZpZyAtPiBmbG93T2YoZmFsc2UpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLnN0YXRlSW4oCisgICAgICAgICAgICAgICAgc2NvcGUgPSB2aWV3TW9kZWxTY29wZSwKKyAgICAgICAgICAgICAgICBzdGFydGVkID0gU2hhcmluZ1N0YXJ0ZWQuV2hpbGVTdWJzY3JpYmVkKCksCisgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gZmFsc2UsCisgICAgICAgICAgICApCisKKyAgICAvKiogTm90aWZpZXMgdGhhdCB0aGUgc2NyaW0gaGFzIGJlZW4gdG91Y2hlZC4gKi8KKyAgICBmdW4gb25TY3JpbVRvdWNoZWQocHJveGllZElucHV0OiBQcm94aWVkSW5wdXRNb2RlbCkgeworICAgICAgICBpZiAoIWlzU2NyaW1FbmFibGVkLnZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorCisgICAgICAgIGludGVyYWN0b3Iuc2VuZFByb3hpZWRJbnB1dChwcm94aWVkSW5wdXQpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvdmlld21vZGVsL1NoYWRlVmlld01vZGVsLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvdWkvdmlld21vZGVsL1NoYWRlVmlld01vZGVsLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjhkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3bW9kZWwvU2hhZGVWaWV3TW9kZWwua3QKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnVpLnZpZXdtb2RlbAorCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5GbG9hdFJhbmdlCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kb21haW4uaW50ZXJhY3Rvci5NdWx0aVNoYWRlSW50ZXJhY3RvcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlByb3hpZWRJbnB1dE1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVDb25maWcKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5TaGFkZUlkCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkNvcm91dGluZVNjb3BlCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuRmxvdworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LlNoYXJpbmdTdGFydGVkCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuU3RhdGVGbG93CitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuZGlzdGluY3RVbnRpbENoYW5nZWQKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5tYXAKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5zdGF0ZUluCisKKy8qKiBNb2RlbHMgVUkgc3RhdGUgZm9yIGEgc2luZ2xlIHNoYWRlLiAqLworY2xhc3MgU2hhZGVWaWV3TW9kZWwoCisgICAgdmlld01vZGVsU2NvcGU6IENvcm91dGluZVNjb3BlLAorICAgIHByaXZhdGUgdmFsIHNoYWRlSWQ6IFNoYWRlSWQsCisgICAgcHJpdmF0ZSB2YWwgaW50ZXJhY3RvcjogTXVsdGlTaGFkZUludGVyYWN0b3IsCispIHsKKyAgICAvKiogV2hldGhlciB0aGUgc2hhZGUgaXMgdmlzaWJsZS4gKi8KKyAgICB2YWwgaXNWaXNpYmxlOiBTdGF0ZUZsb3c8Qm9vbGVhbj4gPQorICAgICAgICBpbnRlcmFjdG9yCisgICAgICAgICAgICAuaXNWaXNpYmxlKHNoYWRlSWQpCisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBmYWxzZSwKKyAgICAgICAgICAgICkKKworICAgIC8qKiBXaGV0aGVyIHN3aXBpbmcgb24gdGhlIHNoYWRlIFVJIGlzIGN1cnJlbnRseSBlbmFibGVkLiAqLworICAgIHZhbCBpc1N3aXBpbmdFbmFibGVkOiBTdGF0ZUZsb3c8Qm9vbGVhbj4gPQorICAgICAgICBpbnRlcmFjdG9yCisgICAgICAgICAgICAuaXNOb25Qcm94aWVkSW5wdXRBbGxvd2VkKHNoYWRlSWQpCisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBmYWxzZSwKKyAgICAgICAgICAgICkKKworICAgIC8qKiBXaGV0aGVyIHRoZSBzaGFkZSBtdXN0IGJlIGNvbGxhcHNlZCBpbW1lZGlhdGVseS4gKi8KKyAgICB2YWwgaXNGb3JjZUNvbGxhcHNlZDogRmxvdzxCb29sZWFuPiA9CisgICAgICAgIGludGVyYWN0b3IuaXNGb3JjZUNvbGxhcHNlZChzaGFkZUlkKS5kaXN0aW5jdFVudGlsQ2hhbmdlZCgpCisKKyAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSBzaGFkZS4gKi8KKyAgICB2YWwgd2lkdGg6IFN0YXRlRmxvdzxTaXplPiA9CisgICAgICAgIGludGVyYWN0b3Iuc2hhZGVDb25maWcKKyAgICAgICAgICAgIC5tYXAgeyBzaGFkZVdpZHRoKGl0KSB9CisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBzaGFkZVdpZHRoKGludGVyYWN0b3Iuc2hhZGVDb25maWcudmFsdWUpLAorICAgICAgICAgICAgKQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB1c2VyIG11c3Qgc3dpcGUgdXAgd2hlbiB0aGUgc2hhZGUgaXMgZnVsbHkgZXhwYW5kZWQgdG8gYXV0b21hdGljYWxseQorICAgICAqIGNvbGxhcHNlIG9uY2UgdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGUuIElmIHRoZSB1c2VyIHN3aXBlcyBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIHRoZQorICAgICAqIHNoYWRlIHdpbGwgYXV0b21hdGljYWxseSByZXZlcnQgYmFjayB0byBmdWxseSBleHBhbmRlZCBvbmNlIHRoZSB1c2VyIHN0b3BzIHN3aXBpbmcuCisgICAgICovCisgICAgdmFsIHN3aXBlQ29sbGFwc2VUaHJlc2hvbGQ6IFN0YXRlRmxvdzxGbG9hdD4gPQorICAgICAgICBpbnRlcmFjdG9yLnNoYWRlQ29uZmlnCisgICAgICAgICAgICAubWFwIHsgaXQuc3dpcGVDb2xsYXBzZVRocmVzaG9sZCB9CisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbnRlcmFjdG9yLnNoYWRlQ29uZmlnLnZhbHVlLnN3aXBlQ29sbGFwc2VUaHJlc2hvbGQsCisgICAgICAgICAgICApCisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IHRoYXQgdGhlIHVzZXIgbXVzdCBzd2lwZSBkb3duIHdoZW4gdGhlIHNoYWRlIGlzIGZ1bGx5IGNvbGxhcHNlZCB0byBhdXRvbWF0aWNhbGx5CisgICAgICogZXhwYW5kIG9uY2UgdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2hhZGUuIElmIHRoZSB1c2VyIHN3aXBlcyBsZXNzIHRoYW4gdGhpcyBhbW91bnQsIHRoZQorICAgICAqIHNoYWRlIHdpbGwgYXV0b21hdGljYWxseSByZXZlcnQgYmFjayB0byBmdWxseSBjb2xsYXBzZWQgb25jZSB0aGUgdXNlciBzdG9wcyBzd2lwaW5nLgorICAgICAqLworICAgIHZhbCBzd2lwZUV4cGFuZFRocmVzaG9sZDogU3RhdGVGbG93PEZsb2F0PiA9CisgICAgICAgIGludGVyYWN0b3Iuc2hhZGVDb25maWcKKyAgICAgICAgICAgIC5tYXAgeyBpdC5zd2lwZUV4cGFuZFRocmVzaG9sZCB9CisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbnRlcmFjdG9yLnNoYWRlQ29uZmlnLnZhbHVlLnN3aXBlRXhwYW5kVGhyZXNob2xkLAorICAgICAgICAgICAgKQorCisgICAgLyoqCisgICAgICogUHJveGllZCBpbnB1dCBhZmZlY3RpbmcgdGhlIHNoYWRlLiBUaGlzIGlzIGlucHV0IGNvbWluZyBmcm9tIHNvdXJjZXMgb3V0c2lkZSBvZiBzeXN0ZW0gVUkKKyAgICAgKiAoZm9yIGV4YW1wbGUsIHN3aXBpbmcgZG93biBvbiB0aGUgTGF1bmNoZXIgb3IgZnJvbSB0aGUgc3RhdHVzIGJhcikgb3Igb3V0c2lkZSB0aGUgVUkgb2YgYW55CisgICAgICogc2hhZGUgKGZvciBleGFtcGxlLCB0aGUgc2NyaW0gdGhhdCdzIHNob3duIGJlaGluZCB0aGUgc2hhZGVzKS4KKyAgICAgKi8KKyAgICB2YWwgcHJveGllZElucHV0OiBGbG93PFByb3hpZWRJbnB1dE1vZGVsPz4gPQorICAgICAgICBpbnRlcmFjdG9yCisgICAgICAgICAgICAucHJveGllZElucHV0KHNoYWRlSWQpCisgICAgICAgICAgICAuc3RhdGVJbigKKyAgICAgICAgICAgICAgICBzY29wZSA9IHZpZXdNb2RlbFNjb3BlLAorICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBudWxsLAorICAgICAgICAgICAgKQorCisgICAgLyoqIE5vdGlmaWVzIHRoYXQgdGhlIGV4cGFuc2lvbiBhbW91bnQgZm9yIHRoZSBzaGFkZSBoYXMgY2hhbmdlZC4gKi8KKyAgICBmdW4gb25FeHBhbnNpb25DaGFuZ2VkKAorICAgICAgICBleHBhbnNpb246IEZsb2F0LAorICAgICkgeworICAgICAgICBpbnRlcmFjdG9yLnNldEV4cGFuc2lvbihzaGFkZUlkLCBleHBhbnNpb24uY29lcmNlSW4oMGYsIDFmKSkKKyAgICB9CisKKyAgICAvKiogTm90aWZpZXMgdGhhdCBhIGRyYWcgZ2VzdHVyZSBoYXMgc3RhcnRlZC4gKi8KKyAgICBmdW4gb25EcmFnU3RhcnRlZCgpIHsKKyAgICAgICAgaW50ZXJhY3Rvci5vblVzZXJJbnRlcmFjdGlvblN0YXJ0ZWQoc2hhZGVJZCkKKyAgICB9CisKKyAgICAvKiogTm90aWZpZXMgdGhhdCBhIGRyYWcgZ2VzdHVyZSBoYXMgZW5kZWQuICovCisgICAgZnVuIG9uRHJhZ0VuZGVkKCkgeworICAgICAgICBpbnRlcmFjdG9yLm9uVXNlckludGVyYWN0aW9uRW5kZWQoc2hhZGVJZCA9IHNoYWRlSWQpCisgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gc2hhZGVXaWR0aChzaGFkZUNvbmZpZzogU2hhZGVDb25maWcpOiBTaXplIHsKKyAgICAgICAgcmV0dXJuIHdoZW4gKHNoYWRlSWQpIHsKKyAgICAgICAgICAgIFNoYWRlSWQuTEVGVCAtPgorICAgICAgICAgICAgICAgIFNpemUuUGl4ZWxzKChzaGFkZUNvbmZpZyBhcz8gU2hhZGVDb25maWcuRHVhbFNoYWRlQ29uZmlnKT8ubGVmdFNoYWRlV2lkdGhQeCA/OiAwKQorICAgICAgICAgICAgU2hhZGVJZC5SSUdIVCAtPgorICAgICAgICAgICAgICAgIFNpemUuUGl4ZWxzKChzaGFkZUNvbmZpZyBhcz8gU2hhZGVDb25maWcuRHVhbFNoYWRlQ29uZmlnKT8ucmlnaHRTaGFkZVdpZHRoUHggPzogMCkKKyAgICAgICAgICAgIFNoYWRlSWQuU0lOR0xFIC0+IFNpemUuRnJhY3Rpb24oMWYpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBzZWFsZWQgY2xhc3MgU2l6ZSB7CisgICAgICAgIGRhdGEgY2xhc3MgRnJhY3Rpb24oCisgICAgICAgICAgICBARmxvYXRSYW5nZShmcm9tID0gMC4wLCB0byA9IDEuMCkgdmFsIGZyYWN0aW9uOiBGbG9hdCwKKyAgICAgICAgKSA6IFNpemUoKQorICAgICAgICBkYXRhIGNsYXNzIFBpeGVscygKKyAgICAgICAgICAgIHZhbCBwaXhlbHM6IEludCwKKyAgICAgICAgKSA6IFNpemUoKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RldGFzay9Ob3RlVGFza0NvbnRyb2xsZXIua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbm90ZXRhc2svTm90ZVRhc2tDb250cm9sbGVyLmt0CmluZGV4IGFjMjJiN2MuLjc3OWYxZDggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RldGFzay9Ob3RlVGFza0NvbnRyb2xsZXIua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL25vdGV0YXNrL05vdGVUYXNrQ29udHJvbGxlci5rdApAQCAtMTI5LDggKzEyOSw3IEBACiAgICAgICAgICAgICBsb2dEZWJ1ZyB7ICJvblNob3dOb3RlVGFzayAtIHN0YXJ0OiAkaW5mbyIgfQogICAgICAgICAgICAgd2hlbiAoaW5mby5sYXVuY2hNb2RlKSB7CiAgICAgICAgICAgICAgICAgaXMgTm90ZVRhc2tMYXVuY2hNb2RlLkFwcEJ1YmJsZSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8yNjc2MzQ0MTIsIGIvMjY4MzUxNjkzKTogU2hvdWxkIHVzZSBgc2hvd09ySGlkZUFwcEJ1YmJsZUFzVXNlcmAKLSAgICAgICAgICAgICAgICAgICAgYnViYmxlcy5zaG93T3JIaWRlQXBwQnViYmxlKGludGVudCkKKyAgICAgICAgICAgICAgICAgICAgYnViYmxlcy5zaG93T3JIaWRlQXBwQnViYmxlKGludGVudCwgdXNlclRyYWNrZXIudXNlckhhbmRsZSkKICAgICAgICAgICAgICAgICAgICAgLy8gQXBwIGJ1YmJsZSBsb2dnaW5nIGhhcHBlbnMgb24gYG9uQnViYmxlRXhwYW5kQ2hhbmdlZGAuCiAgICAgICAgICAgICAgICAgICAgIGxvZ0RlYnVnIHsgIm9uU2hvd05vdGVUYXNrIC0gb3BlbmVkIGFzIGFwcCBidWJibGU6ICRpbmZvIiB9CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3BsdWdpbnMvUGx1Z2luc01vZHVsZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3BsdWdpbnMvUGx1Z2luc01vZHVsZS5qYXZhCmluZGV4IDk1ZjE0MTkuLmZiZjFhMGUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9wbHVnaW5zL1BsdWdpbnNNb2R1bGUuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcGx1Z2lucy9QbHVnaW5zTW9kdWxlLmphdmEKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgcmV0dXJuIG5ldyBQbHVnaW5JbnN0YW5jZS5GYWN0b3J5KAogICAgICAgICAgICAgICAgIFBsdWdpbk1vZHVsZS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLAogICAgICAgICAgICAgICAgIG5ldyBQbHVnaW5JbnN0YW5jZS5JbnN0YW5jZUZhY3Rvcnk8PigpLAotICAgICAgICAgICAgICAgIG5ldyBQbHVnaW5JbnN0YW5jZS5WZXJzaW9uQ2hlY2tlcigpLAorICAgICAgICAgICAgICAgIG5ldyBQbHVnaW5JbnN0YW5jZS5WZXJzaW9uQ2hlY2tlckltcGwoKSwKICAgICAgICAgICAgICAgICBwcml2aWxlZ2VkUGx1Z2lucywKICAgICAgICAgICAgICAgICBpc0RlYnVnKTsKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvUVNGcmFnbWVudC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL1FTRnJhZ21lbnQuamF2YQppbmRleCBiYWE4MTJjLi41ODRkMjdmOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL1FTRnJhZ21lbnQuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvUVNGcmFnbWVudC5qYXZhCkBAIC02MzUsNyArNjM1LDggQEAKICAgICAgICAgICAgICAgICAmJiBtTGFzdEtleWd1YXJkQW5kRXhwYW5kZWQgPT0gb25LZXlndWFyZEFuZEV4cGFuZGVkCiAgICAgICAgICAgICAgICAgJiYgbUxhc3RWaWV3SGVpZ2h0ID09IGN1cnJlbnRIZWlnaHQKICAgICAgICAgICAgICAgICAmJiBtTGFzdEhlYWRlclRyYW5zbGF0aW9uID09IGhlYWRlclRyYW5zbGF0aW9uCi0gICAgICAgICAgICAgICAgJiYgbVNxdWlzaGluZXNzRnJhY3Rpb24gPT0gc3F1aXNoaW5lc3NGcmFjdGlvbikgeworICAgICAgICAgICAgICAgICYmIG1TcXVpc2hpbmVzc0ZyYWN0aW9uID09IHNxdWlzaGluZXNzRnJhY3Rpb24KKyAgICAgICAgICAgICAgICAmJiBtTGFzdFBhbmVsRnJhY3Rpb24gPT0gcGFuZWxFeHBhbnNpb25GcmFjdGlvbikgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIG1MYXN0SGVhZGVyVHJhbnNsYXRpb24gPSBoZWFkZXJUcmFuc2xhdGlvbjsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9RU0hvc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9RU0hvc3QuamF2YQppbmRleCBhNzFlNmRkLi45ZWNlNzJkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvUVNIb3N0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL1FTSG9zdC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5xcy5RU0ZhY3Rvcnk7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5xcy5RU1RpbGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5xcy5RU1RpbGVWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLnBpcGVsaW5lLmRvbWFpbi5pbnRlcmFjdG9yLlBhbmVsSW50ZXJhY3RvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLmxlYWsuR2FyYmFnZU1vbml0b3I7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMzMsNyArMzQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1wdWJsaWMgaW50ZXJmYWNlIFFTSG9zdCB7CitwdWJsaWMgaW50ZXJmYWNlIFFTSG9zdCBleHRlbmRzIFBhbmVsSW50ZXJhY3RvciB7CiAgICAgU3RyaW5nIFRJTEVTX1NFVFRJTkcgPSBTZXR0aW5ncy5TZWN1cmUuUVNfVElMRVM7CiAgICAgaW50IFBPU0lUSU9OX0FUX0VORCA9IC0xOwogCkBAIC01Nyw5ICs1OCw2IEBACiAgICAgfQogCiAgICAgdm9pZCB3YXJuKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCk7Ci0gICAgdm9pZCBjb2xsYXBzZVBhbmVscygpOwotICAgIHZvaWQgZm9yY2VDb2xsYXBzZVBhbmVscygpOwotICAgIHZvaWQgb3BlblBhbmVscygpOwogICAgIENvbnRleHQgZ2V0Q29udGV4dCgpOwogICAgIENvbnRleHQgZ2V0VXNlckNvbnRleHQoKTsKICAgICBpbnQgZ2V0VXNlcklkKCk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvZGFnZ2VyL1FTSG9zdE1vZHVsZS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9kYWdnZXIvUVNIb3N0TW9kdWxlLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OGZhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvZGFnZ2VyL1FTSG9zdE1vZHVsZS5rdApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLmRhZ2dlcgorCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmVhdHVyZUZsYWdzCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmxhZ3MKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5RU0hvc3QKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5RU1RpbGVIb3N0CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMucGlwZWxpbmUuZG9tYWluLmludGVyYWN0b3IuUGFuZWxJbnRlcmFjdG9yCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMucGlwZWxpbmUuZG9tYWluLmludGVyYWN0b3IuUGFuZWxJbnRlcmFjdG9ySW1wbAoraW1wb3J0IGRhZ2dlci5CaW5kcworaW1wb3J0IGRhZ2dlci5Nb2R1bGUKK2ltcG9ydCBkYWdnZXIuUHJvdmlkZXMKKworQE1vZHVsZQoraW50ZXJmYWNlIFFTSG9zdE1vZHVsZSB7CisKKyAgICBAQmluZHMgZnVuIHByb3ZpZGVRc0hvc3QoY29udHJvbGxlckltcGw6IFFTVGlsZUhvc3QpOiBRU0hvc3QKKworICAgIEBNb2R1bGUKKyAgICBjb21wYW5pb24gb2JqZWN0IHsKKyAgICAgICAgQFByb3ZpZGVzCisgICAgICAgIEBKdm1TdGF0aWMKKyAgICAgICAgZnVuIHByb3ZpZGVQYW5lbEludGVyYWN0b3IoCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3M6IEZlYXR1cmVGbGFncywKKyAgICAgICAgICAgIHFzSG9zdDogUVNIb3N0LAorICAgICAgICAgICAgcGFuZWxJbnRlcmFjdG9ySW1wbDogUGFuZWxJbnRlcmFjdG9ySW1wbAorICAgICAgICApOiBQYW5lbEludGVyYWN0b3IgeworICAgICAgICAgICAgcmV0dXJuIGlmIChmZWF0dXJlRmxhZ3MuaXNFbmFibGVkKEZsYWdzLlFTX1BJUEVMSU5FX05FV19IT1NUKSkgeworICAgICAgICAgICAgICAgIHBhbmVsSW50ZXJhY3RvckltcGwKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXNIb3N0CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvZGFnZ2VyL1FTTW9kdWxlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvZGFnZ2VyL1FTTW9kdWxlLmphdmEKaW5kZXggNDMxZDZlOC4uY2ZlOTMxMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL2RhZ2dlci9RU01vZHVsZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9kYWdnZXIvUVNNb2R1bGUuamF2YQpAQCAtMjcsNyArMjcsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm1lZGlhLmRhZ2dlci5NZWRpYU1vZHVsZTsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5BdXRvQWRkVHJhY2tlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5RU0hvc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMuUVNUaWxlSG9zdDsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5SZWR1Y2VCcmlnaHRDb2xvcnNDb250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLmV4dGVybmFsLlFTRXh0ZXJuYWxNb2R1bGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMudGlsZWltcGwuUVNUaWxlSW1wbDsKQEAgLTQ1LDcgKzQ0LDYgQEAKIAogaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKIAotaW1wb3J0IGRhZ2dlci5CaW5kczsKIGltcG9ydCBkYWdnZXIuTW9kdWxlOwogaW1wb3J0IGRhZ2dlci5Qcm92aWRlczsKIGltcG9ydCBkYWdnZXIubXVsdGliaW5kaW5ncy5NdWx0aWJpbmRzOwpAQCAtNTQsNyArNTIsMTMgQEAKICAqIE1vZHVsZSBmb3IgUVMgZGVwZW5kZW5jaWVzCiAgKi8KIEBNb2R1bGUoc3ViY29tcG9uZW50cyA9IHtRU0ZyYWdtZW50Q29tcG9uZW50LmNsYXNzfSwKLSAgICAgICAgaW5jbHVkZXMgPSB7TWVkaWFNb2R1bGUuY2xhc3MsIFFTRXh0ZXJuYWxNb2R1bGUuY2xhc3MsIFFTRmxhZ3NNb2R1bGUuY2xhc3N9KQorICAgICAgICBpbmNsdWRlcyA9IHsKKyAgICAgICAgICAgICAgICBNZWRpYU1vZHVsZS5jbGFzcywKKyAgICAgICAgICAgICAgICBRU0V4dGVybmFsTW9kdWxlLmNsYXNzLAorICAgICAgICAgICAgICAgIFFTRmxhZ3NNb2R1bGUuY2xhc3MsCisgICAgICAgICAgICAgICAgUVNIb3N0TW9kdWxlLmNsYXNzCisgICAgICAgIH0KKykKIHB1YmxpYyBpbnRlcmZhY2UgUVNNb2R1bGUgewogCiAgICAgLyoqIEEgbWFwIG9mIGludGVybmFsIFFTIHRpbGVzLiBFbnN1cmVzIHRoYXQgdGhpcyBjYW4gYmUgaW5qZWN0ZWQgZXZlbiBpZgpAQCAtMTAwLDggKzEwNCw0IEBACiAgICAgICAgIG1hbmFnZXIuaW5pdCgpOwogICAgICAgICByZXR1cm4gbWFuYWdlcjsKICAgICB9Ci0KLSAgICAvKiogKi8KLSAgICBAQmluZHMKLSAgICBRU0hvc3QgcHJvdmlkZVFzSG9zdChRU1RpbGVIb3N0IGNvbnRyb2xsZXJJbXBsKTsKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9leHRlcm5hbC9UaWxlU2VydmljZXMuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9leHRlcm5hbC9UaWxlU2VydmljZXMuamF2YQppbmRleCBhZGM3MTY1Li4yMDgzY2M3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvZXh0ZXJuYWwvVGlsZVNlcnZpY2VzLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL2V4dGVybmFsL1RpbGVTZXJ2aWNlcy5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLlN5c1VJU2luZ2xldG9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRhZ2dlci5xdWFsaWZpZXJzLk1haW47CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMuUVNIb3N0OworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLnBpcGVsaW5lLmRvbWFpbi5pbnRlcmFjdG9yLlBhbmVsSW50ZXJhY3RvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zZXR0aW5ncy5Vc2VyVHJhY2tlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuQ29tbWFuZFF1ZXVlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waG9uZS5TdGF0dXNCYXJJY29uQ29udHJvbGxlcjsKQEAgLTc0LDYgKzc1LDcgQEAKICAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRRdWV1ZSBtQ29tbWFuZFF1ZXVlOwogICAgIHByaXZhdGUgZmluYWwgVXNlclRyYWNrZXIgbVVzZXJUcmFja2VyOwogICAgIHByaXZhdGUgZmluYWwgU3RhdHVzQmFySWNvbkNvbnRyb2xsZXIgbVN0YXR1c0Jhckljb25Db250cm9sbGVyOworICAgIHByaXZhdGUgZmluYWwgUGFuZWxJbnRlcmFjdG9yIG1QYW5lbEludGVyYWN0b3I7CiAKICAgICBwcml2YXRlIGludCBtTWF4Qm91bmQgPSBERUZBVUxUX01BWF9CT1VORDsKIApAQCAtODUsNyArODcsOCBAQAogICAgICAgICAgICAgVXNlclRyYWNrZXIgdXNlclRyYWNrZXIsCiAgICAgICAgICAgICBLZXlndWFyZFN0YXRlQ29udHJvbGxlciBrZXlndWFyZFN0YXRlQ29udHJvbGxlciwKICAgICAgICAgICAgIENvbW1hbmRRdWV1ZSBjb21tYW5kUXVldWUsCi0gICAgICAgICAgICBTdGF0dXNCYXJJY29uQ29udHJvbGxlciBzdGF0dXNCYXJJY29uQ29udHJvbGxlcikgeworICAgICAgICAgICAgU3RhdHVzQmFySWNvbkNvbnRyb2xsZXIgc3RhdHVzQmFySWNvbkNvbnRyb2xsZXIsCisgICAgICAgICAgICBQYW5lbEludGVyYWN0b3IgcGFuZWxJbnRlcmFjdG9yKSB7CiAgICAgICAgIG1Ib3N0ID0gaG9zdDsKICAgICAgICAgbUtleWd1YXJkU3RhdGVDb250cm9sbGVyID0ga2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXI7CiAgICAgICAgIG1Db250ZXh0ID0gbUhvc3QuZ2V0Q29udGV4dCgpOwpAQCAtOTYsNiArOTksNyBAQAogICAgICAgICBtQ29tbWFuZFF1ZXVlID0gY29tbWFuZFF1ZXVlOwogICAgICAgICBtU3RhdHVzQmFySWNvbkNvbnRyb2xsZXIgPSBzdGF0dXNCYXJJY29uQ29udHJvbGxlcjsKICAgICAgICAgbUNvbW1hbmRRdWV1ZS5hZGRDYWxsYmFjayhtUmVxdWVzdExpc3RlbmluZ0NhbGxiYWNrKTsKKyAgICAgICAgbVBhbmVsSW50ZXJhY3RvciA9IHBhbmVsSW50ZXJhY3RvcjsKICAgICB9CiAKICAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgewpAQCAtMjU1LDcgKzI1OSw3IEBACiAgICAgICAgIGlmIChjdXN0b21UaWxlICE9IG51bGwpIHsKICAgICAgICAgICAgIHZlcmlmeUNhbGxlcihjdXN0b21UaWxlKTsKICAgICAgICAgICAgIGN1c3RvbVRpbGUub25EaWFsb2dTaG93bigpOwotICAgICAgICAgICAgbUhvc3QuZm9yY2VDb2xsYXBzZVBhbmVscygpOworICAgICAgICAgICAgbVBhbmVsSW50ZXJhY3Rvci5mb3JjZUNvbGxhcHNlUGFuZWxzKCk7CiAgICAgICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKG1TZXJ2aWNlcy5nZXQoY3VzdG9tVGlsZSkpLnNldFNob3dpbmdEaWFsb2codHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNzUsNyArMjc5LDcgQEAKICAgICAgICAgQ3VzdG9tVGlsZSBjdXN0b21UaWxlID0gZ2V0VGlsZUZvclRva2VuKHRva2VuKTsKICAgICAgICAgaWYgKGN1c3RvbVRpbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgdmVyaWZ5Q2FsbGVyKGN1c3RvbVRpbGUpOwotICAgICAgICAgICAgbUhvc3QuZm9yY2VDb2xsYXBzZVBhbmVscygpOworICAgICAgICAgICAgbVBhbmVsSW50ZXJhY3Rvci5mb3JjZUNvbGxhcHNlUGFuZWxzKCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9waXBlbGluZS9kb21haW4vaW50ZXJhY3Rvci9QYW5lbEludGVyYWN0b3Iua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvcGlwZWxpbmUvZG9tYWluL2ludGVyYWN0b3IvUGFuZWxJbnRlcmFjdG9yLmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MGNhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvcGlwZWxpbmUvZG9tYWluL2ludGVyYWN0b3IvUGFuZWxJbnRlcmFjdG9yLmt0CkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLnBpcGVsaW5lLmRvbWFpbi5pbnRlcmFjdG9yCisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5kYWdnZXIuU3lzVUlTaW5nbGV0b24KK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuQ2VudHJhbFN1cmZhY2VzCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdAorCisvKiogRW5jYXBzdWxhdGVzIGJ1c2luZXNzIGxvZ2ljIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBRUyBwYW5lbC4gKi8KK2ludGVyZmFjZSBQYW5lbEludGVyYWN0b3IgeworCisgICAgLyoqIENvbGxhcHNlIHRoZSBzaGFkZSAqLworICAgIGZ1biBjb2xsYXBzZVBhbmVscygpCisKKyAgICAvKiogQ29sbGFwc2UgdGhlIHNoYWRlIGZvcmNlZnVsbHksIHNraXBwaW5nIHNvbWUgYW5pbWF0aW9ucy4gKi8KKyAgICBmdW4gZm9yY2VDb2xsYXBzZVBhbmVscygpCisKKyAgICAvKiogT3BlbiB0aGUgUXVpY2sgU2V0dGluZ3MgcGFuZWwgKi8KKyAgICBmdW4gb3BlblBhbmVscygpCit9CisKK0BTeXNVSVNpbmdsZXRvbgorY2xhc3MgUGFuZWxJbnRlcmFjdG9ySW1wbAorQEluamVjdAorY29uc3RydWN0b3IoCisgICAgcHJpdmF0ZSB2YWwgY2VudHJhbFN1cmZhY2VzOiBPcHRpb25hbDxDZW50cmFsU3VyZmFjZXM+LAorKSA6IFBhbmVsSW50ZXJhY3RvciB7CisgICAgb3ZlcnJpZGUgZnVuIGNvbGxhcHNlUGFuZWxzKCkgeworICAgICAgICBjZW50cmFsU3VyZmFjZXMuaWZQcmVzZW50IHsgaXQucG9zdEFuaW1hdGVDb2xsYXBzZVBhbmVscygpIH0KKyAgICB9CisKKyAgICBvdmVycmlkZSBmdW4gZm9yY2VDb2xsYXBzZVBhbmVscygpIHsKKyAgICAgICAgY2VudHJhbFN1cmZhY2VzLmlmUHJlc2VudCB7IGl0LnBvc3RBbmltYXRlRm9yY2VDb2xsYXBzZVBhbmVscygpIH0KKyAgICB9CisKKyAgICBvdmVycmlkZSBmdW4gb3BlblBhbmVscygpIHsKKyAgICAgICAgY2VudHJhbFN1cmZhY2VzLmlmUHJlc2VudCB7IGl0LnBvc3RBbmltYXRlT3BlblBhbmVscygpIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvdGlsZXMvTG9jYXRpb25UaWxlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvdGlsZXMvTG9jYXRpb25UaWxlLmphdmEKaW5kZXggODlkNDAyYTMuLjI3ZjU4MjYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy90aWxlcy9Mb2NhdGlvblRpbGUuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvdGlsZXMvTG9jYXRpb25UaWxlLmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLnN0YXR1c2Jhci5TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMuUVNIb3N0OwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLmxvZ2dpbmcuUVNMb2dnZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMucGlwZWxpbmUuZG9tYWluLmludGVyYWN0b3IuUGFuZWxJbnRlcmFjdG9yOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLnRpbGVpbXBsLlFTVGlsZUltcGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5LZXlndWFyZFN0YXRlQ29udHJvbGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LkxvY2F0aW9uQ29udHJvbGxlcjsKQEAgLTUyLDYgKzUzLDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgTG9jYXRpb25Db250cm9sbGVyIG1Db250cm9sbGVyOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIgbUtleWd1YXJkOworICAgIHByaXZhdGUgZmluYWwgUGFuZWxJbnRlcmFjdG9yIG1QYW5lbEludGVyYWN0b3I7CiAgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgQ2FsbGJhY2soKTsKIAogICAgIEBJbmplY3QKQEAgLTY1LDEyICs2NywxNCBAQAogICAgICAgICAgICAgQWN0aXZpdHlTdGFydGVyIGFjdGl2aXR5U3RhcnRlciwKICAgICAgICAgICAgIFFTTG9nZ2VyIHFzTG9nZ2VyLAogICAgICAgICAgICAgTG9jYXRpb25Db250cm9sbGVyIGxvY2F0aW9uQ29udHJvbGxlciwKLSAgICAgICAgICAgIEtleWd1YXJkU3RhdGVDb250cm9sbGVyIGtleWd1YXJkU3RhdGVDb250cm9sbGVyCisgICAgICAgICAgICBLZXlndWFyZFN0YXRlQ29udHJvbGxlciBrZXlndWFyZFN0YXRlQ29udHJvbGxlciwKKyAgICAgICAgICAgIFBhbmVsSW50ZXJhY3RvciBwYW5lbEludGVyYWN0b3IKICAgICApIHsKICAgICAgICAgc3VwZXIoaG9zdCwgYmFja2dyb3VuZExvb3BlciwgbWFpbkhhbmRsZXIsIGZhbHNpbmdNYW5hZ2VyLCBtZXRyaWNzTG9nZ2VyLAogICAgICAgICAgICAgICAgIHN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwgYWN0aXZpdHlTdGFydGVyLCBxc0xvZ2dlcik7CiAgICAgICAgIG1Db250cm9sbGVyID0gbG9jYXRpb25Db250cm9sbGVyOwogICAgICAgICBtS2V5Z3VhcmQgPSBrZXlndWFyZFN0YXRlQ29udHJvbGxlcjsKKyAgICAgICAgbVBhbmVsSW50ZXJhY3RvciA9IHBhbmVsSW50ZXJhY3RvcjsKICAgICAgICAgbUNvbnRyb2xsZXIub2JzZXJ2ZSh0aGlzLCBtQ2FsbGJhY2spOwogICAgICAgICBtS2V5Z3VhcmQub2JzZXJ2ZSh0aGlzLCBtQ2FsbGJhY2spOwogICAgIH0KQEAgLTkwLDcgKzk0LDcgQEAKICAgICAgICAgaWYgKG1LZXlndWFyZC5pc01ldGhvZFNlY3VyZSgpICYmIG1LZXlndWFyZC5pc1Nob3dpbmcoKSkgewogICAgICAgICAgICAgbUFjdGl2aXR5U3RhcnRlci5wb3N0UVNSdW5uYWJsZURpc21pc3NpbmdLZXlndWFyZCgoKSAtPiB7CiAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB3YXNFbmFibGVkID0gbVN0YXRlLnZhbHVlOwotICAgICAgICAgICAgICAgIG1Ib3N0Lm9wZW5QYW5lbHMoKTsKKyAgICAgICAgICAgICAgICBtUGFuZWxJbnRlcmFjdG9yLm9wZW5QYW5lbHMoKTsKICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZXRMb2NhdGlvbkVuYWJsZWQoIXdhc0VuYWJsZWQpOwogICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvdGlsZXMvU2NyZWVuUmVjb3JkVGlsZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL3RpbGVzL1NjcmVlblJlY29yZFRpbGUuamF2YQppbmRleCAwN2I1MGM5Li42NTU5MmE3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvdGlsZXMvU2NyZWVuUmVjb3JkVGlsZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy90aWxlcy9TY3JlZW5SZWNvcmRUaWxlLmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLnN0YXR1c2Jhci5TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMuUVNIb3N0OwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLmxvZ2dpbmcuUVNMb2dnZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMucGlwZWxpbmUuZG9tYWluLmludGVyYWN0b3IuUGFuZWxJbnRlcmFjdG9yOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLnRpbGVpbXBsLlFTVGlsZUltcGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc2NyZWVucmVjb3JkLlJlY29yZGluZ0NvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBob25lLktleWd1YXJkRGlzbWlzc1V0aWw7CkBAIC02Niw2ICs2Nyw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgQ2FsbGJhY2soKTsKICAgICBwcml2YXRlIGZpbmFsIERpYWxvZ0xhdW5jaEFuaW1hdG9yIG1EaWFsb2dMYXVuY2hBbmltYXRvcjsKICAgICBwcml2YXRlIGZpbmFsIEZlYXR1cmVGbGFncyBtRmxhZ3M7CisgICAgcHJpdmF0ZSBmaW5hbCBQYW5lbEludGVyYWN0b3IgbVBhbmVsSW50ZXJhY3RvcjsKIAogICAgIHByaXZhdGUgbG9uZyBtTWlsbGlzVW50aWxGaW5pc2hlZCA9IDA7CiAKQEAgLTgzLDcgKzg1LDggQEAKICAgICAgICAgICAgIFJlY29yZGluZ0NvbnRyb2xsZXIgY29udHJvbGxlciwKICAgICAgICAgICAgIEtleWd1YXJkRGlzbWlzc1V0aWwga2V5Z3VhcmREaXNtaXNzVXRpbCwKICAgICAgICAgICAgIEtleWd1YXJkU3RhdGVDb250cm9sbGVyIGtleWd1YXJkU3RhdGVDb250cm9sbGVyLAotICAgICAgICAgICAgRGlhbG9nTGF1bmNoQW5pbWF0b3IgZGlhbG9nTGF1bmNoQW5pbWF0b3IKKyAgICAgICAgICAgIERpYWxvZ0xhdW5jaEFuaW1hdG9yIGRpYWxvZ0xhdW5jaEFuaW1hdG9yLAorICAgICAgICAgICAgUGFuZWxJbnRlcmFjdG9yIHBhbmVsSW50ZXJhY3RvcgogICAgICkgewogICAgICAgICBzdXBlcihob3N0LCBiYWNrZ3JvdW5kTG9vcGVyLCBtYWluSGFuZGxlciwgZmFsc2luZ01hbmFnZXIsIG1ldHJpY3NMb2dnZXIsCiAgICAgICAgICAgICAgICAgc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLCBhY3Rpdml0eVN0YXJ0ZXIsIHFzTG9nZ2VyKTsKQEAgLTkzLDYgKzk2LDcgQEAKICAgICAgICAgbUtleWd1YXJkRGlzbWlzc1V0aWwgPSBrZXlndWFyZERpc21pc3NVdGlsOwogICAgICAgICBtS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIgPSBrZXlndWFyZFN0YXRlQ29udHJvbGxlcjsKICAgICAgICAgbURpYWxvZ0xhdW5jaEFuaW1hdG9yID0gZGlhbG9nTGF1bmNoQW5pbWF0b3I7CisgICAgICAgIG1QYW5lbEludGVyYWN0b3IgPSBwYW5lbEludGVyYWN0b3I7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNzEsNyArMTc1LDcgQEAKICAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGV4aXQgYW5pbWF0aW9uIHdoaWNoIGxvb2tzIHdlaXJkIHdoZW4gaXQgaGFwcGVucyBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZQogICAgICAgICAgICAgLy8gc2hhZGUgY29sbGFwc2luZy4KICAgICAgICAgICAgIG1EaWFsb2dMYXVuY2hBbmltYXRvci5kaXNhYmxlQWxsQ3VycmVudERpYWxvZ3NFeGl0QW5pbWF0aW9ucygpOwotICAgICAgICAgICAgZ2V0SG9zdCgpLmNvbGxhcHNlUGFuZWxzKCk7CisgICAgICAgICAgICBtUGFuZWxJbnRlcmFjdG9yLmNvbGxhcHNlUGFuZWxzKCk7CiAgICAgICAgIH07CiAKICAgICAgICAgZmluYWwgRGlhbG9nIGRpYWxvZyA9IG1Db250cm9sbGVyLmNyZWF0ZVNjcmVlblJlY29yZERpYWxvZyhtQ29udGV4dCwgbUZsYWdzLApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudHMvT3ZlcnZpZXdQcm94eVNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnRzL092ZXJ2aWV3UHJveHlTZXJ2aWNlLmphdmEKaW5kZXggOGEzZWNjNi4uMDc0OGJjYiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudHMvT3ZlcnZpZXdQcm94eVNlcnZpY2UuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50cy9PdmVydmlld1Byb3h5U2VydmljZS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudC5BQ1RJT05fRE9XTjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50LkFDVElPTl9VUDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJQb2xpY3lDb25zdGFudHMuTkFWX0JBUl9NT0RFXzNCVVRUT047Ci0KIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwuYWNjZXNzaWJpbGl0eS5jb21tb24uU2hvcnRjdXRDb25zdGFudHMuQ0hPT1NFUl9QQUNLQUdFX05BTUU7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNoYXJlZC5zeXN0ZW0uUXVpY2tTdGVwQ29udHJhY3QuS0VZX0VYVFJBX1NVUFBPUlRTX1dJTkRPV19DT1JORVJTOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zeXN0ZW11aS5zaGFyZWQuc3lzdGVtLlF1aWNrU3RlcENvbnRyYWN0LktFWV9FWFRSQV9TWVNVSV9QUk9YWTsKQEAgLTcxMyw2ICs3MTIsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29ubmVjdGlvblRvQ3VycmVudFVzZXIoKSB7CisgICAgICAgIExvZy52KFRBR19PUFMsICJzdGFydENvbm5lY3Rpb25Ub0N1cnJlbnRVc2VyOiBjb25uZWN0aW9uIGlzIHJlc3RhcnRlZCIpOwogICAgICAgICBpZiAobUhhbmRsZXIuZ2V0TG9vcGVyKCkgIT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobUNvbm5lY3Rpb25SdW5uYWJsZSk7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2NyZWVuc2hvdC9Mb25nU2NyZWVuc2hvdEFjdGl2aXR5LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2NyZWVuc2hvdC9Mb25nU2NyZWVuc2hvdEFjdGl2aXR5LmphdmEKaW5kZXggY2E4ZTEwMS4uMDJhNjBhZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NjcmVlbnNob3QvTG9uZ1NjcmVlbnNob3RBY3Rpdml0eS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zY3JlZW5zaG90L0xvbmdTY3JlZW5zaG90QWN0aXZpdHkuamF2YQpAQCAtNDgxLDcgKzQ4MSw2IEBACiAgICAgICAgICAgICBtQ3JvcFZpZXcuc2V0RXh0cmFQYWRkaW5nKGV4dHJhUGFkZGluZyArIG1QcmV2aWV3LmdldFBhZGRpbmdUb3AoKSwKICAgICAgICAgICAgICAgICAgICAgZXh0cmFQYWRkaW5nICsgbVByZXZpZXcuZ2V0UGFkZGluZ0JvdHRvbSgpKTsKICAgICAgICAgICAgIGltYWdlVG9wICs9IChwcmV2aWV3SGVpZ2h0IC0gaW1hZ2VIZWlnaHQpIC8gMjsKLSAgICAgICAgICAgIG1Dcm9wVmlldy5zZXRFeHRyYVBhZGRpbmcoZXh0cmFQYWRkaW5nLCBleHRyYVBhZGRpbmcpOwogICAgICAgICAgICAgbUNyb3BWaWV3LnNldEltYWdlV2lkdGgocHJldmlld1dpZHRoKTsKICAgICAgICAgICAgIHNjYWxlID0gcHJldmlld1dpZHRoIC8gKGZsb2F0KSBtUHJldmlldy5nZXREcmF3YWJsZSgpLmdldEludHJpbnNpY1dpZHRoKCk7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblBhbmVsVmlld0NvbnRyb2xsZXIuamF2YQppbmRleCBmMWJmOTRhLi4zMDg2NWFhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLmphdmEKQEAgLTEyMTksNiArMTIxOSwxMiBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIG9uU3BsaXRTaGFkZUVuYWJsZWRDaGFuZ2VkKCkgewogICAgICAgICBtU2hhZGVMb2cubG9nU3BsaXRTaGFkZUNoYW5nZWQobVNwbGl0U2hhZGVFbmFibGVkKTsKKyAgICAgICAgLy8gUmVzZXQgYW55IGxlZnQgb3ZlciBvdmVyc2Nyb2xsIHN0YXRlLiBJdCBpcyBhIHJhcmUgY29ybmVyIGNhc2UgYnV0IGNhbiBoYXBwZW4uCisgICAgICAgIG1Rc0NvbnRyb2xsZXIuc2V0T3ZlclNjcm9sbEFtb3VudCgwKTsKKyAgICAgICAgbVNjcmltQ29udHJvbGxlci5zZXROb3RpZmljYXRpb25zT3ZlclNjcm9sbEFtb3VudCgwKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0Q29udHJvbGxlci5zZXRPdmVyRXhwYW5zaW9uKDApOworICAgICAgICBtTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXRDb250cm9sbGVyLnNldE92ZXJTY3JvbGxBbW91bnQoMCk7CisKICAgICAgICAgLy8gd2hlbiB3ZSBzd2l0Y2ggYmV0d2VlbiBzcGxpdCBzaGFkZSBhbmQgcmVndWxhciBzaGFkZSB3ZSB3YW50IHRvIGVuZm9yY2Ugc2V0dGluZyBxcyB0bwogICAgICAgICAvLyB0aGUgZGVmYXVsdCBzdGF0ZTogZXhwYW5kZWQgZm9yIHNwbGl0IHNoYWRlIGFuZCBjb2xsYXBzZWQgb3RoZXJ3aXNlCiAgICAgICAgIGlmICghaXNPbktleWd1YXJkKCkgJiYgbVBhbmVsRXhwYW5kZWQpIHsKQEAgLTM3NzMsMTAgKzM3NzksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbUhlaWdodEFuaW1hdG9yLmVuZCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Rc0NvbnRyb2xsZXIuc2V0U2hhZGVFeHBhbmRlZEhlaWdodChtRXhwYW5kZWRIZWlnaHQpOwotICAgICAgICAgICAgbUV4cGFuc2lvbkRyYWdEb3duQW1vdW50UHggPSBoOwogICAgICAgICAgICAgbUV4cGFuZGVkRnJhY3Rpb24gPSBNYXRoLm1pbigxZiwKICAgICAgICAgICAgICAgICAgICAgbWF4UGFuZWxIZWlnaHQgPT0gMCA/IDAgOiBtRXhwYW5kZWRIZWlnaHQgLyBtYXhQYW5lbEhlaWdodCk7CisgICAgICAgICAgICBtUXNDb250cm9sbGVyLnNldFNoYWRlRXhwYW5zaW9uKG1FeHBhbmRlZEhlaWdodCwgbUV4cGFuZGVkRnJhY3Rpb24pOworICAgICAgICAgICAgbUV4cGFuc2lvbkRyYWdEb3duQW1vdW50UHggPSBoOwogICAgICAgICAgICAgbUFtYmllbnRTdGF0ZS5zZXRFeHBhbnNpb25GcmFjdGlvbihtRXhwYW5kZWRGcmFjdGlvbik7CiAgICAgICAgICAgICBvbkhlaWdodFVwZGF0ZWQobUV4cGFuZGVkSGVpZ2h0KTsKICAgICAgICAgICAgIHVwZGF0ZVBhbmVsRXhwYW5zaW9uQW5kVmlzaWJpbGl0eSgpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdDb250cm9sbGVyLmphdmEKaW5kZXggZTJmMzFlOC4uYTcxNmE2ZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlci5qYXZhCkBAIC0xNiwxMyArMTYsMTMgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zaGFkZTsKIAoraW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zeXN0ZW11aS5mbGFncy5GbGFncy5UUkFDS1BBRF9HRVNUVVJFX0JBQ0s7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwua290bGluLkphdmFBZGFwdGVyS3QuY29sbGVjdEZsb3c7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25MZWdhY3lIZWxwZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5HZXN0dXJlRGV0ZWN0b3I7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0RGV2aWNlOwpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3U3R1YjsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmtleWd1YXJkLkF1dGhLZXlndWFyZE1lc3NhZ2VBcmVhOwpAQCAtMzgsNyArMzksMTAgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmJpb21ldHJpY3MuZG9tYWluLmludGVyYWN0b3IuVWRmcHNPdmVybGF5SW50ZXJhY3RvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jbGFzc2lmaWVyLkZhbHNpbmdDb2xsZWN0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuY29tcG9zZS5Db21wb3NlRmFjYWRlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRvY2suRG9ja01hbmFnZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmVhdHVyZUZsYWdzOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZsYWdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLktleWd1YXJkVW5sb2NrQW5pbWF0aW9uQ29udHJvbGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5kb21haW4uaW50ZXJhY3Rvci5BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3RvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5kb21haW4uaW50ZXJhY3Rvci5LZXlndWFyZFRyYW5zaXRpb25JbnRlcmFjdG9yOwpAQCAtNDcsNiArNTEsOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLnVpLmJpbmRlci5LZXlndWFyZEJvdW5jZXJWaWV3QmluZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLnVpLnZpZXdtb2RlbC5LZXlndWFyZEJvdW5jZXJWaWV3TW9kZWw7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQudWkudmlld21vZGVsLlByaW1hcnlCb3VuY2VyVG9Hb25lVHJhbnNpdGlvblZpZXdNb2RlbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRvbWFpbi5pbnRlcmFjdG9yLk11bHRpU2hhZGVJbnRlcmFjdG9yOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkudmlldy5NdWx0aVNoYWRlVmlldzsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuRHJhZ0Rvd25IZWxwZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkxvY2tzY3JlZW5TaGFkZVRyYW5zaXRpb25Db250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5Ob3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyOwpAQCAtNjEsMTEgKzY3LDEzIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBob25lLlN0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBob25lLmRhZ2dlci5DZW50cmFsU3VyZmFjZXNDb21wb25lbnQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLndpbmRvdy5TdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC50aW1lLlN5c3RlbUNsb2NrOwogCiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiAKIGltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKIAogLyoqCiAgKiBDb250cm9sbGVyIGZvciB7QGxpbmsgTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3fS4KQEAgLTg4LDEwICs5NiwxMiBAQAogICAgIHByaXZhdGUgZmluYWwgTm90aWZpY2F0aW9uSW5zZXRzQ29udHJvbGxlciBtTm90aWZpY2F0aW9uSW5zZXRzQ29udHJvbGxlcjsKICAgICBwcml2YXRlIGZpbmFsIEFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yIG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3RvcjsKICAgICBwcml2YXRlIGZpbmFsIFVkZnBzT3ZlcmxheUludGVyYWN0b3IgbVVkZnBzT3ZlcmxheUludGVyYWN0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1RyYWNrcGFkR2VzdHVyZUJhY2tFbmFibGVkOwogICAgIHByaXZhdGUgR2VzdHVyZURldGVjdG9yIG1QdWxzaW5nV2FrZXVwR2VzdHVyZUhhbmRsZXI7CiAgICAgcHJpdmF0ZSBWaWV3IG1CcmlnaHRuZXNzTWlycm9yOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVG91Y2hBY3RpdmU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Ub3VjaENhbmNlbGxlZDsKKyAgICBwcml2YXRlIE1vdGlvbkV2ZW50IG1Eb3duRXZlbnQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1FeHBhbmRBbmltYXRpb25SdW5uaW5nOwogICAgIHByaXZhdGUgTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXQgbVN0YWNrU2Nyb2xsTGF5b3V0OwogICAgIHByaXZhdGUgUGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlciBtU3RhdHVzQmFyVmlld0NvbnRyb2xsZXI7CkBAIC0xMTEsNiArMTIxLDcgQEAKICAgICAgICAgICAgICAgICBtSXNPY2NsdXNpb25UcmFuc2l0aW9uUnVubmluZyA9CiAgICAgICAgICAgICAgICAgICAgIHN0ZXAuZ2V0VHJhbnNpdGlvblN0YXRlKCkgPT0gVHJhbnNpdGlvblN0YXRlLlJVTk5JTkc7CiAgICAgICAgICAgICB9OworICAgIHByaXZhdGUgZmluYWwgU3lzdGVtQ2xvY2sgbUNsb2NrOwogCiAgICAgQEluamVjdAogICAgIHB1YmxpYyBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdDb250cm9sbGVyKApAQCAtMTM3LDggKzE0OCwxMCBAQAogICAgICAgICAgICAgQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IgYWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IsCiAgICAgICAgICAgICBVZGZwc092ZXJsYXlJbnRlcmFjdG9yIHVkZnBzT3ZlcmxheUludGVyYWN0b3IsCiAgICAgICAgICAgICBLZXlndWFyZFRyYW5zaXRpb25JbnRlcmFjdG9yIGtleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3IsCi0gICAgICAgICAgICBQcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwgcHJpbWFyeUJvdW5jZXJUb0dvbmVUcmFuc2l0aW9uVmlld01vZGVsCi0gICAgKSB7CisgICAgICAgICAgICBQcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwgcHJpbWFyeUJvdW5jZXJUb0dvbmVUcmFuc2l0aW9uVmlld01vZGVsLAorICAgICAgICAgICAgRmVhdHVyZUZsYWdzIGZlYXR1cmVGbGFncywKKyAgICAgICAgICAgIFByb3ZpZGVyPE11bHRpU2hhZGVJbnRlcmFjdG9yPiBtdWx0aVNoYWRlSW50ZXJhY3RvclByb3ZpZGVyLAorICAgICAgICAgICAgU3lzdGVtQ2xvY2sgY2xvY2spIHsKICAgICAgICAgbUxvY2tzY3JlZW5TaGFkZVRyYW5zaXRpb25Db250cm9sbGVyID0gdHJhbnNpdGlvbkNvbnRyb2xsZXI7CiAgICAgICAgIG1GYWxzaW5nQ29sbGVjdG9yID0gZmFsc2luZ0NvbGxlY3RvcjsKICAgICAgICAgbVN0YXR1c0JhclN0YXRlQ29udHJvbGxlciA9IHN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjsKQEAgLTE1OSw2ICsxNzIsNyBAQAogICAgICAgICBtTm90aWZpY2F0aW9uSW5zZXRzQ29udHJvbGxlciA9IG5vdGlmaWNhdGlvbkluc2V0c0NvbnRyb2xsZXI7CiAgICAgICAgIG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3RvciA9IGFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yOwogICAgICAgICBtVWRmcHNPdmVybGF5SW50ZXJhY3RvciA9IHVkZnBzT3ZlcmxheUludGVyYWN0b3I7CisgICAgICAgIG1Jc1RyYWNrcGFkR2VzdHVyZUJhY2tFbmFibGVkID0gZmVhdHVyZUZsYWdzLmlzRW5hYmxlZChUUkFDS1BBRF9HRVNUVVJFX0JBQ0spOwogCiAgICAgICAgIC8vIFRoaXMgdmlldyBpcyBub3QgcGFydCBvZiB0aGUgbmV3bHkgaW5mbGF0ZWQgZXhwYW5kZWQgc3RhdHVzIGJhci4KICAgICAgICAgbUJyaWdodG5lc3NNaXJyb3IgPSBtVmlldy5maW5kVmlld0J5SWQoUi5pZC5icmlnaHRuZXNzX21pcnJvcl9jb250YWluZXIpOwpAQCAtMTcwLDYgKzE4NCwxNiBAQAogCiAgICAgICAgIGNvbGxlY3RGbG93KG1WaWV3LCBrZXlndWFyZFRyYW5zaXRpb25JbnRlcmFjdG9yLmdldExvY2tzY3JlZW5Ub0RyZWFtaW5nVHJhbnNpdGlvbigpLAogICAgICAgICAgICAgICAgIG1Mb2Nrc2NyZWVuVG9EcmVhbWluZ1RyYW5zaXRpb24pOworCisgICAgICAgIG1DbG9jayA9IGNsb2NrOworICAgICAgICBpZiAoQ29tcG9zZUZhY2FkZS5JTlNUQU5DRS5pc0NvbXBvc2VBdmFpbGFibGUoKQorICAgICAgICAgICAgICAgICYmIGZlYXR1cmVGbGFncy5pc0VuYWJsZWQoRmxhZ3MuRFVBTF9TSEFERSkpIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdTdHViIG11bHRpU2hhZGVWaWV3U3R1YiA9IG1WaWV3LmZpbmRWaWV3QnlJZChSLmlkLm11bHRpX3NoYWRlX3N0dWIpOworICAgICAgICAgICAgaWYgKG11bHRpU2hhZGVWaWV3U3R1YiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTXVsdGlTaGFkZVZpZXcgbXVsdGlTaGFkZVZpZXcgPSAoTXVsdGlTaGFkZVZpZXcpIG11bHRpU2hhZGVWaWV3U3R1Yi5pbmZsYXRlKCk7CisgICAgICAgICAgICAgICAgbXVsdGlTaGFkZVZpZXcuaW5pdChtdWx0aVNoYWRlSW50ZXJhY3RvclByb3ZpZGVyLmdldCgpLCBjbG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIxOSw5ICsyNDMsMTEgQEAKICAgICAgICAgICAgICAgICBpZiAoaXNEb3duKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEFjdGl2ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaENhbmNlbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtRG93bkV2ZW50ID0gZXY7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldi5nZXRBY3Rpb25NYXNrZWQoKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2LmdldEFjdGlvbk1hc2tlZCgpID09IE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpIHsKICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duRXZlbnQgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVRvdWNoQ2FuY2VsbGVkIHx8IG1FeHBhbmRBbmltYXRpb25SdW5uaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI2Miw3ICsyODgsNyBAQAogICAgICAgICAgICAgICAgIG1Mb2NrSWNvblZpZXdDb250cm9sbGVyLm9uVG91Y2hFdmVudCgKICAgICAgICAgICAgICAgICAgICAgICAgIGV2LAogICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbVNlcnZpY2Uud2FrZVVwSWZEb3ppbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xvY2sudXB0aW1lTWlsbGlzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE9DS19JQ09OX1RPVUNIIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG93ZXJNYW5hZ2VyLldBS0VfUkVBU09OX0dFU1RVUkUpCkBAIC00NDYsMTAgKzQ3MiwxOCBAQAogCiAgICAgcHVibGljIHZvaWQgY2FuY2VsQ3VycmVudFRvdWNoKCkgewogICAgICAgICBpZiAobVRvdWNoQWN0aXZlKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obm93LCBub3csCi0gICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwsIDAuMGYsIDAuMGYsIDApOwotICAgICAgICAgICAgZXZlbnQuc2V0U291cmNlKElucHV0RGV2aWNlLlNPVVJDRV9UT1VDSFNDUkVFTik7CisgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IG1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGZpbmFsIE1vdGlvbkV2ZW50IGV2ZW50OworICAgICAgICAgICAgaWYgKG1Jc1RyYWNrcGFkR2VzdHVyZUJhY2tFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obURvd25FdmVudCk7CisgICAgICAgICAgICAgICAgZXZlbnQuc2V0RG93blRpbWUobm93KTsKKyAgICAgICAgICAgICAgICBldmVudC5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCk7CisgICAgICAgICAgICAgICAgZXZlbnQuc2V0TG9jYXRpb24oMC4wZiwgMC4wZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKG5vdywgbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCwgMC4wZiwgMC4wZiwgMCk7CisgICAgICAgICAgICAgICAgZXZlbnQuc2V0U291cmNlKElucHV0RGV2aWNlLlNPVVJDRV9UT1VDSFNDUkVFTik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaFRvdWNoRXZlbnQoZXZlbnQpOwogICAgICAgICAgICAgZXZlbnQucmVjeWNsZSgpOwogICAgICAgICAgICAgbVRvdWNoQ2FuY2VsbGVkID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9RdWlja1NldHRpbmdzQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL1F1aWNrU2V0dGluZ3NDb250cm9sbGVyLmphdmEKaW5kZXggZGY4YWU1MC4uOWY0NjcwNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL1F1aWNrU2V0dGluZ3NDb250cm9sbGVyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL1F1aWNrU2V0dGluZ3NDb250cm9sbGVyLmphdmEKQEAgLTM1MSw3ICszNTEsNiBAQAogICAgICAgICBtRmVhdHVyZUZsYWdzID0gZmVhdHVyZUZsYWdzOwogICAgICAgICBtSW50ZXJhY3Rpb25KYW5rTW9uaXRvciA9IGludGVyYWN0aW9uSmFua01vbml0b3I7CiAKLSAgICAgICAgbVNoYWRlRXhwYW5zaW9uU3RhdGVNYW5hZ2VyLmFkZEV4cGFuc2lvbkxpc3RlbmVyKHRoaXM6Om9uUGFuZWxFeHBhbnNpb25DaGFuZ2VkKTsKICAgICAgICAgbUxvY2tzY3JlZW5TaGFkZVRyYW5zaXRpb25Db250cm9sbGVyLmFkZENhbGxiYWNrKG5ldyBMb2Nrc2NyZWVuU2hhZGVUcmFuc2l0aW9uQ2FsbGJhY2soKSk7CiAgICAgfQogCkBAIC04NzgsOCArODc3LDkgQEAKICAgICAgICAgbUNvbGxhcHNlZE9uRG93biA9IGNvbGxhcHNlZE9uRG93bjsKICAgICB9CiAKLSAgICB2b2lkIHNldFNoYWRlRXhwYW5kZWRIZWlnaHQoZmxvYXQgc2hhZGVFeHBhbmRlZEhlaWdodCkgewotICAgICAgICBtU2hhZGVFeHBhbmRlZEhlaWdodCA9IHNoYWRlRXhwYW5kZWRIZWlnaHQ7CisgICAgdm9pZCBzZXRTaGFkZUV4cGFuc2lvbihmbG9hdCBleHBhbmRlZEhlaWdodCwgZmxvYXQgZXhwYW5kZWRGcmFjdGlvbikgeworICAgICAgICBtU2hhZGVFeHBhbmRlZEhlaWdodCA9IGV4cGFuZGVkSGVpZ2h0OworICAgICAgICBtU2hhZGVFeHBhbmRlZEZyYWN0aW9uID0gZXhwYW5kZWRGcmFjdGlvbjsKICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKQEAgLTE3NDksMTEgKzE3NDksNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgdm9pZCBvblBhbmVsRXhwYW5zaW9uQ2hhbmdlZChTaGFkZUV4cGFuc2lvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIG1TaGFkZUV4cGFuZGVkRnJhY3Rpb24gPSBldmVudC5nZXRGcmFjdGlvbigpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEFuaW1hdGUgUVMgY2xvc2luZyBieSBmbGluZ2luZyBpdC4KICAgICAgKiBJZiBRUyBpcyBleHBhbmRlZCwgaXQgd2lsbCBjb2xsYXBzZSBpbnRvIFFRUyBhbmQgc3RvcC4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zbWFydHNwYWNlL2RhZ2dlci9TbWFydHNwYWNlVmlld0NvbXBvbmVudC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zbWFydHNwYWNlL2RhZ2dlci9TbWFydHNwYWNlVmlld0NvbXBvbmVudC5rdAppbmRleCA1NzM2YTVjLi4yNjE0OTMyMSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NtYXJ0c3BhY2UvZGFnZ2VyL1NtYXJ0c3BhY2VWaWV3Q29tcG9uZW50Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zbWFydHNwYWNlL2RhZ2dlci9TbWFydHNwYWNlVmlld0NvbXBvbmVudC5rdApAQCAtMzcsNyArMzcsOCBAQAogICAgICAgICBmdW4gY3JlYXRlKAogICAgICAgICAgICAgQEJpbmRzSW5zdGFuY2UgcGFyZW50OiBWaWV3R3JvdXAsCiAgICAgICAgICAgICBAQmluZHNJbnN0YW5jZSBATmFtZWQoUExVR0lOKSBwbHVnaW46IEJjU21hcnRzcGFjZURhdGFQbHVnaW4sCi0gICAgICAgICAgICBAQmluZHNJbnN0YW5jZSBvbkF0dGFjaExpc3RlbmVyOiBWaWV3Lk9uQXR0YWNoU3RhdGVDaGFuZ2VMaXN0ZW5lcgorICAgICAgICAgICAgQEJpbmRzSW5zdGFuY2Ugb25BdHRhY2hMaXN0ZW5lcjogVmlldy5PbkF0dGFjaFN0YXRlQ2hhbmdlTGlzdGVuZXIsCisgICAgICAgICAgICBAQmluZHNJbnN0YW5jZSB2aWV3V2l0aEN1c3RvbUxheW91dDogVmlldz8gPSBudWxsCiAgICAgICAgICk6IFNtYXJ0c3BhY2VWaWV3Q29tcG9uZW50CiAgICAgfQogCkBAIC01MywxMCArNTQsMTMgQEAKICAgICAgICAgICAgIGZhbHNpbmdNYW5hZ2VyOiBGYWxzaW5nTWFuYWdlciwKICAgICAgICAgICAgIHBhcmVudDogVmlld0dyb3VwLAogICAgICAgICAgICAgQE5hbWVkKFBMVUdJTikgcGx1Z2luOiBCY1NtYXJ0c3BhY2VEYXRhUGx1Z2luLAorICAgICAgICAgICAgdmlld1dpdGhDdXN0b21MYXlvdXQ6IFZpZXc/LAogICAgICAgICAgICAgb25BdHRhY2hMaXN0ZW5lcjogVmlldy5PbkF0dGFjaFN0YXRlQ2hhbmdlTGlzdGVuZXIKICAgICAgICAgKToKICAgICAgICAgICAgICAgICBCY1NtYXJ0c3BhY2VEYXRhUGx1Z2luLlNtYXJ0c3BhY2VWaWV3IHsKLSAgICAgICAgICAgIHZhbCBzc1ZpZXcgPSBwbHVnaW4uZ2V0VmlldyhwYXJlbnQpCisgICAgICAgICAgICB2YWwgc3NWaWV3ID0gdmlld1dpdGhDdXN0b21MYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgYXM/IEJjU21hcnRzcGFjZURhdGFQbHVnaW4uU21hcnRzcGFjZVZpZXcKKyAgICAgICAgICAgICAgICAgICAgPzogcGx1Z2luLmdldFZpZXcocGFyZW50KQogICAgICAgICAgICAgLy8gQ3VycmVudGx5LCB0aGlzIGlzIG9ubHkgdXNlZCB0byBwcm92aWRlIFNtYXJ0c3BhY2VWaWV3IG9uIERyZWFtIHN1cmZhY2UuCiAgICAgICAgICAgICBzc1ZpZXcuc2V0VWlTdXJmYWNlKFVJX1NVUkZBQ0VfRFJFQU0pCiAgICAgICAgICAgICBzc1ZpZXcucmVnaXN0ZXJEYXRhUHJvdmlkZXIocGx1Z2luKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9LZXlib2FyZFNob3J0Y3V0TGlzdFNlYXJjaC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9LZXlib2FyZFNob3J0Y3V0TGlzdFNlYXJjaC5qYXZhCmluZGV4IDAxZTA0MmIuLmM5MjBlMWUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5Ym9hcmRTaG9ydGN1dExpc3RTZWFyY2guamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0tleWJvYXJkU2hvcnRjdXRMaXN0U2VhcmNoLmphdmEKQEAgLTY1NywyNSArNjU3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmlucHV0X3N3aXRjaF9pbnB1dF9sYW5ndWFnZV9wcmV2aW91cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9TUEFDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX01FVEFfT04gfCBLZXlFdmVudC5NRVRBX1NISUZUX09OKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSkpLAotICAgICAgICAgICAgICAgIC8qIEFjY2VzcyBlbW9qaTogTWV0YSArIC4gKi8KLSAgICAgICAgICAgICAgICBuZXcgU2hvcnRjdXRNdWx0aU1hcHBpbmdJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuaW5wdXRfYWNjZXNzX2Vtb2ppKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2hvcnRjdXRLZXlHcm91cChuZXcgS2V5Ym9hcmRTaG9ydGN1dEluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuaW5wdXRfYWNjZXNzX2Vtb2ppKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX1BFUklPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX01FVEFfT04pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpKSksCi0gICAgICAgICAgICAgICAgLyogQWNjZXNzIHZvaWNlIHR5cGluZzogTWV0YSArIFYgKi8KLSAgICAgICAgICAgICAgICBuZXcgU2hvcnRjdXRNdWx0aU1hcHBpbmdJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuaW5wdXRfYWNjZXNzX3ZvaWNlX3R5cGluZyksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNob3J0Y3V0S2V5R3JvdXAobmV3IEtleWJvYXJkU2hvcnRjdXRJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmlucHV0X2FjY2Vzc192b2ljZV90eXBpbmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LktFWUNPREVfViwgS2V5RXZlbnQuTUVUQV9NRVRBX09OKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSkpCiAgICAgICAgICk7CiAgICAgICAgIHJldHVybiBuZXcgS2V5Ym9hcmRTaG9ydGN1dE11bHRpTWFwcGluZ0dyb3VwKApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25Mb2Nrc2NyZWVuVXNlck1hbmFnZXJJbXBsLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkxvY2tzY3JlZW5Vc2VyTWFuYWdlckltcGwuamF2YQppbmRleCA1MWM1MTgzLi5jYWM0MjUxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkxvY2tzY3JlZW5Vc2VyTWFuYWdlckltcGwuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkxvY2tzY3JlZW5Vc2VyTWFuYWdlckltcGwuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXI7CiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5BQ1RJT05fREVWSUNFX1BPTElDWV9NQU5BR0VSX1NUQVRFX0NIQU5HRUQ7Ci0KIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3lzdGVtdWkuRGVqYW5rVXRpbHMud2hpdGVsaXN0SXBjczsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLktleWd1YXJkTWFuYWdlcjsKQEAgLTE0NSw3ICsxNDQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBJbnRlbnQuQUNUSU9OX1VTRVJfVU5MT0NLRUQ6CiAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBvdmVydmlldyBjb25uZWN0aW9uIHRvIHRoZSBsYXVuY2hlciBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgIG1PdmVydmlld1Byb3h5U2VydmljZUxhenkuZ2V0KCkuc3RhcnRDb25uZWN0aW9uVG9DdXJyZW50VXNlcigpOworICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0IGlmIHVzZXIgaGFzbid0IGNvbm5lY3RlZCB5ZXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PdmVydmlld1Byb3h5U2VydmljZUxhenkuZ2V0KCkuZ2V0UHJveHkoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtT3ZlcnZpZXdQcm94eVNlcnZpY2VMYXp5LmdldCgpLnN0YXJ0Q29ubmVjdGlvblRvQ3VycmVudFVzZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIE5PVElGSUNBVElPTl9VTkxPQ0tFRF9CWV9XT1JLX0NIQUxMRU5HRV9BQ1RJT046CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudFNlbmRlciBpbnRlbnRTZW5kZXIgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25SZW1vdGVJbnB1dE1hbmFnZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRNYW5hZ2VyLmphdmEKaW5kZXggOTkwODFlOS4uOWUyYTA3ZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25SZW1vdGVJbnB1dE1hbmFnZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvblJlbW90ZUlucHV0TWFuYWdlci5qYXZhCkBAIC01NCw2ICs1NCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5zdGF0dXNiYXIuU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5kYWdnZXIuQ2VudHJhbFN1cmZhY2VzRGVwZW5kZW5jaWVzTW9kdWxlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uTm90aWZQaXBlbGluZUZsYWdzOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uY29sbGVjdGlvbi5Ob3RpZmljYXRpb25FbnRyeTsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLmNvbGxlY3Rpb24uTm90aWZpY2F0aW9uRW50cnkuRWRpdGVkU3VnZ2VzdGlvbkluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uLnJlbmRlci5Ob3RpZmljYXRpb25WaXNpYmlsaXR5UHJvdmlkZXI7CkBAIC02NSw2ICs2Niw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5EdW1wVXRpbHNLdDsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLkxpc3RlbmVyU2V0OwogCitpbXBvcnQgZGFnZ2VyLkxhenk7CisKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC03Miw4ICs3NSw2IEBACiBpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIAotaW1wb3J0IGRhZ2dlci5MYXp5OwotCiAvKioKICAqIENsYXNzIGZvciBoYW5kbGluZyByZW1vdGUgaW5wdXQgc3RhdGUgb3ZlciBhIHNldCBvZiBub3RpZmljYXRpb25zLiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhpbmdzCiAgKiBsaWtlIGtlZXBpbmcgbm90aWZpY2F0aW9ucyB0ZW1wb3JhcmlseSB0aGF0IHdlcmUgY2FuY2VsbGVkIGFzIGEgcmVzcG9uc2UgdG8gYSByZW1vdGUgaW5wdXQKQEAgLTEwNCw2ICsxMDUsOCBAQAogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRNYW5hZ2VyIG1LZXlndWFyZE1hbmFnZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIgbVN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjsKICAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUlucHV0VXJpQ29udHJvbGxlciBtUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBSZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIgbVJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlcjsKICAgICBwcml2YXRlIGZpbmFsIE5vdGlmaWNhdGlvbkNsaWNrTm90aWZpZXIgbUNsaWNrTm90aWZpZXI7CiAKICAgICBwcm90ZWN0ZWQgUmVtb3RlSW5wdXRDb250cm9sbGVyIG1SZW1vdGVJbnB1dENvbnRyb2xsZXI7CkBAIC0yNTksNiArMjYyLDcgQEAKICAgICAgICAgICAgIExhenk8T3B0aW9uYWw8Q2VudHJhbFN1cmZhY2VzPj4gY2VudHJhbFN1cmZhY2VzT3B0aW9uYWxMYXp5LAogICAgICAgICAgICAgU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyIHN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwKICAgICAgICAgICAgIFJlbW90ZUlucHV0VXJpQ29udHJvbGxlciByZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXIsCisgICAgICAgICAgICBSZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIgcmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyLAogICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpY2tOb3RpZmllciBjbGlja05vdGlmaWVyLAogICAgICAgICAgICAgQWN0aW9uQ2xpY2tMb2dnZXIgbG9nZ2VyLAogICAgICAgICAgICAgRHVtcE1hbmFnZXIgZHVtcE1hbmFnZXIpIHsKQEAgLTI3NSw2ICsyNzksNyBAQAogICAgICAgICBtS2V5Z3VhcmRNYW5hZ2VyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEtleWd1YXJkTWFuYWdlci5jbGFzcyk7CiAgICAgICAgIG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIgPSBzdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7CiAgICAgICAgIG1SZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXIgPSByZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXI7CisgICAgICAgIG1SZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIgPSByZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXI7CiAgICAgICAgIG1DbGlja05vdGlmaWVyID0gY2xpY2tOb3RpZmllcjsKIAogICAgICAgICBkdW1wTWFuYWdlci5yZWdpc3RlckR1bXBhYmxlKHRoaXMpOwpAQCAtMjk0LDcgKzI5OSw4IEBACiAgICAgLyoqIEluaXRpYWxpemVzIHRoaXMgY29tcG9uZW50IHdpdGggdGhlIHByb3ZpZGVkIGRlcGVuZGVuY2llcy4gKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVcFdpdGhDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaywgUmVtb3RlSW5wdXRDb250cm9sbGVyLkRlbGVnYXRlIGRlbGVnYXRlKSB7CiAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtUmVtb3RlSW5wdXRDb250cm9sbGVyID0gbmV3IFJlbW90ZUlucHV0Q29udHJvbGxlcihkZWxlZ2F0ZSwgbVJlbW90ZUlucHV0VXJpQ29udHJvbGxlcik7CisgICAgICAgIG1SZW1vdGVJbnB1dENvbnRyb2xsZXIgPSBuZXcgUmVtb3RlSW5wdXRDb250cm9sbGVyKGRlbGVnYXRlLAorICAgICAgICAgICAgICAgIG1SZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXIsIG1SZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIpOwogICAgICAgICBpZiAobVJlbW90ZUlucHV0TGlzdGVuZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbVJlbW90ZUlucHV0TGlzdGVuZXIuc2V0UmVtb3RlSW5wdXRDb250cm9sbGVyKG1SZW1vdGVJbnB1dENvbnRyb2xsZXIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1JlbW90ZUlucHV0Q29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9SZW1vdGVJbnB1dENvbnRyb2xsZXIuamF2YQppbmRleCBmNDRmNTk4Li5hMzdiMmE5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1JlbW90ZUlucHV0Q29udHJvbGxlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUmVtb3RlSW5wdXRDb250cm9sbGVyLmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uY29sbGVjdGlvbi5Ob3RpZmljYXRpb25FbnRyeTsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LlJlbW90ZUlucHV0VXJpQ29udHJvbGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LlJlbW90ZUlucHV0VmlldzsKQEAgLTUyLDEwICs1MywxNCBAQAogICAgIHByaXZhdGUgZmluYWwgRGVsZWdhdGUgbURlbGVnYXRlOwogICAgIHByaXZhdGUgZmluYWwgUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyIG1SZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXI7CiAKKyAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlciBtTG9nZ2VyOworCiAgICAgcHVibGljIFJlbW90ZUlucHV0Q29udHJvbGxlcihEZWxlZ2F0ZSBkZWxlZ2F0ZSwKLSAgICAgICAgICAgIFJlbW90ZUlucHV0VXJpQ29udHJvbGxlciByZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXIpIHsKKyAgICAgICAgICAgIFJlbW90ZUlucHV0VXJpQ29udHJvbGxlciByZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXIsCisgICAgICAgICAgICBSZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIgbG9nZ2VyKSB7CiAgICAgICAgIG1EZWxlZ2F0ZSA9IGRlbGVnYXRlOwogICAgICAgICBtUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyID0gcmVtb3RlSW5wdXRVcmlDb250cm9sbGVyOworICAgICAgICBtTG9nZ2VyID0gbG9nZ2VyOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE3LDYgKzEyMiw5IEBACiAgICAgICAgIGJvb2xlYW4gaXNBY3RpdmUgPSBpc1JlbW90ZUlucHV0QWN0aXZlKGVudHJ5KTsKICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IHBydW5lV2Vha1RoZW5SZW1vdmVBbmRDb250YWlucygKICAgICAgICAgICAgICAgICBlbnRyeSAvKiBjb250YWlucyAqLywgbnVsbCAvKiByZW1vdmUgKi8sIHRva2VuIC8qIHJlbW92ZVRva2VuICovKTsKKyAgICAgICAgbUxvZ2dlci5sb2dBZGRSZW1vdGVJbnB1dChlbnRyeS5nZXRLZXkoKS8qIGVudHJ5S2V5ICovLAorICAgICAgICAgICAgICAgIGlzQWN0aXZlIC8qIGlzUmVtb3RlSW5wdXRBbHJlYWR5QWN0aXZlICovLAorICAgICAgICAgICAgICAgIGZvdW5kIC8qIGlzUmVtb3RlSW5wdXRGb3VuZCAqLyk7CiAgICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgICAgIG1PcGVuLmFkZChuZXcgUGFpcjw+KG5ldyBXZWFrUmVmZXJlbmNlPD4oZW50cnkpLCB0b2tlbikpOwogICAgICAgICB9CkBAIC0xMzcsOSArMTQ1LDIyIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVtb3RlSW5wdXQoTm90aWZpY2F0aW9uRW50cnkgZW50cnksIE9iamVjdCB0b2tlbikgewogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGVudHJ5KTsKLSAgICAgICAgaWYgKGVudHJ5Lm1SZW1vdGVFZGl0SW1lVmlzaWJsZSAmJiBlbnRyeS5tUmVtb3RlRWRpdEltZUFuaW1hdGluZ0F3YXkpIHJldHVybjsKKyAgICAgICAgaWYgKGVudHJ5Lm1SZW1vdGVFZGl0SW1lVmlzaWJsZSAmJiBlbnRyeS5tUmVtb3RlRWRpdEltZUFuaW1hdGluZ0F3YXkpIHsKKyAgICAgICAgICAgIG1Mb2dnZXIubG9nUmVtb3ZlUmVtb3RlSW5wdXQoCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldEtleSgpIC8qIGVudHJ5S2V5Ki8sCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyogcmVtb3RlRWRpdEltZVZpc2libGUgKi8sCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyogcmVtb3RlRWRpdEltZUFuaW1hdGluZ0F3YXkgKi8pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIC8vIElmIHRoZSB2aWV3IGlzIGJlaW5nIHJlbW92ZWQsIHRoaXMgbWF5IGJlIGNhbGxlZCBldmVuIHRob3VnaCB3ZSdyZSBub3QgYWN0aXZlCi0gICAgICAgIGlmICghaXNSZW1vdGVJbnB1dEFjdGl2ZShlbnRyeSkpIHJldHVybjsKKyAgICAgICAgYm9vbGVhbiByZW1vdGVJbnB1dEFjdGl2ZSA9IGlzUmVtb3RlSW5wdXRBY3RpdmUoZW50cnkpOworICAgICAgICBtTG9nZ2VyLmxvZ1JlbW92ZVJlbW90ZUlucHV0KAorICAgICAgICAgICAgICAgIGVudHJ5LmdldEtleSgpIC8qIGVudHJ5S2V5Ki8sCisgICAgICAgICAgICAgICAgZW50cnkubVJlbW90ZUVkaXRJbWVWaXNpYmxlIC8qIHJlbW90ZUVkaXRJbWVWaXNpYmxlICovLAorICAgICAgICAgICAgICAgIGVudHJ5Lm1SZW1vdGVFZGl0SW1lQW5pbWF0aW5nQXdheSAvKiByZW1vdGVFZGl0SW1lQW5pbWF0aW5nQXdheSAqLywKKyAgICAgICAgICAgICAgICByZW1vdGVJbnB1dEFjdGl2ZSAvKiBpc1JlbW90ZUlucHV0QWN0aXZlICovKTsKKworICAgICAgICBpZiAoIXJlbW90ZUlucHV0QWN0aXZlKSByZXR1cm47CiAKICAgICAgICAgcHJ1bmVXZWFrVGhlblJlbW92ZUFuZENvbnRhaW5zKG51bGwgLyogY29udGFpbnMgKi8sIGVudHJ5IC8qIHJlbW92ZSAqLywgdG9rZW4pOwogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclN0YXRlQ29udHJvbGxlckltcGwuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU3RhdGVDb250cm9sbGVySW1wbC5qYXZhCmluZGV4IGI5YWM5MTguLjc5ZDAxYjRhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclN0YXRlQ29udHJvbGxlckltcGwuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclN0YXRlQ29udHJvbGxlckltcGwuamF2YQpAQCAtNTYsNiArNTYsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNoYWRlLlNoYWRlRXhwYW5zaW9uU3RhdGVNYW5hZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uc3RhY2suU3RhY2tTdGF0ZUFuaW1hdG9yOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuQ2FsbGJhY2tDb250cm9sbGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwuQ29tcGlsZTsKIAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTI5OSw3ICszMDAsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gc2V0SXNEcmVhbWluZyhib29sZWFuIGlzRHJlYW1pbmcpIHsKLSAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpIHx8IENvbXBpbGUuSVNfREVCVUcpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgInNldElzRHJlYW1pbmc6IiArIGlzRHJlYW1pbmcpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtSXNEcmVhbWluZyA9PSBpc0RyZWFtaW5nKSB7CkBAIC0zMjEsNiArMzIyLDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNEcmVhbWluZygpIHsKKyAgICAgICAgcmV0dXJuIG1Jc0RyZWFtaW5nOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEFuZEluc3RydW1lbnREb3plQW1vdW50KFZpZXcgdmlldywgZmxvYXQgZG96ZUFtb3VudCwgYm9vbGVhbiBhbmltYXRlZCkgewogICAgICAgICBpZiAobURhcmtBbmltYXRvciAhPSBudWxsICYmIG1EYXJrQW5pbWF0b3IuaXNSdW5uaW5nKCkpIHsKICAgICAgICAgICAgIGlmIChhbmltYXRlZCAmJiBtRG96ZUFtb3VudFRhcmdldCA9PSBkb3plQW1vdW50KSB7CkBAIC01ODAsNiArNTg2LDcgQEAKICAgICAgICAgcHcucHJpbnRsbigiIG1MZWF2ZU9wZW5PbktleWd1YXJkSGlkZT0iICsgbUxlYXZlT3Blbk9uS2V5Z3VhcmRIaWRlKTsKICAgICAgICAgcHcucHJpbnRsbigiIG1LZXlndWFyZFJlcXVlc3RlZD0iICsgbUtleWd1YXJkUmVxdWVzdGVkKTsKICAgICAgICAgcHcucHJpbnRsbigiIG1Jc0RvemluZz0iICsgbUlzRG96aW5nKTsKKyAgICAgICAgcHcucHJpbnRsbigiIG1Jc0RyZWFtaW5nPSIgKyBtSXNEcmVhbWluZyk7CiAgICAgICAgIHB3LnByaW50bG4oIiBtTGlzdGVuZXJzeyIgKyBtTGlzdGVuZXJzLnNpemUoKSArICJ9PSIpOwogICAgICAgICBmb3IgKFJhbmtlZExpc3RlbmVyIHJsIDogbUxpc3RlbmVycykgewogICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICIgKyBybC5tTGlzdGVuZXIpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9kYWdnZXIvQ2VudHJhbFN1cmZhY2VzRGVwZW5kZW5jaWVzTW9kdWxlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL2RhZ2dlci9DZW50cmFsU3VyZmFjZXNEZXBlbmRlbmNpZXNNb2R1bGUuamF2YQppbmRleCBkNzU2OGE5Li41NjVjMGE5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL2RhZ2dlci9DZW50cmFsU3VyZmFjZXNEZXBlbmRlbmNpZXNNb2R1bGUuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL2RhZ2dlci9DZW50cmFsU3VyZmFjZXNEZXBlbmRlbmNpZXNNb2R1bGUuamF2YQpAQCAtNTQsNiArNTQsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5jb21tYW5kbGluZS5Db21tYW5kUmVnaXN0cnk7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLmdlc3R1cmUuU3dpcGVTdGF0dXNCYXJBd2F5R2VzdHVyZUhhbmRsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5Ob3RpZlBpcGVsaW5lRmxhZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5SZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uLk5vdGlmQ29sbGVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLmNvbGxlY3Rpb24uTm90aWZQaXBlbGluZTsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLmNvbGxlY3Rpb24ubm90aWZjb2xsZWN0aW9uLkNvbW1vbk5vdGlmQ29sbGVjdGlvbjsKQEAgLTc3LDE0ICs3OCwxNCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwuY29uY3VycmVuY3kuRGVsYXlhYmxlRXhlY3V0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC50aW1lLlN5c3RlbUNsb2NrOwogCi1pbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCiBpbXBvcnQgZGFnZ2VyLkJpbmRzOwogaW1wb3J0IGRhZ2dlci5MYXp5OwogaW1wb3J0IGRhZ2dlci5Nb2R1bGU7CiBpbXBvcnQgZGFnZ2VyLlByb3ZpZGVzOwogCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCiAvKioKICAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGluc3RhbmNlcyBuZWVkZWQgdG8gY29uc3RydWN0IHtAbGluayBDZW50cmFsU3VyZmFjZXNJbXBsfS4gVGhlc2UgYXJlIG1vdmVkIHRvCiAgKiB0aGlzIHNlcGFyYXRlIGZyb20ge0BsaW5rIENlbnRyYWxTdXJmYWNlc01vZHVsZX0gbW9kdWxlIHNvIHRoYXQgY29tcG9uZW50cyB0aGF0IHdpc2ggdG8gYnVpbGQKQEAgLTEwNSw2ICsxMDYsNyBAQAogICAgICAgICAgICAgTGF6eTxPcHRpb25hbDxDZW50cmFsU3VyZmFjZXM+PiBjZW50cmFsU3VyZmFjZXNPcHRpb25hbExhenksCiAgICAgICAgICAgICBTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIgc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLAogICAgICAgICAgICAgUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyIHJlbW90ZUlucHV0VXJpQ29udHJvbGxlciwKKyAgICAgICAgICAgIFJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlciByZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIsCiAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGlja05vdGlmaWVyIGNsaWNrTm90aWZpZXIsCiAgICAgICAgICAgICBBY3Rpb25DbGlja0xvZ2dlciBhY3Rpb25DbGlja0xvZ2dlciwKICAgICAgICAgICAgIER1bXBNYW5hZ2VyIGR1bXBNYW5hZ2VyKSB7CkBAIC0xMTcsNiArMTE5LDcgQEAKICAgICAgICAgICAgICAgICBjZW50cmFsU3VyZmFjZXNPcHRpb25hbExhenksCiAgICAgICAgICAgICAgICAgc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLAogICAgICAgICAgICAgICAgIHJlbW90ZUlucHV0VXJpQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICByZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIsCiAgICAgICAgICAgICAgICAgY2xpY2tOb3RpZmllciwKICAgICAgICAgICAgICAgICBhY3Rpb25DbGlja0xvZ2dlciwKICAgICAgICAgICAgICAgICBkdW1wTWFuYWdlcik7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9SZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9SZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4MmRmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9SZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIua3QKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbgorCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLlN5c1VJU2luZ2xldG9uCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubG9nLmRhZ2dlci5Ob3RpZmljYXRpb25SZW1vdGVJbnB1dExvZworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMubG9nLkxvZ0J1ZmZlcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMubG9nLkxvZ0xldmVsLkRFQlVHCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdAorCisvKiogTG9nZ2VyIGNsYXNzIGZvciBbUmVtb3RlSW5wdXRDb250cm9sbGVyXS4gKi8KK0BTeXNVSVNpbmdsZXRvbgorY2xhc3MgUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyCitASW5qZWN0Citjb25zdHJ1Y3RvcihATm90aWZpY2F0aW9uUmVtb3RlSW5wdXRMb2cgcHJpdmF0ZSB2YWwgbG9nQnVmZmVyOiBMb2dCdWZmZXIpIHsKKworICAgIC8qKiBsb2dzIGFkZFJlbW90ZUlucHV0IGludm9jYXRpb24gb2YgW1JlbW90ZUlucHV0Q29udHJvbGxlcl0gKi8KKyAgICBmdW4gbG9nQWRkUmVtb3RlSW5wdXQoCisgICAgICAgIGVudHJ5S2V5OiBTdHJpbmcsCisgICAgICAgIGlzUmVtb3RlSW5wdXRBbHJlYWR5QWN0aXZlOiBCb29sZWFuLAorICAgICAgICBpc1JlbW90ZUlucHV0Rm91bmQ6IEJvb2xlYW4KKyAgICApID0KKyAgICAgICAgbG9nQnVmZmVyLmxvZygKKyAgICAgICAgICAgIFRBRywKKyAgICAgICAgICAgIERFQlVHLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cjEgPSBlbnRyeUtleQorICAgICAgICAgICAgICAgIGJvb2wxID0gaXNSZW1vdGVJbnB1dEFscmVhZHlBY3RpdmUKKyAgICAgICAgICAgICAgICBib29sMiA9IGlzUmVtb3RlSW5wdXRGb3VuZAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsgImFkZFJlbW90ZUlucHV0IGVudHJ5OiAkc3RyMSwgaXNBbHJlYWR5QWN0aXZlOiAkYm9vbDEsIGlzRm91bmQ6JGJvb2wyIiB9CisgICAgICAgICkKKworICAgIC8qKiBsb2dzIHJlbW92ZVJlbW90ZUlucHV0IGludm9jYXRpb24gb2YgW1JlbW90ZUlucHV0Q29udHJvbGxlcl0gKi8KKyAgICBASnZtT3ZlcmxvYWRzCisgICAgZnVuIGxvZ1JlbW92ZVJlbW90ZUlucHV0KAorICAgICAgICBlbnRyeUtleTogU3RyaW5nLAorICAgICAgICByZW1vdGVFZGl0SW1lVmlzaWJsZTogQm9vbGVhbiwKKyAgICAgICAgcmVtb3RlRWRpdEltZUFuaW1hdGluZ0F3YXk6IEJvb2xlYW4sCisgICAgICAgIGlzUmVtb3RlSW5wdXRBY3RpdmU6IEJvb2xlYW4/ID0gbnVsbAorICAgICkgPQorICAgICAgICBsb2dCdWZmZXIubG9nKAorICAgICAgICAgICAgVEFHLAorICAgICAgICAgICAgREVCVUcsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyMSA9IGVudHJ5S2V5CisgICAgICAgICAgICAgICAgYm9vbDEgPSByZW1vdGVFZGl0SW1lVmlzaWJsZQorICAgICAgICAgICAgICAgIGJvb2wyID0gcmVtb3RlRWRpdEltZUFuaW1hdGluZ0F3YXkKKyAgICAgICAgICAgICAgICBzdHIyID0gaXNSZW1vdGVJbnB1dEFjdGl2ZT8udG9TdHJpbmcoKSA/OiAiTi9BIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAicmVtb3ZlUmVtb3RlSW5wdXQgZW50cnk6ICRzdHIxLCByZW1vdGVFZGl0SW1lVmlzaWJsZTogJGJvb2wxIiArCisgICAgICAgICAgICAgICAgICAgICIsIHJlbW90ZUVkaXRJbWVBbmltYXRpbmdBd2F5OiAkYm9vbDIsIGlzQWN0aXZlOiAkc3RyMiIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKQorCisgICAgcHJpdmF0ZSBjb21wYW5pb24gb2JqZWN0IHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgVEFHID0gIlJlbW90ZUlucHV0Q29udHJvbGxlckxvZyIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9jb2xsZWN0aW9uL2Nvb3JkaW5hdG9yL0hlYWRzVXBDb29yZGluYXRvci5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2NvbGxlY3Rpb24vY29vcmRpbmF0b3IvSGVhZHNVcENvb3JkaW5hdG9yLmt0CmluZGV4IDEwMDRlYzEuLjRkMGU3NDYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2NvbGxlY3Rpb24vY29vcmRpbmF0b3IvSGVhZHNVcENvb3JkaW5hdG9yLmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2NvbGxlY3Rpb24vY29vcmRpbmF0b3IvSGVhZHNVcENvb3JkaW5hdG9yLmt0CkBAIC0zODksMTEgKzM4OSwxMSBAQAogICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgd2hldGhlciB0aGlzIG5vdGlmaWNhdGlvbiBzaG91bGQgbGF1bmNoIGEgZnVsbCBzY3JlZW4gaW50ZW50LCBhbmQKICAgICAgICAgICAgIC8vIGxhdW5jaCBpdCBpZiBuZWVkZWQuCiAgICAgICAgICAgICB2YWwgZnNpRGVjaXNpb24gPSBtTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlci5nZXRGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oZW50cnkpCi0gICAgICAgICAgICBpZiAoZnNpRGVjaXNpb24gIT0gbnVsbCAmJiBmc2lEZWNpc2lvbi5zaG91bGRMYXVuY2gpIHsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlci5sb2dGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oZW50cnksIGZzaURlY2lzaW9uKQorICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXIubG9nRnVsbFNjcmVlbkludGVudERlY2lzaW9uKGVudHJ5LCBmc2lEZWNpc2lvbikKKyAgICAgICAgICAgIGlmIChmc2lEZWNpc2lvbi5zaG91bGRMYXVuY2gpIHsKICAgICAgICAgICAgICAgICBtTGF1bmNoRnVsbFNjcmVlbkludGVudFByb3ZpZGVyLmxhdW5jaEZ1bGxTY3JlZW5JbnRlbnQoZW50cnkpCiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncy5mc2lPbkRORFVwZGF0ZSgpICYmCi0gICAgICAgICAgICAgICAgZnNpRGVjaXNpb24uZXF1YWxzKEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5OT19GU0lfU1VQUFJFU1NFRF9PTkxZX0JZX0RORCkpIHsKKyAgICAgICAgICAgICAgICBmc2lEZWNpc2lvbiA9PSBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlNJX1NVUFBSRVNTRURfT05MWV9CWV9ETkQpIHsKICAgICAgICAgICAgICAgICAvLyBJZiBETkQgd2FzIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGVudHJ5IHdhcyBzdXBwcmVzc2VkLCBub3RlIGl0IGZvciBwb3RlbnRpYWwKICAgICAgICAgICAgICAgICAvLyByZWNvbnNpZGVyYXRpb24gb24gbGF0ZXIgcmFua2luZyB1cGRhdGVzLgogICAgICAgICAgICAgICAgIGFkZEZvckZTSVJlY29uc2lkZXJhdGlvbihlbnRyeSwgbVN5c3RlbUNsb2NrLmN1cnJlbnRUaW1lTWlsbGlzKCkpCkBAIC01MTQsMTQgKzUxNCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXIuZ2V0RnVsbFNjcmVlbkludGVudERlY2lzaW9uKGVudHJ5KQogICAgICAgICAgICAgICAgICAgICBpZiAoZGVjaXNpb24uc2hvdWxkTGF1bmNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cgYm90aCB0aGUgbGF1bmNoIG9mIHRoZSBmdWxsIHNjcmVlbiBhbmQgYWxzbyB0aGF0IHRoaXMgd2FzIHZpYSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyByYW5raW5nIHVwZGF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2dnZXIubG9nRW50cnlVcGRhdGVkVG9GdWxsU2NyZWVuKGVudHJ5LmtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhbmtpbmcgdXBkYXRlLCBhbmQgZmluYWxseSByZXZva2UgY2FuZGlkYWN5IGZvciBGU0kgcmVjb25zaWRlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBtTG9nZ2VyLmxvZ0VudHJ5VXBkYXRlZFRvRnVsbFNjcmVlbihlbnRyeS5rZXksIGRlY2lzaW9uLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlci5sb2dGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksIGRlY2lzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgbUxhdW5jaEZ1bGxTY3JlZW5JbnRlbnRQcm92aWRlci5sYXVuY2hGdWxsU2NyZWVuSW50ZW50KGVudHJ5KQorICAgICAgICAgICAgICAgICAgICAgICAgbUZTSVVwZGF0ZUNhbmRpZGF0ZXMucmVtb3ZlKGVudHJ5LmtleSkKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbGF1bmNoIHRoZSBGU0kgdGhlbiB0aGlzIGlzIG5vIGxvbmdlciBhIGNhbmRpZGF0ZSBmb3IgSFVOCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlY2lzaW9uID09IEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5OT19GU0lfU1VQUFJFU1NFRF9PTkxZX0JZX0RORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjaXNpb24gaGFzIG5vdCBjaGFuZ2VkOyBubyBuZWVkIHRvIGxvZworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBvdGhlciBjb25kaXRpb24gaXMgbm93IGJsb2NraW5nIEZTSTsgbG9nIHRoYXQgYW5kIHJldm9rZSBjYW5kaWRhY3kKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBGU0kgcmVjb25zaWRlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBtTG9nZ2VyLmxvZ0VudHJ5RGlzcXVhbGlmaWVkRnJvbUZ1bGxTY3JlZW4oZW50cnkua2V5LCBkZWNpc2lvbi5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXIubG9nRnVsbFNjcmVlbkludGVudERlY2lzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LCBkZWNpc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GU0lVcGRhdGVDYW5kaWRhdGVzLnJlbW92ZShlbnRyeS5rZXkpCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2NvbGxlY3Rpb24vY29vcmRpbmF0b3IvSGVhZHNVcENvb3JkaW5hdG9yTG9nZ2VyLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vY29sbGVjdGlvbi9jb29yZGluYXRvci9IZWFkc1VwQ29vcmRpbmF0b3JMb2dnZXIua3QKaW5kZXggMmM2YmY2Yi4uZTkzNjU1OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vY29sbGVjdGlvbi9jb29yZGluYXRvci9IZWFkc1VwQ29vcmRpbmF0b3JMb2dnZXIua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vY29sbGVjdGlvbi9jb29yZGluYXRvci9IZWFkc1VwQ29vcmRpbmF0b3JMb2dnZXIua3QKQEAgLTcwLDExICs3MCwyMSBAQAogICAgICAgICB9KQogICAgIH0KIAotICAgIGZ1biBsb2dFbnRyeVVwZGF0ZWRUb0Z1bGxTY3JlZW4oa2V5OiBTdHJpbmcpIHsKKyAgICBmdW4gbG9nRW50cnlVcGRhdGVkVG9GdWxsU2NyZWVuKGtleTogU3RyaW5nLCByZWFzb246IFN0cmluZykgewogICAgICAgICBidWZmZXIubG9nKFRBRywgTG9nTGV2ZWwuREVCVUcsIHsKICAgICAgICAgICAgIHN0cjEgPSBrZXkKKyAgICAgICAgICAgIHN0cjIgPSByZWFzb24KICAgICAgICAgfSwgewotICAgICAgICAgICAgInVwZGF0aW5nIGVudHJ5IHRvIGxhdW5jaCBmdWxsIHNjcmVlbiBpbnRlbnQ6ICRzdHIxIgorICAgICAgICAgICAgInVwZGF0aW5nIGVudHJ5IHRvIGxhdW5jaCBmdWxsIHNjcmVlbiBpbnRlbnQ6ICRzdHIxIGJlY2F1c2UgJHN0cjIiCisgICAgICAgIH0pCisgICAgfQorCisgICAgZnVuIGxvZ0VudHJ5RGlzcXVhbGlmaWVkRnJvbUZ1bGxTY3JlZW4oa2V5OiBTdHJpbmcsIHJlYXNvbjogU3RyaW5nKSB7CisgICAgICAgIGJ1ZmZlci5sb2coVEFHLCBMb2dMZXZlbC5ERUJVRywgeworICAgICAgICAgICAgc3RyMSA9IGtleQorICAgICAgICAgICAgc3RyMiA9IHJlYXNvbgorICAgICAgICB9LCB7CisgICAgICAgICAgICAidXBkYXRlZCBlbnRyeSBubyBsb25nZXIgcXVhbGlmaWVzIGZvciBmdWxsIHNjcmVlbiBpbnRlbnQ6ICRzdHIxIGJlY2F1c2UgJHN0cjIiCiAgICAgICAgIH0pCiAgICAgfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9pbnRlcnJ1cHRpb24vTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vaW50ZXJydXB0aW9uL05vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXIuamF2YQppbmRleCA5MDAxNDcwLi41YmE4ODAxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9pbnRlcnJ1cHRpb24vTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2ludGVycnVwdGlvbi9Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLmludGVycnVwdGlvbjsKIAoraW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uY29sbGVjdGlvbi5Ob3RpZmljYXRpb25FbnRyeTsKIAogLyoqCkBAIC0xNTMsNyArMTU1LDggQEAKICAgICAgKiBAcGFyYW0gZW50cnkgdGhlIGVudHJ5IHRvIGV2YWx1YXRlCiAgICAgICogQHJldHVybiBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24gcmVwcmVzZW50aW5nIHRoZSBkZWNpc2lvbiBmb3Igd2hldGhlciB0byBzaG93IHRoZSBpbnRlbnQKICAgICAgKi8KLSAgICBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24gZ2V0RnVsbFNjcmVlbkludGVudERlY2lzaW9uKE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5KTsKKyAgICBATm9uTnVsbAorICAgIEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbiBnZXRGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oQE5vbk51bGwgTm90aWZpY2F0aW9uRW50cnkgZW50cnkpOwogCiAgICAgLyoqCiAgICAgICogV3JpdGUgdGhlIGZ1bGwgc2NyZWVuIGxhdW5jaCBkZWNpc2lvbiBmb3IgdGhlIGdpdmVuIGVudHJ5IHRvIGxvZ3MuCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9pbnRlcnJ1cHRpb24vTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGwuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2ludGVycnVwdGlvbi9Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbC5qYXZhCmluZGV4IDlmNDViOWQuLjZmNGVlZDMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2ludGVycnVwdGlvbi9Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2ludGVycnVwdGlvbi9Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbC5qYXZhCkBAIC0yOCwxMiArMjgsMTEgQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuQW1iaWVudERpc3BsYXlDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnNlcnZpY2UuZHJlYW1zLklEcmVhbU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5TdGF0dXNCYXJOb3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LmFubm90YXRpb24uTm9uTnVsbDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmxvZ2dpbmcuVWlFdmVudDsKQEAgLTY4LDcgKzY3LDYgQEAKICAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkU3RhdGVDb250cm9sbGVyIG1LZXlndWFyZFN0YXRlQ29udHJvbGxlcjsKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogICAgIHByaXZhdGUgZmluYWwgUG93ZXJNYW5hZ2VyIG1Qb3dlck1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJRHJlYW1NYW5hZ2VyIG1EcmVhbU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBBbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb24gbUFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbjsKICAgICBwcml2YXRlIGZpbmFsIEJhdHRlcnlDb250cm9sbGVyIG1CYXR0ZXJ5Q29udHJvbGxlcjsKICAgICBwcml2YXRlIGZpbmFsIEhlYWRzVXBNYW5hZ2VyIG1IZWFkc1VwTWFuYWdlcjsKQEAgLTExMCw3ICsxMDgsNiBAQAogICAgIHB1YmxpYyBOb3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbCgKICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIsCiAgICAgICAgICAgICBQb3dlck1hbmFnZXIgcG93ZXJNYW5hZ2VyLAotICAgICAgICAgICAgSURyZWFtTWFuYWdlciBkcmVhbU1hbmFnZXIsCiAgICAgICAgICAgICBBbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb24gYW1iaWVudERpc3BsYXlDb25maWd1cmF0aW9uLAogICAgICAgICAgICAgQmF0dGVyeUNvbnRyb2xsZXIgYmF0dGVyeUNvbnRyb2xsZXIsCiAgICAgICAgICAgICBTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIgc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLApAQCAtMTI0LDcgKzEyMSw2IEBACiAgICAgICAgICAgICBVc2VyVHJhY2tlciB1c2VyVHJhY2tlcikgewogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGVudFJlc29sdmVyOwogICAgICAgICBtUG93ZXJNYW5hZ2VyID0gcG93ZXJNYW5hZ2VyOwotICAgICAgICBtRHJlYW1NYW5hZ2VyID0gZHJlYW1NYW5hZ2VyOwogICAgICAgICBtQmF0dGVyeUNvbnRyb2xsZXIgPSBiYXR0ZXJ5Q29udHJvbGxlcjsKICAgICAgICAgbUFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiA9IGFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbjsKICAgICAgICAgbVN0YXR1c0JhclN0YXRlQ29udHJvbGxlciA9IHN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjsKQEAgLTIzMiw2ICsyMjgsNyBAQAogICAgIC8vIHN1cHByZXNzb3IuCiAgICAgLy8KICAgICAvLyBJZiB0aGUgZW50cnkgd2FzIG5vdCBzdXBwcmVzc2VkIGJ5IERORCwganVzdCByZXR1cm5zIHRoZSBnaXZlbiBkZWNpc2lvbi4KKyAgICBATm9uTnVsbAogICAgIHByaXZhdGUgRnVsbFNjcmVlbkludGVudERlY2lzaW9uIGdldERlY2lzaW9uR2l2ZW5TdXBwcmVzc2lvbihGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24gZGVjaXNpb24sCiAgICAgICAgICAgICBib29sZWFuIHN1cHByZXNzZWRCeURORCkgewogICAgICAgICBpZiAoc3VwcHJlc3NlZEJ5RE5EKSB7CkBAIC0yNDMsNyArMjQwLDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRnVsbFNjcmVlbkludGVudERlY2lzaW9uIGdldEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbihOb3RpZmljYXRpb25FbnRyeSBlbnRyeSkgeworICAgIHB1YmxpYyBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24gZ2V0RnVsbFNjcmVlbkludGVudERlY2lzaW9uKEBOb25OdWxsIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5KSB7CiAgICAgICAgIGlmIChlbnRyeS5nZXRTYm4oKS5nZXROb3RpZmljYXRpb24oKS5mdWxsU2NyZWVuSW50ZW50ID09IG51bGwpIHsKICAgICAgICAgICAgIGlmIChlbnRyeS5pc1N0aWNreUFuZE5vdERlbW90ZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlNJX1NIT1dfU1RJQ0tZX0hVTjsKQEAgLTI4NCw3ICsyODEsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgZHJlYW1pbmcsIHRoZW4gbGF1bmNoIHRoZSBGdWxsU2NyZWVuSW50ZW50Ci0gICAgICAgIGlmIChpc0RyZWFtaW5nKCkpIHsKKyAgICAgICAgLy8gV2UgYXZvaWQgdXNpbmcgSURyZWFtTWFuYWdlciNpc0RyZWFtaW5nIGhlcmUgYXMgdGhhdCBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UgZHVyaW5nCisgICAgICAgIC8vIHRoZSBkcmVhbSdzIHdha2UtdXAgcGhhc2UuCisgICAgICAgIGlmIChtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldERlY2lzaW9uR2l2ZW5TdXBwcmVzc2lvbihGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uRlNJX0RFVklDRV9JU19EUkVBTUlORywKICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NlZEJ5RE5EKTsKICAgICAgICAgfQpAQCAtMzM2LDY0ICszMzUsMzIgQEAKICAgICAgICAgZmluYWwgaW50IHVpZCA9IGVudHJ5LmdldFNibigpLmdldFVpZCgpOwogICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBlbnRyeS5nZXRTYm4oKS5nZXRQYWNrYWdlTmFtZSgpOwogICAgICAgICBzd2l0Y2ggKGRlY2lzaW9uKSB7Ci0gICAgICAgICAgICBjYXNlIE5PX0ZTSV9TSE9XX1NUSUNLWV9IVU46Ci0gICAgICAgICAgICAgICAgbUxvZ2dlci5sb2dOb0Z1bGxzY3JlZW4oZW50cnksICJQZXJtaXNzaW9uIGRlbmllZCwgc2hvdyBzdGlja3kgSFVOIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgY2FzZSBOT19GVUxMX1NDUkVFTl9JTlRFTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBOT19GU0lfU1VQUFJFU1NFRF9CWV9ETkQ6Ci0gICAgICAgICAgICBjYXNlIE5PX0ZTSV9TVVBQUkVTU0VEX09OTFlfQllfRE5EOgotICAgICAgICAgICAgICAgIG1Mb2dnZXIubG9nTm9GdWxsc2NyZWVuKGVudHJ5LCAiU3VwcHJlc3NlZCBieSBETkQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIE5PX0ZTSV9OT1RfSU1QT1JUQU5UX0VOT1VHSDoKLSAgICAgICAgICAgICAgICBtTG9nZ2VyLmxvZ05vRnVsbHNjcmVlbihlbnRyeSwgIk5vdCBpbXBvcnRhbnQgZW5vdWdoIik7CisgICAgICAgICAgICAgICAgLy8gZXhwbGljaXRseSBwcmV2ZW50IGxvZ2dpbmcgZm9yIHRoaXMgKGZyZXF1ZW50KSBjYXNlCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgY2FzZSBOT19GU0lfU1VQUFJFU1NJVkVfR1JPVVBfQUxFUlRfQkVIQVZJT1I6CiAgICAgICAgICAgICAgICAgYW5kcm9pZC51dGlsLkV2ZW50TG9nLndyaXRlRXZlbnQoMHg1MzRlNDU1NCwgIjIzMTMyMjg3MyIsIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cEFsZXJ0QmVoYXZpb3IiKTsKICAgICAgICAgICAgICAgICBtVWlFdmVudExvZ2dlci5sb2coRlNJX1NVUFBSRVNTRURfU1VQUFJFU1NJVkVfR1JPVVBfQUxFUlRfQkVIQVZJT1IsIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBtTG9nZ2VyLmxvZ05vRnVsbHNjcmVlbldhcm5pbmcoZW50cnksICJHcm91cEFsZXJ0QmVoYXZpb3Igd2lsbCBwcmV2ZW50IEhVTiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgRlNJX0RFVklDRV9OT1RfSU5URVJBQ1RJVkU6Ci0gICAgICAgICAgICAgICAgbUxvZ2dlci5sb2dGdWxsc2NyZWVuKGVudHJ5LCAiRGV2aWNlIGlzIG5vdCBpbnRlcmFjdGl2ZSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgRlNJX0RFVklDRV9JU19EUkVBTUlORzoKLSAgICAgICAgICAgICAgICBtTG9nZ2VyLmxvZ0Z1bGxzY3JlZW4oZW50cnksICJEZXZpY2UgaXMgZHJlYW1pbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEZTSV9LRVlHVUFSRF9TSE9XSU5HOgotICAgICAgICAgICAgICAgIG1Mb2dnZXIubG9nRnVsbHNjcmVlbihlbnRyeSwgIktleWd1YXJkIGlzIHNob3dpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIE5PX0ZTSV9FWFBFQ1RFRF9UT19IVU46Ci0gICAgICAgICAgICAgICAgbUxvZ2dlci5sb2dOb0Z1bGxzY3JlZW4oZW50cnksICJFeHBlY3RlZCB0byBIVU4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEZTSV9LRVlHVUFSRF9PQ0NMVURFRDoKLSAgICAgICAgICAgICAgICBtTG9nZ2VyLmxvZ0Z1bGxzY3JlZW4oZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbm90IHRvIEhVTiB3aGlsZSBrZXlndWFyZCBvY2NsdWRlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgRlNJX0xPQ0tFRF9TSEFERToKLSAgICAgICAgICAgICAgICBtTG9nZ2VyLmxvZ0Z1bGxzY3JlZW4oZW50cnksICJLZXlndWFyZCBpcyBzaG93aW5nIGFuZCBub3Qgb2NjbHVkZWQiKTsKKyAgICAgICAgICAgICAgICBtTG9nZ2VyLmxvZ05vRnVsbHNjcmVlbldhcm5pbmcoZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNpc2lvbiArICI6IEdyb3VwQWxlcnRCZWhhdmlvciB3aWxsIHByZXZlbnQgSFVOIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgY2FzZSBOT19GU0lfTk9fSFVOX09SX0tFWUdVQVJEOgogICAgICAgICAgICAgICAgIGFuZHJvaWQudXRpbC5FdmVudExvZy53cml0ZUV2ZW50KDB4NTM0ZTQ1NTQsICIyMzEzMjI4NzMiLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAibm8gaHVuIG9yIGtleWd1YXJkIik7CiAgICAgICAgICAgICAgICAgbVVpRXZlbnRMb2dnZXIubG9nKEZTSV9TVVBQUkVTU0VEX05PX0hVTl9PUl9LRVlHVUFSRCwgdWlkLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUxvZ2dlci5sb2dOb0Z1bGxzY3JlZW5XYXJuaW5nKGVudHJ5LCAiRXhwZWN0ZWQgbm90IHRvIEhVTiB3aGlsZSBub3Qgb24ga2V5Z3VhcmQiKTsKKyAgICAgICAgICAgICAgICBtTG9nZ2VyLmxvZ05vRnVsbHNjcmVlbldhcm5pbmcoZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNpc2lvbiArICI6IEV4cGVjdGVkIG5vdCB0byBIVU4gd2hpbGUgbm90IG9uIGtleWd1YXJkIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBGU0lfRVhQRUNURURfTk9UX1RPX0hVTjoKLSAgICAgICAgICAgICAgICBtTG9nZ2VyLmxvZ0Z1bGxzY3JlZW4oZW50cnksICJFeHBlY3RlZCBub3QgdG8gSFVOIik7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChkZWNpc2lvbi5zaG91bGRMYXVuY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvZ2dlci5sb2dGdWxsc2NyZWVuKGVudHJ5LCBkZWNpc2lvbi5uYW1lKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2dnZXIubG9nTm9GdWxsc2NyZWVuKGVudHJ5LCBkZWNpc2lvbi5uYW1lKCkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RyZWFtaW5nKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHF1ZXJ5IGRyZWFtIG1hbmFnZXIuIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkSGVhZHNVcFdoZW5Bd2FrZShOb3RpZmljYXRpb25FbnRyeSBlbnRyeSwgYm9vbGVhbiBsb2cpIHsKICAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHNibiA9IGVudHJ5LmdldFNibigpOwogCkBAIC00NDMsNyArNDEwLDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2xlYW4gaW5Vc2UgPSBtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSAmJiAhaXNEcmVhbWluZygpOworICAgICAgICBib29sZWFuIGluVXNlID0gbVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkgJiYgIW1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpOwogCiAgICAgICAgIGlmICghaW5Vc2UpIHsKICAgICAgICAgICAgIGlmIChsb2cpIG1Mb2dnZXIubG9nTm9IZWFkc1VwTm90SW5Vc2UoZW50cnkpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L0V4cGFuZGFibGVOb3RpZmljYXRpb25Sb3cuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9FeHBhbmRhYmxlTm90aWZpY2F0aW9uUm93LmphdmEKaW5kZXggMzc0MWYwYy4uYTUyOWRhNSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L0V4cGFuZGFibGVOb3RpZmljYXRpb25Sb3cuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvRXhwYW5kYWJsZU5vdGlmaWNhdGlvblJvdy5qYXZhCkBAIC0yNiwxMCArMjYsOCBAQAogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLmFwcC5JTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uQ2hhbm5lbDsKLWltcG9ydCBhbmRyb2lkLmFwcC5yb2xlLlJvbGVNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKQEAgLTM4LDEyICszNiw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGVkVmVjdG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5UcmFjZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlTZXQ7CkBAIC03Myw2ICs2OCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9nZ2luZy5NZXRyaWNzTG9nZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmxvZ2dpbmcubmFuby5NZXRyaWNzUHJvdG8uTWV0cmljc0V2ZW50OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyU2VydmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkNvbnRyYXN0Q29sb3JVdGlsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5DYWNoaW5nSWNvblZpZXc7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkNhbGxMYXlvdXQ7CkBAIC04Niw3ICs4Miw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5zdGF0dXNiYXIuTm90aWZpY2F0aW9uTWVudVJvd1BsdWdpbjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLnN0YXR1c2Jhci5Ob3RpZmljYXRpb25NZW51Um93UGx1Z2luLk1lbnVJdGVtOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuc3RhdHVzYmFyLlN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTm90aWZpY2F0aW9uTWVkaWFNYW5hZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5SZW1vdGVJbnB1dENvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlNtYXJ0UmVwbHlDb250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uVmlldzsKQEAgLTE0MSw4ICsxMzYsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBDb21waWxlLklTX0RFQlVHICYmIExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX09OTUVBU1VSRSA9CiAgICAgICAgICAgICBDb21waWxlLklTX0RFQlVHICYmIExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0RJVklERVJfQUxQSEEgPSAweDI5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xPUkVEX0RJVklERVJfQUxQSEEgPSAweDdCOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRU5VX1ZJRVdfSU5ERVggPSAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9IRUFERVJfVklTSUJMRV9BTU9VTlQgPSAxLjBmOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVDRU5UTFlfQUxFUlRFRF9USFJFU0hPTERfTVMgPSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwKTsKQEAgLTE5Miw3ICsxODUsNiBAQAogICAgIHByaXZhdGUgaW50IG1NYXhTbWFsbEhlaWdodDsKICAgICBwcml2YXRlIGludCBtTWF4U21hbGxIZWlnaHRMYXJnZTsKICAgICBwcml2YXRlIGludCBtTWF4RXhwYW5kZWRIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUluY3JlYXNlZFBhZGRpbmdCZXR3ZWVuRWxlbWVudHM7CiAgICAgcHJpdmF0ZSBpbnQgbU5vdGlmaWNhdGlvbkxhdW5jaEhlaWdodDsKICAgICBwcml2YXRlIGJvb2xlYW4gbU11c3RTdGF5T25TY3JlZW47CiAKQEAgLTI3OCw3ICsyNzAsNiBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd05vQmFja2dyb3VuZDsKICAgICBwcml2YXRlIEV4cGFuZGFibGVOb3RpZmljYXRpb25Sb3cgbU5vdGlmaWNhdGlvblBhcmVudDsKICAgICBwcml2YXRlIE9uRXhwYW5kQ2xpY2tMaXN0ZW5lciBtT25FeHBhbmRDbGlja0xpc3RlbmVyOwotICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU9uQXBwQ2xpY2tMaXN0ZW5lcjsKICAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1PbkZlZWRiYWNrQ2xpY2tMaXN0ZW5lcjsKICAgICBwcml2YXRlIFBhdGggbUV4cGFuZGluZ0NsaXBQYXRoOwogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNJbmxpbmVSZXBseUFuaW1hdGlvbkZsYWdFbmFibGVkID0gZmFsc2U7CkBAIC0zNzEsNyArMzYyLDYgQEAKICAgICBwcml2YXRlIGZsb2F0IG1UcmFuc2xhdGlvbldoZW5SZW1vdmVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtV2FzQ2hpbGRJbkdyb3VwV2hlblJlbW92ZWQ7CiAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25JbmxpbmVJbWFnZVJlc29sdmVyIG1JbWFnZVJlc29sdmVyOwotICAgIHByaXZhdGUgTm90aWZpY2F0aW9uTWVkaWFNYW5hZ2VyIG1NZWRpYU1hbmFnZXI7CiAgICAgQE51bGxhYmxlCiAgICAgcHJpdmF0ZSBPbkV4cGFuc2lvbkNoYW5nZWRMaXN0ZW5lciBtRXhwYW5zaW9uQ2hhbmdlZExpc3RlbmVyOwogICAgIEBOdWxsYWJsZQpAQCAtMzgxLDMyICszNzEsNiBAQAogICAgIHByaXZhdGUgZmxvYXQgbUJvdHRvbVJvdW5kbmVzc0R1cmluZ0xhdW5jaEFuaW1hdGlvbjsKICAgICBwcml2YXRlIGZsb2F0IG1TbWFsbFJvdW5kbmVzczsKIAotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4ge0Bjb2RlIHN0YXR1c0Jhck5vdGlmaWNhdGlvbn0gaXMgYSBzeXN0ZW0gbm90aWZpY2F0aW9uLgotICAgICAqIDxiPk5vdGU8L2I+LCB0aGlzIHNob3VsZCBiZSBydW4gaW4gdGhlIGJhY2tncm91bmQgdGhyZWFkIGlmIHBvc3NpYmxlIGFzIGl0IG1ha2VzIG11bHRpcGxlIElQQwotICAgICAqIGNhbGxzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gaXNTeXN0ZW1Ob3RpZmljYXRpb24oQ29udGV4dCBjb250ZXh0LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gc2JuKSB7Ci0gICAgICAgIElOb3RpZmljYXRpb25NYW5hZ2VyIGlObSA9IElOb3RpZmljYXRpb25NYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKSk7Ci0KLSAgICAgICAgYm9vbGVhbiBpc1N5c3RlbSA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXNTeXN0ZW0gPSBpTm0uaXNQZXJtaXNzaW9uRml4ZWQoc2JuLmdldFBhY2thZ2VOYW1lKCksIHNibi5nZXRVc2VySWQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgcmVhY2ggTk1TIik7Ci0gICAgICAgIH0KLSAgICAgICAgUm9sZU1hbmFnZXIgcm0gPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoUm9sZU1hbmFnZXIuY2xhc3MpOwotICAgICAgICBMaXN0PFN0cmluZz4gZml4ZWRSb2xlSG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmaXhlZFJvbGVIb2xkZXJzLmFkZEFsbChybS5nZXRSb2xlSG9sZGVycyhSb2xlTWFuYWdlci5ST0xFX0RJQUxFUikpOwotICAgICAgICBmaXhlZFJvbGVIb2xkZXJzLmFkZEFsbChybS5nZXRSb2xlSG9sZGVycyhSb2xlTWFuYWdlci5ST0xFX0VNRVJHRU5DWSkpOwotICAgICAgICBpZiAoZml4ZWRSb2xlSG9sZGVycy5jb250YWlucyhzYm4uZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgIGlzU3lzdGVtID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc1N5c3RlbTsKLSAgICB9Ci0KICAgICBwdWJsaWMgTm90aWZpY2F0aW9uQ29udGVudFZpZXdbXSBnZXRMYXlvdXRzKCkgewogICAgICAgICByZXR1cm4gQXJyYXlzLmNvcHlPZihtTGF5b3V0cywgbUxheW91dHMubGVuZ3RoKTsKICAgICB9CkBAIC03OTQsMTEgKzc1OCw2IEBACiAgICAgICAgIG1Qcml2YXRlTGF5b3V0LnNldFJlbW90ZUlucHV0Q29udHJvbGxlcihyKTsKICAgICB9CiAKLQotICAgIFN0cmluZyBnZXRBcHBOYW1lKCkgewotICAgICAgICByZXR1cm4gbUFwcE5hbWU7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgYWRkQ2hpbGROb3RpZmljYXRpb24oRXhwYW5kYWJsZU5vdGlmaWNhdGlvblJvdyByb3cpIHsKICAgICAgICAgYWRkQ2hpbGROb3RpZmljYXRpb24ocm93LCAtMSk7CiAgICAgfQpAQCAtMTI3MiwxMCArMTIzMSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgSGVhZHNVcE1hbmFnZXIgZ2V0SGVhZHNVcE1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBtSGVhZHNVcE1hbmFnZXI7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgc2V0R3V0c1ZpZXcoTWVudUl0ZW0gaXRlbSkgewogICAgICAgICBpZiAoZ2V0R3V0cygpICE9IG51bGwgJiYgaXRlbS5nZXRHdXRzVmlldygpIGluc3RhbmNlb2YgTm90aWZpY2F0aW9uR3V0cy5HdXRzQ29udGVudCkgewogICAgICAgICAgICAgZ2V0R3V0cygpLnNldEd1dHNDb250ZW50KChOb3RpZmljYXRpb25HdXRzLkd1dHNDb250ZW50KSBpdGVtLmdldEd1dHNWaWV3KCkpOwpAQCAtMTcwNSw3ICsxNjYwLDYgQEAKICAgICAgICAgICAgIEhlYWRzVXBNYW5hZ2VyIGhlYWRzVXBNYW5hZ2VyLAogICAgICAgICAgICAgUm93Q29udGVudEJpbmRTdGFnZSByb3dDb250ZW50QmluZFN0YWdlLAogICAgICAgICAgICAgT25FeHBhbmRDbGlja0xpc3RlbmVyIG9uRXhwYW5kQ2xpY2tMaXN0ZW5lciwKLSAgICAgICAgICAgIE5vdGlmaWNhdGlvbk1lZGlhTWFuYWdlciBub3RpZmljYXRpb25NZWRpYU1hbmFnZXIsCiAgICAgICAgICAgICBDb29yZGluYXRlT25DbGlja0xpc3RlbmVyIG9uRmVlZGJhY2tDbGlja0xpc3RlbmVyLAogICAgICAgICAgICAgRmFsc2luZ01hbmFnZXIgZmFsc2luZ01hbmFnZXIsCiAgICAgICAgICAgICBGYWxzaW5nQ29sbGVjdG9yIGZhbHNpbmdDb2xsZWN0b3IsCkBAIC0xNzE4LDcgKzE2NzIsOCBAQAogICAgICAgICAgICAgTWV0cmljc0xvZ2dlciBtZXRyaWNzTG9nZ2VyLAogICAgICAgICAgICAgU21hcnRSZXBseUNvbnN0YW50cyBzbWFydFJlcGx5Q29uc3RhbnRzLAogICAgICAgICAgICAgU21hcnRSZXBseUNvbnRyb2xsZXIgc21hcnRSZXBseUNvbnRyb2xsZXIsCi0gICAgICAgICAgICBGZWF0dXJlRmxhZ3MgZmVhdHVyZUZsYWdzKSB7CisgICAgICAgICAgICBGZWF0dXJlRmxhZ3MgZmVhdHVyZUZsYWdzLAorICAgICAgICAgICAgSVN0YXR1c0JhclNlcnZpY2Ugc3RhdHVzQmFyU2VydmljZSkgewogICAgICAgICBtRW50cnkgPSBlbnRyeTsKICAgICAgICAgbUFwcE5hbWUgPSBhcHBOYW1lOwogICAgICAgICBpZiAobU1lbnVSb3cgPT0gbnVsbCkgewpAQCAtMTczNiw3ICsxNjkxLDYgQEAKICAgICAgICAgbUhlYWRzVXBNYW5hZ2VyID0gaGVhZHNVcE1hbmFnZXI7CiAgICAgICAgIG1Sb3dDb250ZW50QmluZFN0YWdlID0gcm93Q29udGVudEJpbmRTdGFnZTsKICAgICAgICAgbU9uRXhwYW5kQ2xpY2tMaXN0ZW5lciA9IG9uRXhwYW5kQ2xpY2tMaXN0ZW5lcjsKLSAgICAgICAgbU1lZGlhTWFuYWdlciA9IG5vdGlmaWNhdGlvbk1lZGlhTWFuYWdlcjsKICAgICAgICAgc2V0T25GZWVkYmFja0NsaWNrTGlzdGVuZXIob25GZWVkYmFja0NsaWNrTGlzdGVuZXIpOwogICAgICAgICBtRmFsc2luZ01hbmFnZXIgPSBmYWxzaW5nTWFuYWdlcjsKICAgICAgICAgbUZhbHNpbmdDb2xsZWN0b3IgPSBmYWxzaW5nQ29sbGVjdG9yOwpAQCAtMTc0Nyw3ICsxNzAxLDggQEAKICAgICAgICAgICAgICAgICAgICAgbVBlb3BsZU5vdGlmaWNhdGlvbklkZW50aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgIHJpdlN1YmNvbXBvbmVudEZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgIHNtYXJ0UmVwbHlDb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgIHNtYXJ0UmVwbHlDb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgc21hcnRSZXBseUNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c0JhclNlcnZpY2UpOwogICAgICAgICB9CiAgICAgICAgIG1PblVzZXJJbnRlcmFjdGlvbkNhbGxiYWNrID0gb25Vc2VySW50ZXJhY3Rpb25DYWxsYmFjazsKICAgICAgICAgbUJ1YmJsZXNNYW5hZ2VyT3B0aW9uYWwgPSBidWJibGVzTWFuYWdlck9wdGlvbmFsOwpAQCAtMjkyNSwyMiArMjg4MCw2IEBACiAgICAgICAgIHVwZGF0ZUNsaWNrQW5kRm9jdXMoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlUaW50KFZpZXcgdiwgaW50IGNvbG9yKSB7Ci0gICAgICAgIGludCBhbHBoYTsKLSAgICAgICAgaWYgKGNvbG9yICE9IDApIHsKLSAgICAgICAgICAgIGFscGhhID0gQ09MT1JFRF9ESVZJREVSX0FMUEhBOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29sb3IgPSAweGZmMDAwMDAwOwotICAgICAgICAgICAgYWxwaGEgPSBERUZBVUxUX0RJVklERVJfQUxQSEE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHYuZ2V0QmFja2dyb3VuZCgpIGluc3RhbmNlb2YgQ29sb3JEcmF3YWJsZSkgewotICAgICAgICAgICAgQ29sb3JEcmF3YWJsZSBiYWNrZ3JvdW5kID0gKENvbG9yRHJhd2FibGUpIHYuZ2V0QmFja2dyb3VuZCgpOwotICAgICAgICAgICAgYmFja2dyb3VuZC5tdXRhdGUoKTsKLSAgICAgICAgICAgIGJhY2tncm91bmQuc2V0Q29sb3IoY29sb3IpOwotICAgICAgICAgICAgYmFja2dyb3VuZC5zZXRBbHBoYShhbHBoYSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgaW50IGdldE1heEV4cGFuZEhlaWdodCgpIHsKICAgICAgICAgcmV0dXJuIG1Qcml2YXRlTGF5b3V0LmdldEV4cGFuZEhlaWdodCgpOwogICAgIH0KQEAgLTMxMjgsMTQgKzMwNjcsNiBAQAogICAgICAgICByZXR1cm4gc2hvd2luZ0xheW91dCAhPSBudWxsICYmIHNob3dpbmdMYXlvdXQucmVxdWlyZVJvd1RvSGF2ZU92ZXJsYXBwaW5nUmVuZGVyaW5nKCk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRFeHRyYUJvdHRvbVBhZGRpbmcoKSB7Ci0gICAgICAgIGlmIChtSXNTdW1tYXJ5V2l0aENoaWxkcmVuICYmIGlzR3JvdXBFeHBhbmRlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUluY3JlYXNlZFBhZGRpbmdCZXR3ZWVuRWxlbWVudHM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgc2V0SW5saW5lUmVwbHlBbmltYXRpb25GbGFnRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewogICAgICAgICBtSXNJbmxpbmVSZXBseUFuaW1hdGlvbkZsYWdFbmFibGVkID0gaXNFbmFibGVkOwogICAgIH0KQEAgLTMyNTcsMTAgKzMxODgsNiBAQAogICAgICAgICByZXR1cm4gc2hvdWxkU2hvd1B1YmxpYygpID8gbVB1YmxpY0xheW91dCA6IG1Qcml2YXRlTGF5b3V0OwogICAgIH0KIAotICAgIHB1YmxpYyBWaWV3IGdldEV4cGFuZGVkQ29udGVudFZpZXcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcml2YXRlTGF5b3V0KCkuZ2V0RXhwYW5kZWRDaGlsZCgpOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHNldExlZ2FjeShib29sZWFuIGxlZ2FjeSkgewogICAgICAgICBmb3IgKE5vdGlmaWNhdGlvbkNvbnRlbnRWaWV3IGwgOiBtTGF5b3V0cykgewogICAgICAgICAgICAgbC5zZXRMZWdhY3kobGVnYWN5KTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9FeHBhbmRhYmxlTm90aWZpY2F0aW9uUm93Q29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L0V4cGFuZGFibGVOb3RpZmljYXRpb25Sb3dDb250cm9sbGVyLmphdmEKaW5kZXggZGZjODBmZC4uNWNhMDg2NiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L0V4cGFuZGFibGVOb3RpZmljYXRpb25Sb3dDb250cm9sbGVyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L0V4cGFuZGFibGVOb3RpZmljYXRpb25Sb3dDb250cm9sbGVyLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBhbmRyb2lkeC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9nZ2luZy5NZXRyaWNzTG9nZ2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5JU3RhdHVzQmFyU2VydmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jbGFzc2lmaWVyLkZhbHNpbmdDb2xsZWN0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmVhdHVyZUZsYWdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZsYWdzOwpAQCAtMzYsNyArMzcsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuUGx1Z2luTWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLnN0YXR1c2Jhci5Ob3RpZmljYXRpb25NZW51Um93UGx1Z2luOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuc3RhdHVzYmFyLlN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTm90aWZpY2F0aW9uTWVkaWFNYW5hZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5TbWFydFJlcGx5Q29udHJvbGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLkZlZWRiYWNrSWNvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLmNvbGxlY3Rpb24uTm90aWZpY2F0aW9uRW50cnk7CkBAIC03NCw3ICs3NCw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBOb3RpZmljYXRpb25MaXN0Q29udGFpbmVyIG1MaXN0Q29udGFpbmVyOwogICAgIHByaXZhdGUgZmluYWwgUmVtb3RlSW5wdXRWaWV3U3ViY29tcG9uZW50LkZhY3RvcnkgbVJlbW90ZUlucHV0Vmlld1N1YmNvbXBvbmVudEZhY3Rvcnk7CiAgICAgcHJpdmF0ZSBmaW5hbCBBY3RpdmF0YWJsZU5vdGlmaWNhdGlvblZpZXdDb250cm9sbGVyIG1BY3RpdmF0YWJsZU5vdGlmaWNhdGlvblZpZXdDb250cm9sbGVyOwotICAgIHByaXZhdGUgZmluYWwgTm90aWZpY2F0aW9uTWVkaWFNYW5hZ2VyIG1NZWRpYU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5NYW5hZ2VyIG1QbHVnaW5NYW5hZ2VyOwogICAgIHByaXZhdGUgZmluYWwgU3lzdGVtQ2xvY2sgbUNsb2NrOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1BcHBOYW1lOwpAQCAtMTAyLDYgKzEwMSw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTbWFydFJlcGx5Q29udHJvbGxlciBtU21hcnRSZXBseUNvbnRyb2xsZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBFeHBhbmRhYmxlTm90aWZpY2F0aW9uUm93RHJhZ0NvbnRyb2xsZXIgbURyYWdDb250cm9sbGVyOwogICAgIHByaXZhdGUgZmluYWwgTm90aWZpY2F0aW9uRGlzbWlzc2liaWxpdHlQcm92aWRlciBtRGlzbWlzc2liaWxpdHlQcm92aWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIElTdGF0dXNCYXJTZXJ2aWNlIG1TdGF0dXNCYXJTZXJ2aWNlOwogICAgIHByaXZhdGUgZmluYWwgRXhwYW5kYWJsZU5vdGlmaWNhdGlvblJvdy5FeHBhbmRhYmxlTm90aWZpY2F0aW9uUm93TG9nZ2VyIG1Mb2dnZXJDYWxsYmFjayA9CiAgICAgICAgICAgICBuZXcgRXhwYW5kYWJsZU5vdGlmaWNhdGlvblJvdy5FeHBhbmRhYmxlTm90aWZpY2F0aW9uUm93TG9nZ2VyKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMTM2LDcgKzEzNiw2IEBACiAgICAgICAgICAgICBNZXRyaWNzTG9nZ2VyIG1ldHJpY3NMb2dnZXIsCiAgICAgICAgICAgICBOb3RpZmljYXRpb25Sb3dMb2dnZXIgbG9nQnVmZmVyTG9nZ2VyLAogICAgICAgICAgICAgTm90aWZpY2F0aW9uTGlzdENvbnRhaW5lciBsaXN0Q29udGFpbmVyLAotICAgICAgICAgICAgTm90aWZpY2F0aW9uTWVkaWFNYW5hZ2VyIG1lZGlhTWFuYWdlciwKICAgICAgICAgICAgIFNtYXJ0UmVwbHlDb25zdGFudHMgc21hcnRSZXBseUNvbnN0YW50cywKICAgICAgICAgICAgIFNtYXJ0UmVwbHlDb250cm9sbGVyIHNtYXJ0UmVwbHlDb250cm9sbGVyLAogICAgICAgICAgICAgUGx1Z2luTWFuYWdlciBwbHVnaW5NYW5hZ2VyLApAQCAtMTYwLDEyICsxNTksMTIgQEAKICAgICAgICAgICAgIFBlb3BsZU5vdGlmaWNhdGlvbklkZW50aWZpZXIgcGVvcGxlTm90aWZpY2F0aW9uSWRlbnRpZmllciwKICAgICAgICAgICAgIE9wdGlvbmFsPEJ1YmJsZXNNYW5hZ2VyPiBidWJibGVzTWFuYWdlck9wdGlvbmFsLAogICAgICAgICAgICAgRXhwYW5kYWJsZU5vdGlmaWNhdGlvblJvd0RyYWdDb250cm9sbGVyIGRyYWdDb250cm9sbGVyLAotICAgICAgICAgICAgTm90aWZpY2F0aW9uRGlzbWlzc2liaWxpdHlQcm92aWRlciBkaXNtaXNzaWJpbGl0eVByb3ZpZGVyKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb25EaXNtaXNzaWJpbGl0eVByb3ZpZGVyIGRpc21pc3NpYmlsaXR5UHJvdmlkZXIsCisgICAgICAgICAgICBJU3RhdHVzQmFyU2VydmljZSBzdGF0dXNCYXJTZXJ2aWNlKSB7CiAgICAgICAgIG1WaWV3ID0gdmlldzsKICAgICAgICAgbUxpc3RDb250YWluZXIgPSBsaXN0Q29udGFpbmVyOwogICAgICAgICBtUmVtb3RlSW5wdXRWaWV3U3ViY29tcG9uZW50RmFjdG9yeSA9IHJpdlN1YmNvbXBvbmVudEZhY3Rvcnk7CiAgICAgICAgIG1BY3RpdmF0YWJsZU5vdGlmaWNhdGlvblZpZXdDb250cm9sbGVyID0gYWN0aXZhdGFibGVOb3RpZmljYXRpb25WaWV3Q29udHJvbGxlcjsKLSAgICAgICAgbU1lZGlhTWFuYWdlciA9IG1lZGlhTWFuYWdlcjsKICAgICAgICAgbVBsdWdpbk1hbmFnZXIgPSBwbHVnaW5NYW5hZ2VyOwogICAgICAgICBtQ2xvY2sgPSBjbG9jazsKICAgICAgICAgbUFwcE5hbWUgPSBhcHBOYW1lOwpAQCAtMTkzLDYgKzE5Miw3IEBACiAgICAgICAgIG1TbWFydFJlcGx5Q29uc3RhbnRzID0gc21hcnRSZXBseUNvbnN0YW50czsKICAgICAgICAgbVNtYXJ0UmVwbHlDb250cm9sbGVyID0gc21hcnRSZXBseUNvbnRyb2xsZXI7CiAgICAgICAgIG1EaXNtaXNzaWJpbGl0eVByb3ZpZGVyID0gZGlzbWlzc2liaWxpdHlQcm92aWRlcjsKKyAgICAgICAgbVN0YXR1c0JhclNlcnZpY2UgPSBzdGF0dXNCYXJTZXJ2aWNlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjEyLDcgKzIxMiw2IEBACiAgICAgICAgICAgICAgICAgbUhlYWRzVXBNYW5hZ2VyLAogICAgICAgICAgICAgICAgIG1Sb3dDb250ZW50QmluZFN0YWdlLAogICAgICAgICAgICAgICAgIG1PbkV4cGFuZENsaWNrTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgbU1lZGlhTWFuYWdlciwKICAgICAgICAgICAgICAgICBtT25GZWVkYmFja0NsaWNrTGlzdGVuZXIsCiAgICAgICAgICAgICAgICAgbUZhbHNpbmdNYW5hZ2VyLAogICAgICAgICAgICAgICAgIG1GYWxzaW5nQ29sbGVjdG9yLApAQCAtMjI1LDcgKzIyNCw4IEBACiAgICAgICAgICAgICAgICAgbU1ldHJpY3NMb2dnZXIsCiAgICAgICAgICAgICAgICAgbVNtYXJ0UmVwbHlDb25zdGFudHMsCiAgICAgICAgICAgICAgICAgbVNtYXJ0UmVwbHlDb250cm9sbGVyLAotICAgICAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3MKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUZsYWdzLAorICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJTZXJ2aWNlCiAgICAgICAgICk7CiAgICAgICAgIG1WaWV3LnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKICAgICAgICAgaWYgKG1BbGxvd0xvbmdQcmVzcykgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L0V4cGFuZGFibGVWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvRXhwYW5kYWJsZVZpZXcuamF2YQppbmRleCAyNWM3MjY0Li45ZGY2YmE5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvRXhwYW5kYWJsZVZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvRXhwYW5kYWJsZVZpZXcuamF2YQpAQCAtNDUxLDcgKzQ1MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2xpcHBpbmcoKSB7CiAgICAgICAgIGlmIChtQ2xpcFRvQWN0dWFsSGVpZ2h0ICYmIHNob3VsZENsaXBUb0FjdHVhbEhlaWdodCgpKSB7CiAgICAgICAgICAgICBpbnQgdG9wID0gZ2V0Q2xpcFRvcEFtb3VudCgpOwotICAgICAgICAgICAgaW50IGJvdHRvbSA9IE1hdGgubWF4KE1hdGgubWF4KGdldEFjdHVhbEhlaWdodCgpICsgZ2V0RXh0cmFCb3R0b21QYWRkaW5nKCkKKyAgICAgICAgICAgIGludCBib3R0b20gPSBNYXRoLm1heChNYXRoLm1heChnZXRBY3R1YWxIZWlnaHQoKQogICAgICAgICAgICAgICAgICAgICAtIG1DbGlwQm90dG9tQW1vdW50LCB0b3ApLCBtTWluaW11bUhlaWdodEZvckNsaXBwaW5nKTsKICAgICAgICAgICAgIG1DbGlwUmVjdC5zZXQoSW50ZWdlci5NSU5fVkFMVUUsIHRvcCwgSW50ZWdlci5NQVhfVkFMVUUsIGJvdHRvbSk7CiAgICAgICAgICAgICBzZXRDbGlwQm91bmRzKG1DbGlwUmVjdCk7CkBAIC01OTIsMTMgKzU5Miw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBwYWRkaW5nIHVzZWQgdG8gYWx0ZXIgaG93IG11Y2ggb2YgdGhlIHZpZXcgaXMgY2xpcHBlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEV4dHJhQm90dG9tUGFkZGluZygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBncm91cCdzIGV4cGFuc2lvbiBzdGF0ZSBpcyBjaGFuZ2luZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzR3JvdXBFeHBhbnNpb25DaGFuZ2luZygpIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9Ob3RpZmljYXRpb25Db250ZW50Vmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L05vdGlmaWNhdGlvbkNvbnRlbnRWaWV3LmphdmEKaW5kZXggZDkzYzEyYi4uNzgzOTJmNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L05vdGlmaWNhdGlvbkNvbnRlbnRWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L05vdGlmaWNhdGlvbkNvbnRlbnRWaWV3LmphdmEKQEAgLTIxLDEwICsyMSwxMyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2Uubm90aWZpY2F0aW9uLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuSW5kZW50aW5nUHJpbnRXcml0ZXI7CkBAIC0zOSw2ICs0Miw3IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5zdGF0dXNiYXIuTm90aWZpY2F0aW9uTWVudVJvd1BsdWdpbjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuUmVtb3RlSW5wdXRDb250cm9sbGVyOwpAQCAtMTI5LDYgKzEzMyw3IEBACiAgICAgcHJpdmF0ZSBSdW5uYWJsZSBtRXhwYW5kZWRWaXNpYmxlTGlzdGVuZXI7CiAgICAgcHJpdmF0ZSBQZW9wbGVOb3RpZmljYXRpb25JZGVudGlmaWVyIG1QZW9wbGVJZGVudGlmaWVyOwogICAgIHByaXZhdGUgUmVtb3RlSW5wdXRWaWV3U3ViY29tcG9uZW50LkZhY3RvcnkgbVJlbW90ZUlucHV0U3ViY29tcG9uZW50RmFjdG9yeTsKKyAgICBwcml2YXRlIElTdGF0dXNCYXJTZXJ2aWNlIG1TdGF0dXNCYXJTZXJ2aWNlOwogCiAgICAgLyoqCiAgICAgICogTGlzdCBvZiBsaXN0ZW5lcnMgZm9yIHdoZW4gY29udGVudCB2aWV3cyBiZWNvbWUgaW5hY3RpdmUgKGkuZS4gbm90IHRoZSBzaG93aW5nIHZpZXcpLgpAQCAtMTk2LDExICsyMDEsMTMgQEAKICAgICAgICAgICAgIFBlb3BsZU5vdGlmaWNhdGlvbklkZW50aWZpZXIgcGVvcGxlTm90aWZpY2F0aW9uSWRlbnRpZmllciwKICAgICAgICAgICAgIFJlbW90ZUlucHV0Vmlld1N1YmNvbXBvbmVudC5GYWN0b3J5IHJpdlN1YmNvbXBvbmVudEZhY3RvcnksCiAgICAgICAgICAgICBTbWFydFJlcGx5Q29uc3RhbnRzIHNtYXJ0UmVwbHlDb25zdGFudHMsCi0gICAgICAgICAgICBTbWFydFJlcGx5Q29udHJvbGxlciBzbWFydFJlcGx5Q29udHJvbGxlcikgeworICAgICAgICAgICAgU21hcnRSZXBseUNvbnRyb2xsZXIgc21hcnRSZXBseUNvbnRyb2xsZXIsCisgICAgICAgICAgICBJU3RhdHVzQmFyU2VydmljZSBzdGF0dXNCYXJTZXJ2aWNlKSB7CiAgICAgICAgIG1QZW9wbGVJZGVudGlmaWVyID0gcGVvcGxlTm90aWZpY2F0aW9uSWRlbnRpZmllcjsKICAgICAgICAgbVJlbW90ZUlucHV0U3ViY29tcG9uZW50RmFjdG9yeSA9IHJpdlN1YmNvbXBvbmVudEZhY3Rvcnk7CiAgICAgICAgIG1TbWFydFJlcGx5Q29uc3RhbnRzID0gc21hcnRSZXBseUNvbnN0YW50czsKICAgICAgICAgbVNtYXJ0UmVwbHlDb250cm9sbGVyID0gc21hcnRSZXBseUNvbnRyb2xsZXI7CisgICAgICAgIG1TdGF0dXNCYXJTZXJ2aWNlID0gc3RhdHVzQmFyU2VydmljZTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWluZmxhdGUoKSB7CkBAIC0yMDU1LDYgKzIwNjIsMjMgQEAKICAgICAgICAgICAgIHB3LnByaW50KCJudWxsIik7CiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOworCisgICAgICAgIHB3LnByaW50KCJSZW1vdGVJbnB1dFZpZXdzIHsgIik7CisgICAgICAgIHB3LnByaW50KCIgdmlzaWJsZVR5cGU6ICIgKyBtVmlzaWJsZVR5cGUpOworICAgICAgICBpZiAobUhlYWRzVXBSZW1vdGVJbnB1dENvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcHcucHJpbnQoIiwgaGVhZHNVcFJlbW90ZUlucHV0Q29udHJvbGxlci5pc0FjdGl2ZTogIgorICAgICAgICAgICAgICAgICAgICArIG1IZWFkc1VwUmVtb3RlSW5wdXRDb250cm9sbGVyLmlzQWN0aXZlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHcucHJpbnQoIiwgaGVhZHNVcFJlbW90ZUlucHV0Q29udHJvbGxlcjogbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FeHBhbmRlZFJlbW90ZUlucHV0Q29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBwdy5wcmludCgiLCBleHBhbmRlZFJlbW90ZUlucHV0Q29udHJvbGxlci5pc0FjdGl2ZTogIgorICAgICAgICAgICAgICAgICAgICArIG1FeHBhbmRlZFJlbW90ZUlucHV0Q29udHJvbGxlci5pc0FjdGl2ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB3LnByaW50KCIsIGV4cGFuZGVkUmVtb3RlSW5wdXRDb250cm9sbGVyOiBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcHcucHJpbnRsbigiIH0iKTsKICAgICB9CiAKICAgICAvKiogQWRkIGFueSBleGlzdGluZyBTbWFydFJlcGx5VmlldyB0byB0aGUgZHVtcCAqLwpAQCAtMjE3Niw0ICsyMjAwLDM2IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0SGVhZHNVcFdyYXBwZXIoTm90aWZpY2F0aW9uVmlld1dyYXBwZXIgaGVhZHNVcFdyYXBwZXIpIHsKICAgICAgICAgbUhlYWRzVXBXcmFwcGVyID0gaGVhZHNVcFdyYXBwZXI7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hEcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmRpc3BhdGNoRHJhdyhjYW52YXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gQ2F0Y2ggZHJhdyBleGNlcHRpb25zIHRoYXQgbWF5IGJlIGNhdXNlZCBieSBSZW1vdGVWaWV3cworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRHJhd2luZyB2aWV3IGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgY2FuY2VsTm90aWZpY2F0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbE5vdGlmaWNhdGlvbihFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXRWaXNpYmlsaXR5KEdPTkUpOworICAgICAgICAgICAgZmluYWwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHNibiA9IG1Ob3RpZmljYXRpb25FbnRyeS5nZXRTYm4oKTsKKyAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gcmVwb3J0IG5vdGlmaWNhdGlvbiBpbmZsYXRpb24gZXJyb3JzIGJhY2sgdXAKKyAgICAgICAgICAgICAgICAvLyB0byBub3RpZmljYXRpb24gZGVsZWdhdGVzCisgICAgICAgICAgICAgICAgbVN0YXR1c0JhclNlcnZpY2Uub25Ob3RpZmljYXRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNibi5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2JuLmdldFRhZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2JuLmdldElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzYm4uZ2V0VWlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzYm4uZ2V0SW5pdGlhbFBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNibi5nZXRVc2VyKCkuZ2V0SWRlbnRpZmllcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5jZWxOb3RpZmljYXRpb24gZmFpbGVkOiAiICsgZXgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vc3RhY2svTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXQuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3N0YWNrL05vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0LmphdmEKaW5kZXggZTJlMmEyMy4uYzBhZWQ3YSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vc3RhY2svTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXQuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9zdGFjay9Ob3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dC5qYXZhCkBAIC03MzIsMTkgKzczMiwyOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIC8vIFRPRE86IG1vdmUgdGhpcyBsb2dpYyB0byBjb250cm9sbGVyLCB3aGljaCB3aWxsIGludm9rZSB1cGRhdGVGb290ZXJWaWV3IGRpcmVjdGx5Ci0gICAgICAgIGJvb2xlYW4gc2hvd0Rpc21pc3NWaWV3ID0gbUNsZWFyQWxsRW5hYmxlZCAmJgotICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLmhhc0FjdGl2ZUNsZWFyYWJsZU5vdGlmaWNhdGlvbnMoUk9XU19BTEwpOwotICAgICAgICBib29sZWFuIHNob3dGb290ZXJWaWV3ID0gKHNob3dEaXNtaXNzVmlldyB8fCBtQ29udHJvbGxlci5nZXRWaXNpYmxlTm90aWZpY2F0aW9uQ291bnQoKSA+IDApCi0gICAgICAgICAgICAgICAgJiYgbUlzQ3VycmVudFVzZXJTZXR1cCAgLy8gc2VlOiBiLzE5MzE0OTU1MAorICAgICAgICBmaW5hbCBib29sZWFuIHNob3dIaXN0b3J5ID0gbUNvbnRyb2xsZXIuaXNIaXN0b3J5RW5hYmxlZCgpOworICAgICAgICBmaW5hbCBib29sZWFuIHNob3dEaXNtaXNzVmlldyA9IHNob3VsZFNob3dEaXNtaXNzVmlldygpOworCisgICAgICAgIHVwZGF0ZUZvb3RlclZpZXcoc2hvdWxkU2hvd0Zvb3RlclZpZXcoc2hvd0Rpc21pc3NWaWV3KS8qIHZpc2libGUgKi8sCisgICAgICAgICAgICAgICAgc2hvd0Rpc21pc3NWaWV3IC8qIHNob3dEaXNtaXNzVmlldyAqLywKKyAgICAgICAgICAgICAgICBzaG93SGlzdG9yeS8qIHNob3dIaXN0b3J5ICovKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkU2hvd0Rpc21pc3NWaWV3KCkgeworICAgICAgICByZXR1cm4gbUNsZWFyQWxsRW5hYmxlZAorICAgICAgICAgICAgICAgICYmIG1Db250cm9sbGVyLmhhc0FjdGl2ZUNsZWFyYWJsZU5vdGlmaWNhdGlvbnMoUk9XU19BTEwpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRTaG93Rm9vdGVyVmlldyhib29sZWFuIHNob3dEaXNtaXNzVmlldykgeworICAgICAgICByZXR1cm4gKHNob3dEaXNtaXNzVmlldyB8fCBtQ29udHJvbGxlci5nZXRWaXNpYmxlTm90aWZpY2F0aW9uQ291bnQoKSA+IDApCisgICAgICAgICAgICAgICAgJiYgbUlzQ3VycmVudFVzZXJTZXR1cCAvLyBzZWU6IGIvMTkzMTQ5NTUwCiAgICAgICAgICAgICAgICAgJiYgIW9uS2V5Z3VhcmQoKQogICAgICAgICAgICAgICAgICYmIG1VcGNvbWluZ1N0YXR1c0JhclN0YXRlICE9IFN0YXR1c0JhclN0YXRlLktFWUdVQVJECiAgICAgICAgICAgICAgICAgLy8gcXVpY2sgc2V0dGluZ3MgZG9uJ3QgYWZmZWN0IG5vdGlmaWNhdGlvbnMgd2hlbiBub3QgaW4gZnVsbCBzY3JlZW4KICAgICAgICAgICAgICAgICAmJiAobVFzRXhwYW5zaW9uRnJhY3Rpb24gIT0gMSB8fCAhbVFzRnVsbFNjcmVlbikKICAgICAgICAgICAgICAgICAmJiAhbVNjcmVlbk9mZkFuaW1hdGlvbkNvbnRyb2xsZXIuc2hvdWxkSGlkZU5vdGlmaWNhdGlvbnNGb290ZXIoKQogICAgICAgICAgICAgICAgICYmICFtSXNSZW1vdGVJbnB1dEFjdGl2ZTsKLSAgICAgICAgYm9vbGVhbiBzaG93SGlzdG9yeSA9IG1Db250cm9sbGVyLmlzSGlzdG9yeUVuYWJsZWQoKTsKLQotICAgICAgICB1cGRhdGVGb290ZXJWaWV3KHNob3dGb290ZXJWaWV3LCBzaG93RGlzbWlzc1ZpZXcsIHNob3dIaXN0b3J5KTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ0OTksNyArNDUwOCw3IEBACiAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVZpZXcuc2V0RmFrZVNoYWRvd0ludGVuc2l0eSgwLjBmLCAwLjBmLCAwLCAwKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZmxvYXQgeUxvY2F0aW9uID0gcHJldmlvdXMuZ2V0VHJhbnNsYXRpb25ZKCkgKyBwcmV2aW91cy5nZXRBY3R1YWxIZWlnaHQoKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlVmlldy5nZXRUcmFuc2xhdGlvblkoKSAtIHByZXZpb3VzLmdldEV4dHJhQm90dG9tUGFkZGluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVZpZXcuZ2V0VHJhbnNsYXRpb25ZKCk7CiAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVZpZXcuc2V0RmFrZVNoYWRvd0ludGVuc2l0eSgKICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgLyBGYWtlU2hhZG93Vmlldy5TSEFET1dfU0lCTElOR19UUkVTSE9MRCwKICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLmdldE91dGxpbmVBbHBoYSgpLCAoaW50KSB5TG9jYXRpb24sCkBAIC01Mjc4LDI5ICs1Mjg3LDcxIEBACiAgICAgICAgIH0pOwogICAgICAgICBwdy5wcmludGxuKCk7CiAgICAgICAgIHB3LnByaW50bG4oIkNvbnRlbnRzOiIpOwotICAgICAgICBEdW1wVXRpbHNLdC53aXRoSW5jcmVhc2VkSW5kZW50KHB3LCAoKSAtPiB7Ci0gICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIk51bWJlciBvZiBjaGlsZHJlbjogIiArIGNoaWxkQ291bnQpOwotICAgICAgICAgICAgcHcucHJpbnRsbigpOworICAgICAgICBEdW1wVXRpbHNLdC53aXRoSW5jcmVhc2VkSW5kZW50KAorICAgICAgICAgICAgICAgIHB3LAorICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIk51bWJlciBvZiBjaGlsZHJlbjogIiArIGNoaWxkQ291bnQpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCk7CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRXhwYW5kYWJsZVZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0SW5kZXgoaSk7Ci0gICAgICAgICAgICAgICAgY2hpbGQuZHVtcChwdywgYXJncyk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHRyYW5zaWVudFZpZXdDb3VudCA9IGdldFRyYW5zaWVudFZpZXdDb3VudCgpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiVHJhbnNpZW50IFZpZXdzOiAiICsgdHJhbnNpZW50Vmlld0NvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNpZW50Vmlld0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBFeHBhbmRhYmxlVmlldyBjaGlsZCA9IChFeHBhbmRhYmxlVmlldykgZ2V0VHJhbnNpZW50VmlldyhpKTsKLSAgICAgICAgICAgICAgICBjaGlsZC5kdW1wKHB3LCBhcmdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFZpZXcgc3dpcGVkVmlldyA9IG1Td2lwZUhlbHBlci5nZXRTd2lwZWRWaWV3KCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJTd2lwZWQgdmlldzogIiArIHN3aXBlZFZpZXcpOwotICAgICAgICAgICAgaWYgKHN3aXBlZFZpZXcgaW5zdGFuY2VvZiBFeHBhbmRhYmxlVmlldykgewotICAgICAgICAgICAgICAgIEV4cGFuZGFibGVWaWV3IGV4cGFuZGFibGVWaWV3ID0gKEV4cGFuZGFibGVWaWV3KSBzd2lwZWRWaWV3OwotICAgICAgICAgICAgICAgIGV4cGFuZGFibGVWaWV3LmR1bXAocHcsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuZGFibGVWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdEluZGV4KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZHVtcChwdywgYXJncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBGb290ZXJWaWV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtcFV0aWxzS3Qud2l0aEluY3JlYXNlZEluZGVudChwdywgKCkgLT4gZHVtcEZvb3RlclZpZXdWaXNpYmlsaXR5KHB3KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zaWVudFZpZXdDb3VudCA9IGdldFRyYW5zaWVudFZpZXdDb3VudCgpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJUcmFuc2llbnQgVmlld3M6ICIgKyB0cmFuc2llbnRWaWV3Q291bnQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zaWVudFZpZXdDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlVmlldyBjaGlsZCA9IChFeHBhbmRhYmxlVmlldykgZ2V0VHJhbnNpZW50VmlldyhpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmR1bXAocHcsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFZpZXcgc3dpcGVkVmlldyA9IG1Td2lwZUhlbHBlci5nZXRTd2lwZWRWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIlN3aXBlZCB2aWV3OiAiICsgc3dpcGVkVmlldyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzd2lwZWRWaWV3IGluc3RhbmNlb2YgRXhwYW5kYWJsZVZpZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuZGFibGVWaWV3IGV4cGFuZGFibGVWaWV3ID0gKEV4cGFuZGFibGVWaWV3KSBzd2lwZWRWaWV3OworICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVZpZXcuZHVtcChwdywgYXJncyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcEZvb3RlclZpZXdWaXNpYmlsaXR5KEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvd0Rpc21pc3NWaWV3ID0gc2hvdWxkU2hvd0Rpc21pc3NWaWV3KCk7CisKKyAgICAgICAgcHcucHJpbnRsbigic2hvd0Zvb3RlclZpZXc6ICIgKyBzaG91bGRTaG93Rm9vdGVyVmlldyhzaG93RGlzbWlzc1ZpZXcpKTsKKyAgICAgICAgRHVtcFV0aWxzS3Qud2l0aEluY3JlYXNlZEluZGVudCgKKyAgICAgICAgICAgICAgICBwdywKKyAgICAgICAgICAgICAgICAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oInNob3dEaXNtaXNzVmlldzogIiArIHNob3dEaXNtaXNzVmlldyk7CisgICAgICAgICAgICAgICAgICAgIER1bXBVdGlsc0t0LndpdGhJbmNyZWFzZWRJbmRlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJtQ2xlYXJBbGxFbmFibGVkOiAiICsgbUNsZWFyQWxsRW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhc0FjdGl2ZUNsZWFyYWJsZU5vdGlmaWNhdGlvbnM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnRyb2xsZXIuaGFzQWN0aXZlQ2xlYXJhYmxlTm90aWZpY2F0aW9ucygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9XU19BTEwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJzaG93SGlzdG9yeTogIiArIG1Db250cm9sbGVyLmlzSGlzdG9yeUVuYWJsZWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlzaWJsZU5vdGlmaWNhdGlvbkNvdW50OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1Db250cm9sbGVyLmdldFZpc2libGVOb3RpZmljYXRpb25Db3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigibUlzQ3VycmVudFVzZXJTZXR1cDogIiArIG1Jc0N1cnJlbnRVc2VyU2V0dXApOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJvbktleWd1YXJkOiAiICsgb25LZXlndWFyZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigibVVwY29taW5nU3RhdHVzQmFyU3RhdGU6ICIgKyBtVXBjb21pbmdTdGF0dXNCYXJTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIm1Rc0V4cGFuc2lvbkZyYWN0aW9uOiAiICsgbVFzRXhwYW5zaW9uRnJhY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJtUXNGdWxsU2NyZWVuOiAiICsgbVFzRnVsbFNjcmVlbik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1TY3JlZW5PZmZBbmltYXRpb25Db250cm9sbGVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLnNob3VsZEhpZGVOb3RpZmljYXRpb25zRm9vdGVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TY3JlZW5PZmZBbmltYXRpb25Db250cm9sbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaG91bGRIaWRlTm90aWZpY2F0aW9uc0Zvb3RlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigibUlzUmVtb3RlSW5wdXRBY3RpdmU6ICIgKyBtSXNSZW1vdGVJbnB1dEFjdGl2ZSk7CisgICAgICAgICAgICAgICAgfSk7CiAgICAgfQogCiAgICAgQFNoYWRlVmlld1JlZmFjdG9yKFJlZmFjdG9yQ29tcG9uZW50LlNIQURFX1ZJRVcpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL0NlbnRyYWxTdXJmYWNlc0ltcGwuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvQ2VudHJhbFN1cmZhY2VzSW1wbC5qYXZhCmluZGV4IDAwNTE5YjkuLjU0MzhhNTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvQ2VudHJhbFN1cmZhY2VzSW1wbC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvQ2VudHJhbFN1cmZhY2VzSW1wbC5qYXZhCkBAIC02MTMsNyArNjEzLDYgQEAKIAogICAgIHByaXZhdGUgUnVubmFibGUgbUxhdW5jaFRyYW5zaXRpb25FbmRSdW5uYWJsZTsKICAgICBwcml2YXRlIFJ1bm5hYmxlIG1MYXVuY2hUcmFuc2l0aW9uQ2FuY2VsUnVubmFibGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1MYXVuY2hpbmdBZmZvcmRhbmNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtTGF1bmNoQ2FtZXJhV2hlbkZpbmlzaGVkV2FraW5nOwogICAgIHByaXZhdGUgYm9vbGVhbiBtTGF1bmNoQ2FtZXJhT25GaW5pc2hlZEdvaW5nVG9TbGVlcDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUxhdW5jaEVtZXJnZW5jeUFjdGlvbldoZW5GaW5pc2hlZFdha2luZzsKQEAgLTM3OTYsOCArMzc5NSw2IEBACiAKICAgICAgICAgbVNjcmltQ29udHJvbGxlci5zZXRFeHBhbnNpb25BZmZlY3RzQWxwaGEoIXVubG9ja2luZyk7CiAKLSAgICAgICAgYm9vbGVhbiBsYXVuY2hpbmdBZmZvcmRhbmNlV2l0aFByZXZpZXcgPSBtTGF1bmNoaW5nQWZmb3JkYW5jZTsKLSAgICAgICAgbVNjcmltQ29udHJvbGxlci5zZXRMYXVuY2hpbmdBZmZvcmRhbmNlV2l0aFByZXZpZXcobGF1bmNoaW5nQWZmb3JkYW5jZVdpdGhQcmV2aWV3KTsKICAgICAgICAgaWYgKG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5pc1Zpc2libGVTdGF0ZSgpKSB7CiAgICAgICAgICAgICBpZiAoKCFpc09jY2x1ZGVkKCkgfHwgaXNQYW5lbEV4cGFuZGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICYmIChtU3RhdGUgPT0gU3RhdHVzQmFyU3RhdGUuU0hBREUgfHwgbVN0YXRlID09IFN0YXR1c0JhclN0YXRlLlNIQURFX0xPQ0tFRApAQCAtMzgxNiw5ICszODEzLDYgQEAKICAgICAgICAgICAgIFNjcmltU3RhdGUgc3RhdGUgPSBtU3RhdHVzQmFyS2V5Z3VhcmRWaWV3TWFuYWdlci5wcmltYXJ5Qm91bmNlck5lZWRzU2NyaW1taW5nKCkKICAgICAgICAgICAgICAgICAgICAgPyBTY3JpbVN0YXRlLkJPVU5DRVJfU0NSSU1NRUQgOiBTY3JpbVN0YXRlLkJPVU5DRVI7CiAgICAgICAgICAgICBtU2NyaW1Db250cm9sbGVyLnRyYW5zaXRpb25UbyhzdGF0ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobGF1bmNoaW5nQWZmb3JkYW5jZVdpdGhQcmV2aWV3KSB7Ci0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGF2b2lkIGFuaW1hdGluZyB3aGVuIGxhdW5jaGluZyB3aXRoIGEgcHJldmlldy4KLSAgICAgICAgICAgIG1TY3JpbUNvbnRyb2xsZXIudHJhbnNpdGlvblRvKFNjcmltU3RhdGUuVU5MT0NLRUQsIG1VbmxvY2tTY3JpbUNhbGxiYWNrKTsKICAgICAgICAgfSBlbHNlIGlmIChtQnJpZ2h0bmVzc01pcnJvclZpc2libGUpIHsKICAgICAgICAgICAgIG1TY3JpbUNvbnRyb2xsZXIudHJhbnNpdGlvblRvKFNjcmltU3RhdGUuQlJJR0hUTkVTU19NSVJST1IpOwogICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTdGF0dXNCYXJTdGF0ZS5TSEFERV9MT0NLRUQpIHsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvU2NyaW1Db250cm9sbGVyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL1NjcmltQ29udHJvbGxlci5qYXZhCmluZGV4IDBiZGVkNzMuLjQ2NjAzZGYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvU2NyaW1Db250cm9sbGVyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9TY3JpbUNvbnRyb2xsZXIuamF2YQpAQCAtODA5LDYgKzgwOSwxMSBAQAogCiAgICAgcHVibGljIHZvaWQgc2V0T2NjbHVkZUFuaW1hdGlvblBsYXlpbmcoYm9vbGVhbiBvY2NsdWRlQW5pbWF0aW9uUGxheWluZykgewogICAgICAgICBtT2NjbHVkZUFuaW1hdGlvblBsYXlpbmcgPSBvY2NsdWRlQW5pbWF0aW9uUGxheWluZzsKKworICAgICAgICBmb3IgKFNjcmltU3RhdGUgc3RhdGUgOiBTY3JpbVN0YXRlLnZhbHVlcygpKSB7CisgICAgICAgICAgICBzdGF0ZS5zZXRPY2NsdWRlQW5pbWF0aW9uUGxheWluZyhvY2NsdWRlQW5pbWF0aW9uUGxheWluZyk7CisgICAgICAgIH0KKwogICAgICAgICBhcHBseUFuZERpc3BhdGNoU3RhdGUoKTsKICAgICB9CiAKQEAgLTg1Myw3ICs4NTgsNiBAQAogICAgICAgICBpZiAobVN0YXRlID09IFNjcmltU3RhdGUuVU5MT0NLRUQgfHwgbVN0YXRlID09IFNjcmltU3RhdGUuRFJFQU1JTkcpIHsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gb2NjbHVkaW5nID0KICAgICAgICAgICAgICAgICAgICAgbU9jY2x1ZGVBbmltYXRpb25QbGF5aW5nIHx8IG1TdGF0ZS5tTGF1bmNoaW5nQWZmb3JkYW5jZVdpdGhQcmV2aWV3OwotCiAgICAgICAgICAgICAvLyBEYXJrZW4gc2NyaW0gYXMgaXQncyBwdWxsZWQgZG93biB3aGlsZSB1bmxvY2tlZC4gSWYgd2UncmUgdW5sb2NrZWQgYnV0IHBsYXlpbmcgdGhlCiAgICAgICAgICAgICAvLyBzY3JlZW4gb2ZmL29jY2x1c2lvbiBhbmltYXRpb25zLCBpZ25vcmUgZXhwYW5zaW9uIGNoYW5nZXMgd2hpbGUgdGhvc2UgYW5pbWF0aW9ucwogICAgICAgICAgICAgLy8gcGxheS4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvU2NyaW1TdGF0ZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9TY3JpbVN0YXRlLmphdmEKaW5kZXggMGU5ZDNjZS4uN2IyMDI4MyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9TY3JpbVN0YXRlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9TY3JpbVN0YXRlLmphdmEKQEAgLTI0Myw3ICsyNDMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgOiBDZW50cmFsU3VyZmFjZXMuRkFERV9LRVlHVUFSRF9EVVJBVElPTjsKIAogICAgICAgICAgICAgYm9vbGVhbiBmcm9tQW9kID0gcHJldmlvdXNTdGF0ZSA9PSBBT0QgfHwgcHJldmlvdXNTdGF0ZSA9PSBQVUxTSU5HOwotICAgICAgICAgICAgbUFuaW1hdGVDaGFuZ2UgPSAhbUxhdW5jaGluZ0FmZm9yZGFuY2VXaXRoUHJldmlldyAmJiAhZnJvbUFvZDsKKyAgICAgICAgICAgIC8vIElmIGxhdW5jaC9vY2NsdWRlIGFuaW1hdGlvbnMgd2VyZSBwbGF5aW5nLCB0aGV5IGFscmVhZHkgYW5pbWF0ZWQgdGhlIHNjcmltCisgICAgICAgICAgICAvLyBhbHBoYSB0byAwZiBhcyBwYXJ0IG9mIHRoZSBhbmltYXRpb24uIElmIHdlIGFuaW1hdGUgaXQgbm93LCB3ZSdsbCBzZXQgaXQgYmFjaworICAgICAgICAgICAgLy8gdG8gMWYgYW5kIGFuaW1hdGUgaXQgYmFjayB0byAwZiwgY2F1c2luZyBhbiB1bndhbnRlZCBzY3JpbSBmbGFzaC4KKyAgICAgICAgICAgIG1BbmltYXRlQ2hhbmdlID0gIW1MYXVuY2hpbmdBZmZvcmRhbmNlV2l0aFByZXZpZXcKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1PY2NsdWRlQW5pbWF0aW9uUGxheWluZworICAgICAgICAgICAgICAgICAgICAmJiAhZnJvbUFvZDsKIAogICAgICAgICAgICAgbUZyb250VGludCA9IENvbG9yLlRSQU5TUEFSRU5UOwogICAgICAgICAgICAgbUJlaGluZFRpbnQgPSBDb2xvci5CTEFDSzsKQEAgLTMwOCw2ICszMTMsNyBAQAogICAgIGJvb2xlYW4gbVdhbGxwYXBlclN1cHBvcnRzQW1iaWVudE1vZGU7CiAgICAgYm9vbGVhbiBtSGFzQmFja2Ryb3A7CiAgICAgYm9vbGVhbiBtTGF1bmNoaW5nQWZmb3JkYW5jZVdpdGhQcmV2aWV3OworICAgIGJvb2xlYW4gbU9jY2x1ZGVBbmltYXRpb25QbGF5aW5nOwogICAgIGJvb2xlYW4gbVdha2VMb2NrU2NyZWVuU2Vuc29yQWN0aXZlOwogICAgIGJvb2xlYW4gbUtleWd1YXJkRmFkaW5nQXdheTsKICAgICBsb25nIG1LZXlndWFyZEZhZGluZ0F3YXlEdXJhdGlvbjsKQEAgLTQxMSw2ICs0MTcsMTAgQEAKICAgICAgICAgbUxhdW5jaGluZ0FmZm9yZGFuY2VXaXRoUHJldmlldyA9IGxhdW5jaGluZ0FmZm9yZGFuY2VXaXRoUHJldmlldzsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRPY2NsdWRlQW5pbWF0aW9uUGxheWluZyhib29sZWFuIG9jY2x1ZGVBbmltYXRpb25QbGF5aW5nKSB7CisgICAgICAgIG1PY2NsdWRlQW5pbWF0aW9uUGxheWluZyA9IG9jY2x1ZGVBbmltYXRpb25QbGF5aW5nOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzTG93UG93ZXJTdGF0ZSgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvU3RhdHVzQmFyS2V5Z3VhcmRWaWV3TWFuYWdlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9TdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKaW5kZXggYWE3MWI1MS4uNjliNjgzYiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9TdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9TdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKQEAgLTg1LDYgKzg1LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51bmZvbGQuRm9sZEFvZEFuaW1hdGlvbkNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudW5mb2xkLlN5c1VJVW5mb2xkQ29tcG9uZW50OwogCitpbXBvcnQgZGFnZ2VyLkxhenk7CisKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC05NCw4ICs5Niw2IEBACiAKIGltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OwogCi1pbXBvcnQgZGFnZ2VyLkxhenk7Ci0KIC8qKgogICogTWFuYWdlcyBjcmVhdGluZywgc2hvd2luZywgaGlkaW5nIGFuZCByZXNldHRpbmcgdGhlIGtleWd1YXJkIHdpdGhpbiB0aGUgc3RhdHVzIGJhci4gQ2FsbHMgYmFjawogICogdmlhIHtAbGluayBWaWV3TWVkaWF0b3JDYWxsYmFja30gdG8gcG9rZSB0aGUgd2FrZSBsb2NrIGFuZCByZXBvcnQgdGhhdCB0aGUga2V5Z3VhcmQgaXMgZG9uZSwKQEAgLTQwNSwxNCArNDA1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIG5ldyBsZWdhY3kgYWx0ZXJuYXRlIGJvdW5jZXIuIE9ubHkgdXNlZCBpZiBtZG9lcm4gYWx0ZXJuYXRlIGJvdW5jZXIgaXMgTk9UIGVuYWJsZS4KKyAgICAgKiBTZXRzIGEgbmV3IGxlZ2FjeSBhbHRlcm5hdGUgYm91bmNlci4gT25seSB1c2VkIGlmIG1vZGVybiBhbHRlcm5hdGUgYm91bmNlciBpcyBOT1QgZW5hYmxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMZWdhY3lBbHRlcm5hdGVCb3VuY2VyKEBOb25OdWxsIExlZ2FjeUFsdGVybmF0ZUJvdW5jZXIgYWx0ZXJuYXRlQm91bmNlckxlZ2FjeSkgewogICAgICAgICBpZiAoIW1Jc01vZGVybkFsdGVybmF0ZUJvdW5jZXJFbmFibGVkKSB7CiAgICAgICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5nZXRMZWdhY3lBbHRlcm5hdGVCb3VuY2VyKCksCiAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZUJvdW5jZXJMZWdhY3kpKSB7CiAgICAgICAgICAgICAgICAgbUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLnNldExlZ2FjeUFsdGVybmF0ZUJvdW5jZXIoYWx0ZXJuYXRlQm91bmNlckxlZ2FjeSk7Ci0gICAgICAgICAgICAgICAgaGlkZUFsdGVybmF0ZUJvdW5jZXIoZmFsc2UpOworICAgICAgICAgICAgICAgIGhpZGVBbHRlcm5hdGVCb3VuY2VyKHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTY0MCw4ICs2NDAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNob3dQcmltYXJ5Qm91bmNlcihib29sZWFuIHNjcmltbWVkKSB7CiAgICAgICAgIGhpZGVBbHRlcm5hdGVCb3VuY2VyKGZhbHNlKTsKLQotICAgICAgICBpZiAobUtleWd1YXJkU3RhdGVDb250cm9sbGVyLmlzU2hvd2luZygpICAmJiAhaXNCb3VuY2VyU2hvd2luZygpKSB7CisgICAgICAgIGlmIChtS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIuaXNTaG93aW5nKCkgJiYgIWlzQm91bmNlclNob3dpbmcoKSkgewogICAgICAgICAgICAgbVByaW1hcnlCb3VuY2VySW50ZXJhY3Rvci5zaG93KHNjcmltbWVkKTsKICAgICAgICAgfQogICAgICAgICB1cGRhdGVTdGF0ZXMoKTsKQEAgLTczNCw3ICs3MzMsNyBAQAogICAgICAgICAgICAgICAgIHNob3dCb3VuY2VyT3JLZXlndWFyZChoaWRlQm91bmNlcldoZW5TaG93aW5nKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChoaWRlQm91bmNlcldoZW5TaG93aW5nKSB7Ci0gICAgICAgICAgICAgICAgaGlkZUFsdGVybmF0ZUJvdW5jZXIoZmFsc2UpOworICAgICAgICAgICAgICAgIGhpZGVBbHRlcm5hdGVCb3VuY2VyKHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUtleWd1YXJkVXBkYXRlTWFuYWdlci5zZW5kS2V5Z3VhcmRSZXNldCgpOwogICAgICAgICAgICAgdXBkYXRlU3RhdGVzKCk7CkBAIC03NDIsOCArNzQxLDggQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBoaWRlQWx0ZXJuYXRlQm91bmNlcihib29sZWFuIGZvcmNlVXBkYXRlU2NyaW0pIHsKLSAgICAgICAgdXBkYXRlQWx0ZXJuYXRlQm91bmNlclNob3dpbmcobUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLmhpZGUoKSB8fCBmb3JjZVVwZGF0ZVNjcmltKTsKKyAgICBwdWJsaWMgdm9pZCBoaWRlQWx0ZXJuYXRlQm91bmNlcihib29sZWFuIHVwZGF0ZVNjcmltKSB7CisgICAgICAgIHVwZGF0ZUFsdGVybmF0ZUJvdW5jZXJTaG93aW5nKG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5oaWRlKCkgJiYgdXBkYXRlU2NyaW0pOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBbHRlcm5hdGVCb3VuY2VyU2hvd2luZyhib29sZWFuIHVwZGF0ZVNjcmltKSB7CkBAIC0xNDQ3LDE2ICsxNDQ2LDIxIEBACiAgICAgICogRm9yIGFueSB0b3VjaGVzIG9uIHRoZSBOUFZDLCBzaG93IHRoZSBwcmltYXJ5IGJvdW5jZXIgaWYgdGhlIGFsdGVybmF0ZSBib3VuY2VyIGlzIGN1cnJlbnRseQogICAgICAqIHNob3dpbmcuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgb25Ub3VjaChNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBpZiAobUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLmlzVmlzaWJsZVN0YXRlKCkKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoKE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGJvb2xlYW4gaGFuZGxlZFRvdWNoID0gZmFsc2U7CisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAKKyAgICAgICAgICAgICAgICAmJiBtQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IuaXNWaXNpYmxlU3RhdGUoKQogICAgICAgICAgICAgICAgICYmIG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5oYXNBbHRlcm5hdGVCb3VuY2VyU2hvd25XaXRoTWluVGltZSgpKSB7CiAgICAgICAgICAgICBzaG93UHJpbWFyeUJvdW5jZXIodHJ1ZSk7CisgICAgICAgICAgICBoYW5kbGVkVG91Y2ggPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRm9yd2FyZCBOUFZDIHRvdWNoZXMgdG8gY2FsbGJhY2tzIGluIGNhc2UgdGhleSB3YW50IHRvIHJlc3BvbmQgdG8gdG91Y2hlcwogICAgICAgICBmb3IgKEtleWd1YXJkVmlld01hbmFnZXJDYWxsYmFjayBjYWxsYmFjazogbUNhbGxiYWNrcykgewogICAgICAgICAgICAgY2FsbGJhY2sub25Ub3VjaChldmVudCk7CiAgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFuZGxlZFRvdWNoOwogICAgIH0KIAogICAgIC8qKiBVcGRhdGUga2V5Z3VhcmQgcG9zaXRpb24gYmFzZWQgb24gYSB0YXBwZWQgWCBjb29yZGluYXRlLiAqLwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waXBlbGluZS9tb2JpbGUvZGF0YS9yZXBvc2l0b3J5L3Byb2QvTW9iaWxlQ29ubmVjdGlvblJlcG9zaXRvcnlJbXBsLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waXBlbGluZS9tb2JpbGUvZGF0YS9yZXBvc2l0b3J5L3Byb2QvTW9iaWxlQ29ubmVjdGlvblJlcG9zaXRvcnlJbXBsLmt0CmluZGV4IGYxZmMzODYuLmY4NjZkNjUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGlwZWxpbmUvbW9iaWxlL2RhdGEvcmVwb3NpdG9yeS9wcm9kL01vYmlsZUNvbm5lY3Rpb25SZXBvc2l0b3J5SW1wbC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BpcGVsaW5lL21vYmlsZS9kYXRhL3JlcG9zaXRvcnkvcHJvZC9Nb2JpbGVDb25uZWN0aW9uUmVwb3NpdG9yeUltcGwua3QKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcgotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxTaWduYWxTdHJlbmd0aAogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxTaWduYWxTdHJlbmd0aC5TSUdOQUxfU1RSRU5HVEhfTk9ORV9PUl9VTktOT1dOCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbFNpZ25hbFN0cmVuZ3RoQ2RtYQogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZQpAQCAtMjgsMTIgKzI3LDEyIEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255RGlzcGxheUluZm8KIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlEaXNwbGF5SW5mby5PVkVSUklERV9ORVRXT1JLX1RZUEVfTk9ORQogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXIKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyLkVSSV9PRkYKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyLkVSSV9GTEFTSAoraW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXIuRVJJX09OCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlci5FWFRSQV9TVUJTQ1JJUFRJT05fSUQKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOCiBpbXBvcnQgY29tLmFuZHJvaWQuc2V0dGluZ3NsaWIuVXRpbHMKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5icm9hZGNhc3QuQnJvYWRjYXN0RGlzcGF0Y2hlcgotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNvbW1vbi5jb3JvdXRpbmUuQ29uZmxhdGVkQ2FsbGJhY2tGbG93LmNvbmZsYXRlZENhbGxiYWNrRmxvdwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRhZ2dlci5xdWFsaWZpZXJzLkFwcGxpY2F0aW9uCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZGFnZ2VyLnF1YWxpZmllcnMuQmFja2dyb3VuZAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmxvZy50YWJsZS5UYWJsZUxvZ0J1ZmZlcgpAQCAtNTksMTYgKzU4LDE0IEBACiBpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmFzRXhlY3V0b3IKIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuY2hhbm5lbHMuYXdhaXRDbG9zZQogaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LkZsb3cKLWltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5NdXRhYmxlU2hhcmVkRmxvdwotaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LlNoYXJlZEZsb3cKIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5TaGFyaW5nU3RhcnRlZAogaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LlN0YXRlRmxvdworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmNhbGxiYWNrRmxvdwogaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmZpbHRlcgotaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmZpbHRlcklzSW5zdGFuY2UKIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5tYXAKIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5tYXBMYXRlc3QKIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5tYXBOb3ROdWxsCi1pbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuc2hhcmVJbgoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LnNjYW4KIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5zdGF0ZUluCiAKIC8qKgpAQCAtMTAwLDggKzk3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdmFsIHRlbGVwaG9ueUNhbGxiYWNrRXZlbnQgPSBNdXRhYmxlU2hhcmVkRmxvdzxVbml0PihleHRyYUJ1ZmZlckNhcGFjaXR5ID0gMSkKLQogICAgIC8qKgogICAgICAqIFRoaXMgZmxvdyBkZWZpbmVzIHRoZSBzaW5nbGUgc2hhcmVkIGNvbm5lY3Rpb24gdG8gc3lzdGVtX3NlcnZlciB2aWEgVGVsZXBob255Q2FsbGJhY2suIEFueQogICAgICAqIG5ldyBjYWxsYmFjayBzaG91bGQgYmUgYWRkZWQgdG8gdGhpcyBsaXN0ZW5lciBhbmQgZnVubmVsZWQgdGhyb3VnaCBjYWxsYmFja0V2ZW50cyB2aWEgYSBkYXRhCkBAIC0xMDksOSArMTA0LDE1IEBACiAgICAgICoKICAgICAgKiBUaGUgcmVhc29uIHdlIG5lZWQgdG8gZG8gdGhpcyBpcyBiZWNhdXNlIFRlbGVwaG9ueU1hbmFnZXIgbGltaXRzIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZAogICAgICAqIGxpc3RlbmVycyBwZXItcHJvY2Vzcywgc28gd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBuZXcgbGlzdGVuZXIgZm9yIGV2ZXJ5IGNhbGxiYWNrLgorICAgICAqCisgICAgICogQSBub3RlIG9uIHRoZSBkZXNpZ24gZm9yIGJhY2sgcHJlc3N1cmUgaGVyZTogV2UgdXNlIHRoZSBbY29hbGVzY2VdIG9wZXJhdG9yIGhlcmUgdG8gY2hhbmdlCisgICAgICogdGhlIGJhY2twcmVzc3VyZSBzdHJhdGVneSB0byBzdG9yZSBleGFjdGx5IHRoZSBsYXN0IGNhbGxiYWNrIGV2ZW50IG9mIF9lYWNoIHR5cGVfIGhlcmUsIGFzCisgICAgICogb3Bwb3NlZCB0byB0aGUgZGVmYXVsdCBzdHJhdGVneSB3aGljaCBpcyB0byBkcm9wIHRoZSBvbGRlc3QgZXZlbnQgKHJlZ2FyZGxlc3Mgb2YgdHlwZSkuIFRoaXMKKyAgICAgKiBtZWFucyB0aGF0IHdlIHNob3VsZCBuZXZlciBtaXNzIGFueSBzaW5nbGUgZXZlbnQgYXMgbG9uZyBhcyB0aGUgZmxvdyBoYXMgYmVlbiBzdGFydGVkLgogICAgICAqLwotICAgIHByaXZhdGUgdmFsIGNhbGxiYWNrRXZlbnRzOiBTaGFyZWRGbG93PENhbGxiYWNrRXZlbnQ+ID0KLSAgICAgICAgY29uZmxhdGVkQ2FsbGJhY2tGbG93IHsKKyAgICBwcml2YXRlIHZhbCBjYWxsYmFja0V2ZW50czogU3RhdGVGbG93PFRlbGVwaG9ueUNhbGxiYWNrU3RhdGU+ID0gcnVuIHsKKyAgICAgICAgdmFsIGluaXRpYWwgPSBUZWxlcGhvbnlDYWxsYmFja1N0YXRlKCkKKyAgICAgICAgY2FsbGJhY2tGbG93IHsKICAgICAgICAgICAgICAgICB2YWwgY2FsbGJhY2sgPQogICAgICAgICAgICAgICAgICAgICBvYmplY3QgOgogICAgICAgICAgICAgICAgICAgICAgICAgVGVsZXBob255Q2FsbGJhY2soKSwKQEAgLTE2NSw0OCArMTY2LDUwIEBACiAgICAgICAgICAgICAgICAgdGVsZXBob255TWFuYWdlci5yZWdpc3RlclRlbGVwaG9ueUNhbGxiYWNrKGJnRGlzcGF0Y2hlci5hc0V4ZWN1dG9yKCksIGNhbGxiYWNrKQogICAgICAgICAgICAgICAgIGF3YWl0Q2xvc2UgeyB0ZWxlcGhvbnlNYW5hZ2VyLnVucmVnaXN0ZXJUZWxlcGhvbnlDYWxsYmFjayhjYWxsYmFjaykgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLnNoYXJlSW4oc2NvcGUsIFNoYXJpbmdTdGFydGVkLldoaWxlU3Vic2NyaWJlZCgpKQorICAgICAgICAgICAgLnNjYW4oaW5pdGlhbCA9IGluaXRpYWwpIHsgc3RhdGUsIGV2ZW50IC0+IHN0YXRlLmFwcGx5RXZlbnQoZXZlbnQpIH0KKyAgICAgICAgICAgIC5zdGF0ZUluKHNjb3BlID0gc2NvcGUsIHN0YXJ0ZWQgPSBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwgaW5pdGlhbCkKKyAgICB9CiAKICAgICBvdmVycmlkZSB2YWwgaXNFbWVyZ2VuY3lPbmx5ID0KICAgICAgICAgY2FsbGJhY2tFdmVudHMKLSAgICAgICAgICAgIC5maWx0ZXJJc0luc3RhbmNlPENhbGxiYWNrRXZlbnQuT25TZXJ2aWNlU3RhdGVDaGFuZ2VkPigpCisgICAgICAgICAgICAubWFwTm90TnVsbCB7IGl0Lm9uU2VydmljZVN0YXRlQ2hhbmdlZCB9CiAgICAgICAgICAgICAubWFwIHsgaXQuc2VydmljZVN0YXRlLmlzRW1lcmdlbmN5T25seSB9CiAgICAgICAgICAgICAuc3RhdGVJbihzY29wZSwgU2hhcmluZ1N0YXJ0ZWQuV2hpbGVTdWJzY3JpYmVkKCksIGZhbHNlKQogCiAgICAgb3ZlcnJpZGUgdmFsIGlzUm9hbWluZyA9CiAgICAgICAgIGNhbGxiYWNrRXZlbnRzCi0gICAgICAgICAgICAuZmlsdGVySXNJbnN0YW5jZTxDYWxsYmFja0V2ZW50Lk9uU2VydmljZVN0YXRlQ2hhbmdlZD4oKQorICAgICAgICAgICAgLm1hcE5vdE51bGwgeyBpdC5vblNlcnZpY2VTdGF0ZUNoYW5nZWQgfQogICAgICAgICAgICAgLm1hcCB7IGl0LnNlcnZpY2VTdGF0ZS5yb2FtaW5nIH0KICAgICAgICAgICAgIC5zdGF0ZUluKHNjb3BlLCBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwgZmFsc2UpCiAKICAgICBvdmVycmlkZSB2YWwgb3BlcmF0b3JBbHBoYVNob3J0ID0KICAgICAgICAgY2FsbGJhY2tFdmVudHMKLSAgICAgICAgICAgIC5maWx0ZXJJc0luc3RhbmNlPENhbGxiYWNrRXZlbnQuT25TZXJ2aWNlU3RhdGVDaGFuZ2VkPigpCisgICAgICAgICAgICAubWFwTm90TnVsbCB7IGl0Lm9uU2VydmljZVN0YXRlQ2hhbmdlZCB9CiAgICAgICAgICAgICAubWFwIHsgaXQuc2VydmljZVN0YXRlLm9wZXJhdG9yQWxwaGFTaG9ydCB9CiAgICAgICAgICAgICAuc3RhdGVJbihzY29wZSwgU2hhcmluZ1N0YXJ0ZWQuV2hpbGVTdWJzY3JpYmVkKCksIG51bGwpCiAKICAgICBvdmVycmlkZSB2YWwgaXNJblNlcnZpY2UgPQogICAgICAgICBjYWxsYmFja0V2ZW50cwotICAgICAgICAgICAgLmZpbHRlcklzSW5zdGFuY2U8Q2FsbGJhY2tFdmVudC5PblNlcnZpY2VTdGF0ZUNoYW5nZWQ+KCkKKyAgICAgICAgICAgIC5tYXBOb3ROdWxsIHsgaXQub25TZXJ2aWNlU3RhdGVDaGFuZ2VkIH0KICAgICAgICAgICAgIC5tYXAgeyBVdGlscy5pc0luU2VydmljZShpdC5zZXJ2aWNlU3RhdGUpIH0KICAgICAgICAgICAgIC5zdGF0ZUluKHNjb3BlLCBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwgZmFsc2UpCiAKICAgICBvdmVycmlkZSB2YWwgaXNHc20gPQogICAgICAgICBjYWxsYmFja0V2ZW50cwotICAgICAgICAgICAgLmZpbHRlcklzSW5zdGFuY2U8Q2FsbGJhY2tFdmVudC5PblNpZ25hbFN0cmVuZ3RoQ2hhbmdlZD4oKQorICAgICAgICAgICAgLm1hcE5vdE51bGwgeyBpdC5vblNpZ25hbFN0cmVuZ3RoQ2hhbmdlZCB9CiAgICAgICAgICAgICAubWFwIHsgaXQuc2lnbmFsU3RyZW5ndGguaXNHc20gfQogICAgICAgICAgICAgLnN0YXRlSW4oc2NvcGUsIFNoYXJpbmdTdGFydGVkLldoaWxlU3Vic2NyaWJlZCgpLCBmYWxzZSkKIAogICAgIG92ZXJyaWRlIHZhbCBjZG1hTGV2ZWwgPQogICAgICAgICBjYWxsYmFja0V2ZW50cwotICAgICAgICAgICAgLmZpbHRlcklzSW5zdGFuY2U8Q2FsbGJhY2tFdmVudC5PblNpZ25hbFN0cmVuZ3RoQ2hhbmdlZD4oKQorICAgICAgICAgICAgLm1hcE5vdE51bGwgeyBpdC5vblNpZ25hbFN0cmVuZ3RoQ2hhbmdlZCB9CiAgICAgICAgICAgICAubWFwIHsKICAgICAgICAgICAgICAgICBpdC5zaWduYWxTdHJlbmd0aC5nZXRDZWxsU2lnbmFsU3RyZW5ndGhzKENlbGxTaWduYWxTdHJlbmd0aENkbWE6OmNsYXNzLmphdmEpLmxldCB7CiAgICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RocyAtPgogICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZW5ndGhzLmlzTm90RW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RyZW5ndGhzWzBdLmxldmVsCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDZWxsU2lnbmFsU3RyZW5ndGguU0lHTkFMX1NUUkVOR1RIX05PTkVfT1JfVU5LTk9XTgorICAgICAgICAgICAgICAgICAgICAgICAgU0lHTkFMX1NUUkVOR1RIX05PTkVfT1JfVU5LTk9XTgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjE0LDE5ICsyMTcsMTkgQEAKIAogICAgIG92ZXJyaWRlIHZhbCBwcmltYXJ5TGV2ZWwgPQogICAgICAgICBjYWxsYmFja0V2ZW50cwotICAgICAgICAgICAgLmZpbHRlcklzSW5zdGFuY2U8Q2FsbGJhY2tFdmVudC5PblNpZ25hbFN0cmVuZ3RoQ2hhbmdlZD4oKQorICAgICAgICAgICAgLm1hcE5vdE51bGwgeyBpdC5vblNpZ25hbFN0cmVuZ3RoQ2hhbmdlZCB9CiAgICAgICAgICAgICAubWFwIHsgaXQuc2lnbmFsU3RyZW5ndGgubGV2ZWwgfQogICAgICAgICAgICAgLnN0YXRlSW4oc2NvcGUsIFNoYXJpbmdTdGFydGVkLldoaWxlU3Vic2NyaWJlZCgpLCBTSUdOQUxfU1RSRU5HVEhfTk9ORV9PUl9VTktOT1dOKQogCiAgICAgb3ZlcnJpZGUgdmFsIGRhdGFDb25uZWN0aW9uU3RhdGUgPQogICAgICAgICBjYWxsYmFja0V2ZW50cwotICAgICAgICAgICAgLmZpbHRlcklzSW5zdGFuY2U8Q2FsbGJhY2tFdmVudC5PbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkPigpCisgICAgICAgICAgICAubWFwTm90TnVsbCB7IGl0Lm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgfQogICAgICAgICAgICAgLm1hcCB7IGl0LmRhdGFTdGF0ZS50b0RhdGFDb25uZWN0aW9uVHlwZSgpIH0KICAgICAgICAgICAgIC5zdGF0ZUluKHNjb3BlLCBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwgRGlzY29ubmVjdGVkKQogCiAgICAgb3ZlcnJpZGUgdmFsIGRhdGFBY3Rpdml0eURpcmVjdGlvbiA9CiAgICAgICAgIGNhbGxiYWNrRXZlbnRzCi0gICAgICAgICAgICAuZmlsdGVySXNJbnN0YW5jZTxDYWxsYmFja0V2ZW50Lk9uRGF0YUFjdGl2aXR5PigpCisgICAgICAgICAgICAubWFwTm90TnVsbCB7IGl0Lm9uRGF0YUFjdGl2aXR5IH0KICAgICAgICAgICAgIC5tYXAgeyBpdC5kaXJlY3Rpb24udG9Nb2JpbGVEYXRhQWN0aXZpdHlNb2RlbCgpIH0KICAgICAgICAgICAgIC5zdGF0ZUluKAogICAgICAgICAgICAgICAgIHNjb3BlLApAQCAtMjM2LDI4ICsyMzksMjYgQEAKIAogICAgIG92ZXJyaWRlIHZhbCBjYXJyaWVyTmV0d29ya0NoYW5nZUFjdGl2ZSA9CiAgICAgICAgIGNhbGxiYWNrRXZlbnRzCi0gICAgICAgICAgICAuZmlsdGVySXNJbnN0YW5jZTxDYWxsYmFja0V2ZW50Lk9uQ2Fycmllck5ldHdvcmtDaGFuZ2U+KCkKKyAgICAgICAgICAgIC5tYXBOb3ROdWxsIHsgaXQub25DYXJyaWVyTmV0d29ya0NoYW5nZSB9CiAgICAgICAgICAgICAubWFwIHsgaXQuYWN0aXZlIH0KICAgICAgICAgICAgIC5zdGF0ZUluKHNjb3BlLCBTaGFyaW5nU3RhcnRlZC5XaGlsZVN1YnNjcmliZWQoKSwgZmFsc2UpCiAKICAgICBvdmVycmlkZSB2YWwgcmVzb2x2ZWROZXR3b3JrVHlwZSA9CiAgICAgICAgIGNhbGxiYWNrRXZlbnRzCi0gICAgICAgICAgICAuZmlsdGVySXNJbnN0YW5jZTxDYWxsYmFja0V2ZW50Lk9uRGlzcGxheUluZm9DaGFuZ2VkPigpCisgICAgICAgICAgICAubWFwTm90TnVsbCB7IGl0Lm9uRGlzcGxheUluZm9DaGFuZ2VkIH0KICAgICAgICAgICAgIC5tYXAgewotICAgICAgICAgICAgICAgIGlmIChpdC50ZWxlcGhvbnlEaXNwbGF5SW5mby5uZXR3b3JrVHlwZSA9PSBORVRXT1JLX1RZUEVfVU5LTk9XTikgewotICAgICAgICAgICAgICAgICAgICBVbmtub3duTmV0d29ya1R5cGUKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKAotICAgICAgICAgICAgICAgICAgICBpdC50ZWxlcGhvbnlEaXNwbGF5SW5mby5vdmVycmlkZU5ldHdvcmtUeXBlID09IE9WRVJSSURFX05FVFdPUktfVFlQRV9OT05FCi0gICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgICAgIERlZmF1bHROZXR3b3JrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vYmlsZU1hcHBpbmdzUHJveHkudG9JY29uS2V5KGl0LnRlbGVwaG9ueURpc3BsYXlJbmZvLm5ldHdvcmtUeXBlKQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXQudGVsZXBob255RGlzcGxheUluZm8ub3ZlcnJpZGVOZXR3b3JrVHlwZSAhPSBPVkVSUklERV9ORVRXT1JLX1RZUEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICBPdmVycmlkZU5ldHdvcmtUeXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgbW9iaWxlTWFwcGluZ3NQcm94eS50b0ljb25LZXlPdmVycmlkZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC50ZWxlcGhvbnlEaXNwbGF5SW5mby5vdmVycmlkZU5ldHdvcmtUeXBlCiAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0LnRlbGVwaG9ueURpc3BsYXlJbmZvLm5ldHdvcmtUeXBlICE9IE5FVFdPUktfVFlQRV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgICAgIERlZmF1bHROZXR3b3JrVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vYmlsZU1hcHBpbmdzUHJveHkudG9JY29uS2V5KGl0LnRlbGVwaG9ueURpc3BsYXlJbmZvLm5ldHdvcmtUeXBlKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgVW5rbm93bk5ldHdvcmtUeXBlCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLnN0YXRlSW4oc2NvcGUsIFNoYXJpbmdTdGFydGVkLldoaWxlU3Vic2NyaWJlZCgpLCBVbmtub3duTmV0d29ya1R5cGUpCkBAIC0yODIsNyArMjgzLDEwIEBACiAKICAgICBvdmVycmlkZSB2YWwgY2RtYVJvYW1pbmc6IFN0YXRlRmxvdzxCb29sZWFuPiA9CiAgICAgICAgIHRlbGVwaG9ueVBvbGxpbmdFdmVudAotICAgICAgICAgICAgLm1hcExhdGVzdCB7IHRlbGVwaG9ueU1hbmFnZXIuY2RtYUVuaGFuY2VkUm9hbWluZ0luZGljYXRvckRpc3BsYXlOdW1iZXIgIT0gRVJJX09GRiB9CisgICAgICAgICAgICAubWFwTGF0ZXN0IHsKKyAgICAgICAgICAgICAgICB2YWwgY2RtYUVyaSA9IHRlbGVwaG9ueU1hbmFnZXIuY2RtYUVuaGFuY2VkUm9hbWluZ0luZGljYXRvckRpc3BsYXlOdW1iZXIKKyAgICAgICAgICAgICAgICBjZG1hRXJpID09IEVSSV9PTiB8fCBjZG1hRXJpID09IEVSSV9GTEFTSAorICAgICAgICAgICAgfQogICAgICAgICAgICAgLnN0YXRlSW4oc2NvcGUsIFNoYXJpbmdTdGFydGVkLldoaWxlU3Vic2NyaWJlZCgpLCBmYWxzZSkKIAogICAgIG92ZXJyaWRlIHZhbCBuZXR3b3JrTmFtZTogU3RhdGVGbG93PE5ldHdvcmtOYW1lTW9kZWw+ID0KQEAgLTMwMCw3ICszMDQsOCBAQAogICAgIG92ZXJyaWRlIHZhbCBkYXRhRW5hYmxlZCA9IHJ1biB7CiAgICAgICAgIHZhbCBpbml0aWFsID0gdGVsZXBob255TWFuYWdlci5pc0RhdGFDb25uZWN0aW9uQWxsb3dlZAogICAgICAgICBjYWxsYmFja0V2ZW50cwotICAgICAgICAgICAgLm1hcE5vdE51bGwgeyAoaXQgYXM/IENhbGxiYWNrRXZlbnQuT25EYXRhRW5hYmxlZENoYW5nZWQpPy5lbmFibGVkIH0KKyAgICAgICAgICAgIC5tYXBOb3ROdWxsIHsgaXQub25EYXRhRW5hYmxlZENoYW5nZWQgfQorICAgICAgICAgICAgLm1hcCB7IGl0LmVuYWJsZWQgfQogICAgICAgICAgICAgLnN0YXRlSW4oc2NvcGUsIFNoYXJpbmdTdGFydGVkLldoaWxlU3Vic2NyaWJlZCgpLCBpbml0aWFsKQogICAgIH0KIApAQCAtMzQ0LDEyICszNDksNDEgQEAKICAqIFdyYXAgZXZlcnkgW1RlbGVwaG9ueUNhbGxiYWNrXSB3ZSBjYXJlIGFib3V0IGluIGEgZGF0YSBjbGFzcyBzbyB3ZSBjYW4gYWNjZXB0IHRoZW0gaW4gYSBzaW5nbGUKICAqIHNoYXJlZCBmbG93IGFuZCB0aGVuIHNwbGl0IHRoZW0gYmFjayBvdXQgaW50byBvdGhlciBmbG93cy4KICAqLwotcHJpdmF0ZSBzZWFsZWQgaW50ZXJmYWNlIENhbGxiYWNrRXZlbnQgeworc2VhbGVkIGludGVyZmFjZSBDYWxsYmFja0V2ZW50IHsKKyAgICBkYXRhIGNsYXNzIE9uQ2Fycmllck5ldHdvcmtDaGFuZ2UodmFsIGFjdGl2ZTogQm9vbGVhbikgOiBDYWxsYmFja0V2ZW50CisgICAgZGF0YSBjbGFzcyBPbkRhdGFBY3Rpdml0eSh2YWwgZGlyZWN0aW9uOiBJbnQpIDogQ2FsbGJhY2tFdmVudAorICAgIGRhdGEgY2xhc3MgT25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCh2YWwgZGF0YVN0YXRlOiBJbnQpIDogQ2FsbGJhY2tFdmVudAorICAgIGRhdGEgY2xhc3MgT25EYXRhRW5hYmxlZENoYW5nZWQodmFsIGVuYWJsZWQ6IEJvb2xlYW4pIDogQ2FsbGJhY2tFdmVudAorICAgIGRhdGEgY2xhc3MgT25EaXNwbGF5SW5mb0NoYW5nZWQodmFsIHRlbGVwaG9ueURpc3BsYXlJbmZvOiBUZWxlcGhvbnlEaXNwbGF5SW5mbykgOiBDYWxsYmFja0V2ZW50CiAgICAgZGF0YSBjbGFzcyBPblNlcnZpY2VTdGF0ZUNoYW5nZWQodmFsIHNlcnZpY2VTdGF0ZTogU2VydmljZVN0YXRlKSA6IENhbGxiYWNrRXZlbnQKICAgICBkYXRhIGNsYXNzIE9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkKHZhbCBzaWduYWxTdHJlbmd0aDogU2lnbmFsU3RyZW5ndGgpIDogQ2FsbGJhY2tFdmVudAotICAgIGRhdGEgY2xhc3MgT25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCh2YWwgZGF0YVN0YXRlOiBJbnQpIDogQ2FsbGJhY2tFdmVudAotICAgIGRhdGEgY2xhc3MgT25EYXRhQWN0aXZpdHkodmFsIGRpcmVjdGlvbjogSW50KSA6IENhbGxiYWNrRXZlbnQKLSAgICBkYXRhIGNsYXNzIE9uQ2Fycmllck5ldHdvcmtDaGFuZ2UodmFsIGFjdGl2ZTogQm9vbGVhbikgOiBDYWxsYmFja0V2ZW50Ci0gICAgZGF0YSBjbGFzcyBPbkRpc3BsYXlJbmZvQ2hhbmdlZCh2YWwgdGVsZXBob255RGlzcGxheUluZm86IFRlbGVwaG9ueURpc3BsYXlJbmZvKSA6IENhbGxiYWNrRXZlbnQKLSAgICBkYXRhIGNsYXNzIE9uRGF0YUVuYWJsZWRDaGFuZ2VkKHZhbCBlbmFibGVkOiBCb29sZWFuKSA6IENhbGxiYWNrRXZlbnQKK30KKworLyoqCisgKiBBIHNpbXBsZSBib3ggdHlwZSBmb3IgMS10by0xIG1hcHBpbmcgb2YgW0NhbGxiYWNrRXZlbnRdIHRvIHRoZSBiYXRjaGVkIGV2ZW50LiBVc2VkIGluIGNvbmp1bmN0aW9uCisgKiB3aXRoIFtzY2FuXSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZHJvcCBpbXBvcnRhbnQgY2FsbGJhY2tzIGR1ZSB0byBsYXRlIHN1YnNjcmliZXJzCisgKi8KK2RhdGEgY2xhc3MgVGVsZXBob255Q2FsbGJhY2tTdGF0ZSgKKyAgICB2YWwgb25EYXRhQWN0aXZpdHk6IENhbGxiYWNrRXZlbnQuT25EYXRhQWN0aXZpdHk/ID0gbnVsbCwKKyAgICB2YWwgb25DYXJyaWVyTmV0d29ya0NoYW5nZTogQ2FsbGJhY2tFdmVudC5PbkNhcnJpZXJOZXR3b3JrQ2hhbmdlPyA9IG51bGwsCisgICAgdmFsIG9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQ6IENhbGxiYWNrRXZlbnQuT25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZD8gPSBudWxsLAorICAgIHZhbCBvbkRhdGFFbmFibGVkQ2hhbmdlZDogQ2FsbGJhY2tFdmVudC5PbkRhdGFFbmFibGVkQ2hhbmdlZD8gPSBudWxsLAorICAgIHZhbCBvbkRpc3BsYXlJbmZvQ2hhbmdlZDogQ2FsbGJhY2tFdmVudC5PbkRpc3BsYXlJbmZvQ2hhbmdlZD8gPSBudWxsLAorICAgIHZhbCBvblNlcnZpY2VTdGF0ZUNoYW5nZWQ6IENhbGxiYWNrRXZlbnQuT25TZXJ2aWNlU3RhdGVDaGFuZ2VkPyA9IG51bGwsCisgICAgdmFsIG9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkOiBDYWxsYmFja0V2ZW50Lk9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkPyA9IG51bGwsCispIHsKKyAgICBmdW4gYXBwbHlFdmVudChldmVudDogQ2FsbGJhY2tFdmVudCk6IFRlbGVwaG9ueUNhbGxiYWNrU3RhdGUgeworICAgICAgICByZXR1cm4gd2hlbiAoZXZlbnQpIHsKKyAgICAgICAgICAgIGlzIENhbGxiYWNrRXZlbnQuT25DYXJyaWVyTmV0d29ya0NoYW5nZSAtPiBjb3B5KG9uQ2Fycmllck5ldHdvcmtDaGFuZ2UgPSBldmVudCkKKyAgICAgICAgICAgIGlzIENhbGxiYWNrRXZlbnQuT25EYXRhQWN0aXZpdHkgLT4gY29weShvbkRhdGFBY3Rpdml0eSA9IGV2ZW50KQorICAgICAgICAgICAgaXMgQ2FsbGJhY2tFdmVudC5PbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkIC0+CisgICAgICAgICAgICAgICAgY29weShvbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkID0gZXZlbnQpCisgICAgICAgICAgICBpcyBDYWxsYmFja0V2ZW50Lk9uRGF0YUVuYWJsZWRDaGFuZ2VkIC0+IGNvcHkob25EYXRhRW5hYmxlZENoYW5nZWQgPSBldmVudCkKKyAgICAgICAgICAgIGlzIENhbGxiYWNrRXZlbnQuT25EaXNwbGF5SW5mb0NoYW5nZWQgLT4gY29weShvbkRpc3BsYXlJbmZvQ2hhbmdlZCA9IGV2ZW50KQorICAgICAgICAgICAgaXMgQ2FsbGJhY2tFdmVudC5PblNlcnZpY2VTdGF0ZUNoYW5nZWQgLT4geworICAgICAgICAgICAgICAgIGNvcHkob25TZXJ2aWNlU3RhdGVDaGFuZ2VkID0gZXZlbnQpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpcyBDYWxsYmFja0V2ZW50Lk9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkIC0+IGNvcHkob25TaWduYWxTdHJlbmd0aENoYW5nZWQgPSBldmVudCkKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGlwZWxpbmUvd2lmaS91aS92aWV3bW9kZWwvV2lmaVZpZXdNb2RlbC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGlwZWxpbmUvd2lmaS91aS92aWV3bW9kZWwvV2lmaVZpZXdNb2RlbC5rdAppbmRleCAxMDU3MjMxLi40YjI0ZTdhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BpcGVsaW5lL3dpZmkvdWkvdmlld21vZGVsL1dpZmlWaWV3TW9kZWwua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waXBlbGluZS93aWZpL3VpL3ZpZXdtb2RlbC9XaWZpVmlld01vZGVsLmt0CkBAIC0xMjQsNyArMTI0LDggQEAKICAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0IC0+IGljb24KICAgICAgICAgICAgICAgICAgICAgd2lmaUNvbnN0YW50cy5hbHdheXNTaG93SWNvbklmRW5hYmxlZCAtPiBpY29uCiAgICAgICAgICAgICAgICAgICAgICFjb25uZWN0aXZpdHlDb25zdGFudHMuaGFzRGF0YUNhcGFiaWxpdGllcyAtPiBpY29uCi0gICAgICAgICAgICAgICAgICAgIHdpZmlOZXR3b3JrIGlzIFdpZmlOZXR3b3JrTW9kZWwuQWN0aXZlICYmIHdpZmlOZXR3b3JrLmlzVmFsaWRhdGVkIC0+IGljb24KKyAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGIvMjcyNTA5OTY1OiBFdmVuIGlmIHdlIGhhdmUgYW4gYWN0aXZlIGFuZCB2YWxpZGF0ZWQgd2lmaSBuZXR3b3JrLCB3ZQorICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCB3YW50IHRvIHNob3cgdGhlIGljb24gaWYgd2lmaSBpc24ndCB0aGUgZGVmYXVsdCBuZXR3b3JrLgogICAgICAgICAgICAgICAgICAgICBlbHNlIC0+IFdpZmlJY29uLkhpZGRlbgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS91dGlsL2xlYWsvR2FyYmFnZU1vbml0b3IuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS91dGlsL2xlYWsvR2FyYmFnZU1vbml0b3IuamF2YQppbmRleCBhMGEwMzcyLi4yMDllYTQxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvdXRpbC9sZWFrL0dhcmJhZ2VNb25pdG9yLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3V0aWwvbGVhay9HYXJiYWdlTW9uaXRvci5qYXZhCkBAIC01OSw2ICs1OSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5zdGF0dXNiYXIuU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLlFTSG9zdDsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5sb2dnaW5nLlFTTG9nZ2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLnBpcGVsaW5lLmRvbWFpbi5pbnRlcmFjdG9yLlBhbmVsSW50ZXJhY3RvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy50aWxlaW1wbC5RU1RpbGVJbXBsOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwuY29uY3VycmVuY3kuRGVsYXlhYmxlRXhlY3V0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5jb25jdXJyZW5jeS5NZXNzYWdlUm91dGVyOwpAQCAtNDEyLDYgKzQxMyw3IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgR2FyYmFnZU1vbml0b3IgZ207CiAgICAgICAgIHByaXZhdGUgUHJvY2Vzc01lbUluZm8gcG1pOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gZHVtcEluUHJvZ3Jlc3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFuZWxJbnRlcmFjdG9yIG1QYW5lbEludGVyYWN0b3I7CiAKICAgICAgICAgQEluamVjdAogICAgICAgICBwdWJsaWMgTWVtb3J5VGlsZSgKQEAgLTQyMywxMSArNDI1LDEzIEBACiAgICAgICAgICAgICAgICAgU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyIHN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICBBY3Rpdml0eVN0YXJ0ZXIgYWN0aXZpdHlTdGFydGVyLAogICAgICAgICAgICAgICAgIFFTTG9nZ2VyIHFzTG9nZ2VyLAotICAgICAgICAgICAgICAgIEdhcmJhZ2VNb25pdG9yIG1vbml0b3IKKyAgICAgICAgICAgICAgICBHYXJiYWdlTW9uaXRvciBtb25pdG9yLAorICAgICAgICAgICAgICAgIFBhbmVsSW50ZXJhY3RvciBwYW5lbEludGVyYWN0b3IKICAgICAgICAgKSB7CiAgICAgICAgICAgICBzdXBlcihob3N0LCBiYWNrZ3JvdW5kTG9vcGVyLCBtYWluSGFuZGxlciwgZmFsc2luZ01hbmFnZXIsIG1ldHJpY3NMb2dnZXIsCiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwgYWN0aXZpdHlTdGFydGVyLCBxc0xvZ2dlcik7CiAgICAgICAgICAgICBnbSA9IG1vbml0b3I7CisgICAgICAgICAgICBtUGFuZWxJbnRlcmFjdG9yID0gcGFuZWxJbnRlcmFjdG9yOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC00NTcsNyArNDYxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdCgoKSAtPiB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRIb3N0KCkuY29sbGFwc2VQYW5lbHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYW5lbEludGVyYWN0b3IuY29sbGFwc2VQYW5lbHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eVN0YXJ0ZXIucG9zdFN0YXJ0QWN0aXZpdHlEaXNtaXNzaW5nS2V5Z3VhcmQoc2hhcmVJbnRlbnQsIDApOwogICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvdm9sdW1lL1ZvbHVtZURpYWxvZ0ltcGwuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS92b2x1bWUvVm9sdW1lRGlhbG9nSW1wbC5qYXZhCmluZGV4IDNjN2QwOTIuLjk1Y2MxMmEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS92b2x1bWUvVm9sdW1lRGlhbG9nSW1wbC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS92b2x1bWUvVm9sdW1lRGlhbG9nSW1wbC5qYXZhCkBAIC0xNDE2LDExICsxNDE2LDcgQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQE5vbk51bGwgQW5pbWF0b3IgYW5pbWF0aW9uKSB7CiAgICAgICAgICAgICAgICAgbUludGVyYWN0aW9uSmFua01vbml0b3IuY2FuY2VsKENVSl9WT0xVTUVfQ09OVFJPTCk7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAib25BbmltYXRpb25DYW5jZWwiKTsKLQotICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBvbmx5IGhhdmUgb25lIGFuaW1hdGlvbiBsaXN0ZW5lciBmb3IgY2FuY2VsLCBzbyB0aGUgamFuayBsaXN0ZW5lciBzaG91bGQKLSAgICAgICAgICAgICAgICAvLyBhbHNvIGNhbGwgZm9yIGNsZWFudXAuCi0gICAgICAgICAgICAgICAgZmluaXNoRGlzbWlzcygpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQW5pbWF0aW9uQ2FuY2VsIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMTUyOSw3ICsxNTI1LDEyIEBACiAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKG1EaWFsb2dIaWRlQW5pbWF0aW9uRHVyYXRpb25NcykKICAgICAgICAgICAgICAgICAuc2V0SW50ZXJwb2xhdG9yKG5ldyBTeXN0ZW1VSUludGVycG9sYXRvcnMuTG9nQWNjZWxlcmF0ZUludGVycG9sYXRvcigpKQogICAgICAgICAgICAgICAgIC53aXRoRW5kQWN0aW9uKCgpIC0+IG1IYW5kbGVyLnBvc3REZWxheWVkKCgpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoRGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5ub3RpZnlWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbURpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIHRyeVRvUmVtb3ZlQ2FwdGlvbnNUb29sdGlwKCk7CisgICAgICAgICAgICAgICAgICAgIG1Jc0FuaW1hdGluZ0Rpc21pc3MgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICBoaWRlUmluZ2VyRHJhd2VyKCk7CiAgICAgICAgICAgICAgICAgfSwgNTApKTsKICAgICAgICAgaWYgKCFzaG91bGRTbGlkZUluVm9sdW1lVHJheSgpKSB7CiAgICAgICAgICAgICBhbmltYXRvci50cmFuc2xhdGlvblgoCkBAIC0xNTQ3LDE4ICsxNTQ4LDYgQEAKICAgICAgICAgVHJhY2UuZW5kU2VjdGlvbigpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIENsZWFuIHVwIGFuZCBoaWRlIHZvbHVtZSBkaWFsb2cuIENhbGxlZCB3aGVuIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC9jYW5jZWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmlzaERpc21pc3MoKSB7Ci0gICAgICAgIG1Db250cm9sbGVyLm5vdGlmeVZpc2libGUoZmFsc2UpOwotICAgICAgICBtRGlhbG9nLmRpc21pc3MoKTsKLSAgICAgICAgdHJ5VG9SZW1vdmVDYXB0aW9uc1Rvb2x0aXAoKTsKLSAgICAgICAgbUlzQW5pbWF0aW5nRGlzbWlzcyA9IGZhbHNlOwotCi0gICAgICAgIGhpZGVSaW5nZXJEcmF3ZXIoKTsKLSAgICB9Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gc2hvd0FjdGl2ZVN0cmVhbU9ubHkoKSB7CiAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9MRUFOQkFDSykKICAgICAgICAgICAgICAgICB8fCBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9URUxFVklTSU9OKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZE1lc3NhZ2VBcmVhQ29udHJvbGxlclRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZE1lc3NhZ2VBcmVhQ29udHJvbGxlclRlc3QuamF2YQppbmRleCAwZTgzN2QyLi5hMzVlNWI1IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRNZXNzYWdlQXJlYUNvbnRyb2xsZXJUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkTWVzc2FnZUFyZWFDb250cm9sbGVyVGVzdC5qYXZhCkBAIC0xOCwxMiArMTgsMTUgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OwogCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUxvbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuZXE7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CiAKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudGVzdGluZy5BbmRyb2lkVGVzdGluZ1J1bm5lcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3RpbmcuVGVzdGFibGVMb29wZXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5TeXN1aVRlc3RDYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuQ29uZmlndXJhdGlvbkNvbnRyb2xsZXI7CkBAIC0zNyw2ICs0MCw3IEBACiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOwogCiBAU21hbGxUZXN0CitAVGVzdGFibGVMb29wZXIuUnVuV2l0aExvb3BlcgogQFJ1bldpdGgoQW5kcm9pZFRlc3RpbmdSdW5uZXIuY2xhc3MpCiBwdWJsaWMgY2xhc3MgS2V5Z3VhcmRNZXNzYWdlQXJlYUNvbnRyb2xsZXJUZXN0IGV4dGVuZHMgU3lzdWlUZXN0Q2FzZSB7CiAgICAgQE1vY2sKQEAgLTQ1LDE0ICs0OSwxNCBAQAogICAgIHByaXZhdGUgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1LZXlndWFyZFVwZGF0ZU1vbml0b3I7CiAgICAgQE1vY2sKICAgICBwcml2YXRlIEtleWd1YXJkTWVzc2FnZUFyZWEgbUtleWd1YXJkTWVzc2FnZUFyZWE7Ci0KICAgICBwcml2YXRlIEtleWd1YXJkTWVzc2FnZUFyZWFDb250cm9sbGVyIG1NZXNzYWdlQXJlYUNvbnRyb2xsZXI7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKICAgICAgICAgbU1lc3NhZ2VBcmVhQ29udHJvbGxlciA9IG5ldyBLZXlndWFyZE1lc3NhZ2VBcmVhQ29udHJvbGxlci5GYWN0b3J5KAotICAgICAgICAgICAgICAgIG1LZXlndWFyZFVwZGF0ZU1vbml0b3IsIG1Db25maWd1cmF0aW9uQ29udHJvbGxlcikuY3JlYXRlKG1LZXlndWFyZE1lc3NhZ2VBcmVhKTsKKyAgICAgICAgICAgICAgICBtS2V5Z3VhcmRVcGRhdGVNb25pdG9yLCBtQ29uZmlndXJhdGlvbkNvbnRyb2xsZXIpLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBtS2V5Z3VhcmRNZXNzYWdlQXJlYSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTg5LDYgKzkzLDE5IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TWVzc2FnZV9Bbm5vdW5jZUZvckFjY2Vzc2liaWxpdHkoKSB7CisgICAgICAgIEFyZ3VtZW50Q2FwdG9yPFJ1bm5hYmxlPiBhcmd1bWVudENhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKFJ1bm5hYmxlLmNsYXNzKTsKKyAgICAgICAgd2hlbihtS2V5Z3VhcmRNZXNzYWdlQXJlYS5nZXRUZXh0KCkpLnRoZW5SZXR1cm4oImFiYyIpOworICAgICAgICBtTWVzc2FnZUFyZWFDb250cm9sbGVyLnNldE1lc3NhZ2UoImFiYyIpOworCisgICAgICAgIHZlcmlmeShtS2V5Z3VhcmRNZXNzYWdlQXJlYSkuc2V0TWVzc2FnZSgiYWJjIiwgLyogYW5pbWF0ZT0gKi8gdHJ1ZSk7CisgICAgICAgIHZlcmlmeShtS2V5Z3VhcmRNZXNzYWdlQXJlYSkucmVtb3ZlQ2FsbGJhY2tzKGFueShSdW5uYWJsZS5jbGFzcykpOworICAgICAgICB2ZXJpZnkobUtleWd1YXJkTWVzc2FnZUFyZWEpLnBvc3REZWxheWVkKGFyZ3VtZW50Q2FwdG9yLmNhcHR1cmUoKSwgYW55TG9uZygpKTsKKyAgICAgICAgYXJndW1lbnRDYXB0b3IuZ2V0VmFsdWUoKS5ydW4oKTsKKyAgICAgICAgdmVyaWZ5KG1LZXlndWFyZE1lc3NhZ2VBcmVhKS5hbm5vdW5jZUZvckFjY2Vzc2liaWxpdHkoImFiYyIpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldEJvdW5jZXJWaXNpYmxlKCkgewogICAgICAgICBtTWVzc2FnZUFyZWFDb250cm9sbGVyLnNldElzVmlzaWJsZSh0cnVlKTsKICAgICAgICAgdmVyaWZ5KG1LZXlndWFyZE1lc3NhZ2VBcmVhKS5zZXRJc1Zpc2libGUodHJ1ZSk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXJUZXN0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXJUZXN0LmphdmEKaW5kZXggMzhkM2EzZS4uZjk2NmViMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9rZXlndWFyZC9LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlclRlc3QuamF2YQpAQCAtNjYsNiArNjYsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNsYXNzaWZpZXIuRmFsc2luZ0ExMXlEZWxlZ2F0ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jbGFzc2lmaWVyLkZhbHNpbmdDb2xsZWN0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmVhdHVyZUZsYWdzOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZsYWdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmxvZy5TZXNzaW9uVHJhY2tlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLkFjdGl2aXR5U3RhcnRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLkZhbHNpbmdNYW5hZ2VyOwpAQCAtNjE5LDEzICs2MjAsMjYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlaW5mbGF0ZVZpZXdGbGlwcGVyKCkgewotICAgICAgICBtS2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIucmVpbmZsYXRlVmlld0ZsaXBwZXIoKTsKKyAgICAgICAgbUtleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyLnJlaW5mbGF0ZVZpZXdGbGlwcGVyKCgpIC0+IHt9KTsKICAgICAgICAgdmVyaWZ5KG1LZXlndWFyZFNlY3VyaXR5Vmlld0ZsaXBwZXJDb250cm9sbGVyKS5jbGVhclZpZXdzKCk7CiAgICAgICAgIHZlcmlmeShtS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlcikuZ2V0U2VjdXJpdHlWaWV3KGFueShTZWN1cml0eU1vZGUuY2xhc3MpLAogICAgICAgICAgICAgICAgIGFueShLZXlndWFyZFNlY3VyaXR5Q2FsbGJhY2suY2xhc3MpKTsKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWluZmxhdGVWaWV3RmxpcHBlcl9hc3luY0JvdW5jZXJGbGFnT24oKSB7CisgICAgICAgIHdoZW4obUZlYXR1cmVGbGFncy5pc0VuYWJsZWQoRmxhZ3MuQVNZTkNfSU5GTEFURV9CT1VOQ0VSKSkudGhlblJldHVybih0cnVlKTsKKyAgICAgICAgS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlci5PblZpZXdJbmZsYXRlZExpc3RlbmVyIG9uVmlld0luZmxhdGVkTGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICgpIC0+IHsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICBtS2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIucmVpbmZsYXRlVmlld0ZsaXBwZXIob25WaWV3SW5mbGF0ZWRMaXN0ZW5lcik7CisgICAgICAgIHZlcmlmeShtS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlcikuY2xlYXJWaWV3cygpOworICAgICAgICB2ZXJpZnkobUtleWd1YXJkU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIpLmFzeW5jaHJvbm91c2x5SW5mbGF0ZVZpZXcoCisgICAgICAgICAgICAgICAgYW55KFNlY3VyaXR5TW9kZS5jbGFzcyksCisgICAgICAgICAgICAgICAgYW55KEtleWd1YXJkU2VjdXJpdHlDYWxsYmFjay5jbGFzcyksIGVxKG9uVmlld0luZmxhdGVkTGlzdGVuZXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaWRlRnBzQ29udHJvbGxlclNob3coKSB7CiAgICAgICAgIG1LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlci51cGRhdGVTaWRlRnBzVmlzaWJpbGl0eSgvKiBpc1Zpc2libGU9ICovIHRydWUpOwogICAgICAgICB2ZXJpZnkobVNpZGVGcHNDb250cm9sbGVyKS5zaG93KApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2tleWd1YXJkL0tleWd1YXJkU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXJUZXN0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlclRlc3QuamF2YQppbmRleCAxNjE0YjU3Li5hZmI1NGQyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlclRlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQva2V5Z3VhcmQvS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlclRlc3QuamF2YQpAQCAtMzEsMTAgKzMxLDEyIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93SW5zZXRzQ29udHJvbGxlcjsKIAoraW1wb3J0IGFuZHJvaWR4LmFzeW5jbGF5b3V0aW5mbGF0ZXIudmlldy5Bc3luY0xheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5rZXlndWFyZC5LZXlndWFyZFNlY3VyaXR5TW9kZWwuU2VjdXJpdHlNb2RlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlN5c3VpVGVzdENhc2U7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmVhdHVyZUZsYWdzOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKQEAgLTU3LDYgKzU5LDggQEAKICAgICBATW9jawogICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUxheW91dEluZmxhdGVyOwogICAgIEBNb2NrCisgICAgcHJpdmF0ZSBBc3luY0xheW91dEluZmxhdGVyIG1Bc3luY0xheW91dEluZmxhdGVyOworICAgIEBNb2NrCiAgICAgcHJpdmF0ZSBLZXlndWFyZElucHV0Vmlld0NvbnRyb2xsZXIuRmFjdG9yeSBtS2V5Z3VhcmRTZWN1cml0eVZpZXdDb250cm9sbGVyRmFjdG9yeTsKICAgICBATW9jawogICAgIHByaXZhdGUgRW1lcmdlbmN5QnV0dG9uQ29udHJvbGxlci5GYWN0b3J5IG1FbWVyZ2VuY3lCdXR0b25Db250cm9sbGVyRmFjdG9yeTsKQEAgLTcwLDYgKzc0LDggQEAKICAgICBwcml2YXRlIFdpbmRvd0luc2V0c0NvbnRyb2xsZXIgbVdpbmRvd0luc2V0c0NvbnRyb2xsZXI7CiAgICAgQE1vY2sKICAgICBwcml2YXRlIEtleWd1YXJkU2VjdXJpdHlDYWxsYmFjayBtS2V5Z3VhcmRTZWN1cml0eUNhbGxiYWNrOworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBGZWF0dXJlRmxhZ3MgbUZlYXR1cmVGbGFnczsKIAogICAgIHByaXZhdGUgS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlciBtS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlcjsKIApAQCAtODIsMTAgKzg4LDExIEBACiAgICAgICAgIHdoZW4obVZpZXcuZ2V0V2luZG93SW5zZXRzQ29udHJvbGxlcigpKS50aGVuUmV0dXJuKG1XaW5kb3dJbnNldHNDb250cm9sbGVyKTsKICAgICAgICAgd2hlbihtRW1lcmdlbmN5QnV0dG9uQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlKGFueShFbWVyZ2VuY3lCdXR0b24uY2xhc3MpKSkKICAgICAgICAgICAgICAgICAudGhlblJldHVybihtRW1lcmdlbmN5QnV0dG9uQ29udHJvbGxlcik7CisgICAgICAgIHdoZW4obVZpZXcuZ2V0Q29udGV4dCgpKS50aGVuUmV0dXJuKGdldENvbnRleHQoKSk7CiAKICAgICAgICAgbUtleWd1YXJkU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIgPSBuZXcgS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlcihtVmlldywKLSAgICAgICAgICAgICAgICBtTGF5b3V0SW5mbGF0ZXIsIG1LZXlndWFyZFNlY3VyaXR5Vmlld0NvbnRyb2xsZXJGYWN0b3J5LAotICAgICAgICAgICAgICAgIG1FbWVyZ2VuY3lCdXR0b25Db250cm9sbGVyRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgbUxheW91dEluZmxhdGVyLCBtQXN5bmNMYXlvdXRJbmZsYXRlciwgbUtleWd1YXJkU2VjdXJpdHlWaWV3Q29udHJvbGxlckZhY3RvcnksCisgICAgICAgICAgICAgICAgbUVtZXJnZW5jeUJ1dHRvbkNvbnRyb2xsZXJGYWN0b3J5LCBtRmVhdHVyZUZsYWdzKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTA4LDYgKzExNSwxNCBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYXN5bmNocm9ub3VzbHlJbmZsYXRlVmlldygpIHsKKyAgICAgICAgbUtleWd1YXJkU2VjdXJpdHlWaWV3RmxpcHBlckNvbnRyb2xsZXIuYXN5bmNocm9ub3VzbHlJbmZsYXRlVmlldyhTZWN1cml0eU1vZGUuUElOLAorICAgICAgICAgICAgICAgIG1LZXlndWFyZFNlY3VyaXR5Q2FsbGJhY2ssIG51bGwpOworICAgICAgICB2ZXJpZnkobUFzeW5jTGF5b3V0SW5mbGF0ZXIpLmluZmxhdGUoYW55SW50KCksIGVxKG1WaWV3KSwgYW55KAorICAgICAgICAgICAgICAgIEFzeW5jTGF5b3V0SW5mbGF0ZXIuT25JbmZsYXRlRmluaXNoZWRMaXN0ZW5lci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgb25EZW5zaXR5T3JGb250U2NhbGVDaGFuZ2VkKCkgewogICAgICAgICBtS2V5Z3VhcmRTZWN1cml0eVZpZXdGbGlwcGVyQ29udHJvbGxlci5jbGVhclZpZXdzKCk7CiAgICAgICAgIHZlcmlmeShtVmlldykucmVtb3ZlQWxsVmlld3MoKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vRm9udFZhcmlhdGlvblV0aWxzVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vRm9udFZhcmlhdGlvblV0aWxzVGVzdC5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzBjYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FuaW1hdGlvbi9Gb250VmFyaWF0aW9uVXRpbHNUZXN0Lmt0CkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuYW5pbWF0aW9uCisKK2ltcG9ydCBhbmRyb2lkLnRlc3RpbmcuQW5kcm9pZFRlc3RpbmdSdW5uZXIKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQKK2ltcG9ydCBvcmcuanVuaXQuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAorCitwcml2YXRlIGNvbnN0IHZhbCBUQUdfV0dIVCA9ICJ3Z2h0IgorcHJpdmF0ZSBjb25zdCB2YWwgVEFHX1dEVEggPSAid2R0aCIKK3ByaXZhdGUgY29uc3QgdmFsIFRBR19PUFNaID0gIm9wc3oiCitwcml2YXRlIGNvbnN0IHZhbCBUQUdfUk9ORCA9ICJST05EIgorCitAUnVuV2l0aChBbmRyb2lkVGVzdGluZ1J1bm5lcjo6Y2xhc3MpCitAU21hbGxUZXN0CitjbGFzcyBGb250VmFyaWF0aW9uVXRpbHNUZXN0IDogU3lzdWlUZXN0Q2FzZSgpIHsKKyAgICBAVGVzdAorICAgIGZ1biB0ZXN0VXBkYXRlRm9udFZhcmlhdGlvbl9nZXRDb3JyZWN0RnZhclN0cigpIHsKKyAgICAgICAgdmFsIGZvbnRWYXJpYXRpb25VdGlscyA9IEZvbnRWYXJpYXRpb25VdGlscygpCisgICAgICAgIHZhbCBpbml0RnZhciA9CisgICAgICAgICAgICBmb250VmFyaWF0aW9uVXRpbHMudXBkYXRlRm9udFZhcmlhdGlvbigKKyAgICAgICAgICAgICAgICB3ZWlnaHQgPSAxMDAsCisgICAgICAgICAgICAgICAgd2lkdGggPSAxMDAsCisgICAgICAgICAgICAgICAgb3B0aWNhbFNpemUgPSAtMSwKKyAgICAgICAgICAgICAgICByb3VuZG5lc3MgPSAxMDAKKyAgICAgICAgICAgICkKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiJyRUQUdfV0dIVCcgMTAwLCAnJFRBR19XRFRIJyAxMDAsICckVEFHX1JPTkQnIDEwMCIsIGluaXRGdmFyKQorICAgICAgICB2YWwgdXBkYXRlZEZ2YXIgPQorICAgICAgICAgICAgZm9udFZhcmlhdGlvblV0aWxzLnVwZGF0ZUZvbnRWYXJpYXRpb24oCisgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMjAwLAorICAgICAgICAgICAgICAgIHdpZHRoID0gMTAwLAorICAgICAgICAgICAgICAgIG9wdGljYWxTaXplID0gMCwKKyAgICAgICAgICAgICAgICByb3VuZG5lc3MgPSAxMDAKKyAgICAgICAgICAgICkKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICInJFRBR19XR0hUJyAyMDAsICckVEFHX1dEVEgnIDEwMCwgJyRUQUdfT1BTWicgMCwgJyRUQUdfUk9ORCcgMTAwIiwKKyAgICAgICAgICAgIHVwZGF0ZWRGdmFyCisgICAgICAgICkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biB0ZXN0U3R5bGVWYWx1ZVVuY2hhbmdlX2dldEJsYW5rU3RyKCkgeworICAgICAgICB2YWwgZm9udFZhcmlhdGlvblV0aWxzID0gRm9udFZhcmlhdGlvblV0aWxzKCkKKyAgICAgICAgZm9udFZhcmlhdGlvblV0aWxzLnVwZGF0ZUZvbnRWYXJpYXRpb24oCisgICAgICAgICAgICB3ZWlnaHQgPSAxMDAsCisgICAgICAgICAgICB3aWR0aCA9IDEwMCwKKyAgICAgICAgICAgIG9wdGljYWxTaXplID0gMCwKKyAgICAgICAgICAgIHJvdW5kbmVzcyA9IDEwMAorICAgICAgICApCisgICAgICAgIHZhbCB1cGRhdGVkRnZhcjEgPQorICAgICAgICAgICAgZm9udFZhcmlhdGlvblV0aWxzLnVwZGF0ZUZvbnRWYXJpYXRpb24oCisgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMTAwLAorICAgICAgICAgICAgICAgIHdpZHRoID0gMTAwLAorICAgICAgICAgICAgICAgIG9wdGljYWxTaXplID0gMCwKKyAgICAgICAgICAgICAgICByb3VuZG5lc3MgPSAxMDAKKyAgICAgICAgICAgICkKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgdXBkYXRlZEZ2YXIxKQorICAgICAgICB2YWwgdXBkYXRlZEZ2YXIyID0gZm9udFZhcmlhdGlvblV0aWxzLnVwZGF0ZUZvbnRWYXJpYXRpb24oKQorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiLCB1cGRhdGVkRnZhcjIpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FuaW1hdGlvbi9UZXh0QW5pbWF0b3JUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2FuaW1hdGlvbi9UZXh0QW5pbWF0b3JUZXN0Lmt0CmluZGV4IGIzODk1NTguLmQ3YWE2ZTAgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9hbmltYXRpb24vVGV4dEFuaW1hdG9yVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYW5pbWF0aW9uL1RleHRBbmltYXRvclRlc3Qua3QKQEAgLTE5LDcgKzE5LDYgQEAKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckxpc3RlbmVyQWRhcHRlcgogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5mb250cy5Gb250VmFyaWF0aW9uQXhpcwogaW1wb3J0IGFuZHJvaWQudGVzdGluZy5BbmRyb2lkVGVzdGluZ1J1bm5lcgogaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQKIGltcG9ydCBhbmRyb2lkLnRleHQuU3RhdGljTGF5b3V0CkBAIC0xODAsNzEgKzE3OSw0IEBACiAKICAgICAgICAgYXNzZXJ0VGhhdChwYWludC50eXBlZmFjZSkuaXNTYW1lSW5zdGFuY2VBcyhwcmV2VHlwZWZhY2UpCiAgICAgfQotCi0gICAgQFRlc3QKLSAgICBmdW4gdGVzdFNldFRleHRTdHlsZV9hZGRXZWlnaHQoKSB7Ci0gICAgICAgIHRlc3RXZWlnaHRDaGFuZ2UoIiIsIDEwMCwgRm9udFZhcmlhdGlvbkF4aXMuZnJvbUZvbnRWYXJpYXRpb25TZXR0aW5ncygiJ3dnaHQnIDEwMCIpISEpCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBmdW4gdGVzdFNldFRleHRTdHlsZV9jaGFuZ2VXZWlnaHQoKSB7Ci0gICAgICAgIHRlc3RXZWlnaHRDaGFuZ2UoCi0gICAgICAgICAgICAgICAgIid3Z2h0JyA1MDAiLAotICAgICAgICAgICAgICAgIDEwMCwKLSAgICAgICAgICAgICAgICBGb250VmFyaWF0aW9uQXhpcy5mcm9tRm9udFZhcmlhdGlvblNldHRpbmdzKCInd2dodCcgMTAwIikhIQotICAgICAgICApCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBmdW4gdGVzdFNldFRleHRTdHlsZV9hZGRXZWlnaHRXaXRoT3RoZXJBeGlzKCkgewotICAgICAgICB0ZXN0V2VpZ2h0Q2hhbmdlKAotICAgICAgICAgICAgICAgICInd2R0aCcgMTAwIiwKLSAgICAgICAgICAgICAgICAxMDAsCi0gICAgICAgICAgICAgICAgRm9udFZhcmlhdGlvbkF4aXMuZnJvbUZvbnRWYXJpYXRpb25TZXR0aW5ncygiJ3dnaHQnIDEwMCwgJ3dkdGgnIDEwMCIpISEKLSAgICAgICAgKQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgZnVuIHRlc3RTZXRUZXh0U3R5bGVfY2hhbmdlV2VpZ2h0V2l0aE90aGVyQXhpcygpIHsKLSAgICAgICAgdGVzdFdlaWdodENoYW5nZSgKLSAgICAgICAgICAgICAgICAiJ3dnaHQnIDUwMCwgJ3dkdGgnIDEwMCIsCi0gICAgICAgICAgICAgICAgMTAwLAotICAgICAgICAgICAgICAgIEZvbnRWYXJpYXRpb25BeGlzLmZyb21Gb250VmFyaWF0aW9uU2V0dGluZ3MoIid3Z2h0JyAxMDAsICd3ZHRoJyAxMDAiKSEhCi0gICAgICAgICkKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1biB0ZXN0V2VpZ2h0Q2hhbmdlKAotICAgICAgICAgICAgaW5pdGlhbEZvbnRWYXJpYXRpb25TZXR0aW5nczogU3RyaW5nLAotICAgICAgICAgICAgd2VpZ2h0OiBJbnQsCi0gICAgICAgICAgICBleHBlY3RlZEZvbnRWYXJpYXRpb25TZXR0aW5nczogQXJyYXk8Rm9udFZhcmlhdGlvbkF4aXM+Ci0gICAgKSB7Ci0gICAgICAgIHZhbCBsYXlvdXQgPSBtYWtlTGF5b3V0KCJIZWxsbywgV29ybGQiLCBQQUlOVCkKLSAgICAgICAgdmFsIHZhbHVlQW5pbWF0b3IgPSBtb2NrKFZhbHVlQW5pbWF0b3I6OmNsYXNzLmphdmEpCi0gICAgICAgIHZhbCB0ZXh0SW50ZXJwb2xhdG9yID0gbW9jayhUZXh0SW50ZXJwb2xhdG9yOjpjbGFzcy5qYXZhKQotICAgICAgICB2YWwgcGFpbnQgPQotICAgICAgICAgICAgICAgIFRleHRQYWludCgpLmFwcGx5IHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZWZhY2UgPSBUeXBlZmFjZS5jcmVhdGVGcm9tRmlsZSgiL3N5c3RlbS9mb250cy9Sb2JvdG8tUmVndWxhci50dGYiKQotICAgICAgICAgICAgICAgICAgICBmb250VmFyaWF0aW9uU2V0dGluZ3MgPSBpbml0aWFsRm9udFZhcmlhdGlvblNldHRpbmdzCi0gICAgICAgICAgICAgICAgfQotICAgICAgICBgd2hlbmAodGV4dEludGVycG9sYXRvci50YXJnZXRQYWludCkudGhlblJldHVybihwYWludCkKLQotICAgICAgICB2YWwgdGV4dEFuaW1hdG9yID0KLSAgICAgICAgICAgICAgICBUZXh0QW5pbWF0b3IobGF5b3V0LCB7fSkuYXBwbHkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRJbnRlcnBvbGF0b3IgPSB0ZXh0SW50ZXJwb2xhdG9yCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0b3IgPSB2YWx1ZUFuaW1hdG9yCi0gICAgICAgICAgICAgICAgfQotICAgICAgICB0ZXh0QW5pbWF0b3Iuc2V0VGV4dFN0eWxlKHdlaWdodCA9IHdlaWdodCwgYW5pbWF0ZSA9IGZhbHNlKQotCi0gICAgICAgIHZhbCByZXN1bHRGb250VmFyaWF0aW9uTGlzdCA9Ci0gICAgICAgICAgICAgICAgRm9udFZhcmlhdGlvbkF4aXMuZnJvbUZvbnRWYXJpYXRpb25TZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnRlcnBvbGF0b3IudGFyZ2V0UGFpbnQuZm9udFZhcmlhdGlvblNldHRpbmdzCi0gICAgICAgICAgICAgICAgKQotICAgICAgICBleHBlY3RlZEZvbnRWYXJpYXRpb25TZXR0aW5ncy5mb3JFYWNoIHsgZXhwZWN0ZWRBeGlzIC0+Ci0gICAgICAgICAgICB2YWwgcmVzdWx0QXhpcyA9IHJlc3VsdEZvbnRWYXJpYXRpb25MaXN0Py5maWx0ZXIgeyBpdC50YWcgPT0gZXhwZWN0ZWRBeGlzLnRhZyB9Py5nZXQoMCkKLSAgICAgICAgICAgIGFzc2VydFRoYXQocmVzdWx0QXhpcykuaXNOb3ROdWxsKCkKLSAgICAgICAgICAgIGlmIChyZXN1bHRBeGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdEF4aXMuc3R5bGVWYWx1ZSkuaXNFcXVhbFRvKGV4cGVjdGVkQXhpcy5zdHlsZVZhbHVlKQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2Jpb21ldHJpY3MvQXV0aENvbnRyb2xsZXJUZXN0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYmlvbWV0cmljcy9BdXRoQ29udHJvbGxlclRlc3QuamF2YQppbmRleCBlMWM3NDE3Li5jMDY4ZWZiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYmlvbWV0cmljcy9BdXRoQ29udHJvbGxlclRlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYmlvbWV0cmljcy9BdXRoQ29udHJvbGxlclRlc3QuamF2YQpAQCAtMzUsNyArMzUsNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmVxOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLmRvQW5zd2VyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLmRvUmV0dXJuOwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLmluT3JkZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5yZXNldDsKQEAgLTkzMCw2ICs5MjksMTUgQEAKICAgICAgICAgYXNzZXJ0Tm90U2FtZShmaXJzdEZwTG9jYXRpb24sIG1BdXRoQ29udHJvbGxlci5nZXRGaW5nZXJwcmludFNlbnNvckxvY2F0aW9uKCkpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlRGlhbG9nX3doZW5HbG9iYWxBY3Rpb25zTWVudVNob3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNob3dEaWFsb2cobmV3IGludFtdezF9IC8qIHNlbnNvcklkcyAqLywgZmFsc2UgLyogY3JlZGVudGlhbEFsbG93ZWQgKi8pOworICAgICAgICBtQXV0aENvbnRyb2xsZXIuaGFuZGxlU2hvd0dsb2JhbEFjdGlvbnNNZW51KCk7CisgICAgICAgIHZlcmlmeShtUmVjZWl2ZXIpLm9uRGlhbG9nRGlzbWlzc2VkKAorICAgICAgICAgICAgICAgIGVxKEJpb21ldHJpY1Byb21wdC5ESVNNSVNTRURfUkVBU09OX1VTRVJfQ0FOQ0VMKSwKKyAgICAgICAgICAgICAgICBlcShudWxsKSAvKiBjcmVkZW50aWFsQXR0ZXN0YXRpb24gKi8pOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBzaG93RGlhbG9nKGludFtdIHNlbnNvcklkcywgYm9vbGVhbiBjcmVkZW50aWFsQWxsb3dlZCkgewogICAgICAgICBtQXV0aENvbnRyb2xsZXIuc2hvd0F1dGhlbnRpY2F0aW9uRGlhbG9nKGNyZWF0ZVRlc3RQcm9tcHRJbmZvKCksCiAgICAgICAgICAgICAgICAgbVJlY2VpdmVyIC8qIHJlY2VpdmVyICovLApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2Jpb21ldHJpY3MvVWRmcHNLZXlndWFyZFZpZXdDb250cm9sbGVyV2l0aENvcm91dGluZXNUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2Jpb21ldHJpY3MvVWRmcHNLZXlndWFyZFZpZXdDb250cm9sbGVyV2l0aENvcm91dGluZXNUZXN0Lmt0CmluZGV4IDg2ZmIyNzkuLjc4NmNiMDEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9iaW9tZXRyaWNzL1VkZnBzS2V5Z3VhcmRWaWV3Q29udHJvbGxlcldpdGhDb3JvdXRpbmVzVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvYmlvbWV0cmljcy9VZGZwc0tleWd1YXJkVmlld0NvbnRyb2xsZXJXaXRoQ29yb3V0aW5lc1Rlc3Qua3QKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiAgICAgICAgICAgICAvLyBXSEVOIHRoZSBib3VuY2VyIGV4cGFuc2lvbiBpcyBWSVNJQkxFCiAgICAgICAgICAgICB2YWwgam9iID0gbUNvbnRyb2xsZXIubGlzdGVuRm9yQm91bmNlckV4cGFuc2lvbih0aGlzKQotICAgICAgICAgICAga2V5Z3VhcmRCb3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5VmlzaWJsZSh0cnVlKQorICAgICAgICAgICAga2V5Z3VhcmRCb3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5U2hvdyh0cnVlKQogICAgICAgICAgICAga2V5Z3VhcmRCb3VuY2VyUmVwb3NpdG9yeS5zZXRQYW5lbEV4cGFuc2lvbihLZXlndWFyZEJvdW5jZXJDb25zdGFudHMuRVhQQU5TSU9OX1ZJU0lCTEUpCiAgICAgICAgICAgICB5aWVsZCgpCiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy9zZXR0aW5ncy9Db250cm9sc1NldHRpbmdzRGlhbG9nTWFuYWdlckltcGxUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3NldHRpbmdzL0NvbnRyb2xzU2V0dGluZ3NEaWFsb2dNYW5hZ2VySW1wbFRlc3Qua3QKaW5kZXggNWE2MTNhYS4uNTkwOTg5ZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3NldHRpbmdzL0NvbnRyb2xzU2V0dGluZ3NEaWFsb2dNYW5hZ2VySW1wbFRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3NldHRpbmdzL0NvbnRyb2xzU2V0dGluZ3NEaWFsb2dNYW5hZ2VySW1wbFRlc3Qua3QKQEAgLTQ1LDYgKzQ1LDcgQEAKIGltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUJvb2xlYW4KIGltcG9ydCBvcmcubW9ja2l0by5Nb2NrCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5hbnlJbnQKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLmRvQW5zd2VyCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcgogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5gd2hlbmAKQEAgLTIzNCw2ICsyMzUsMzYgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIGZ1biBkaWFsb2dQb3NpdGl2ZUJ1dHRvbldoZW5DYWxsZWRPbkNvbXBsZXRlU2V0dGluZ0lzVHJ1ZSgpIHsKKyAgICAgICAgc2hhcmVkUHJlZmVyZW5jZXMucHV0QXR0ZW1wdHMoMCkKKyAgICAgICAgc2VjdXJlU2V0dGluZ3MucHV0Qm9vbChTRVRUSU5HX1NIT1csIHRydWUpCisgICAgICAgIHNlY3VyZVNldHRpbmdzLnB1dEJvb2woU0VUVElOR19BQ1RJT04sIGZhbHNlKQorCisgICAgICAgIGRvQW5zd2VyIHsgYXNzZXJ0VGhhdChzZWN1cmVTZXR0aW5ncy5nZXRCb29sKFNFVFRJTkdfQUNUSU9OLCBmYWxzZSkpLmlzVHJ1ZSgpIH0KKyAgICAgICAgICAgIC5gd2hlbmAoY29tcGxldGVkUnVubmFibGUpCisgICAgICAgICAgICAuaW52b2tlKCkKKworICAgICAgICB1bmRlclRlc3QubWF5YmVTaG93RGlhbG9nKGNvbnRleHQsIGNvbXBsZXRlZFJ1bm5hYmxlKQorICAgICAgICBjbGlja0J1dHRvbihEaWFsb2dJbnRlcmZhY2UuQlVUVE9OX1BPU0lUSVZFKQorCisgICAgICAgIHZlcmlmeShjb21wbGV0ZWRSdW5uYWJsZSkuaW52b2tlKCkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBkaWFsb2dQb3NpdGl2ZUNhbmNlbEtleWd1YXJkU3RpbGxDYWxsc09uQ29tcGxldGUoKSB7CisgICAgICAgIGB3aGVuYChhY3Rpdml0eVN0YXJ0ZXIuZGlzbWlzc0tleWd1YXJkVGhlbkV4ZWN1dGUoYW55KCksIG51bGxhYmxlKCksIGFueUJvb2xlYW4oKSkpCisgICAgICAgICAgICAudGhlbkFuc3dlciB7IChpdC5hcmd1bWVudHNbMV0gYXMgUnVubmFibGUpLnJ1bigpIH0KKyAgICAgICAgc2hhcmVkUHJlZmVyZW5jZXMucHV0QXR0ZW1wdHMoMCkKKyAgICAgICAgc2VjdXJlU2V0dGluZ3MucHV0Qm9vbChTRVRUSU5HX1NIT1csIHRydWUpCisgICAgICAgIHNlY3VyZVNldHRpbmdzLnB1dEJvb2woU0VUVElOR19BQ1RJT04sIGZhbHNlKQorCisgICAgICAgIHVuZGVyVGVzdC5tYXliZVNob3dEaWFsb2coY29udGV4dCwgY29tcGxldGVkUnVubmFibGUpCisgICAgICAgIGNsaWNrQnV0dG9uKERpYWxvZ0ludGVyZmFjZS5CVVRUT05fUE9TSVRJVkUpCisKKyAgICAgICAgdmVyaWZ5KGNvbXBsZXRlZFJ1bm5hYmxlKS5pbnZva2UoKQorICAgIH0KKworICAgIEBUZXN0CiAgICAgZnVuIGRpYWxvZ0NhbmNlbERvZXNudENoYW5nZVNldHRpbmcoKSB7CiAgICAgICAgIHNoYXJlZFByZWZlcmVuY2VzLnB1dEF0dGVtcHRzKDApCiAgICAgICAgIHNlY3VyZVNldHRpbmdzLnB1dEJvb2woU0VUVElOR19TSE9XLCB0cnVlKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL0NvbnRyb2xzVWlDb250cm9sbGVySW1wbFRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvQ29udHJvbHNVaUNvbnRyb2xsZXJJbXBsVGVzdC5rdAppbmRleCAzZjYxYmY3Li4xMDc1N2FlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvQ29udHJvbHNVaUNvbnRyb2xsZXJJbXBsVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvQ29udHJvbHNVaUNvbnRyb2xsZXJJbXBsVGVzdC5rdApAQCAtMzQ3LDcgKzM0Nyw3IEBACiAgICAgICAgIHdoZW5ldmVyKGNvbnRyb2xzQ29udHJvbGxlci5yZW1vdmVGYXZvcml0ZXMoZXEoY29tcG9uZW50TmFtZSkpKS50aGVuUmV0dXJuKHRydWUpCiAgICAgICAgIHZhbCBwYW5lbCA9IFNlbGVjdGVkSXRlbS5QYW5lbEl0ZW0oIkFwcCBuYW1lIiwgY29tcG9uZW50TmFtZSkKICAgICAgICAgcHJlZmVycmVkUGFuZWxSZXBvc2l0b3J5LnNldFNlbGVjdGVkQ29tcG9uZW50KAotICAgICAgICAgICAgICAgIFNlbGVjdGVkQ29tcG9uZW50UmVwb3NpdG9yeS5TZWxlY3RlZENvbXBvbmVudChwYW5lbCkKKyAgICAgICAgICAgIFNlbGVjdGVkQ29tcG9uZW50UmVwb3NpdG9yeS5TZWxlY3RlZENvbXBvbmVudChwYW5lbCkKICAgICAgICAgKQogICAgICAgICB1bmRlclRlc3Quc2hvdyhwYXJlbnQsIHt9LCBjb250ZXh0KQogICAgICAgICB1bmRlclRlc3Quc3RhcnRSZW1vdmluZ0FwcChjb21wb25lbnROYW1lLCAiVGVzdCBBcHAiKQpAQCAtMzYyLDYgKzM2MiwyNiBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgZnVuIHRlc3RDYW5jZWxSZW1vdmluZ0FwcHNEb2VzbnRSZW1vdmVGYXZvcml0ZSgpIHsKKyAgICAgICAgdmFsIGNvbXBvbmVudE5hbWUgPSBDb21wb25lbnROYW1lKGNvbnRleHQsICJjbHMiKQorICAgICAgICB3aGVuZXZlcihjb250cm9sc0NvbnRyb2xsZXIucmVtb3ZlRmF2b3JpdGVzKGVxKGNvbXBvbmVudE5hbWUpKSkudGhlblJldHVybih0cnVlKQorICAgICAgICB2YWwgcGFuZWwgPSBTZWxlY3RlZEl0ZW0uUGFuZWxJdGVtKCJBcHAgbmFtZSIsIGNvbXBvbmVudE5hbWUpCisgICAgICAgIHByZWZlcnJlZFBhbmVsUmVwb3NpdG9yeS5zZXRTZWxlY3RlZENvbXBvbmVudCgKKyAgICAgICAgICAgIFNlbGVjdGVkQ29tcG9uZW50UmVwb3NpdG9yeS5TZWxlY3RlZENvbXBvbmVudChwYW5lbCkKKyAgICAgICAgKQorICAgICAgICB1bmRlclRlc3Quc2hvdyhwYXJlbnQsIHt9LCBjb250ZXh0KQorICAgICAgICB1bmRlclRlc3Quc3RhcnRSZW1vdmluZ0FwcChjb21wb25lbnROYW1lLCAiVGVzdCBBcHAiKQorCisgICAgICAgIGZha2VEaWFsb2dDb250cm9sbGVyLmNsaWNrTmV1dHJhbCgpCisKKyAgICAgICAgdmVyaWZ5KGNvbnRyb2xzQ29udHJvbGxlciwgbmV2ZXIoKSkucmVtb3ZlRmF2b3JpdGVzKGVxKGNvbXBvbmVudE5hbWUpKQorICAgICAgICBhc3NlcnRUaGF0KHVuZGVyVGVzdC5nZXRQcmVmZXJyZWRTZWxlY3RlZEl0ZW0oZW1wdHlMaXN0KCkpKS5pc0VxdWFsVG8ocGFuZWwpCisgICAgICAgIGFzc2VydFRoYXQocHJlZmVycmVkUGFuZWxSZXBvc2l0b3J5LnNob3VsZEFkZERlZmF1bHRDb21wb25lbnQoKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChwcmVmZXJyZWRQYW5lbFJlcG9zaXRvcnkuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKSkKKyAgICAgICAgICAgIC5pc0VxdWFsVG8oU2VsZWN0ZWRDb21wb25lbnRSZXBvc2l0b3J5LlNlbGVjdGVkQ29tcG9uZW50KHBhbmVsKSkKKyAgICB9CisKKyAgICBAVGVzdAogICAgIGZ1biB0ZXN0SGlkZUNhbmNlbHNUaGVSZW1vdmVBcHBEaWFsb2coKSB7CiAgICAgICAgIHZhbCBjb21wb25lbnROYW1lID0gQ29tcG9uZW50TmFtZShjb250ZXh0LCAiY2xzIikKICAgICAgICAgdW5kZXJUZXN0LnNob3cocGFyZW50LCB7fSwgY29udGV4dCkKQEAgLTM3MiwxMCArMzkyLDQyIEBACiAgICAgICAgIHZlcmlmeShmYWtlRGlhbG9nQ29udHJvbGxlci5kaWFsb2cpLmNhbmNlbCgpCiAgICAgfQogCisgICAgQFRlc3QKKyAgICBmdW4gdGVzdE9uUm90YXRpb25XaXRoUGFuZWxVcGRhdGVCb3VuZHNDYWxsZWQoKSB7CisgICAgICAgIG1vY2tMYXlvdXRJbmZsYXRlcigpCisgICAgICAgIHZhbCBwYWNrYWdlTmFtZSA9ICJwa2ciCisgICAgICAgIGB3aGVuYChhdXRob3JpemVkUGFuZWxzUmVwb3NpdG9yeS5nZXRBdXRob3JpemVkUGFuZWxzKCkpLnRoZW5SZXR1cm4oc2V0T2YocGFja2FnZU5hbWUpKQorICAgICAgICB2YWwgcGFuZWwgPSBTZWxlY3RlZEl0ZW0uUGFuZWxJdGVtKCJBcHAgbmFtZSIsIENvbXBvbmVudE5hbWUocGFja2FnZU5hbWUsICJjbHMiKSkKKyAgICAgICAgdmFsIHNlcnZpY2VJbmZvID0gc2V0VXBQYW5lbChwYW5lbCkKKworICAgICAgICB1bmRlclRlc3Quc2hvdyhwYXJlbnQsIHt9LCBjb250ZXh0KQorCisgICAgICAgIHZhbCBjYXB0b3IgPSBhcmd1bWVudENhcHRvcjxDb250cm9sc0xpc3RpbmdDb250cm9sbGVyLkNvbnRyb2xzTGlzdGluZ0NhbGxiYWNrPigpCisKKyAgICAgICAgdmVyaWZ5KGNvbnRyb2xzTGlzdGluZ0NvbnRyb2xsZXIpLmFkZENhbGxiYWNrKGNhcHR1cmUoY2FwdG9yKSkKKyAgICAgICAgY2FwdG9yLnZhbHVlLm9uU2VydmljZXNVcGRhdGVkKGxpc3RPZihzZXJ2aWNlSW5mbykpCisgICAgICAgIEZha2VFeGVjdXRvci5leGhhdXN0RXhlY3V0b3JzKHVpRXhlY3V0b3IsIGJnRXhlY3V0b3IpCisKKyAgICAgICAgdmFsIHRhc2tWaWV3Q29uc3VtZXJDYXB0b3IgPSBhcmd1bWVudENhcHRvcjxDb25zdW1lcjxUYXNrVmlldz4+KCkKKyAgICAgICAgdmVyaWZ5KHRhc2tWaWV3RmFjdG9yeSkuY3JlYXRlKGVxKGNvbnRleHQpLCBlcSh1aUV4ZWN1dG9yKSwgY2FwdHVyZSh0YXNrVmlld0NvbnN1bWVyQ2FwdG9yKSkKKworICAgICAgICB2YWwgdGFza1ZpZXc6IFRhc2tWaWV3ID0gbW9jayB7CisgICAgICAgICAgICBgd2hlbmAodGhpcy5wb3N0KGFueSgpKSkudGhlbkFuc3dlciB7CisgICAgICAgICAgICAgICAgdWlFeGVjdXRvci5leGVjdXRlKGl0LmFyZ3VtZW50c1swXSBhcyBSdW5uYWJsZSkKKyAgICAgICAgICAgICAgICB0cnVlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0YXNrVmlld0NvbnN1bWVyQ2FwdG9yLnZhbHVlLmFjY2VwdCh0YXNrVmlldykKKworICAgICAgICB1bmRlclRlc3Qub25PcmllbnRhdGlvbkNoYW5nZSgpCisgICAgICAgIHZlcmlmeSh0YXNrVmlldykub25Mb2NhdGlvbkNoYW5nZWQoKQorICAgIH0KKwogICAgIHByaXZhdGUgZnVuIHNldFVwUGFuZWwocGFuZWw6IFNlbGVjdGVkSXRlbS5QYW5lbEl0ZW0pOiBDb250cm9sc1NlcnZpY2VJbmZvIHsKICAgICAgICAgdmFsIGFjdGl2aXR5ID0gQ29tcG9uZW50TmFtZShjb250ZXh0LCAiYWN0aXZpdHkiKQogICAgICAgICBwcmVmZXJyZWRQYW5lbFJlcG9zaXRvcnkuc2V0U2VsZWN0ZWRDb21wb25lbnQoCi0gICAgICAgICAgICAgICAgU2VsZWN0ZWRDb21wb25lbnRSZXBvc2l0b3J5LlNlbGVjdGVkQ29tcG9uZW50KHBhbmVsKQorICAgICAgICAgICAgU2VsZWN0ZWRDb21wb25lbnRSZXBvc2l0b3J5LlNlbGVjdGVkQ29tcG9uZW50KHBhbmVsKQogICAgICAgICApCiAgICAgICAgIHJldHVybiBDb250cm9sc1NlcnZpY2VJbmZvKHBhbmVsLmNvbXBvbmVudE5hbWUsIHBhbmVsLmFwcE5hbWUsIGFjdGl2aXR5KQogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9QYW5lbFRhc2tWaWV3Q29udHJvbGxlclRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvY29udHJvbHMvdWkvUGFuZWxUYXNrVmlld0NvbnRyb2xsZXJUZXN0Lmt0CmluZGV4IGRlMDRlZjguLjlkZjc5OTIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9jb250cm9scy91aS9QYW5lbFRhc2tWaWV3Q29udHJvbGxlclRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2NvbnRyb2xzL3VpL1BhbmVsVGFza1ZpZXdDb250cm9sbGVyVGVzdC5rdApAQCAtMTUyLDQgKzE1MiwxMiBAQAogICAgICAgICBsaXN0ZW5lckNhcHRvci52YWx1ZS5vblRhc2tSZW1vdmFsU3RhcnRlZCgwKQogICAgICAgICB2ZXJpZnkodGFza1ZpZXcpLnJlbGVhc2UoKQogICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHRlc3RPblJlZnJlc2hCb3VuZHMoKSB7CisgICAgICAgIHVuZGVyVGVzdC5sYXVuY2hUYXNrVmlldygpCisKKyAgICAgICAgdW5kZXJUZXN0LnJlZnJlc2hCb3VuZHMoKQorICAgICAgICB2ZXJpZnkodGFza1ZpZXcpLm9uTG9jYXRpb25DaGFuZ2VkKCkKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL0RyZWFtT3ZlcmxheVNlcnZpY2VUZXN0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL0RyZWFtT3ZlcmxheVNlcnZpY2VUZXN0LmphdmEKaW5kZXggYWExN2Q0OS4uZWQ3Mzc5NyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RyZWFtcy9EcmVhbU92ZXJsYXlTZXJ2aWNlVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvRHJlYW1PdmVybGF5U2VydmljZVRlc3QuamF2YQpAQCAtMjAsNyArMjAsOSBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLmNsZWFySW52b2NhdGlvbnM7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9BbnN3ZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9UaHJvdzsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5pbk9yZGVyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubmV2ZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwpAQCAtNjMsNiArNjUsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcjsKIGltcG9ydCBvcmcubW9ja2l0by5DYXB0b3I7CitpbXBvcnQgb3JnLm1vY2tpdG8uSW5PcmRlcjsKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NrOwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOwpAQCAtMjk1LDYgKzI5OCw3IEBACiAgICAgICAgIC8vIEluZm9ybSB0aGUgb3ZlcmxheSBzZXJ2aWNlIG9mIGRyZWFtIHN0YXJ0aW5nLgogICAgICAgICBjbGllbnQuc3RhcnREcmVhbShtV2luZG93UGFyYW1zLCBtRHJlYW1PdmVybGF5Q2FsbGJhY2ssIERSRUFNX0NPTVBPTkVOVCwKICAgICAgICAgICAgICAgICB0cnVlIC8qc2hvdWxkU2hvd0NvbXBsaWNhdGlvbiovKTsKKyAgICAgICAgbU1haW5FeGVjdXRvci5ydW5BbGxSZWFkeSgpOwogCiAgICAgICAgIGFzc2VydFRoYXQobVNlcnZpY2Uuc2hvdWxkU2hvd0NvbXBsaWNhdGlvbnMoKSkuaXNUcnVlKCk7CiAgICAgfQpAQCAtMzM4LDYgKzM0Miw0OCBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltbWVkaWF0ZUVuZERyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElEcmVhbU92ZXJsYXlDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIGRyZWFtLCBidXQgZG9uJ3QgZXhlY3V0ZSBhbnkgUnVubmFibGVzIHB1dCBvbiB0aGUgZXhlY3V0b3IgeWV0LiBXZSBkZWxheQorICAgICAgICAvLyBleGVjdXRpbmcgUnVubmFibGVzIGFzIHRoZSB0aW1pbmcgaXNuJ3QgZ3VhcmFudGVlZCBhbmQgd2Ugd2FudCB0byB2ZXJpZnkgdGhhdCB0aGUgb3ZlcmxheQorICAgICAgICAvLyBzdGFydHMgYW5kIGZpbmlzaGVzIGluIHRoZSBwcm9wZXIgb3JkZXIgZXZlbiBpZiBSdW5uYWJsZXMgYXJlIGRlbGF5ZWQuCisgICAgICAgIGNsaWVudC5zdGFydERyZWFtKG1XaW5kb3dQYXJhbXMsIG1EcmVhbU92ZXJsYXlDYWxsYmFjaywgRFJFQU1fQ09NUE9ORU5ULAorICAgICAgICAgICAgICAgIGZhbHNlIC8qc2hvdWxkU2hvd0NvbXBsaWNhdGlvbiovKTsKKyAgICAgICAgLy8gSW1tZWRpYXRlbHkgZW5kIHRoZSBkcmVhbS4KKyAgICAgICAgY2xpZW50LmVuZERyZWFtKCk7CisgICAgICAgIC8vIFJ1biBhbnkgc2NoZWR1bGVkIFJ1bm5hYmxlcy4KKyAgICAgICAgbU1haW5FeGVjdXRvci5ydW5BbGxSZWFkeSgpOworCisgICAgICAgIC8vIFRoZSBvdmVybGF5IHN0YXJ0cyB0aGVuIGZpbmlzaGVzLgorICAgICAgICBJbk9yZGVyIGluT3JkZXIgPSBpbk9yZGVyKG1XaW5kb3dNYW5hZ2VyKTsKKyAgICAgICAgaW5PcmRlci52ZXJpZnkobVdpbmRvd01hbmFnZXIpLmFkZFZpZXcobVZpZXdDYXB0b3IuY2FwdHVyZSgpLCBhbnkoKSk7CisgICAgICAgIGluT3JkZXIudmVyaWZ5KG1XaW5kb3dNYW5hZ2VyKS5yZW1vdmVWaWV3KG1WaWV3Q2FwdG9yLmdldFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuZERyZWFtRHVyaW5nU3RhcnREcmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJRHJlYW1PdmVybGF5Q2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworCisgICAgICAgIC8vIFNjaGVkdWxlIHRoZSBlbmREcmVhbSBjYWxsIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0YXJ0RHJlYW0gaW1wbGVtZW50YXRpb24sIGFzIGFueQorICAgICAgICAvLyBvcmRlcmluZyBpcyBwb3NzaWJsZS4KKyAgICAgICAgZG9BbnN3ZXIoaW52b2NhdGlvbiAtPiB7CisgICAgICAgICAgICBjbGllbnQuZW5kRHJlYW0oKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9KS53aGVuKG1TdGF0ZUNvbnRyb2xsZXIpLnNldE92ZXJsYXlBY3RpdmUodHJ1ZSk7CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIGRyZWFtLgorICAgICAgICBjbGllbnQuc3RhcnREcmVhbShtV2luZG93UGFyYW1zLCBtRHJlYW1PdmVybGF5Q2FsbGJhY2ssIERSRUFNX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICAgICBmYWxzZSAvKnNob3VsZFNob3dDb21wbGljYXRpb24qLyk7CisgICAgICAgIG1NYWluRXhlY3V0b3IucnVuQWxsUmVhZHkoKTsKKworICAgICAgICAvLyBUaGUgb3ZlcmxheSBzdGFydHMgdGhlbiBmaW5pc2hlcy4KKyAgICAgICAgSW5PcmRlciBpbk9yZGVyID0gaW5PcmRlcihtV2luZG93TWFuYWdlcik7CisgICAgICAgIGluT3JkZXIudmVyaWZ5KG1XaW5kb3dNYW5hZ2VyKS5hZGRWaWV3KG1WaWV3Q2FwdG9yLmNhcHR1cmUoKSwgYW55KCkpOworICAgICAgICBpbk9yZGVyLnZlcmlmeShtV2luZG93TWFuYWdlcikucmVtb3ZlVmlldyhtVmlld0NhcHRvci5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZXN0cm95KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIElEcmVhbU92ZXJsYXlDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL0NvbXBsaWNhdGlvblR5cGVzVXBkYXRlclRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9kcmVhbXMvY29tcGxpY2F0aW9uL0NvbXBsaWNhdGlvblR5cGVzVXBkYXRlclRlc3QuamF2YQppbmRleCBiMzMyOWViLi4wZTE2YjQ3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZHJlYW1zL2NvbXBsaWNhdGlvbi9Db21wbGljYXRpb25UeXBlc1VwZGF0ZXJUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2RyZWFtcy9jb21wbGljYXRpb24vQ29tcGxpY2F0aW9uVHlwZXNVcGRhdGVyVGVzdC5qYXZhCkBAIC0xNyw3ICsxNyw2IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRyZWFtcy5jb21wbGljYXRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlJbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuZXE7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubmV2ZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CkBAIC0zNiw3ICszNSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZHJlYW1zLkRyZWFtT3ZlcmxheVN0YXRlQ29udHJvbGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zaGFyZWQuY29uZGl0aW9uLk1vbml0b3I7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5jb25jdXJyZW5jeS5GYWtlRXhlY3V0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5zZXR0aW5ncy5TZWN1cmVTZXR0aW5nczsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnNldHRpbmdzLkZha2VTZXR0aW5nczsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnRpbWUuRmFrZVN5c3RlbUNsb2NrOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTU3LDggKzU2LDcgQEAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAgICAgQE1vY2sKICAgICBwcml2YXRlIERyZWFtQmFja2VuZCBtRHJlYW1CYWNrZW5kOwotICAgIEBNb2NrCi0gICAgcHJpdmF0ZSBTZWN1cmVTZXR0aW5ncyBtU2VjdXJlU2V0dGluZ3M7CisgICAgcHJpdmF0ZSBGYWtlU2V0dGluZ3MgbVNlY3VyZVNldHRpbmdzOwogICAgIEBNb2NrCiAgICAgcHJpdmF0ZSBEcmVhbU92ZXJsYXlTdGF0ZUNvbnRyb2xsZXIgbURyZWFtT3ZlcmxheVN0YXRlQ29udHJvbGxlcjsKICAgICBAQ2FwdG9yCkBAIC03NCw2ICs3Miw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcyk7CiAgICAgICAgIHdoZW4obURyZWFtQmFja2VuZC5nZXRFbmFibGVkQ29tcGxpY2F0aW9ucygpKS50aGVuUmV0dXJuKG5ldyBIYXNoU2V0PD4oKSk7CisgICAgICAgIG1TZWN1cmVTZXR0aW5ncyA9IG5ldyBGYWtlU2V0dGluZ3MoKTsKIAogICAgICAgICBtTW9uaXRvciA9IFNlbGZFeGVjdXRpbmdNb25pdG9yLmNyZWF0ZUluc3RhbmNlKCk7CiAgICAgICAgIG1Db250cm9sbGVyID0gbmV3IENvbXBsaWNhdGlvblR5cGVzVXBkYXRlcihtRHJlYW1CYWNrZW5kLCBtRXhlY3V0b3IsCkBAIC0xMDAsMTkgKzk5LDE1IEBACiAgICAgICAgIHdoZW4obURyZWFtQmFja2VuZC5nZXRFbmFibGVkQ29tcGxpY2F0aW9ucygpKS50aGVuUmV0dXJuKG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgKICAgICAgICAgICAgICAgICBEcmVhbUJhY2tlbmQuQ09NUExJQ0FUSU9OX1RZUEVfVElNRSwgRHJlYW1CYWNrZW5kLkNPTVBMSUNBVElPTl9UWVBFX1dFQVRIRVIsCiAgICAgICAgICAgICAgICAgRHJlYW1CYWNrZW5kLkNPTVBMSUNBVElPTl9UWVBFX0FJUl9RVUFMSVRZKSkpOwotICAgICAgICBmaW5hbCBDb250ZW50T2JzZXJ2ZXIgc2V0dGluZ3NPYnNlcnZlciA9IGNhcHR1cmVTZXR0aW5nc09ic2VydmVyKCk7Ci0gICAgICAgIHNldHRpbmdzT2JzZXJ2ZXIub25DaGFuZ2UoZmFsc2UpOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2V0dGluZyB0byB0cmlnZ2VyIGFueSBjb250ZW50IG9ic2VydmVycworICAgICAgICBtU2VjdXJlU2V0dGluZ3MucHV0Qm9vbEZvclVzZXIoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlNDUkVFTlNBVkVSX0NPTVBMSUNBVElPTlNfRU5BQkxFRCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICBVc2VySGFuZGxlLm15VXNlcklkKCkpOwogICAgICAgICBtRXhlY3V0b3IucnVuQWxsUmVhZHkoKTsKIAogICAgICAgICB2ZXJpZnkobURyZWFtT3ZlcmxheVN0YXRlQ29udHJvbGxlcikuc2V0QXZhaWxhYmxlQ29tcGxpY2F0aW9uVHlwZXMoCiAgICAgICAgICAgICAgICAgQ29tcGxpY2F0aW9uLkNPTVBMSUNBVElPTl9UWVBFX1RJTUUgfCBDb21wbGljYXRpb24uQ09NUExJQ0FUSU9OX1RZUEVfV0VBVEhFUgogICAgICAgICAgICAgICAgICAgICAgICAgfCBDb21wbGljYXRpb24uQ09NUExJQ0FUSU9OX1RZUEVfQUlSX1FVQUxJVFkpOwogICAgIH0KLQotICAgIHByaXZhdGUgQ29udGVudE9ic2VydmVyIGNhcHR1cmVTZXR0aW5nc09ic2VydmVyKCkgewotICAgICAgICB2ZXJpZnkobVNlY3VyZVNldHRpbmdzKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlckZvclVzZXIoCi0gICAgICAgICAgICAgICAgZXEoU2V0dGluZ3MuU2VjdXJlLlNDUkVFTlNBVkVSX0NPTVBMSUNBVElPTlNfRU5BQkxFRCksCi0gICAgICAgICAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXJDYXB0b3IuY2FwdHVyZSgpLCBlcShVc2VySGFuZGxlLm15VXNlcklkKCkpKTsKLSAgICAgICAgcmV0dXJuIG1TZXR0aW5nc09ic2VydmVyQ2FwdG9yLmdldFZhbHVlKCk7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZlYXR1cmVGbGFnc0RlYnVnVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GZWF0dXJlRmxhZ3NEZWJ1Z1Rlc3Qua3QKaW5kZXggMmJjZDc1Yi4uMThmN2RiMSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZlYXR1cmVGbGFnc0RlYnVnVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzRGVidWdUZXN0Lmt0CkBAIC0zNyw2ICszNyw3IEBACiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5hbnlCb29sZWFuCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5hbnlTdHJpbmcKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLmluT3JkZXIKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lcwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMKQEAgLTUzLDcgKzU0LDcgQEAKICAqLwogQFNtYWxsVGVzdAogY2xhc3MgRmVhdHVyZUZsYWdzRGVidWdUZXN0IDogU3lzdWlUZXN0Q2FzZSgpIHsKLSAgICBwcml2YXRlIGxhdGVpbml0IHZhciBtRmVhdHVyZUZsYWdzRGVidWc6IEZlYXR1cmVGbGFnc0RlYnVnCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgZmVhdHVyZUZsYWdzRGVidWc6IEZlYXR1cmVGbGFnc0RlYnVnCiAKICAgICBATW9jawogICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGZsYWdNYW5hZ2VyOiBGbGFnTWFuYWdlcgpAQCAtODUsNyArODYsNyBAQAogICAgICAgICBmbGFnTWFwLnB1dChGbGFncy5URUFNRk9PRC5uYW1lLCBGbGFncy5URUFNRk9PRCkKICAgICAgICAgZmxhZ01hcC5wdXQodGVhbWZvb2RhYmxlRmxhZ0EubmFtZSwgdGVhbWZvb2RhYmxlRmxhZ0EpCiAgICAgICAgIGZsYWdNYXAucHV0KHRlYW1mb29kYWJsZUZsYWdCLm5hbWUsIHRlYW1mb29kYWJsZUZsYWdCKQotICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcgPSBGZWF0dXJlRmxhZ3NEZWJ1ZygKKyAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcgPSBGZWF0dXJlRmxhZ3NEZWJ1ZygKICAgICAgICAgICAgIGZsYWdNYW5hZ2VyLAogICAgICAgICAgICAgbW9ja0NvbnRleHQsCiAgICAgICAgICAgICBnbG9iYWxTZXR0aW5ncywKQEAgLTk1LDcgKzk2LDcgQEAKICAgICAgICAgICAgIGZsYWdNYXAsCiAgICAgICAgICAgICByZXN0YXJ0ZXIKICAgICAgICAgKQotICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuaW5pdCgpCisgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmluaXQoKQogICAgICAgICB2ZXJpZnkoZmxhZ01hbmFnZXIpLm9uU2V0dGluZ3NDaGFuZ2VkQWN0aW9uID0gYW55KCkKICAgICAgICAgYnJvYWRjYXN0UmVjZWl2ZXIgPSB3aXRoQXJnQ2FwdG9yIHsKICAgICAgICAgICAgIHZlcmlmeShtb2NrQ29udGV4dCkucmVnaXN0ZXJSZWNlaXZlcigKQEAgLTExNiw3ICsxMTcsNyBAQAogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPEJvb2xlYW4+KGVxKCI0IiksIGFueSgpKSkudGhlblJldHVybihmYWxzZSkKIAogICAgICAgICBhc3NlcnRUaGF0KAotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCgKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCgKICAgICAgICAgICAgICAgICBSZWxlYXNlZEZsYWcoCiAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiMiIsCkBAIC0xMjUsNyArMTI2LDcgQEAKICAgICAgICAgICAgICkKICAgICAgICAgKS5pc1RydWUoKQogICAgICAgICBhc3NlcnRUaGF0KAotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCgKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCgKICAgICAgICAgICAgICAgICBVbnJlbGVhc2VkRmxhZygKICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIzIiwKQEAgLTEzNCw3ICsxMzUsNyBAQAogICAgICAgICAgICAgKQogICAgICAgICApLmlzVHJ1ZSgpCiAgICAgICAgIGFzc2VydFRoYXQoCi0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKAorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKAogICAgICAgICAgICAgICAgIFJlbGVhc2VkRmxhZygKICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICI0IiwKQEAgLTE0Myw3ICsxNDQsNyBAQAogICAgICAgICAgICAgKQogICAgICAgICApLmlzRmFsc2UoKQogICAgICAgICBhc3NlcnRUaGF0KAotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCgKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCgKICAgICAgICAgICAgICAgICBVbnJlbGVhc2VkRmxhZygKICAgICAgICAgICAgICAgICAgICAgNSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICI1IiwKQEAgLTE1Nyw4ICsxNTgsOCBAQAogICAgIGZ1biB0ZWFtRm9vZEZsYWdfRmFsc2UoKSB7CiAgICAgICAgIHdoZW5ldmVyKGZsYWdNYW5hZ2VyLnJlYWRGbGFnVmFsdWU8Qm9vbGVhbj4oCiAgICAgICAgICAgICBlcShGbGFncy5URUFNRk9PRC5uYW1lKSwgYW55KCkpKS50aGVuUmV0dXJuKGZhbHNlKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQodGVhbWZvb2RhYmxlRmxhZ0EpKS5pc0ZhbHNlKCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKHRlYW1mb29kYWJsZUZsYWdCKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQodGVhbWZvb2RhYmxlRmxhZ0EpKS5pc0ZhbHNlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQodGVhbWZvb2RhYmxlRmxhZ0IpKS5pc1RydWUoKQogCiAgICAgICAgIC8vIFJlZ3VsYXIgYm9vbGVhbiBmbGFncyBzaG91bGQgc3RpbGwgdGVzdCB0aGUgc2FtZS4KICAgICAgICAgLy8gT25seSBvdXIgdGVhbWZvb2RhYmxlRmxhZyBzaG91bGQgY2hhbmdlLgpAQCAtMTY5LDggKzE3MCw4IEBACiAgICAgZnVuIHRlYW1Gb29kRmxhZ19UcnVlKCkgewogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPEJvb2xlYW4+KAogICAgICAgICAgICAgZXEoRmxhZ3MuVEVBTUZPT0QubmFtZSksIGFueSgpKSkudGhlblJldHVybih0cnVlKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQodGVhbWZvb2RhYmxlRmxhZ0EpKS5pc1RydWUoKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQodGVhbWZvb2RhYmxlRmxhZ0IpKS5pc1RydWUoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCh0ZWFtZm9vZGFibGVGbGFnQSkpLmlzVHJ1ZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKHRlYW1mb29kYWJsZUZsYWdCKSkuaXNUcnVlKCkKIAogICAgICAgICAvLyBSZWd1bGFyIGJvb2xlYW4gZmxhZ3Mgc2hvdWxkIHN0aWxsIHRlc3QgdGhlIHNhbWUuCiAgICAgICAgIC8vIE9ubHkgb3VyIHRlYW1mb29kYWJsZUZsYWcgc2hvdWxkIGNoYW5nZS4KQEAgLTE4NSw4ICsxODYsOCBAQAogICAgICAgICAgICAgLnRoZW5SZXR1cm4oZmFsc2UpCiAgICAgICAgIHdoZW5ldmVyKGZsYWdNYW5hZ2VyLnJlYWRGbGFnVmFsdWU8Qm9vbGVhbj4oCiAgICAgICAgICAgICBlcShGbGFncy5URUFNRk9PRC5uYW1lKSwgYW55KCkpKS50aGVuUmV0dXJuKHRydWUpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCh0ZWFtZm9vZGFibGVGbGFnQSkpLmlzVHJ1ZSgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCh0ZWFtZm9vZGFibGVGbGFnQikpLmlzRmFsc2UoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCh0ZWFtZm9vZGFibGVGbGFnQSkpLmlzVHJ1ZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKHRlYW1mb29kYWJsZUZsYWdCKSkuaXNGYWxzZSgpCiAKICAgICAgICAgLy8gUmVndWxhciBib29sZWFuIGZsYWdzIHNob3VsZCBzdGlsbCB0ZXN0IHRoZSBzYW1lLgogICAgICAgICAvLyBPbmx5IG91ciB0ZWFtZm9vZGFibGVGbGFnIHNob3VsZCBjaGFuZ2UuCkBAIC0yMDUsNyArMjA2LDcgQEAKICAgICAgICAgd2hlbmV2ZXIoZmxhZ01hbmFnZXIucmVhZEZsYWdWYWx1ZTxCb29sZWFuPihlcSgiNSIpLCBhbnkoKSkpLnRoZW5SZXR1cm4oZmFsc2UpCiAKICAgICAgICAgYXNzZXJ0VGhhdCgKLSAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoCiAgICAgICAgICAgICAgICAgUmVzb3VyY2VCb29sZWFuRmxhZygKICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgIjEiLApAQCAtMjE0LDE2ICsyMTUsMTYgQEAKICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICApCiAgICAgICAgICkuaXNGYWxzZSgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChSZXNvdXJjZUJvb2xlYW5GbGFnKDIsICIyIiwgInRlc3QiLCAxMDAyKSkpLmlzVHJ1ZSgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChSZXNvdXJjZUJvb2xlYW5GbGFnKDMsICIzIiwgInRlc3QiLCAxMDAzKSkpLmlzVHJ1ZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFJlc291cmNlQm9vbGVhbkZsYWcoMiwgIjIiLCAidGVzdCIsIDEwMDIpKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoUmVzb3VyY2VCb29sZWFuRmxhZygzLCAiMyIsICJ0ZXN0IiwgMTAwMykpKS5pc1RydWUoKQogCiAgICAgICAgIEFzc2VydC5hc3NlcnRUaHJvd3MoTmFtZU5vdEZvdW5kRXhjZXB0aW9uOjpjbGFzcy5qYXZhKSB7Ci0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFJlc291cmNlQm9vbGVhbkZsYWcoNCwgIjQiLCAidGVzdCIsIDEwMDQpKQorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFJlc291cmNlQm9vbGVhbkZsYWcoNCwgIjQiLCAidGVzdCIsIDEwMDQpKQogICAgICAgICB9CiAgICAgICAgIC8vIFRlc3QgdGhhdCByZXNvdXJjZSBpcyBsb2FkZWQgKGFuZCB2YWxpZGF0ZWQpIGV2ZW4gd2hlbiB0aGUgc2V0dGluZyBpcyBzZXQuCiAgICAgICAgIC8vICBUaGlzIHByZXZlbnRzIGRldmVsb3BlcnMgZnJvbSBub3Qgbm90aWNpbmcgd2hlbiB0aGV5IHJlZmVyZW5jZSBhbiBpbnZhbGlkIHJlc291cmNlLgogICAgICAgICBBc3NlcnQuYXNzZXJ0VGhyb3dzKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjo6Y2xhc3MuamF2YSkgewotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChSZXNvdXJjZUJvb2xlYW5GbGFnKDUsICI1IiwgInRlc3QiLCAxMDA1KSkKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChSZXNvdXJjZUJvb2xlYW5GbGFnKDUsICI1IiwgInRlc3QiLCAxMDA1KSkKICAgICAgICAgfQogICAgIH0KIApAQCAtMjM2LDExICsyMzcsMTEgQEAKICAgICAgICAgICAgIHJldHVybkB0aGVuQW5zd2VyIGl0LmdldEFyZ3VtZW50KDEpCiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoU3lzUHJvcEJvb2xlYW5GbGFnKDEsICJhIiwgInRlc3QiKSkpLmlzRmFsc2UoKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoU3lzUHJvcEJvb2xlYW5GbGFnKDIsICJiIiwgInRlc3QiKSkpLmlzVHJ1ZSgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChTeXNQcm9wQm9vbGVhbkZsYWcoMywgImMiLCAidGVzdCIsIHRydWUpKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoU3lzUHJvcEJvb2xlYW5GbGFnKDEsICJhIiwgInRlc3QiKSkpLmlzRmFsc2UoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChTeXNQcm9wQm9vbGVhbkZsYWcoMiwgImIiLCAidGVzdCIpKSkuaXNUcnVlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoU3lzUHJvcEJvb2xlYW5GbGFnKDMsICJjIiwgInRlc3QiLCB0cnVlKSkpLmlzVHJ1ZSgpCiAgICAgICAgIGFzc2VydFRoYXQoCi0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKAorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKAogICAgICAgICAgICAgICAgIFN5c1Byb3BCb29sZWFuRmxhZygKICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgImQiLApAQCAtMjQ5LDE3ICsyNTAsMTcgQEAKICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICApCiAgICAgICAgICkuaXNGYWxzZSgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChTeXNQcm9wQm9vbGVhbkZsYWcoNSwgImUiLCAidGVzdCIpKSkuaXNGYWxzZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKFN5c1Byb3BCb29sZWFuRmxhZyg1LCAiZSIsICJ0ZXN0IikpKS5pc0ZhbHNlKCkKICAgICB9CiAKICAgICBAVGVzdAogICAgIGZ1biByZWFkU3RyaW5nRmxhZygpIHsKICAgICAgICAgd2hlbmV2ZXIoZmxhZ01hbmFnZXIucmVhZEZsYWdWYWx1ZTxTdHJpbmc+KGVxKCIzIiksIGFueSgpKSkudGhlblJldHVybigiZm9vIikKICAgICAgICAgd2hlbmV2ZXIoZmxhZ01hbmFnZXIucmVhZEZsYWdWYWx1ZTxTdHJpbmc+KGVxKCI0IiksIGFueSgpKSkudGhlblJldHVybigiYmFyIikKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFN0cmluZ0ZsYWcoMSwgIjEiLCAidGVzdCIsICJiaXoiKSkpLmlzRXF1YWxUbygiYml6IikKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFN0cmluZ0ZsYWcoMiwgIjIiLCAidGVzdCIsICJiYXoiKSkpLmlzRXF1YWxUbygiYmF6IikKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFN0cmluZ0ZsYWcoMywgIjMiLCAidGVzdCIsICJidXoiKSkpLmlzRXF1YWxUbygiZm9vIikKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFN0cmluZ0ZsYWcoNCwgIjQiLCAidGVzdCIsICJidXoiKSkpLmlzRXF1YWxUbygiYmFyIikKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoU3RyaW5nRmxhZygxLCAiMSIsICJ0ZXN0IiwgImJpeiIpKSkuaXNFcXVhbFRvKCJiaXoiKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhTdHJpbmdGbGFnKDIsICIyIiwgInRlc3QiLCAiYmF6IikpKS5pc0VxdWFsVG8oImJheiIpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFN0cmluZ0ZsYWcoMywgIjMiLCAidGVzdCIsICJidXoiKSkpLmlzRXF1YWxUbygiZm9vIikKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoU3RyaW5nRmxhZyg0LCAiNCIsICJ0ZXN0IiwgImJ1eiIpKSkuaXNFcXVhbFRvKCJiYXIiKQogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNzYsNyArMjc3LDcgQEAKICAgICAgICAgd2hlbmV2ZXIoZmxhZ01hbmFnZXIucmVhZEZsYWdWYWx1ZTxTdHJpbmc+KGVxKCI2IiksIGFueSgpKSkudGhlblJldHVybigib3ZlcnJpZGU2IikKIAogICAgICAgICBhc3NlcnRUaGF0KAotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZygKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZygKICAgICAgICAgICAgICAgICBSZXNvdXJjZVN0cmluZ0ZsYWcoCiAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICIxIiwKQEAgLTI4Niw3ICsyODcsNyBAQAogICAgICAgICAgICAgKQogICAgICAgICApLmlzRXF1YWxUbygiIikKICAgICAgICAgYXNzZXJ0VGhhdCgKLSAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgUmVzb3VyY2VTdHJpbmdGbGFnKAogICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAiMiIsCkBAIC0yOTYsNyArMjk3LDcgQEAKICAgICAgICAgICAgICkKICAgICAgICAgKS5pc0VxdWFsVG8oInJlc291cmNlMiIpCiAgICAgICAgIGFzc2VydFRoYXQoCi0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKAorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgIFJlc291cmNlU3RyaW5nRmxhZygKICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgIjMiLApAQCAtMzA3LDE1ICszMDgsMTUgQEAKICAgICAgICAgKS5pc0VxdWFsVG8oIm92ZXJyaWRlMyIpCiAKICAgICAgICAgQXNzZXJ0LmFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbjo6Y2xhc3MuamF2YSkgewotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhSZXNvdXJjZVN0cmluZ0ZsYWcoNCwgIjQiLCAidGVzdCIsIDEwMDQpKQorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFJlc291cmNlU3RyaW5nRmxhZyg0LCAiNCIsICJ0ZXN0IiwgMTAwNCkpCiAgICAgICAgIH0KICAgICAgICAgQXNzZXJ0LmFzc2VydFRocm93cyhOYW1lTm90Rm91bmRFeGNlcHRpb246OmNsYXNzLmphdmEpIHsKLSAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoUmVzb3VyY2VTdHJpbmdGbGFnKDUsICI1IiwgInRlc3QiLCAxMDA1KSkKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhSZXNvdXJjZVN0cmluZ0ZsYWcoNSwgIjUiLCAidGVzdCIsIDEwMDUpKQogICAgICAgICB9CiAgICAgICAgIC8vIFRlc3QgdGhhdCByZXNvdXJjZSBpcyBsb2FkZWQgKGFuZCB2YWxpZGF0ZWQpIGV2ZW4gd2hlbiB0aGUgc2V0dGluZyBpcyBzZXQuCiAgICAgICAgIC8vICBUaGlzIHByZXZlbnRzIGRldmVsb3BlcnMgZnJvbSBub3Qgbm90aWNpbmcgd2hlbiB0aGV5IHJlZmVyZW5jZSBhbiBpbnZhbGlkIHJlc291cmNlLgogICAgICAgICBBc3NlcnQuYXNzZXJ0VGhyb3dzKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjo6Y2xhc3MuamF2YSkgewotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhSZXNvdXJjZVN0cmluZ0ZsYWcoNiwgIjYiLCAidGVzdCIsIDEwMDUpKQorICAgICAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKFJlc291cmNlU3RyaW5nRmxhZyg2LCAiNiIsICJ0ZXN0IiwgMTAwNSkpCiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyMywxMCArMzI0LDEwIEBACiAgICAgZnVuIHJlYWRJbnRGbGFnKCkgewogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPEludD4oZXEoIjMiKSwgYW55KCkpKS50aGVuUmV0dXJuKDIyKQogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPEludD4oZXEoIjQiKSwgYW55KCkpKS50aGVuUmV0dXJuKDQ4KQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoSW50RmxhZygxLCAiMSIsICJ0ZXN0IiwgMTIpKSkuaXNFcXVhbFRvKDEyKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoSW50RmxhZygyLCAiMiIsICJ0ZXN0IiwgOTMpKSkuaXNFcXVhbFRvKDkzKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoSW50RmxhZygzLCAiMyIsICJ0ZXN0IiwgOCkpKS5pc0VxdWFsVG8oMjIpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldEludChJbnRGbGFnKDQsICI0IiwgInRlc3QiLCAyMzQpKSkuaXNFcXVhbFRvKDQ4KQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldEludChJbnRGbGFnKDEsICIxIiwgInRlc3QiLCAxMikpKS5pc0VxdWFsVG8oMTIpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KEludEZsYWcoMiwgIjIiLCAidGVzdCIsIDkzKSkpLmlzRXF1YWxUbyg5MykKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoSW50RmxhZygzLCAiMyIsICJ0ZXN0IiwgOCkpKS5pc0VxdWFsVG8oMjIpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KEludEZsYWcoNCwgIjQiLCAidGVzdCIsIDIzNCkpKS5pc0VxdWFsVG8oNDgpCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM0MiwxNyArMzQzLDE3IEBACiAgICAgICAgIHdoZW5ldmVyKGZsYWdNYW5hZ2VyLnJlYWRGbGFnVmFsdWU8SW50PihlcSg0KSwgYW55KCkpKS50aGVuUmV0dXJuKDUwMCkKICAgICAgICAgd2hlbmV2ZXIoZmxhZ01hbmFnZXIucmVhZEZsYWdWYWx1ZTxJbnQ+KGVxKDUpLCBhbnkoKSkpLnRoZW5SZXR1cm4oOTUxOSkKIAotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoUmVzb3VyY2VJbnRGbGFnKDEsICIxIiwgInRlc3QiLCAxMDAxKSkpLmlzRXF1YWxUbyg4OCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KFJlc291cmNlSW50RmxhZygyLCAiMiIsICJ0ZXN0IiwgMTAwMikpKS5pc0VxdWFsVG8oNjEpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldEludChSZXNvdXJjZUludEZsYWcoMywgIjMiLCAidGVzdCIsIDEwMDMpKSkuaXNFcXVhbFRvKDIwKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldEludChSZXNvdXJjZUludEZsYWcoMSwgIjEiLCAidGVzdCIsIDEwMDEpKSkuaXNFcXVhbFRvKDg4KQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldEludChSZXNvdXJjZUludEZsYWcoMiwgIjIiLCAidGVzdCIsIDEwMDIpKSkuaXNFcXVhbFRvKDYxKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldEludChSZXNvdXJjZUludEZsYWcoMywgIjMiLCAidGVzdCIsIDEwMDMpKSkuaXNFcXVhbFRvKDIwKQogCiAgICAgICAgIEFzc2VydC5hc3NlcnRUaHJvd3MoTm90Rm91bmRFeGNlcHRpb246OmNsYXNzLmphdmEpIHsKLSAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoUmVzb3VyY2VJbnRGbGFnKDQsICI0IiwgInRlc3QiLCAxMDA0KSkKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmdldEludChSZXNvdXJjZUludEZsYWcoNCwgIjQiLCAidGVzdCIsIDEwMDQpKQogICAgICAgICB9CiAgICAgICAgIC8vIFRlc3QgdGhhdCByZXNvdXJjZSBpcyBsb2FkZWQgKGFuZCB2YWxpZGF0ZWQpIGV2ZW4gd2hlbiB0aGUgc2V0dGluZyBpcyBzZXQuCiAgICAgICAgIC8vICBUaGlzIHByZXZlbnRzIGRldmVsb3BlcnMgZnJvbSBub3Qgbm90aWNpbmcgd2hlbiB0aGV5IHJlZmVyZW5jZSBhbiBpbnZhbGlkIHJlc291cmNlLgogICAgICAgICBBc3NlcnQuYXNzZXJ0VGhyb3dzKE5vdEZvdW5kRXhjZXB0aW9uOjpjbGFzcy5qYXZhKSB7Ci0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzRGVidWcuZ2V0SW50KFJlc291cmNlSW50RmxhZyg1LCAiNSIsICJ0ZXN0IiwgMTAwNSkpCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRJbnQoUmVzb3VyY2VJbnRGbGFnKDUsICI1IiwgInRlc3QiLCAxMDA1KSkKICAgICAgICAgfQogICAgIH0KIApAQCAtNDMyLDExICs0MzMsMTEgQEAKICAgICAgICAgd2hlbmV2ZXIoZmxhZ01hbmFnZXIucmVhZEZsYWdWYWx1ZTxTdHJpbmc+KGVxKCIxIiksIGFueSgpKSkudGhlblJldHVybigib3JpZ2luYWwiKQogCiAgICAgICAgIC8vIGdldHMgdGhlIGZsYWcgJiBjYWNoZSBpdAotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzEpKS5pc0VxdWFsVG8oIm9yaWdpbmFsIikKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzEpKS5pc0VxdWFsVG8oIm9yaWdpbmFsIikKICAgICAgICAgdmVyaWZ5KGZsYWdNYW5hZ2VyLCB0aW1lcygxKSkucmVhZEZsYWdWYWx1ZShlcSgiMSIpLCBlcShTdHJpbmdGbGFnU2VyaWFsaXplcikpCiAKICAgICAgICAgLy8gaGl0IHRoZSBjYWNoZQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzEpKS5pc0VxdWFsVG8oIm9yaWdpbmFsIikKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzEpKS5pc0VxdWFsVG8oIm9yaWdpbmFsIikKICAgICAgICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKGZsYWdNYW5hZ2VyKQogCiAgICAgICAgIC8vIHNldCB0aGUgZmxhZwpAQCAtNDQ0LDcgKzQ0NSw3IEBACiAgICAgICAgIHZlcmlmeVB1dERhdGEoIjEiLCAie1widHlwZVwiOlwic3RyaW5nXCIsXCJ2YWx1ZVwiOlwibmV3XCJ9IiwgbnVtUmVhZHMgPSAyKQogICAgICAgICB3aGVuZXZlcihmbGFnTWFuYWdlci5yZWFkRmxhZ1ZhbHVlPFN0cmluZz4oZXEoIjEiKSwgYW55KCkpKS50aGVuUmV0dXJuKCJuZXciKQogCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnMSkpLmlzRXF1YWxUbygibmV3IikKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzEpKS5pc0VxdWFsVG8oIm5ldyIpCiAgICAgICAgIHZlcmlmeShmbGFnTWFuYWdlciwgdGltZXMoMykpLnJlYWRGbGFnVmFsdWUoZXEoIjEiKSwgZXEoU3RyaW5nRmxhZ1NlcmlhbGl6ZXIpKQogICAgIH0KIApAQCAtNDU0LDcgKzQ1NSw3IEBACiAKICAgICAgICAgc2VydmVyRmxhZ1JlYWRlci5zZXRGbGFnVmFsdWUoZmxhZy5uYW1lc3BhY2UsIGZsYWcubmFtZSwgZmFsc2UpCiAKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKGZsYWcpKS5pc0ZhbHNlKCkKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoZmxhZykpLmlzRmFsc2UoKQogICAgIH0KIAogICAgIEBUZXN0CkBAIC00NjIsNyArNDYzLDMzIEBACiAgICAgICAgIHZhbCBmbGFnID0gVW5yZWxlYXNlZEZsYWcoMTAwLCBuYW1lID0gIjEwMCIsIG5hbWVzcGFjZSA9ICJ0ZXN0IikKIAogICAgICAgICBzZXJ2ZXJGbGFnUmVhZGVyLnNldEZsYWdWYWx1ZShmbGFnLm5hbWVzcGFjZSwgZmxhZy5uYW1lLCB0cnVlKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoZmxhZykpLmlzVHJ1ZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKGZsYWcpKS5pc1RydWUoKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNlcnZlclNpZGVfT3ZlcnJpZGVVbmNhY2hlZF9Ob1Jlc3RhcnQoKSB7CisgICAgICAgIC8vIE5vIG9uZSBoYXMgcmVhZCB0aGUgZmxhZywgc28gaXQncyBub3QgaW4gdGhlIGNhY2hlLgorICAgICAgICBzZXJ2ZXJGbGFnUmVhZGVyLnNldEZsYWdWYWx1ZSgKKyAgICAgICAgICAgIHRlYW1mb29kYWJsZUZsYWdBLm5hbWVzcGFjZSwgdGVhbWZvb2RhYmxlRmxhZ0EubmFtZSwgIXRlYW1mb29kYWJsZUZsYWdBLmRlZmF1bHQpCisgICAgICAgIHZlcmlmeShyZXN0YXJ0ZXIsIG5ldmVyKCkpLnJlc3RhcnRTeXN0ZW1VSShhbnlTdHJpbmcoKSkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBzZXJ2ZXJTaWRlX092ZXJyaWRlX1Jlc3RhcnRzKCkgeworICAgICAgICAvLyBSZWFkIGl0IHRvIHB1dCBpdCBpbiB0aGUgY2FjaGUuCisgICAgICAgIGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZCh0ZWFtZm9vZGFibGVGbGFnQSkKKyAgICAgICAgc2VydmVyRmxhZ1JlYWRlci5zZXRGbGFnVmFsdWUoCisgICAgICAgICAgICB0ZWFtZm9vZGFibGVGbGFnQS5uYW1lc3BhY2UsIHRlYW1mb29kYWJsZUZsYWdBLm5hbWUsICF0ZWFtZm9vZGFibGVGbGFnQS5kZWZhdWx0KQorICAgICAgICB2ZXJpZnkocmVzdGFydGVyKS5yZXN0YXJ0U3lzdGVtVUkoYW55U3RyaW5nKCkpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gc2VydmVyU2lkZV9SZWR1bmRhbnRPdmVycmlkZV9Ob1Jlc3RhcnQoKSB7CisgICAgICAgIC8vIFJlYWQgaXQgdG8gcHV0IGl0IGluIHRoZSBjYWNoZS4KKyAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKHRlYW1mb29kYWJsZUZsYWdBKQorICAgICAgICBzZXJ2ZXJGbGFnUmVhZGVyLnNldEZsYWdWYWx1ZSgKKyAgICAgICAgICAgIHRlYW1mb29kYWJsZUZsYWdBLm5hbWVzcGFjZSwgdGVhbWZvb2RhYmxlRmxhZ0EubmFtZSwgdGVhbWZvb2RhYmxlRmxhZ0EuZGVmYXVsdCkKKyAgICAgICAgdmVyaWZ5KHJlc3RhcnRlciwgbmV2ZXIoKSkucmVzdGFydFN5c3RlbVVJKGFueVN0cmluZygpKQogICAgIH0KIAogICAgIEBUZXN0CkBAIC00ODIsMTMgKzUwOSwxMyBAQAogICAgICAgICAgICAgLnRoZW5SZXR1cm4oIm92ZXJyaWRlNyIpCiAKICAgICAgICAgLy8gV0hFTiB0aGUgZmxhZ3MgaGF2ZSBiZWVuIGFjY2Vzc2VkCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChmbGFnMSkpLmlzVHJ1ZSgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChmbGFnMikpLmlzVHJ1ZSgpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChmbGFnMykpLmlzRmFsc2UoKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzQpKS5pc0VtcHR5KCkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKGZsYWc1KSkuaXNFcXVhbFRvKCJmbGFnNWRlZmF1bHQiKQotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzYpKS5pc0VxdWFsVG8oInJlc291cmNlMTAwNiIpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnNykpLmlzRXF1YWxUbygib3ZlcnJpZGU3IikKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5pc0VuYWJsZWQoZmxhZzEpKS5pc1RydWUoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmlzRW5hYmxlZChmbGFnMikpLmlzVHJ1ZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuaXNFbmFibGVkKGZsYWczKSkuaXNGYWxzZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKGZsYWc0KSkuaXNFbXB0eSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzRGVidWcuZ2V0U3RyaW5nKGZsYWc1KSkuaXNFcXVhbFRvKCJmbGFnNWRlZmF1bHQiKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc0RlYnVnLmdldFN0cmluZyhmbGFnNikpLmlzRXF1YWxUbygicmVzb3VyY2UxMDA2IikKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NEZWJ1Zy5nZXRTdHJpbmcoZmxhZzcpKS5pc0VxdWFsVG8oIm92ZXJyaWRlNyIpCiAKICAgICAgICAgLy8gVEhFTiB0aGUgZHVtcCBjb250YWlucyB0aGUgZmxhZ3MgYW5kIHRoZSBkZWZhdWx0IHZhbHVlcwogICAgICAgICB2YWwgZHVtcCA9IGR1bXBUb1N0cmluZygpCkBAIC01MjcsNyArNTU0LDcgQEAKICAgICBwcml2YXRlIGZ1biBkdW1wVG9TdHJpbmcoKTogU3RyaW5nIHsKICAgICAgICAgdmFsIHN3ID0gU3RyaW5nV3JpdGVyKCkKICAgICAgICAgdmFsIHB3ID0gUHJpbnRXcml0ZXIoc3cpCi0gICAgICAgIG1GZWF0dXJlRmxhZ3NEZWJ1Zy5kdW1wKHB3LCBlbXB0eUFycmF5PFN0cmluZz4oKSkKKyAgICAgICAgZmVhdHVyZUZsYWdzRGVidWcuZHVtcChwdywgZW1wdHlBcnJheTxTdHJpbmc+KCkpCiAgICAgICAgIHB3LmZsdXNoKCkKICAgICAgICAgcmV0dXJuIHN3LnRvU3RyaW5nKCkKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzUmVsZWFzZVRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvRmVhdHVyZUZsYWdzUmVsZWFzZVRlc3Qua3QKaW5kZXggNGM2MDI4Yy4uOTE3MTQ3YiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL0ZlYXR1cmVGbGFnc1JlbGVhc2VUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9GZWF0dXJlRmxhZ3NSZWxlYXNlVGVzdC5rdApAQCAtMjQsNiArMjQsOCBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmUKIGltcG9ydCBvcmcuanVuaXQuVGVzdAogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2sKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvCitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcgogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9ucwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8uYHdoZW5gIGFzIHdoZW5ldmVyCiAKQEAgLTMzLDcgKzM1LDcgQEAKICAqLwogQFNtYWxsVGVzdAogY2xhc3MgRmVhdHVyZUZsYWdzUmVsZWFzZVRlc3QgOiBTeXN1aVRlc3RDYXNlKCkgewotICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIG1GZWF0dXJlRmxhZ3NSZWxlYXNlOiBGZWF0dXJlRmxhZ3NSZWxlYXNlCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgZmVhdHVyZUZsYWdzUmVsZWFzZTogRmVhdHVyZUZsYWdzUmVsZWFzZQogCiAgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbVJlc291cmNlczogUmVzb3VyY2VzCiAgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbVN5c3RlbVByb3BlcnRpZXM6IFN5c3RlbVByb3BlcnRpZXNIZWxwZXIKQEAgLTQxLDE1ICs0MywyMSBAQAogICAgIHByaXZhdGUgdmFsIGZsYWdNYXAgPSBtdXRhYmxlTWFwT2Y8U3RyaW5nLCBGbGFnPCo+PigpCiAgICAgcHJpdmF0ZSB2YWwgc2VydmVyRmxhZ1JlYWRlciA9IFNlcnZlckZsYWdSZWFkZXJGYWtlKCkKIAorCisgICAgcHJpdmF0ZSB2YWwgZmxhZ0EgPSBSZWxlYXNlZEZsYWcoNTAxLCBuYW1lID0gImEiLCBuYW1lc3BhY2UgPSAidGVzdCIpCisKICAgICBAQmVmb3JlCiAgICAgZnVuIHNldHVwKCkgewogICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpCi0gICAgICAgIG1GZWF0dXJlRmxhZ3NSZWxlYXNlID0gRmVhdHVyZUZsYWdzUmVsZWFzZSgKKyAgICAgICAgZmxhZ01hcC5wdXQoZmxhZ0EubmFtZSwgZmxhZ0EpCisgICAgICAgIGZlYXR1cmVGbGFnc1JlbGVhc2UgPSBGZWF0dXJlRmxhZ3NSZWxlYXNlKAogICAgICAgICAgICAgbVJlc291cmNlcywKICAgICAgICAgICAgIG1TeXN0ZW1Qcm9wZXJ0aWVzLAogICAgICAgICAgICAgc2VydmVyRmxhZ1JlYWRlciwKICAgICAgICAgICAgIGZsYWdNYXAsCiAgICAgICAgICAgICByZXN0YXJ0ZXIpCisKKyAgICAgICAgZmVhdHVyZUZsYWdzUmVsZWFzZS5pbml0KCkKICAgICB9CiAKICAgICBAVGVzdApAQCAtNjAsNyArNjgsNyBAQAogICAgICAgICB2YWwgZmxhZ05hbWVzcGFjZSA9ICJ0ZXN0IgogICAgICAgICB2YWwgZmxhZyA9IFJlc291cmNlQm9vbGVhbkZsYWcoZmxhZ0lkLCBmbGFnTmFtZSwgZmxhZ05hbWVzcGFjZSwgZmxhZ1Jlc291cmNlSWQpCiAgICAgICAgIHdoZW5ldmVyKG1SZXNvdXJjZXMuZ2V0Qm9vbGVhbihmbGFnUmVzb3VyY2VJZCkpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzUmVsZWFzZS5pc0VuYWJsZWQoZmxhZykpLmlzVHJ1ZSgpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzUmVsZWFzZS5pc0VuYWJsZWQoZmxhZykpLmlzVHJ1ZSgpCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTcwLDE2ICs3OCwxNiBAQAogICAgICAgICB3aGVuZXZlcihtUmVzb3VyY2VzLmdldFN0cmluZygxMDAzKSkudGhlblJldHVybihudWxsKQogICAgICAgICB3aGVuZXZlcihtUmVzb3VyY2VzLmdldFN0cmluZygxMDA0KSkudGhlbkFuc3dlciB7IHRocm93IE5hbWVOb3RGb3VuZEV4Y2VwdGlvbigpIH0KIAotICAgICAgICBhc3NlcnRUaGF0KG1GZWF0dXJlRmxhZ3NSZWxlYXNlLmdldFN0cmluZygKKyAgICAgICAgYXNzZXJ0VGhhdChmZWF0dXJlRmxhZ3NSZWxlYXNlLmdldFN0cmluZygKICAgICAgICAgICAgIFJlc291cmNlU3RyaW5nRmxhZygxLCAiMSIsICJ0ZXN0IiwgMTAwMSkpKS5pc0VxdWFsVG8oIiIpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc1JlbGVhc2UuZ2V0U3RyaW5nKAorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc1JlbGVhc2UuZ2V0U3RyaW5nKAogICAgICAgICAgICAgUmVzb3VyY2VTdHJpbmdGbGFnKDIsICIyIiwgInRlc3QiLCAxMDAyKSkpLmlzRXF1YWxUbygicmVzMiIpCiAKICAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uOjpjbGFzcy5qYXZhKSB7Ci0gICAgICAgICAgICBtRmVhdHVyZUZsYWdzUmVsZWFzZS5nZXRTdHJpbmcoUmVzb3VyY2VTdHJpbmdGbGFnKDMsICIzIiwgInRlc3QiLCAxMDAzKSkKKyAgICAgICAgICAgIGZlYXR1cmVGbGFnc1JlbGVhc2UuZ2V0U3RyaW5nKFJlc291cmNlU3RyaW5nRmxhZygzLCAiMyIsICJ0ZXN0IiwgMTAwMykpCiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0VGhyb3dzKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbjo6Y2xhc3MuamF2YSkgewotICAgICAgICAgICAgbUZlYXR1cmVGbGFnc1JlbGVhc2UuZ2V0U3RyaW5nKFJlc291cmNlU3RyaW5nRmxhZyg0LCAiNCIsICJ0ZXN0IiwgMTAwNCkpCisgICAgICAgICAgICBmZWF0dXJlRmxhZ3NSZWxlYXNlLmdldFN0cmluZyhSZXNvdXJjZVN0cmluZ0ZsYWcoNCwgIjQiLCAidGVzdCIsIDEwMDQpKQogICAgICAgICB9CiAgICAgfQogCkBAIC05Miw3ICsxMDAsNyBAQAogCiAgICAgICAgIHZhbCBmbGFnID0gU3lzUHJvcEJvb2xlYW5GbGFnKGZsYWdJZCwgZmxhZ05hbWUsIGZsYWdOYW1lc3BhY2UsIGZsYWdEZWZhdWx0KQogICAgICAgICB3aGVuZXZlcihtU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKGZsYWdOYW1lLCBmbGFnRGVmYXVsdCkpLnRoZW5SZXR1cm4oZmxhZ0RlZmF1bHQpCi0gICAgICAgIGFzc2VydFRoYXQobUZlYXR1cmVGbGFnc1JlbGVhc2UuaXNFbmFibGVkKGZsYWcpKS5pc0VxdWFsVG8oZmxhZ0RlZmF1bHQpCisgICAgICAgIGFzc2VydFRoYXQoZmVhdHVyZUZsYWdzUmVsZWFzZS5pc0VuYWJsZWQoZmxhZykpLmlzRXF1YWxUbyhmbGFnRGVmYXVsdCkKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTAxLDcgKzEwOSw3IEBACiAKICAgICAgICAgc2VydmVyRmxhZ1JlYWRlci5zZXRGbGFnVmFsdWUoZmxhZy5uYW1lc3BhY2UsIGZsYWcubmFtZSwgZmFsc2UpCiAKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzUmVsZWFzZS5pc0VuYWJsZWQoZmxhZykpLmlzRmFsc2UoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc1JlbGVhc2UuaXNFbmFibGVkKGZsYWcpKS5pc0ZhbHNlKCkKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTEwLDYgKzExOCwzMiBAQAogCiAgICAgICAgIHNlcnZlckZsYWdSZWFkZXIuc2V0RmxhZ1ZhbHVlKGZsYWcubmFtZXNwYWNlLCBmbGFnLm5hbWUsIHRydWUpCiAKLSAgICAgICAgYXNzZXJ0VGhhdChtRmVhdHVyZUZsYWdzUmVsZWFzZS5pc0VuYWJsZWQoZmxhZykpLmlzRmFsc2UoKQorICAgICAgICBhc3NlcnRUaGF0KGZlYXR1cmVGbGFnc1JlbGVhc2UuaXNFbmFibGVkKGZsYWcpKS5pc0ZhbHNlKCkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBzZXJ2ZXJTaWRlX092ZXJyaWRlVW5jYWNoZWRfTm9SZXN0YXJ0KCkgeworICAgICAgICAvLyBObyBvbmUgaGFzIHJlYWQgdGhlIGZsYWcsIHNvIGl0J3Mgbm90IGluIHRoZSBjYWNoZS4KKyAgICAgICAgc2VydmVyRmxhZ1JlYWRlci5zZXRGbGFnVmFsdWUoCisgICAgICAgICAgICBmbGFnQS5uYW1lc3BhY2UsIGZsYWdBLm5hbWUsICFmbGFnQS5kZWZhdWx0KQorICAgICAgICBNb2NraXRvLnZlcmlmeShyZXN0YXJ0ZXIsIG5ldmVyKCkpLnJlc3RhcnRTeXN0ZW1VSShNb2NraXRvLmFueVN0cmluZygpKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNlcnZlclNpZGVfT3ZlcnJpZGVfUmVzdGFydHMoKSB7CisgICAgICAgIC8vIFJlYWQgaXQgdG8gcHV0IGl0IGluIHRoZSBjYWNoZS4KKyAgICAgICAgZmVhdHVyZUZsYWdzUmVsZWFzZS5pc0VuYWJsZWQoZmxhZ0EpCisgICAgICAgIHNlcnZlckZsYWdSZWFkZXIuc2V0RmxhZ1ZhbHVlKAorICAgICAgICAgICAgZmxhZ0EubmFtZXNwYWNlLCBmbGFnQS5uYW1lLCAhZmxhZ0EuZGVmYXVsdCkKKyAgICAgICAgTW9ja2l0by52ZXJpZnkocmVzdGFydGVyKS5yZXN0YXJ0U3lzdGVtVUkoTW9ja2l0by5hbnlTdHJpbmcoKSkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBzZXJ2ZXJTaWRlX1JlZHVuZGFudE92ZXJyaWRlX05vUmVzdGFydCgpIHsKKyAgICAgICAgLy8gUmVhZCBpdCB0byBwdXQgaXQgaW4gdGhlIGNhY2hlLgorICAgICAgICBmZWF0dXJlRmxhZ3NSZWxlYXNlLmlzRW5hYmxlZChmbGFnQSkKKyAgICAgICAgc2VydmVyRmxhZ1JlYWRlci5zZXRGbGFnVmFsdWUoCisgICAgICAgICAgICBmbGFnQS5uYW1lc3BhY2UsIGZsYWdBLm5hbWUsIGZsYWdBLmRlZmF1bHQpCisgICAgICAgIE1vY2tpdG8udmVyaWZ5KHJlc3RhcnRlciwgbmV2ZXIoKSkucmVzdGFydFN5c3RlbVVJKE1vY2tpdG8uYW55U3RyaW5nKCkpCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL1NlcnZlckZsYWdSZWFkZXJJbXBsVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9mbGFncy9TZXJ2ZXJGbGFnUmVhZGVySW1wbFRlc3Qua3QKaW5kZXggMmU5ODAwNi4uOTUzYjdmYiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2ZsYWdzL1NlcnZlckZsYWdSZWFkZXJJbXBsVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvZmxhZ3MvU2VydmVyRmxhZ1JlYWRlckltcGxUZXN0Lmt0CkBAIC0yMSwxMSArMjEsMTMgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5TeXN1aVRlc3RDYXNlCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5EZXZpY2VDb25maWdQcm94eUZha2UKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLmNvbmN1cnJlbmN5LkZha2VFeGVjdXRvcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwubW9ja2l0by5hbnkKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLnRpbWUuRmFrZVN5c3RlbUNsb2NrCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQogaW1wb3J0IG9yZy5qdW5pdC5UZXN0CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9jaworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8uYW55U3RyaW5nCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcgogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zCkBAIC01NywxOCArNTksMTggQEAKICAgICAgICAgZGV2aWNlQ29uZmlnLnNldFByb3BlcnR5KE5BTUVTUEFDRSwgImZsYWdfMSIsICIxIiwgZmFsc2UpCiAgICAgICAgIGV4ZWN1dG9yLnJ1bkFsbFJlYWR5KCkKIAotICAgICAgICB2ZXJpZnkoY2hhbmdlTGlzdGVuZXIpLm9uQ2hhbmdlKGZsYWcpCisgICAgICAgIHZlcmlmeShjaGFuZ2VMaXN0ZW5lcikub25DaGFuZ2UoZmxhZywgIjEiKQogICAgIH0KIAogICAgIEBUZXN0CiAgICAgZnVuIHRlc3RDaGFuZ2VfaWdub3Jlc0xpc3RlbmVyc0R1cmluZ1Rlc3QoKSB7CiAgICAgICAgIHZhbCBzZXJ2ZXJGbGFnUmVhZGVyID0gU2VydmVyRmxhZ1JlYWRlckltcGwoTkFNRVNQQUNFLCBkZXZpY2VDb25maWcsIGV4ZWN1dG9yLCB0cnVlKQotICAgICAgICB2YWwgZmxhZyA9IFJlbGVhc2VkRmxhZygxLCAiMSIsICJ0ZXN0IikKKyAgICAgICAgdmFsIGZsYWcgPSBSZWxlYXNlZEZsYWcoMSwgIjEiLCAiICAgdGVzdCIpCiAgICAgICAgIHNlcnZlckZsYWdSZWFkZXIubGlzdGVuRm9yQ2hhbmdlcyhsaXN0T2YoZmxhZyksIGNoYW5nZUxpc3RlbmVyKQogCiAgICAgICAgIGRldmljZUNvbmZpZy5zZXRQcm9wZXJ0eShOQU1FU1BBQ0UsICJmbGFnX292ZXJyaWRlXzEiLCAiMSIsIGZhbHNlKQogICAgICAgICBleGVjdXRvci5ydW5BbGxSZWFkeSgpCiAKLSAgICAgICAgdmVyaWZ5KGNoYW5nZUxpc3RlbmVyLCBuZXZlcigpKS5vbkNoYW5nZShmbGFnKQorICAgICAgICB2ZXJpZnkoY2hhbmdlTGlzdGVuZXIsIG5ldmVyKCkpLm9uQ2hhbmdlKGFueSgpLCBhbnlTdHJpbmcoKSkKICAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvQ3VzdG9taXphdGlvblByb3ZpZGVyVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9DdXN0b21pemF0aW9uUHJvdmlkZXJUZXN0Lmt0CmluZGV4IDk4NGY0YmUuLjEwNDQxMzEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9DdXN0b21pemF0aW9uUHJvdmlkZXJUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9DdXN0b21pemF0aW9uUHJvdmlkZXJUZXN0Lmt0CkBAIC0xOTIsNiArMTkyLDcgQEAKICAgICAgICAgICAgICkKICAgICAgICAgdW5kZXJUZXN0LnByZXZpZXdNYW5hZ2VyID0KICAgICAgICAgICAgIEtleWd1YXJkUmVtb3RlUHJldmlld01hbmFnZXIoCisgICAgICAgICAgICAgICAgYXBwbGljYXRpb25TY29wZSA9IHRlc3RTY29wZS5iYWNrZ3JvdW5kU2NvcGUsCiAgICAgICAgICAgICAgICAgcHJldmlld1JlbmRlcmVyRmFjdG9yeSA9IHByZXZpZXdSZW5kZXJlckZhY3RvcnksCiAgICAgICAgICAgICAgICAgbWFpbkRpc3BhdGNoZXIgPSB0ZXN0RGlzcGF0Y2hlciwKICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSGFuZGxlciA9IGJhY2tncm91bmRIYW5kbGVyLApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RhdGEvcmVwb3NpdG9yeS9LZXlndWFyZEJvdW5jZXJSZXBvc2l0b3J5VGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kYXRhL3JlcG9zaXRvcnkvS2V5Z3VhcmRCb3VuY2VyUmVwb3NpdG9yeVRlc3Qua3QKaW5kZXggMmVhYmRhMy4uZTQ2OGNjMSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RhdGEvcmVwb3NpdG9yeS9LZXlndWFyZEJvdW5jZXJSZXBvc2l0b3J5VGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZGF0YS9yZXBvc2l0b3J5L0tleWd1YXJkQm91bmNlclJlcG9zaXRvcnlUZXN0Lmt0CkBAIC01Nyw3ICs1Nyw3IEBACiAKICAgICBAVGVzdAogICAgIGZ1biBjaGFuZ2luZ0Zsb3dWYWx1ZVRyaWdnZXJzTG9nZ2luZygpID0gcnVuQmxvY2tpbmcgewotICAgICAgICB1bmRlclRlc3Quc2V0UHJpbWFyeUhpZGUodHJ1ZSkKLSAgICAgICAgdmVyaWZ5KGJvdW5jZXJMb2dnZXIpLmxvZ0NoYW5nZSgiIiwgIlByaW1hcnlCb3VuY2VySGlkZSIsIGZhbHNlKQorICAgICAgICB1bmRlclRlc3Quc2V0UHJpbWFyeVNob3codHJ1ZSkKKyAgICAgICAgdmVyaWZ5KGJvdW5jZXJMb2dnZXIpLmxvZ0NoYW5nZSgiIiwgIlByaW1hcnlCb3VuY2VyU2hvdyIsIGZhbHNlKQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kYXRhL3JlcG9zaXRvcnkvS2V5Z3VhcmRUcmFuc2l0aW9uUmVwb3NpdG9yeVRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZGF0YS9yZXBvc2l0b3J5L0tleWd1YXJkVHJhbnNpdGlvblJlcG9zaXRvcnlUZXN0Lmt0CmluZGV4IGFlMjI3YjQuLmQ5ZDQwMTMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kYXRhL3JlcG9zaXRvcnkvS2V5Z3VhcmRUcmFuc2l0aW9uUmVwb3NpdG9yeVRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RhdGEvcmVwb3NpdG9yeS9LZXlndWFyZFRyYW5zaXRpb25SZXBvc2l0b3J5VGVzdC5rdApAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2cuVGVycmlibGVGYWlsdXJlCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZy5UZXJyaWJsZUZhaWx1cmVIYW5kbGVyCiBpbXBvcnQgYW5kcm9pZHgudGVzdC5leHQuanVuaXQucnVubmVycy5BbmRyb2lkSlVuaXQ0CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLkZsYWt5VGVzdAogaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3QKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5TeXN1aVRlc3RDYXNlCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuYW5pbWF0aW9uLkludGVycG9sYXRvcnMKQEAgLTQ3LDYgKzQ4LDcgQEAKIAogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZEpVbml0NDo6Y2xhc3MpCitARmxha3lUZXN0KGJ1Z0lkID0gMjcwNzYwMzk1KQogY2xhc3MgS2V5Z3VhcmRUcmFuc2l0aW9uUmVwb3NpdG9yeVRlc3QgOiBTeXN1aVRlc3RDYXNlKCkgewogCiAgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgdW5kZXJUZXN0OiBLZXlndWFyZFRyYW5zaXRpb25SZXBvc2l0b3J5CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZG9tYWluL2ludGVyYWN0b3IvS2V5Z3VhcmRJbnRlcmFjdG9yVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9LZXlndWFyZEludGVyYWN0b3JUZXN0Lmt0CmluZGV4IDE1MzQzOWUuLjdmMzAxNjIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9LZXlndWFyZEludGVyYWN0b3JUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9LZXlndWFyZEludGVyYWN0b3JUZXN0Lmt0CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgICAgIHJlcG9zaXRvcnkuc2V0S2V5Z3VhcmRPY2NsdWRlZCh0cnVlKQogICAgICAgICAgICAgYXNzZXJ0VGhhdChzZWN1cmVDYW1lcmFBY3RpdmUoKSkuaXNUcnVlKCkKIAotICAgICAgICAgICAgYm91bmNlclJlcG9zaXRvcnkuc2V0UHJpbWFyeVZpc2libGUodHJ1ZSkKKyAgICAgICAgICAgIGJvdW5jZXJSZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KHRydWUpCiAgICAgICAgICAgICBhc3NlcnRUaGF0KHNlY3VyZUNhbWVyYUFjdGl2ZSgpKS5pc0ZhbHNlKCkKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZG9tYWluL2ludGVyYWN0b3IvS2V5Z3VhcmRUcmFuc2l0aW9uU2NlbmFyaW9zVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9LZXlndWFyZFRyYW5zaXRpb25TY2VuYXJpb3NUZXN0Lmt0CmluZGV4IDVjZDI0ZTYuLjA5MmZkY2EgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9LZXlndWFyZFRyYW5zaXRpb25TY2VuYXJpb3NUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9LZXlndWFyZFRyYW5zaXRpb25TY2VuYXJpb3NUZXN0Lmt0CkBAIC0yNTksNyArMjU5LDcgQEAKICAgICAgICAgICAgIHJ1bkN1cnJlbnQoKQogCiAgICAgICAgICAgICAvLyBXSEVOIHRoZSBwcmltYXJ5IGJvdW5jZXIgaXMgc2V0IHRvIHNob3cKLSAgICAgICAgICAgIGJvdW5jZXJSZXBvc2l0b3J5LnNldFByaW1hcnlWaXNpYmxlKHRydWUpCisgICAgICAgICAgICBib3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5U2hvdyh0cnVlKQogICAgICAgICAgICAgcnVuQ3VycmVudCgpCiAKICAgICAgICAgICAgIHZhbCBpbmZvID0KQEAgLTc0MSw3ICs3NDEsNyBAQAogICAgICAgICAgICAgcmVzZXQobW9ja1RyYW5zaXRpb25SZXBvc2l0b3J5KQogCiAgICAgICAgICAgICAvLyBXSEVOIHRoZSBhbHRlcm5hdGVCb3VuY2VyIHN0b3BzIHNob3dpbmcgYW5kIHRoZW4gdGhlIHByaW1hcnkgYm91bmNlciBzaG93cwotICAgICAgICAgICAgYm91bmNlclJlcG9zaXRvcnkuc2V0UHJpbWFyeVZpc2libGUodHJ1ZSkKKyAgICAgICAgICAgIGJvdW5jZXJSZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KHRydWUpCiAgICAgICAgICAgICBydW5DdXJyZW50KCkKIAogICAgICAgICAgICAgdmFsIGluZm8gPQpAQCAtNzc5LDcgKzc3OSw3IEBACiAgICAgICAgICAgICByZXNldChtb2NrVHJhbnNpdGlvblJlcG9zaXRvcnkpCiAKICAgICAgICAgICAgIC8vIEdJVkVOIHRoZSBwcmltYXJ5IGJvdW5jZXIgaXNuJ3Qgc2hvd2luZywgYW9kIGF2YWlsYWJsZSBhbmQgc3RhcnRpbmcgdG8gc2xlZXAKLSAgICAgICAgICAgIGJvdW5jZXJSZXBvc2l0b3J5LnNldFByaW1hcnlWaXNpYmxlKGZhbHNlKQorICAgICAgICAgICAgYm91bmNlclJlcG9zaXRvcnkuc2V0UHJpbWFyeVNob3coZmFsc2UpCiAgICAgICAgICAgICBrZXlndWFyZFJlcG9zaXRvcnkuc2V0QW9kQXZhaWxhYmxlKHRydWUpCiAgICAgICAgICAgICBrZXlndWFyZFJlcG9zaXRvcnkuc2V0V2FrZWZ1bG5lc3NNb2RlbChzdGFydGluZ1RvU2xlZXAoKSkKIApAQCAtODIzLDcgKzgyMyw3IEBACiAKICAgICAgICAgICAgIC8vIEdJVkVOIHRoZSBwcmltYXJ5IGJvdW5jZXIgaXNuJ3Qgc2hvd2luZywgYW9kIG5vdCBhdmFpbGFibGUgYW5kIHN0YXJ0aW5nIHRvIHNsZWVwCiAgICAgICAgICAgICAvLyB0byBzbGVlcAotICAgICAgICAgICAgYm91bmNlclJlcG9zaXRvcnkuc2V0UHJpbWFyeVZpc2libGUoZmFsc2UpCisgICAgICAgICAgICBib3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5U2hvdyhmYWxzZSkKICAgICAgICAgICAgIGtleWd1YXJkUmVwb3NpdG9yeS5zZXRBb2RBdmFpbGFibGUoZmFsc2UpCiAgICAgICAgICAgICBrZXlndWFyZFJlcG9zaXRvcnkuc2V0V2FrZWZ1bG5lc3NNb2RlbChzdGFydGluZ1RvU2xlZXAoKSkKIApAQCAtODY2LDcgKzg2Niw3IEBACiAgICAgICAgICAgICByZXNldChtb2NrVHJhbnNpdGlvblJlcG9zaXRvcnkpCiAKICAgICAgICAgICAgIC8vIEdJVkVOIHRoZSBwcmltYXJ5IGJvdW5jZXIgaXNuJ3Qgc2hvd2luZyBhbmQgZGV2aWNlIG5vdCBzbGVlcGluZwotICAgICAgICAgICAgYm91bmNlclJlcG9zaXRvcnkuc2V0UHJpbWFyeVZpc2libGUoZmFsc2UpCisgICAgICAgICAgICBib3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5U2hvdyhmYWxzZSkKICAgICAgICAgICAgIGtleWd1YXJkUmVwb3NpdG9yeS5zZXRXYWtlZnVsbmVzc01vZGVsKHN0YXJ0aW5nVG9XYWtlKCkpCiAKICAgICAgICAgICAgIC8vIFdIRU4gdGhlIGFsdGVybmF0ZUJvdW5jZXIgc3RvcHMgc2hvd2luZwpAQCAtODkwLDcgKzg5MCw3IEBACiAgICAgZnVuIGBQUklNQVJZX0JPVU5DRVIgdG8gQU9EYCgpID0KICAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgLy8gR0lWRU4gYSBwcmlvciB0cmFuc2l0aW9uIGhhcyBydW4gdG8gUFJJTUFSWV9CT1VOQ0VSCi0gICAgICAgICAgICBib3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5VmlzaWJsZSh0cnVlKQorICAgICAgICAgICAgYm91bmNlclJlcG9zaXRvcnkuc2V0UHJpbWFyeVNob3codHJ1ZSkKICAgICAgICAgICAgIHJ1bm5lci5zdGFydFRyYW5zaXRpb24oCiAgICAgICAgICAgICAgICAgdGVzdFNjb3BlLAogICAgICAgICAgICAgICAgIFRyYW5zaXRpb25JbmZvKApAQCAtOTEyLDcgKzkxMiw3IEBACiAgICAgICAgICAgICBrZXlndWFyZFJlcG9zaXRvcnkuc2V0V2FrZWZ1bG5lc3NNb2RlbChzdGFydGluZ1RvU2xlZXAoKSkKIAogICAgICAgICAgICAgLy8gV0hFTiB0aGUgcHJpbWFyeUJvdW5jZXIgc3RvcHMgc2hvd2luZwotICAgICAgICAgICAgYm91bmNlclJlcG9zaXRvcnkuc2V0UHJpbWFyeVZpc2libGUoZmFsc2UpCisgICAgICAgICAgICBib3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5U2hvdyhmYWxzZSkKICAgICAgICAgICAgIHJ1bkN1cnJlbnQoKQogCiAgICAgICAgICAgICB2YWwgaW5mbyA9CkBAIC05MzIsNyArOTMyLDcgQEAKICAgICBmdW4gYFBSSU1BUllfQk9VTkNFUiB0byBET1pJTkdgKCkgPQogICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CiAgICAgICAgICAgICAvLyBHSVZFTiBhIHByaW9yIHRyYW5zaXRpb24gaGFzIHJ1biB0byBQUklNQVJZX0JPVU5DRVIKLSAgICAgICAgICAgIGJvdW5jZXJSZXBvc2l0b3J5LnNldFByaW1hcnlWaXNpYmxlKHRydWUpCisgICAgICAgICAgICBib3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5U2hvdyh0cnVlKQogICAgICAgICAgICAgcnVubmVyLnN0YXJ0VHJhbnNpdGlvbigKICAgICAgICAgICAgICAgICB0ZXN0U2NvcGUsCiAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbkluZm8oCkBAIC05NTQsNyArOTU0LDcgQEAKICAgICAgICAgICAgIGtleWd1YXJkUmVwb3NpdG9yeS5zZXRXYWtlZnVsbmVzc01vZGVsKHN0YXJ0aW5nVG9TbGVlcCgpKQogCiAgICAgICAgICAgICAvLyBXSEVOIHRoZSBwcmltYXJ5Qm91bmNlciBzdG9wcyBzaG93aW5nCi0gICAgICAgICAgICBib3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5VmlzaWJsZShmYWxzZSkKKyAgICAgICAgICAgIGJvdW5jZXJSZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KGZhbHNlKQogICAgICAgICAgICAgcnVuQ3VycmVudCgpCiAKICAgICAgICAgICAgIHZhbCBpbmZvID0KQEAgLTk3NCw3ICs5NzQsNyBAQAogICAgIGZ1biBgUFJJTUFSWV9CT1VOQ0VSIHRvIExPQ0tTQ1JFRU5gKCkgPQogICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CiAgICAgICAgICAgICAvLyBHSVZFTiBhIHByaW9yIHRyYW5zaXRpb24gaGFzIHJ1biB0byBQUklNQVJZX0JPVU5DRVIKLSAgICAgICAgICAgIGJvdW5jZXJSZXBvc2l0b3J5LnNldFByaW1hcnlWaXNpYmxlKHRydWUpCisgICAgICAgICAgICBib3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5U2hvdyh0cnVlKQogICAgICAgICAgICAgcnVubmVyLnN0YXJ0VHJhbnNpdGlvbigKICAgICAgICAgICAgICAgICB0ZXN0U2NvcGUsCiAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbkluZm8oCkBAIC05OTUsNyArOTk1LDcgQEAKICAgICAgICAgICAgIGtleWd1YXJkUmVwb3NpdG9yeS5zZXRXYWtlZnVsbmVzc01vZGVsKHN0YXJ0aW5nVG9XYWtlKCkpCiAKICAgICAgICAgICAgIC8vIFdIRU4gdGhlIGFsdGVybmF0ZUJvdW5jZXIgc3RvcHMgc2hvd2luZwotICAgICAgICAgICAgYm91bmNlclJlcG9zaXRvcnkuc2V0UHJpbWFyeVZpc2libGUoZmFsc2UpCisgICAgICAgICAgICBib3VuY2VyUmVwb3NpdG9yeS5zZXRQcmltYXJ5U2hvdyhmYWxzZSkKICAgICAgICAgICAgIHJ1bkN1cnJlbnQoKQogCiAgICAgICAgICAgICB2YWwgaW5mbyA9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZG9tYWluL2ludGVyYWN0b3IvUHJpbWFyeUJvdW5jZXJJbnRlcmFjdG9yVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9QcmltYXJ5Qm91bmNlckludGVyYWN0b3JUZXN0Lmt0CmluZGV4IDZiN2ZkNjEuLjVlYzYyODMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9QcmltYXJ5Qm91bmNlckludGVyYWN0b3JUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9QcmltYXJ5Qm91bmNlckludGVyYWN0b3JUZXN0Lmt0CkBAIC0zNSw3ICszNSw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuc2hhcmVkLmNvbnN0YW50cy5LZXlndWFyZEJvdW5jZXJDb25zdGFudHMuRVhQQU5TSU9OX0hJRERFTgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLnNoYXJlZC5jb25zdGFudHMuS2V5Z3VhcmRCb3VuY2VyQ29uc3RhbnRzLkVYUEFOU0lPTl9WSVNJQkxFCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuc2hhcmVkLm1vZGVsLkJvdW5jZXJTaG93TWVzc2FnZU1vZGVsCi1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuc2hhcmVkLm1vZGVsLktleWd1YXJkQm91bmNlck1vZGVsCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5BY3Rpdml0eVN0YXJ0ZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuS2V5Z3VhcmRCeXBhc3NDb250cm9sbGVyCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5LZXlndWFyZFN0YXRlQ29udHJvbGxlcgpAQCAtOTIsNyArOTEsNyBAQAogICAgICAgICAgICAgICAgIGtleWd1YXJkQnlwYXNzQ29udHJvbGxlciwKICAgICAgICAgICAgICkKICAgICAgICAgYHdoZW5gKHJlcG9zaXRvcnkucHJpbWFyeUJvdW5jZXJTdGFydGluZ0Rpc2FwcGVhckFuaW1hdGlvbi52YWx1ZSkudGhlblJldHVybihudWxsKQotICAgICAgICBgd2hlbmAocmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclNob3cudmFsdWUpLnRoZW5SZXR1cm4obnVsbCkKKyAgICAgICAgYHdoZW5gKHJlcG9zaXRvcnkucHJpbWFyeUJvdW5jZXJTaG93LnZhbHVlKS50aGVuUmV0dXJuKGZhbHNlKQogICAgICAgICBgd2hlbmAoYm91bmNlclZpZXcuZGVsZWdhdGUpLnRoZW5SZXR1cm4oYm91bmNlclZpZXdEZWxlZ2F0ZSkKICAgICAgICAgcmVzb3VyY2VzID0gY29udGV4dC5vckNyZWF0ZVRlc3RhYmxlUmVzb3VyY2VzCiAgICAgfQpAQCAtMTAxLDE1ICsxMDAsMTMgQEAKICAgICBmdW4gdGVzdFNob3dfaXNTY3JpbW1lZCgpIHsKICAgICAgICAgdW5kZXJUZXN0LnNob3codHJ1ZSkKICAgICAgICAgdmVyaWZ5KHJlcG9zaXRvcnkpLnNldEtleWd1YXJkQXV0aGVudGljYXRlZChudWxsKQotICAgICAgICB2ZXJpZnkocmVwb3NpdG9yeSkuc2V0UHJpbWFyeUhpZGUoZmFsc2UpCiAgICAgICAgIHZlcmlmeShyZXBvc2l0b3J5KS5zZXRQcmltYXJ5U3RhcnRpbmdUb0hpZGUoZmFsc2UpCiAgICAgICAgIHZlcmlmeShyZXBvc2l0b3J5KS5zZXRQcmltYXJ5U2NyaW1tZWQodHJ1ZSkKICAgICAgICAgdmVyaWZ5KHJlcG9zaXRvcnkpLnNldFBhbmVsRXhwYW5zaW9uKEVYUEFOU0lPTl9WSVNJQkxFKQogICAgICAgICB2ZXJpZnkocmVwb3NpdG9yeSkuc2V0UHJpbWFyeVNob3dpbmdTb29uKHRydWUpCiAgICAgICAgIHZlcmlmeShrZXlndWFyZFN0YXRlQ29udHJvbGxlcikubm90aWZ5UHJpbWFyeUJvdW5jZXJTaG93aW5nKHRydWUpCiAgICAgICAgIHZlcmlmeShtUHJpbWFyeUJvdW5jZXJDYWxsYmFja0ludGVyYWN0b3IpLmRpc3BhdGNoU3RhcnRpbmdUb1Nob3coKQotICAgICAgICB2ZXJpZnkocmVwb3NpdG9yeSkuc2V0UHJpbWFyeVZpc2libGUodHJ1ZSkKLSAgICAgICAgdmVyaWZ5KHJlcG9zaXRvcnkpLnNldFByaW1hcnlTaG93KGFueShLZXlndWFyZEJvdW5jZXJNb2RlbDo6Y2xhc3MuamF2YSkpCisgICAgICAgIHZlcmlmeShyZXBvc2l0b3J5KS5zZXRQcmltYXJ5U2hvdyh0cnVlKQogICAgICAgICB2ZXJpZnkocmVwb3NpdG9yeSkuc2V0UHJpbWFyeVNob3dpbmdTb29uKGZhbHNlKQogICAgICAgICB2ZXJpZnkobVByaW1hcnlCb3VuY2VyQ2FsbGJhY2tJbnRlcmFjdG9yKS5kaXNwYXRjaFZpc2liaWxpdHlDaGFuZ2VkKFZpZXcuVklTSUJMRSkKICAgICB9CkBAIC0xMzIsOSArMTI5LDcgQEAKICAgICAgICAgdmVyaWZ5KGZhbHNpbmdDb2xsZWN0b3IpLm9uQm91bmNlckhpZGRlbigpCiAgICAgICAgIHZlcmlmeShrZXlndWFyZFN0YXRlQ29udHJvbGxlcikubm90aWZ5UHJpbWFyeUJvdW5jZXJTaG93aW5nKGZhbHNlKQogICAgICAgICB2ZXJpZnkocmVwb3NpdG9yeSkuc2V0UHJpbWFyeVNob3dpbmdTb29uKGZhbHNlKQotICAgICAgICB2ZXJpZnkocmVwb3NpdG9yeSkuc2V0UHJpbWFyeVZpc2libGUoZmFsc2UpCi0gICAgICAgIHZlcmlmeShyZXBvc2l0b3J5KS5zZXRQcmltYXJ5SGlkZSh0cnVlKQotICAgICAgICB2ZXJpZnkocmVwb3NpdG9yeSkuc2V0UHJpbWFyeVNob3cobnVsbCkKKyAgICAgICAgdmVyaWZ5KHJlcG9zaXRvcnkpLnNldFByaW1hcnlTaG93KGZhbHNlKQogICAgICAgICB2ZXJpZnkobVByaW1hcnlCb3VuY2VyQ2FsbGJhY2tJbnRlcmFjdG9yKS5kaXNwYXRjaFZpc2liaWxpdHlDaGFuZ2VkKFZpZXcuSU5WSVNJQkxFKQogICAgIH0KIApAQCAtMTYwLDkgKzE1NSw3IEBACiAgICAgICAgIGB3aGVuYChyZXBvc2l0b3J5LnBhbmVsRXhwYW5zaW9uQW1vdW50LnZhbHVlKS50aGVuUmV0dXJuKDAuNWYpCiAgICAgICAgIGB3aGVuYChyZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VyU3RhcnRpbmdEaXNhcHBlYXJBbmltYXRpb24udmFsdWUpLnRoZW5SZXR1cm4obnVsbCkKICAgICAgICAgdW5kZXJUZXN0LnNldFBhbmVsRXhwYW5zaW9uKEVYUEFOU0lPTl9ISURERU4pCi0gICAgICAgIHZlcmlmeShyZXBvc2l0b3J5KS5zZXRQcmltYXJ5VmlzaWJsZShmYWxzZSkKLSAgICAgICAgdmVyaWZ5KHJlcG9zaXRvcnkpLnNldFByaW1hcnlTaG93KG51bGwpCi0gICAgICAgIHZlcmlmeShyZXBvc2l0b3J5KS5zZXRQcmltYXJ5SGlkZSh0cnVlKQorICAgICAgICB2ZXJpZnkocmVwb3NpdG9yeSkuc2V0UHJpbWFyeVNob3coZmFsc2UpCiAgICAgICAgIHZlcmlmeShmYWxzaW5nQ29sbGVjdG9yKS5vbkJvdW5jZXJIaWRkZW4oKQogICAgICAgICB2ZXJpZnkobVByaW1hcnlCb3VuY2VyQ2FsbGJhY2tJbnRlcmFjdG9yKS5kaXNwYXRjaFJlc2V0KCkKICAgICAgICAgdmVyaWZ5KG1QcmltYXJ5Qm91bmNlckNhbGxiYWNrSW50ZXJhY3RvcikuZGlzcGF0Y2hGdWxseUhpZGRlbigpCkBAIC0yNDMsMTEgKzIzNiwxMSBAQAogCiAgICAgQFRlc3QKICAgICBmdW4gdGVzdElzRnVsbFNob3dpbmcoKSB7Ci0gICAgICAgIGB3aGVuYChyZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VyVmlzaWJsZS52YWx1ZSkudGhlblJldHVybih0cnVlKQorICAgICAgICBgd2hlbmAocmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclNob3cudmFsdWUpLnRoZW5SZXR1cm4odHJ1ZSkKICAgICAgICAgYHdoZW5gKHJlcG9zaXRvcnkucGFuZWxFeHBhbnNpb25BbW91bnQudmFsdWUpLnRoZW5SZXR1cm4oRVhQQU5TSU9OX1ZJU0lCTEUpCiAgICAgICAgIGB3aGVuYChyZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VyU3RhcnRpbmdEaXNhcHBlYXJBbmltYXRpb24udmFsdWUpLnRoZW5SZXR1cm4obnVsbCkKICAgICAgICAgYXNzZXJ0VGhhdCh1bmRlclRlc3QuaXNGdWxseVNob3dpbmcoKSkuaXNUcnVlKCkKLSAgICAgICAgYHdoZW5gKHJlcG9zaXRvcnkucHJpbWFyeUJvdW5jZXJWaXNpYmxlLnZhbHVlKS50aGVuUmV0dXJuKGZhbHNlKQorICAgICAgICBgd2hlbmAocmVwb3NpdG9yeS5wcmltYXJ5Qm91bmNlclNob3cudmFsdWUpLnRoZW5SZXR1cm4oZmFsc2UpCiAgICAgICAgIGFzc2VydFRoYXQodW5kZXJUZXN0LmlzRnVsbHlTaG93aW5nKCkpLmlzRmFsc2UoKQogICAgIH0KIApAQCAtMzcwLDcgKzM2Myw3IEBACiAgICAgICAgIGlzVW5sb2NraW5nV2l0aEZwQWxsb3dlZDogQm9vbGVhbiwKICAgICAgICAgaXNBbmltYXRpbmdBd2F5OiBCb29sZWFuCiAgICAgKSB7Ci0gICAgICAgIGB3aGVuYChyZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VyVmlzaWJsZS52YWx1ZSkudGhlblJldHVybihpc1Zpc2libGUpCisgICAgICAgIGB3aGVuYChyZXBvc2l0b3J5LnByaW1hcnlCb3VuY2VyU2hvdy52YWx1ZSkudGhlblJldHVybihpc1Zpc2libGUpCiAgICAgICAgIHJlc291cmNlcy5hZGRPdmVycmlkZShSLmJvb2wuY29uZmlnX3Nob3dfc2lkZWZwc19oaW50X29uX2JvdW5jZXIsIHNmcHNFbmFibGVkKQogICAgICAgICBgd2hlbmAoa2V5Z3VhcmRVcGRhdGVNb25pdG9yLmlzRmluZ2VycHJpbnREZXRlY3Rpb25SdW5uaW5nKS50aGVuUmV0dXJuKGZwc0RldGVjdGlvblJ1bm5pbmcpCiAgICAgICAgIGB3aGVuYChrZXlndWFyZFVwZGF0ZU1vbml0b3IuaXNVbmxvY2tpbmdXaXRoRmluZ2VycHJpbnRBbGxvd2VkKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RvbWFpbi9pbnRlcmFjdG9yL1ByaW1hcnlCb3VuY2VySW50ZXJhY3RvcldpdGhDb3JvdXRpbmVzVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kb21haW4vaW50ZXJhY3Rvci9QcmltYXJ5Qm91bmNlckludGVyYWN0b3JXaXRoQ29yb3V0aW5lc1Rlc3Qua3QKaW5kZXggZjY3NWU3OS4uZWRhYzQ2OCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RvbWFpbi9pbnRlcmFjdG9yL1ByaW1hcnlCb3VuY2VySW50ZXJhY3RvcldpdGhDb3JvdXRpbmVzVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZG9tYWluL2ludGVyYWN0b3IvUHJpbWFyeUJvdW5jZXJJbnRlcmFjdG9yV2l0aENvcm91dGluZXNUZXN0Lmt0CkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgZnVuIG5vdEludGVyYWN0YWJsZVdoZW5FeHBhbnNpb25Jc0JlbG93OTBQZXJjZW50KCkgPSBydW5UZXN0IHsKICAgICAgICAgdmFsIGlzSW50ZXJhY3RhYmxlID0gY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNJbnRlcmFjdGFibGUpCiAKLSAgICAgICAgcmVwb3NpdG9yeS5zZXRQcmltYXJ5VmlzaWJsZSh0cnVlKQorICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KHRydWUpCiAgICAgICAgIHJlcG9zaXRvcnkuc2V0UGFuZWxFeHBhbnNpb24oMC4xNWYpCiAKICAgICAgICAgYXNzZXJ0VGhhdChpc0ludGVyYWN0YWJsZSgpKS5pc0ZhbHNlKCkKQEAgLTg3LDcgKzg3LDcgQEAKICAgICBmdW4gbm90SW50ZXJhY3RhYmxlV2hlbkV4cGFuc2lvbkFib3ZlOTBQZXJjZW50QnV0Tm90VmlzaWJsZSgpID0gcnVuVGVzdCB7CiAgICAgICAgIHZhbCBpc0ludGVyYWN0YWJsZSA9IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzSW50ZXJhY3RhYmxlKQogCi0gICAgICAgIHJlcG9zaXRvcnkuc2V0UHJpbWFyeVZpc2libGUoZmFsc2UpCisgICAgICAgIHJlcG9zaXRvcnkuc2V0UHJpbWFyeVNob3coZmFsc2UpCiAgICAgICAgIHJlcG9zaXRvcnkuc2V0UGFuZWxFeHBhbnNpb24oMC4wNWYpCiAKICAgICAgICAgYXNzZXJ0VGhhdChpc0ludGVyYWN0YWJsZSgpKS5pc0ZhbHNlKCkKQEAgLTk3LDcgKzk3LDcgQEAKICAgICBmdW4gaXNJbnRlcmFjdGFibGVXaGVuRXhwYW5zaW9uQWJvdmU5MFBlcmNlbnRBbmRWaXNpYmxlKCkgPSBydW5UZXN0IHsKICAgICAgICAgdmFyIGlzSW50ZXJhY3RhYmxlID0gY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNJbnRlcmFjdGFibGUpCiAKLSAgICAgICAgcmVwb3NpdG9yeS5zZXRQcmltYXJ5VmlzaWJsZSh0cnVlKQorICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KHRydWUpCiAgICAgICAgIHJlcG9zaXRvcnkuc2V0UGFuZWxFeHBhbnNpb24oMC4wOWYpCiAKICAgICAgICAgYXNzZXJ0VGhhdChpc0ludGVyYWN0YWJsZSgpKS5pc1RydWUoKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3VpL3ZpZXdtb2RlbC9LZXlndWFyZEJvdW5jZXJWaWV3TW9kZWxUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3VpL3ZpZXdtb2RlbC9LZXlndWFyZEJvdW5jZXJWaWV3TW9kZWxUZXN0Lmt0CmluZGV4IDY1ZTRjMTAuLjJhYjFiOTkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC91aS92aWV3bW9kZWwvS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvdWkvdmlld21vZGVsL0tleWd1YXJkQm91bmNlclZpZXdNb2RlbFRlc3Qua3QKQEAgLTkzLDEwICs5MywyMiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIHNob3VsZFVwZGF0ZVNpZGVGcHMoKSA9IHJ1blRlc3QgeworICAgIGZ1biBzaG91bGRVcGRhdGVTaWRlRnBzX3Nob3coKSA9IHJ1blRlc3QgewogICAgICAgICB2YXIgY291bnQgPSAwCiAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3Quc2hvdWxkVXBkYXRlU2lkZUZwcy5vbkVhY2ggeyBjb3VudCsrIH0ubGF1bmNoSW4odGhpcykKLSAgICAgICAgcmVwb3NpdG9yeS5zZXRQcmltYXJ5VmlzaWJsZSh0cnVlKQorICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KHRydWUpCisgICAgICAgIC8vIFJ1biB0aGUgdGFza3MgdGhhdCBhcmUgcGVuZGluZyBhdCB0aGlzIHBvaW50IG9mIHZpcnR1YWwgdGltZS4KKyAgICAgICAgcnVuQ3VycmVudCgpCisgICAgICAgIGFzc2VydFRoYXQoY291bnQpLmlzRXF1YWxUbygxKQorICAgICAgICBqb2IuY2FuY2VsKCkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBzaG91bGRVcGRhdGVTaWRlRnBzX2hpZGUoKSA9IHJ1blRlc3QgeworICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KHRydWUpCisgICAgICAgIHZhciBjb3VudCA9IDAKKyAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5zaG91bGRVcGRhdGVTaWRlRnBzLm9uRWFjaCB7IGNvdW50KysgfS5sYXVuY2hJbih0aGlzKQorICAgICAgICByZXBvc2l0b3J5LnNldFByaW1hcnlTaG93KGZhbHNlKQogICAgICAgICAvLyBSdW4gdGhlIHRhc2tzIHRoYXQgYXJlIHBlbmRpbmcgYXQgdGhpcyBwb2ludCBvZiB2aXJ0dWFsIHRpbWUuCiAgICAgICAgIHJ1bkN1cnJlbnQoKQogICAgICAgICBhc3NlcnRUaGF0KGNvdW50KS5pc0VxdWFsVG8oMSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9jb250cm9scy91aS9NZWRpYUNvbnRyb2xQYW5lbFRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvY29udHJvbHMvdWkvTWVkaWFDb250cm9sUGFuZWxUZXN0Lmt0CmluZGV4IGZkMzUzYWYuLmRmMTNmZGQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9jb250cm9scy91aS9NZWRpYUNvbnRyb2xQYW5lbFRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhQ29udHJvbFBhbmVsVGVzdC5rdApAQCAtOTQsNyArOTQsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwubW9ja2l0by5hbnkKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8uYXJndW1lbnRDYXB0b3IKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8uZXEKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8ubnVsbGFibGUKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8ud2l0aEFyZ0NhcHRvcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwudGltZS5GYWtlU3lzdGVtQ2xvY2sKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0CkBAIC0xNzYzLDcgKzE3NjIsNyBAQAogICAgIGZ1biB0YXBDb250ZW50Vmlld19zaG93T3ZlckxvY2tzY3JlZW5fb3BlbkFjdGl2aXR5KCkgewogICAgICAgICAvLyBXSEVOIHdlIGFyZSBvbiBsb2Nrc2NyZWVuIGFuZCB0aGlzIGFjdGl2aXR5IGNhbiBzaG93IG92ZXIgbG9ja3NjcmVlbgogICAgICAgICB3aGVuZXZlcihrZXlndWFyZFN0YXRlQ29udHJvbGxlci5pc1Nob3dpbmcpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgd2hlbmV2ZXIoYWN0aXZpdHlJbnRlbnRIZWxwZXIud291bGRTaG93T3ZlckxvY2tzY3JlZW4oYW55KCksIGFueSgpKSkudGhlblJldHVybih0cnVlKQorICAgICAgICB3aGVuZXZlcihhY3Rpdml0eUludGVudEhlbHBlci53b3VsZFBlbmRpbmdTaG93T3ZlckxvY2tzY3JlZW4oYW55KCksIGFueSgpKSkudGhlblJldHVybih0cnVlKQogCiAgICAgICAgIHZhbCBjbGlja0ludGVudCA9IG1vY2soSW50ZW50OjpjbGFzcy5qYXZhKQogICAgICAgICB2YWwgcGVuZGluZ0ludGVudCA9IG1vY2soUGVuZGluZ0ludGVudDo6Y2xhc3MuamF2YSkKQEAgLTE3NzQsMTYgKzE3NzMsMjAgQEAKICAgICAgICAgcGxheWVyLmJpbmRQbGF5ZXIoZGF0YSwgS0VZKQogICAgICAgICB2ZXJpZnkodmlld0hvbGRlci5wbGF5ZXIpLnNldE9uQ2xpY2tMaXN0ZW5lcihjYXB0b3IuY2FwdHVyZSgpKQogCi0gICAgICAgIC8vIFRIRU4gaXQgc2hvd3Mgd2l0aG91dCBkaXNtaXNzaW5nIGtleWd1YXJkIGZpcnN0CisgICAgICAgIC8vIFRIRU4gaXQgc2VuZHMgdGhlIFBlbmRpbmdJbnRlbnQgd2l0aG91dCBkaXNtaXNzaW5nIGtleWd1YXJkIGZpcnN0LAorICAgICAgICAvLyBhbmQgZG9lcyBub3QgdXNlIHRoZSBJbnRlbnQgZGlyZWN0bHkgKHNlZSBiLzI3MTg0NTAwOCkKICAgICAgICAgY2FwdG9yLnZhbHVlLm9uQ2xpY2sodmlld0hvbGRlci5wbGF5ZXIpCi0gICAgICAgIHZlcmlmeShhY3Rpdml0eVN0YXJ0ZXIpLnN0YXJ0QWN0aXZpdHkoZXEoY2xpY2tJbnRlbnQpLCBlcSh0cnVlKSwgbnVsbGFibGUoKSwgZXEodHJ1ZSkpCisgICAgICAgIHZlcmlmeShwZW5kaW5nSW50ZW50KS5zZW5kKCkKKyAgICAgICAgdmVyaWZ5KHBlbmRpbmdJbnRlbnQsIG5ldmVyKCkpLmdldEludGVudCgpCisgICAgICAgIHZlcmlmeShhY3Rpdml0eVN0YXJ0ZXIsIG5ldmVyKCkpLnBvc3RTdGFydEFjdGl2aXR5RGlzbWlzc2luZ0tleWd1YXJkKGVxKGNsaWNrSW50ZW50KSwgYW55KCkpCiAgICAgfQogCiAgICAgQFRlc3QKICAgICBmdW4gdGFwQ29udGVudFZpZXdfbm9TaG93T3ZlckxvY2tzY3JlZW5fZGlzbWlzc0tleWd1YXJkKCkgewogICAgICAgICAvLyBXSEVOIHdlIGFyZSBvbiBsb2Nrc2NyZWVuIGFuZCB0aGUgYWN0aXZpdHkgY2Fubm90IHNob3cgb3ZlciBsb2Nrc2NyZWVuCiAgICAgICAgIHdoZW5ldmVyKGtleWd1YXJkU3RhdGVDb250cm9sbGVyLmlzU2hvd2luZykudGhlblJldHVybih0cnVlKQotICAgICAgICB3aGVuZXZlcihhY3Rpdml0eUludGVudEhlbHBlci53b3VsZFNob3dPdmVyTG9ja3NjcmVlbihhbnkoKSwgYW55KCkpKS50aGVuUmV0dXJuKGZhbHNlKQorICAgICAgICB3aGVuZXZlcihhY3Rpdml0eUludGVudEhlbHBlci53b3VsZFBlbmRpbmdTaG93T3ZlckxvY2tzY3JlZW4oYW55KCksIGFueSgpKSkKKyAgICAgICAgICAgIC50aGVuUmV0dXJuKGZhbHNlKQogCiAgICAgICAgIHZhbCBjbGlja0ludGVudCA9IG1vY2soSW50ZW50OjpjbGFzcy5qYXZhKQogICAgICAgICB2YWwgcGVuZGluZ0ludGVudCA9IG1vY2soUGVuZGluZ0ludGVudDo6Y2xhc3MuamF2YSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tZWRpYS9jb250cm9scy91aS9NZWRpYUhpZXJhcmNoeU1hbmFnZXJUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhSGllcmFyY2h5TWFuYWdlclRlc3Qua3QKaW5kZXggYTU3OTUxOC4uZmViNDI5ZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhSGllcmFyY2h5TWFuYWdlclRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2NvbnRyb2xzL3VpL01lZGlhSGllcmFyY2h5TWFuYWdlclRlc3Qua3QKQEAgLTE4MCw2ICsxODAsNTcgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIGZ1biB0ZXN0QmxvY2tlZFdoZW5Db25maWd1cmF0aW9uQ2hhbmdlc0FuZFNjcmVlbk9mZigpIHsKKyAgICAgICAgLy8gTGV0J3Mgc2V0IGl0IG9udG8gUVM6CisgICAgICAgIG1lZGlhSGllcmFyY2h5TWFuYWdlci5xc0V4cGFuc2lvbiA9IDEuMGYKKyAgICAgICAgdmVyaWZ5KG1lZGlhQ2Fyb3VzZWxDb250cm9sbGVyKQorICAgICAgICAgICAgLm9uRGVzaXJlZExvY2F0aW9uQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICBBcmd1bWVudE1hdGNoZXJzLmFueUludCgpLAorICAgICAgICAgICAgICAgIGFueShNZWRpYUhvc3RTdGF0ZTo6Y2xhc3MuamF2YSksCisgICAgICAgICAgICAgICAgYW55Qm9vbGVhbigpLAorICAgICAgICAgICAgICAgIGFueUxvbmcoKSwKKyAgICAgICAgICAgICAgICBhbnlMb25nKCkKKyAgICAgICAgICAgICkKKyAgICAgICAgdmFsIG9ic2VydmVyID0gd2FrZWZ1bGxuZXNzT2JzZXJ2ZXIudmFsdWUKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgibGlmZWN5Y2xlIG9ic2VydmVyIHdhc24ndCByZWdpc3RlcmVkIiwgb2JzZXJ2ZXIpCisgICAgICAgIG9ic2VydmVyLm9uU3RhcnRlZEdvaW5nVG9TbGVlcCgpCisgICAgICAgIGNsZWFySW52b2NhdGlvbnMobWVkaWFDYXJvdXNlbENvbnRyb2xsZXIpCisgICAgICAgIGNvbmZpZ3VyYXRpb25Db250cm9sbGVyLm5vdGlmeUNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkKKyAgICAgICAgdmVyaWZ5KG1lZGlhQ2Fyb3VzZWxDb250cm9sbGVyLCB0aW1lcygwKSkKKyAgICAgICAgICAgIC5vbkRlc2lyZWRMb2NhdGlvbkNoYW5nZWQoCisgICAgICAgICAgICAgICAgQXJndW1lbnRNYXRjaGVycy5hbnlJbnQoKSwKKyAgICAgICAgICAgICAgICBhbnkoTWVkaWFIb3N0U3RhdGU6OmNsYXNzLmphdmEpLAorICAgICAgICAgICAgICAgIGFueUJvb2xlYW4oKSwKKyAgICAgICAgICAgICAgICBhbnlMb25nKCksCisgICAgICAgICAgICAgICAgYW55TG9uZygpCisgICAgICAgICAgICApCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gdGVzdEFsbG93ZWRXaGVuQ29uZmlndXJhdGlvbkNoYW5nZXMoKSB7CisgICAgICAgIC8vIExldCdzIHNldCBpdCBvbnRvIFFTOgorICAgICAgICBtZWRpYUhpZXJhcmNoeU1hbmFnZXIucXNFeHBhbnNpb24gPSAxLjBmCisgICAgICAgIHZlcmlmeShtZWRpYUNhcm91c2VsQ29udHJvbGxlcikKKyAgICAgICAgICAgIC5vbkRlc2lyZWRMb2NhdGlvbkNoYW5nZWQoCisgICAgICAgICAgICAgICAgQXJndW1lbnRNYXRjaGVycy5hbnlJbnQoKSwKKyAgICAgICAgICAgICAgICBhbnkoTWVkaWFIb3N0U3RhdGU6OmNsYXNzLmphdmEpLAorICAgICAgICAgICAgICAgIGFueUJvb2xlYW4oKSwKKyAgICAgICAgICAgICAgICBhbnlMb25nKCksCisgICAgICAgICAgICAgICAgYW55TG9uZygpCisgICAgICAgICAgICApCisgICAgICAgIGNsZWFySW52b2NhdGlvbnMobWVkaWFDYXJvdXNlbENvbnRyb2xsZXIpCisgICAgICAgIGNvbmZpZ3VyYXRpb25Db250cm9sbGVyLm5vdGlmeUNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkKKyAgICAgICAgdmVyaWZ5KG1lZGlhQ2Fyb3VzZWxDb250cm9sbGVyKQorICAgICAgICAgICAgLm9uRGVzaXJlZExvY2F0aW9uQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICBBcmd1bWVudE1hdGNoZXJzLmFueUludCgpLAorICAgICAgICAgICAgICAgIGFueShNZWRpYUhvc3RTdGF0ZTo6Y2xhc3MuamF2YSksCisgICAgICAgICAgICAgICAgYW55Qm9vbGVhbigpLAorICAgICAgICAgICAgICAgIGFueUxvbmcoKSwKKyAgICAgICAgICAgICAgICBhbnlMb25nKCkKKyAgICAgICAgICAgICkKKyAgICB9CisKKyAgICBAVGVzdAogICAgIGZ1biB0ZXN0QWxsb3dlZFdoZW5Ob3RUdXJuaW5nT2ZmKCkgewogICAgICAgICAvLyBMZXQncyBzZXQgaXQgb250byBRUzoKICAgICAgICAgbWVkaWFIaWVyYXJjaHlNYW5hZ2VyLnFzRXhwYW5zaW9uID0gMS4wZgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL21lZGlhL2RpYWxvZy9NZWRpYU91dHB1dEFkYXB0ZXJUZXN0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0QWRhcHRlclRlc3QuamF2YQppbmRleCA1NmUwNjBkLi4xN2Q4Nzk5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0QWRhcHRlclRlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbWVkaWEvZGlhbG9nL01lZGlhT3V0cHV0QWRhcHRlclRlc3QuamF2YQpAQCAtMTYsMTIgKzE2LDEzIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubWVkaWEuZGlhbG9nOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNFTEVDVElPTl9CRUhBVklPUl9HT19UT19BUFA7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNFTEVDVElPTl9CRUhBVklPUl9OT05FOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlJvdXRlTGlzdGluZ1ByZWZlcmVuY2UuSXRlbS5TVUJURVhUX0FEX1JPVVRJTkdfRElTQUxMT1dFRDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Sb3V0ZUxpc3RpbmdQcmVmZXJlbmNlLkl0ZW0uU1VCVEVYVF9DVVNUT007CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUm91dGVMaXN0aW5nUHJlZmVyZW5jZS5JdGVtLlNVQlRFWFRfU1VCU0NSSVBUSU9OX1JFUVVJUkVEOwogCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLm1lZGlhLk1lZGlhRGV2aWNlLlNlbGVjdGlvbkJlaGF2aW9yLlNFTEVDVElPTl9CRUhBVklPUl9HT19UT19BUFA7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNldHRpbmdzbGliLm1lZGlhLk1lZGlhRGV2aWNlLlNlbGVjdGlvbkJlaGF2aW9yLlNFTEVDVElPTl9CRUhBVklPUl9OT05FOworCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvZGF0YS9yZXBvc2l0b3J5L011bHRpU2hhZGVSZXBvc2l0b3J5VGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvcmVwb3NpdG9yeS9NdWx0aVNoYWRlUmVwb3NpdG9yeVRlc3Qua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhY2FmOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RhdGEvcmVwb3NpdG9yeS9NdWx0aVNoYWRlUmVwb3NpdG9yeVRlc3Qua3QKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVwb3NpdG9yeQorCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlN5c3VpVGVzdENhc2UKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jb3JvdXRpbmVzLmNvbGxlY3RMYXN0VmFsdWUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEubW9kZWwuTXVsdGlTaGFkZUludGVyYWN0aW9uTW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVtb3RlcHJveHkuTXVsdGlTaGFkZUlucHV0UHJveHkKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5Qcm94aWVkSW5wdXRNb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlNoYWRlQ29uZmlnCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVJZAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRXaXRoTWVzc2FnZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5FeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cubWFwCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QucnVuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5CZWZvcmUKK2ltcG9ydCBvcmcuanVuaXQuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAoraW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NAorCitAT3B0SW4oRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaTo6Y2xhc3MpCitAU21hbGxUZXN0CitAUnVuV2l0aChKVW5pdDQ6OmNsYXNzKQorY2xhc3MgTXVsdGlTaGFkZVJlcG9zaXRvcnlUZXN0IDogU3lzdWlUZXN0Q2FzZSgpIHsKKworICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGlucHV0UHJveHk6IE11bHRpU2hhZGVJbnB1dFByb3h5CisKKyAgICBAQmVmb3JlCisgICAgZnVuIHNldFVwKCkgeworICAgICAgICBpbnB1dFByb3h5ID0gTXVsdGlTaGFkZUlucHV0UHJveHkoKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHByb3hpZWRJbnB1dCgpID0gcnVuVGVzdCB7CisgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICB2YWwgbGF0ZXN0OiBQcm94aWVkSW5wdXRNb2RlbD8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QucHJveGllZElucHV0KQorCisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJwcm94aWVkSW5wdXQgc2hvdWxkIHN0YXJ0IHdpdGggbnVsbCIpLnRoYXQobGF0ZXN0KS5pc051bGwoKQorCisgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25UYXApCisgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KS5pc0VxdWFsVG8oUHJveGllZElucHV0TW9kZWwuT25UYXApCisKKyAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoMGYsIDEwMGYpKQorICAgICAgICBhc3NlcnRUaGF0KGxhdGVzdCkuaXNFcXVhbFRvKFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZygwZiwgMTAwZikpCisKKyAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoMGYsIDEyMGYpKQorICAgICAgICBhc3NlcnRUaGF0KGxhdGVzdCkuaXNFcXVhbFRvKFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZygwZiwgMTIwZikpCisKKyAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWdFbmQpCisgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KS5pc0VxdWFsVG8oUHJveGllZElucHV0TW9kZWwuT25EcmFnRW5kKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNoYWRlQ29uZmlnX2R1YWxTaGFkZUVuYWJsZWQoKSA9IHJ1blRlc3QgeworICAgICAgICBvdmVycmlkZVJlc291cmNlKFIuYm9vbC5kdWFsX3NoYWRlX2VuYWJsZWQsIHRydWUpCisgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICB2YWwgc2hhZGVDb25maWc6IFNoYWRlQ29uZmlnPyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5zaGFkZUNvbmZpZykKKworICAgICAgICBhc3NlcnRUaGF0KHNoYWRlQ29uZmlnKS5pc0luc3RhbmNlT2YoU2hhZGVDb25maWcuRHVhbFNoYWRlQ29uZmlnOjpjbGFzcy5qYXZhKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNoYWRlQ29uZmlnX2R1YWxTaGFkZU5vdEVuYWJsZWQoKSA9IHJ1blRlc3QgeworICAgICAgICBvdmVycmlkZVJlc291cmNlKFIuYm9vbC5kdWFsX3NoYWRlX2VuYWJsZWQsIGZhbHNlKQorICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgdmFsIHNoYWRlQ29uZmlnOiBTaGFkZUNvbmZpZz8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3Quc2hhZGVDb25maWcpCisKKyAgICAgICAgYXNzZXJ0VGhhdChzaGFkZUNvbmZpZykuaXNJbnN0YW5jZU9mKFNoYWRlQ29uZmlnLlNpbmdsZVNoYWRlQ29uZmlnOjpjbGFzcy5qYXZhKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIGZvcmNlQ29sbGFwc2VBbGwoKSA9IHJ1blRlc3QgeworICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgdmFsIGZvcmNlQ29sbGFwc2VBbGw6IEJvb2xlYW4/IGJ5IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmZvcmNlQ29sbGFwc2VBbGwpCisKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImZvcmNlQ29sbGFwc2VBbGwgc2hvdWxkIHN0YXJ0IGFzIGZhbHNlISIpCisgICAgICAgICAgICAudGhhdChmb3JjZUNvbGxhcHNlQWxsKQorICAgICAgICAgICAgLmlzRmFsc2UoKQorCisgICAgICAgIHVuZGVyVGVzdC5zZXRGb3JjZUNvbGxhcHNlQWxsKHRydWUpCisgICAgICAgIGFzc2VydFRoYXQoZm9yY2VDb2xsYXBzZUFsbCkuaXNUcnVlKCkKKworICAgICAgICB1bmRlclRlc3Quc2V0Rm9yY2VDb2xsYXBzZUFsbChmYWxzZSkKKyAgICAgICAgYXNzZXJ0VGhhdChmb3JjZUNvbGxhcHNlQWxsKS5pc0ZhbHNlKCkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBzaGFkZUludGVyYWN0aW9uKCkgPSBydW5UZXN0IHsKKyAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZSgpCisgICAgICAgIHZhbCBzaGFkZUludGVyYWN0aW9uOiBNdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbD8gYnkKKyAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LnNoYWRlSW50ZXJhY3Rpb24pCisKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoInNoYWRlSW50ZXJhY3Rpb24gc2hvdWxkIHN0YXJ0IGFzIG51bGwhIikudGhhdChzaGFkZUludGVyYWN0aW9uKS5pc051bGwoKQorCisgICAgICAgIHVuZGVyVGVzdC5zZXRTaGFkZUludGVyYWN0aW9uKAorICAgICAgICAgICAgTXVsdGlTaGFkZUludGVyYWN0aW9uTW9kZWwoc2hhZGVJZCA9IFNoYWRlSWQuTEVGVCwgaXNQcm94aWVkID0gZmFsc2UpCisgICAgICAgICkKKyAgICAgICAgYXNzZXJ0VGhhdChzaGFkZUludGVyYWN0aW9uKQorICAgICAgICAgICAgLmlzRXF1YWxUbyhNdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbChzaGFkZUlkID0gU2hhZGVJZC5MRUZULCBpc1Byb3hpZWQgPSBmYWxzZSkpCisKKyAgICAgICAgdW5kZXJUZXN0LnNldFNoYWRlSW50ZXJhY3Rpb24oCisgICAgICAgICAgICBNdWx0aVNoYWRlSW50ZXJhY3Rpb25Nb2RlbChzaGFkZUlkID0gU2hhZGVJZC5SSUdIVCwgaXNQcm94aWVkID0gdHJ1ZSkKKyAgICAgICAgKQorICAgICAgICBhc3NlcnRUaGF0KHNoYWRlSW50ZXJhY3Rpb24pCisgICAgICAgICAgICAuaXNFcXVhbFRvKE11bHRpU2hhZGVJbnRlcmFjdGlvbk1vZGVsKHNoYWRlSWQgPSBTaGFkZUlkLlJJR0hULCBpc1Byb3hpZWQgPSB0cnVlKSkKKworICAgICAgICB1bmRlclRlc3Quc2V0U2hhZGVJbnRlcmFjdGlvbihudWxsKQorICAgICAgICBhc3NlcnRUaGF0KHNoYWRlSW50ZXJhY3Rpb24pLmlzTnVsbCgpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gZXhwYW5zaW9uKCkgPSBydW5UZXN0IHsKKyAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZSgpCisgICAgICAgIHZhbCBsZWZ0RXhwYW5zaW9uOiBGbG9hdD8gYnkKKyAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmdldFNoYWRlKFNoYWRlSWQuTEVGVCkubWFwIHsgaXQuZXhwYW5zaW9uIH0pCisgICAgICAgIHZhbCByaWdodEV4cGFuc2lvbjogRmxvYXQ/IGJ5CisgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5nZXRTaGFkZShTaGFkZUlkLlJJR0hUKS5tYXAgeyBpdC5leHBhbnNpb24gfSkKKyAgICAgICAgdmFsIHNpbmdsZUV4cGFuc2lvbjogRmxvYXQ/IGJ5CisgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5nZXRTaGFkZShTaGFkZUlkLlNJTkdMRSkubWFwIHsgaXQuZXhwYW5zaW9uIH0pCisKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImV4cGFuc2lvbiBzaG91bGQgc3RhcnQgYXMgMCEiKS50aGF0KGxlZnRFeHBhbnNpb24pLmlzWmVybygpCisgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJleHBhbnNpb24gc2hvdWxkIHN0YXJ0IGFzIDAhIikudGhhdChyaWdodEV4cGFuc2lvbikuaXNaZXJvKCkKKyAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImV4cGFuc2lvbiBzaG91bGQgc3RhcnQgYXMgMCEiKS50aGF0KHNpbmdsZUV4cGFuc2lvbikuaXNaZXJvKCkKKworICAgICAgICB1bmRlclRlc3Quc2V0RXhwYW5zaW9uKAorICAgICAgICAgICAgc2hhZGVJZCA9IFNoYWRlSWQuTEVGVCwKKyAgICAgICAgICAgIDAuNGYsCisgICAgICAgICkKKyAgICAgICAgYXNzZXJ0VGhhdChsZWZ0RXhwYW5zaW9uKS5pc0VxdWFsVG8oMC40ZikKKyAgICAgICAgYXNzZXJ0VGhhdChyaWdodEV4cGFuc2lvbikuaXNFcXVhbFRvKDBmKQorICAgICAgICBhc3NlcnRUaGF0KHNpbmdsZUV4cGFuc2lvbikuaXNFcXVhbFRvKDBmKQorCisgICAgICAgIHVuZGVyVGVzdC5zZXRFeHBhbnNpb24oCisgICAgICAgICAgICBzaGFkZUlkID0gU2hhZGVJZC5SSUdIVCwKKyAgICAgICAgICAgIDAuNzNmLAorICAgICAgICApCisgICAgICAgIGFzc2VydFRoYXQobGVmdEV4cGFuc2lvbikuaXNFcXVhbFRvKDAuNGYpCisgICAgICAgIGFzc2VydFRoYXQocmlnaHRFeHBhbnNpb24pLmlzRXF1YWxUbygwLjczZikKKyAgICAgICAgYXNzZXJ0VGhhdChzaW5nbGVFeHBhbnNpb24pLmlzRXF1YWxUbygwZikKKworICAgICAgICB1bmRlclRlc3Quc2V0RXhwYW5zaW9uKAorICAgICAgICAgICAgc2hhZGVJZCA9IFNoYWRlSWQuTEVGVCwKKyAgICAgICAgICAgIDAuMWYsCisgICAgICAgICkKKyAgICAgICAgdW5kZXJUZXN0LnNldEV4cGFuc2lvbigKKyAgICAgICAgICAgIHNoYWRlSWQgPSBTaGFkZUlkLlNJTkdMRSwKKyAgICAgICAgICAgIDAuODhmLAorICAgICAgICApCisgICAgICAgIGFzc2VydFRoYXQobGVmdEV4cGFuc2lvbikuaXNFcXVhbFRvKDAuMWYpCisgICAgICAgIGFzc2VydFRoYXQocmlnaHRFeHBhbnNpb24pLmlzRXF1YWxUbygwLjczZikKKyAgICAgICAgYXNzZXJ0VGhhdChzaW5nbGVFeHBhbnNpb24pLmlzRXF1YWxUbygwLjg4ZikKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1biBjcmVhdGUoKTogTXVsdGlTaGFkZVJlcG9zaXRvcnkgeworICAgICAgICByZXR1cm4gY3JlYXRlKAorICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQsCisgICAgICAgICAgICBpbnB1dFByb3h5ID0gaW5wdXRQcm94eSwKKyAgICAgICAgKQorICAgIH0KKworICAgIGNvbXBhbmlvbiBvYmplY3QgeworICAgICAgICBmdW4gY3JlYXRlKAorICAgICAgICAgICAgY29udGV4dDogQ29udGV4dCwKKyAgICAgICAgICAgIGlucHV0UHJveHk6IE11bHRpU2hhZGVJbnB1dFByb3h5LAorICAgICAgICApOiBNdWx0aVNoYWRlUmVwb3NpdG9yeSB7CisgICAgICAgICAgICByZXR1cm4gTXVsdGlTaGFkZVJlcG9zaXRvcnkoCisgICAgICAgICAgICAgICAgYXBwbGljYXRpb25Db250ZXh0ID0gY29udGV4dCwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3h5ID0gaW5wdXRQcm94eSwKKyAgICAgICAgICAgICkKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RvbWFpbi9pbnRlcmFjdG9yL011bHRpU2hhZGVJbnRlcmFjdG9yVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL2RvbWFpbi9pbnRlcmFjdG9yL011bHRpU2hhZGVJbnRlcmFjdG9yVGVzdC5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTVlNjhmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL211bHRpc2hhZGUvZG9tYWluL2ludGVyYWN0b3IvTXVsdGlTaGFkZUludGVyYWN0b3JUZXN0Lmt0CkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kb21haW4uaW50ZXJhY3RvcgorCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlN5c3VpVGVzdENhc2UKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jb3JvdXRpbmVzLmNvbGxlY3RMYXN0VmFsdWUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVtb3RlcHJveHkuTXVsdGlTaGFkZUlucHV0UHJveHkKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVwb3NpdG9yeS5NdWx0aVNoYWRlUmVwb3NpdG9yeVRlc3QKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLnNoYXJlZC5tb2RlbC5Qcm94aWVkSW5wdXRNb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlNoYWRlSWQKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0V2l0aE1lc3NhZ2UKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy50ZXN0LlRlc3RTY29wZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy50ZXN0LnJ1blRlc3QKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGgKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQKKworQE9wdEluKEV4cGVyaW1lbnRhbENvcm91dGluZXNBcGk6OmNsYXNzKQorQFNtYWxsVGVzdAorQFJ1bldpdGgoSlVuaXQ0OjpjbGFzcykKK2NsYXNzIE11bHRpU2hhZGVJbnRlcmFjdG9yVGVzdCA6IFN5c3VpVGVzdENhc2UoKSB7CisKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciB0ZXN0U2NvcGU6IFRlc3RTY29wZQorICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGlucHV0UHJveHk6IE11bHRpU2hhZGVJbnB1dFByb3h5CisKKyAgICBAQmVmb3JlCisgICAgZnVuIHNldFVwKCkgeworICAgICAgICB0ZXN0U2NvcGUgPSBUZXN0U2NvcGUoKQorICAgICAgICBpbnB1dFByb3h5ID0gTXVsdGlTaGFkZUlucHV0UHJveHkoKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIG1heFNoYWRlRXhwYW5zaW9uKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgICAgIHZhbCBtYXhTaGFkZUV4cGFuc2lvbjogRmxvYXQ/IGJ5IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0Lm1heFNoYWRlRXhwYW5zaW9uKQorICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoIm1heFNoYWRlRXhwYW5zaW9uIG11c3Qgc3RhcnQgd2l0aCAwLjAhIikKKyAgICAgICAgICAgICAgICAudGhhdChtYXhTaGFkZUV4cGFuc2lvbikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKDBmKQorCisgICAgICAgICAgICB1bmRlclRlc3Quc2V0RXhwYW5zaW9uKHNoYWRlSWQgPSBTaGFkZUlkLkxFRlQsIGV4cGFuc2lvbiA9IDAuNDQxZikKKyAgICAgICAgICAgIGFzc2VydFRoYXQobWF4U2hhZGVFeHBhbnNpb24pLmlzRXF1YWxUbygwLjQ0MWYpCisKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRFeHBhbnNpb24oc2hhZGVJZCA9IFNoYWRlSWQuUklHSFQsIGV4cGFuc2lvbiA9IDAuNDQyZikKKyAgICAgICAgICAgIGFzc2VydFRoYXQobWF4U2hhZGVFeHBhbnNpb24pLmlzRXF1YWxUbygwLjQ0MmYpCisKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRFeHBhbnNpb24oc2hhZGVJZCA9IFNoYWRlSWQuUklHSFQsIGV4cGFuc2lvbiA9IDBmKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChtYXhTaGFkZUV4cGFuc2lvbikuaXNFcXVhbFRvKDAuNDQxZikKKworICAgICAgICAgICAgdW5kZXJUZXN0LnNldEV4cGFuc2lvbihzaGFkZUlkID0gU2hhZGVJZC5MRUZULCBleHBhbnNpb24gPSAwZikKKyAgICAgICAgICAgIGFzc2VydFRoYXQobWF4U2hhZGVFeHBhbnNpb24pLmlzRXF1YWxUbygwZikKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gaXNWaXNpYmxlX2R1YWxTaGFkZUNvbmZpZygpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmJvb2wuZHVhbF9zaGFkZV9lbmFibGVkLCB0cnVlKQorICAgICAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZSgpCisgICAgICAgICAgICB2YWwgaXNMZWZ0U2hhZGVWaXNpYmxlOiBCb29sZWFuPyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc1Zpc2libGUoU2hhZGVJZC5MRUZUKSkKKyAgICAgICAgICAgIHZhbCBpc1JpZ2h0U2hhZGVWaXNpYmxlOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzVmlzaWJsZShTaGFkZUlkLlJJR0hUKSkKKyAgICAgICAgICAgIHZhbCBpc1NpbmdsZVNoYWRlVmlzaWJsZTogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc1Zpc2libGUoU2hhZGVJZC5TSU5HTEUpKQorCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlVmlzaWJsZSkuaXNUcnVlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNSaWdodFNoYWRlVmlzaWJsZSkuaXNUcnVlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZVZpc2libGUpLmlzRmFsc2UoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBpc1Zpc2libGVfc2luZ2xlU2hhZGVDb25maWcoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIG92ZXJyaWRlUmVzb3VyY2UoUi5ib29sLmR1YWxfc2hhZGVfZW5hYmxlZCwgZmFsc2UpCisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgICAgIHZhbCBpc0xlZnRTaGFkZVZpc2libGU6IEJvb2xlYW4/IGJ5IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzVmlzaWJsZShTaGFkZUlkLkxFRlQpKQorICAgICAgICAgICAgdmFsIGlzUmlnaHRTaGFkZVZpc2libGU6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNWaXNpYmxlKFNoYWRlSWQuUklHSFQpKQorICAgICAgICAgICAgdmFsIGlzU2luZ2xlU2hhZGVWaXNpYmxlOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzVmlzaWJsZShTaGFkZUlkLlNJTkdMRSkpCisKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNMZWZ0U2hhZGVWaXNpYmxlKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNSaWdodFNoYWRlVmlzaWJsZSkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVWaXNpYmxlKS5pc1RydWUoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBpc05vblByb3hpZWRJbnB1dEFsbG93ZWQoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICAgICAgdmFsIGlzTGVmdFNoYWRlTm9uUHJveGllZElucHV0QWxsb3dlZDogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc05vblByb3hpZWRJbnB1dEFsbG93ZWQoU2hhZGVJZC5MRUZUKSkKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc05vblByb3hpZWRJbnB1dEFsbG93ZWQgc2hvdWxkIHN0YXJ0IGFzIHRydWUhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc0xlZnRTaGFkZU5vblByb3hpZWRJbnB1dEFsbG93ZWQpCisgICAgICAgICAgICAgICAgLmlzVHJ1ZSgpCisKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gY29sbGVjdCBwcm94aWVkIGlucHV0IHNvIHRoZSBmbG93cyBiZWNvbWUgaG90IGFzIHRoZSBnZXN0dXJlIGNhbmNlbGF0aW9uIGNvZGUKKyAgICAgICAgICAgIC8vIGxvZ2ljIHNpdHMgaW4gc2lkZSB0aGUgcHJveGllZElucHV0IGZsb3cgZm9yIGVhY2ggc2hhZGUuCisgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5wcm94aWVkSW5wdXQoU2hhZGVJZC5MRUZUKSkKKyAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LnByb3hpZWRJbnB1dChTaGFkZUlkLlJJR0hUKSkKKworICAgICAgICAgICAgLy8gU3RhcnRpbmcgYSBwcm94aWVkIGludGVyYWN0aW9uIG9uIHRoZSBMRUZUIHNoYWRlIGRpc2FsbG93cyBub24tcHJveGllZCBpbnRlcmFjdGlvbiBvbgorICAgICAgICAgICAgLy8gdGhlCisgICAgICAgICAgICAvLyBzYW1lIHNoYWRlLgorICAgICAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dCgKKyAgICAgICAgICAgICAgICBQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoeEZyYWN0aW9uID0gMGYsIHlEcmFnQW1vdW50UHggPSAxMjNmKQorICAgICAgICAgICAgKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZU5vblByb3hpZWRJbnB1dEFsbG93ZWQpLmlzRmFsc2UoKQorCisgICAgICAgICAgICAvLyBSZWdpc3RlcmluZyB0aGUgZW5kIG9mIHRoZSBwcm94aWVkIGludGVyYWN0aW9uIHJlLWFsbG93cyBpdC4KKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25EcmFnRW5kKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZU5vblByb3hpZWRJbnB1dEFsbG93ZWQpLmlzVHJ1ZSgpCisKKyAgICAgICAgICAgIC8vIFN0YXJ0aW5nIGEgcHJveGllZCBpbnRlcmFjdGlvbiBvbiB0aGUgUklHSFQgc2hhZGUgZm9yY2UtY29sbGFwc2VzIHRoZSBMRUZUIHNoYWRlLAorICAgICAgICAgICAgLy8gZGlzYWxsb3dpbmcgbm9uLXByb3hpZWQgaW5wdXQgb24gdGhlIExFRlQgc2hhZGUuCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KAorICAgICAgICAgICAgICAgIFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZyh4RnJhY3Rpb24gPSAxZiwgeURyYWdBbW91bnRQeCA9IDEyM2YpCisgICAgICAgICAgICApCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlTm9uUHJveGllZElucHV0QWxsb3dlZCkuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBlbmQgb2YgdGhlIGludGVyYWN0aW9uIG9uIHRoZSBSSUdIVCBzaGFkZSByZS1hbGxvd3MgaXQuCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZ0VuZCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNMZWZ0U2hhZGVOb25Qcm94aWVkSW5wdXRBbGxvd2VkKS5pc1RydWUoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBpc0ZvcmNlQ29sbGFwc2VkX3doZW5PdGhlclNoYWRlSW50ZXJhY3Rpb25VbmRlcndheSgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZSgpCisgICAgICAgICAgICB2YWwgaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZDogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc0ZvcmNlQ29sbGFwc2VkKFNoYWRlSWQuTEVGVCkpCisgICAgICAgICAgICB2YWwgaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQ6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNGb3JjZUNvbGxhcHNlZChTaGFkZUlkLlJJR0hUKSkKKyAgICAgICAgICAgIHZhbCBpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQ6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNGb3JjZUNvbGxhcHNlZChTaGFkZUlkLlNJTkdMRSkpCisKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc0ZvcmNlQ29sbGFwc2VkIHNob3VsZCBzdGFydCBhcyBmYWxzZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICAgICAgLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImlzRm9yY2VDb2xsYXBzZWQgc2hvdWxkIHN0YXJ0IGFzIGZhbHNlISIpCisgICAgICAgICAgICAgICAgLnRoYXQoaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICAgICAgLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImlzRm9yY2VDb2xsYXBzZWQgc2hvdWxkIHN0YXJ0IGFzIGZhbHNlISIpCisgICAgICAgICAgICAgICAgLnRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCkKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIHN0YXJ0IG9mIGFuIGludGVyYWN0aW9uIG9uIHRoZSBSSUdIVCBzaGFkZSBmb3JjZS1jb2xsYXBzZXMgdGhlIExFRlQKKyAgICAgICAgICAgIC8vIHNoYWRlLgorICAgICAgICAgICAgdW5kZXJUZXN0Lm9uVXNlckludGVyYWN0aW9uU3RhcnRlZChTaGFkZUlkLlJJR0hUKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc1RydWUoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBlbmQgb2YgdGhlIGludGVyYWN0aW9uIG9uIHRoZSBSSUdIVCBzaGFkZSByZS1hbGxvd3MgaXQuCisgICAgICAgICAgICB1bmRlclRlc3Qub25Vc2VySW50ZXJhY3Rpb25FbmRlZChTaGFkZUlkLlJJR0hUKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzRmFsc2UoKQorCisgICAgICAgICAgICAvLyBSZWdpc3RlcmluZyB0aGUgc3RhcnQgb2YgYW4gaW50ZXJhY3Rpb24gb24gdGhlIExFRlQgc2hhZGUgZm9yY2UtY29sbGFwc2VzIHRoZSBSSUdIVAorICAgICAgICAgICAgLy8gc2hhZGUuCisgICAgICAgICAgICB1bmRlclRlc3Qub25Vc2VySW50ZXJhY3Rpb25TdGFydGVkKFNoYWRlSWQuTEVGVCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc1RydWUoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzRmFsc2UoKQorCisgICAgICAgICAgICAvLyBSZWdpc3RlcmluZyB0aGUgZW5kIG9mIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgTEVGVCBzaGFkZSByZS1hbGxvd3MgaXQuCisgICAgICAgICAgICB1bmRlclRlc3Qub25Vc2VySW50ZXJhY3Rpb25FbmRlZChTaGFkZUlkLkxFRlQpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIGNvbGxhcHNlQWxsKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgICAgIHZhbCBpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzRm9yY2VDb2xsYXBzZWQoU2hhZGVJZC5MRUZUKSkKKyAgICAgICAgICAgIHZhbCBpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZDogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc0ZvcmNlQ29sbGFwc2VkKFNoYWRlSWQuUklHSFQpKQorICAgICAgICAgICAgdmFsIGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZDogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc0ZvcmNlQ29sbGFwc2VkKFNoYWRlSWQuU0lOR0xFKSkKKworICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImlzRm9yY2VDb2xsYXBzZWQgc2hvdWxkIHN0YXJ0IGFzIGZhbHNlISIpCisgICAgICAgICAgICAgICAgLnRoYXQoaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICAgICAgLmlzRmFsc2UoKQorCisgICAgICAgICAgICB1bmRlclRlc3QuY29sbGFwc2VBbGwoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc1RydWUoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNUcnVlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc1RydWUoKQorCisgICAgICAgICAgICAvLyBSZWNlaXZpbmcgcHJveGllZCBpbnB1dCBvbiB0aGF0J3Mgbm90IGEgdGFwIGdlc3R1cmUsIG9uIHRoZSBsZWZ0LWhhbmQgc2lkZSByZXNldHMgdGhlCisgICAgICAgICAgICAvLyAiY29sbGFwc2UgYWxsIi4gTm90ZSB0aGF0IG5vdyB0aGUgUklHSFQgc2hhZGUgaXMgZm9yY2UtY29sbGFwc2VkIGJlY2F1c2Ugd2UncmUKKyAgICAgICAgICAgIC8vIGludGVyYWN0aW5nIHdpdGggdGhlIExFRlQgc2hhZGUuCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZygwZiwgMGYpKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIG9uVGFwT3V0c2lkZV9jb2xsYXBzZXNBbGwoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICAgICAgdmFsIGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQ6IEJvb2xlYW4/IGJ5CisgICAgICAgICAgICAgICAgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNGb3JjZUNvbGxhcHNlZChTaGFkZUlkLkxFRlQpKQorICAgICAgICAgICAgdmFsIGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzRm9yY2VDb2xsYXBzZWQoU2hhZGVJZC5SSUdIVCkpCisgICAgICAgICAgICB2YWwgaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzRm9yY2VDb2xsYXBzZWQoU2hhZGVJZC5TSU5HTEUpKQorCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc0ZvcmNlQ29sbGFwc2VkIHNob3VsZCBzdGFydCBhcyBmYWxzZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc0ZvcmNlQ29sbGFwc2VkIHNob3VsZCBzdGFydCBhcyBmYWxzZSEiKQorICAgICAgICAgICAgICAgIC50aGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25UYXApCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc1RydWUoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHByb3hpZWRJbnB1dF9pZ25vcmVkV2hpbGVOb25Qcm94aWVkR2VzdHVyZVVuZGVyd2F5KCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgICAgIHZhbCBwcm94aWVkSW5wdXQ6IFByb3hpZWRJbnB1dE1vZGVsPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LnByb3hpZWRJbnB1dChTaGFkZUlkLlJJR0hUKSkKKyAgICAgICAgICAgIHVuZGVyVGVzdC5vblVzZXJJbnRlcmFjdGlvblN0YXJ0ZWQoc2hhZGVJZCA9IFNoYWRlSWQuUklHSFQpCisKKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25EcmFnKDAuOWYsIDEwMGYpKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChwcm94aWVkSW5wdXQpLmlzTnVsbCgpCisKKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoUHJveGllZElucHV0TW9kZWwuT25EcmFnKDAuOGYsIDExMGYpKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChwcm94aWVkSW5wdXQpLmlzTnVsbCgpCisKKyAgICAgICAgICAgIHVuZGVyVGVzdC5vblVzZXJJbnRlcmFjdGlvbkVuZGVkKHNoYWRlSWQgPSBTaGFkZUlkLlJJR0hUKQorCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZygwLjlmLCAxMDBmKSkKKyAgICAgICAgICAgIGFzc2VydFRoYXQocHJveGllZElucHV0KS5pc05vdE51bGwoKQorICAgICAgICB9CisKKyAgICBwcml2YXRlIGZ1biBjcmVhdGUoKTogTXVsdGlTaGFkZUludGVyYWN0b3IgeworICAgICAgICByZXR1cm4gY3JlYXRlKAorICAgICAgICAgICAgdGVzdFNjb3BlID0gdGVzdFNjb3BlLAorICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQsCisgICAgICAgICAgICBpbnB1dFByb3h5ID0gaW5wdXRQcm94eSwKKyAgICAgICAgKQorICAgIH0KKworICAgIGNvbXBhbmlvbiBvYmplY3QgeworICAgICAgICBmdW4gY3JlYXRlKAorICAgICAgICAgICAgdGVzdFNjb3BlOiBUZXN0U2NvcGUsCisgICAgICAgICAgICBjb250ZXh0OiBDb250ZXh0LAorICAgICAgICAgICAgaW5wdXRQcm94eTogTXVsdGlTaGFkZUlucHV0UHJveHksCisgICAgICAgICk6IE11bHRpU2hhZGVJbnRlcmFjdG9yIHsKKyAgICAgICAgICAgIHJldHVybiBNdWx0aVNoYWRlSW50ZXJhY3RvcigKKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvblNjb3BlID0gdGVzdFNjb3BlLmJhY2tncm91bmRTY29wZSwKKyAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0KKyAgICAgICAgICAgICAgICAgICAgTXVsdGlTaGFkZVJlcG9zaXRvcnlUZXN0LmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm94eSA9IGlucHV0UHJveHksCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgaW5wdXRQcm94eSA9IGlucHV0UHJveHksCisgICAgICAgICAgICApCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3bW9kZWwvTXVsdGlTaGFkZVZpZXdNb2RlbFRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3bW9kZWwvTXVsdGlTaGFkZVZpZXdNb2RlbFRlc3Qua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NDUxNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL3ZpZXdtb2RlbC9NdWx0aVNoYWRlVmlld01vZGVsVGVzdC5rdApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUudWkudmlld21vZGVsCisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlN5c3VpVGVzdENhc2UKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jb3JvdXRpbmVzLmNvbGxlY3RMYXN0VmFsdWUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVtb3RlcHJveHkuTXVsdGlTaGFkZUlucHV0UHJveHkKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRvbWFpbi5pbnRlcmFjdG9yLk11bHRpU2hhZGVJbnRlcmFjdG9yVGVzdAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy50ZXN0LlRlc3RTY29wZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy50ZXN0LnJ1blRlc3QKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGgKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQKKworQE9wdEluKEV4cGVyaW1lbnRhbENvcm91dGluZXNBcGk6OmNsYXNzKQorQFNtYWxsVGVzdAorQFJ1bldpdGgoSlVuaXQ0OjpjbGFzcykKK2NsYXNzIE11bHRpU2hhZGVWaWV3TW9kZWxUZXN0IDogU3lzdWlUZXN0Q2FzZSgpIHsKKworICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHRlc3RTY29wZTogVGVzdFNjb3BlCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgaW5wdXRQcm94eTogTXVsdGlTaGFkZUlucHV0UHJveHkKKworICAgIEBCZWZvcmUKKyAgICBmdW4gc2V0VXAoKSB7CisgICAgICAgIHRlc3RTY29wZSA9IFRlc3RTY29wZSgpCisgICAgICAgIGlucHV0UHJveHkgPSBNdWx0aVNoYWRlSW5wdXRQcm94eSgpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gc2NyaW1fd2hlbkR1YWxTaGFkZUNvbGxhcHNlZCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIGFscGhhID0gMC41ZgorICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmRpbWVuLmR1YWxfc2hhZGVfc2NyaW1fYWxwaGEsIGFscGhhKQorICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmJvb2wuZHVhbF9zaGFkZV9lbmFibGVkLCB0cnVlKQorCisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgICAgIHZhbCBzY3JpbUFscGhhOiBGbG9hdD8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3Quc2NyaW1BbHBoYSkKKyAgICAgICAgICAgIHZhbCBpc1NjcmltRW5hYmxlZDogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNTY3JpbUVuYWJsZWQpCisKKyAgICAgICAgICAgIGFzc2VydFRoYXQoc2NyaW1BbHBoYSkuaXNaZXJvKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTY3JpbUVuYWJsZWQpLmlzRmFsc2UoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBzY3JpbV93aGVuRHVhbFNoYWRlRXhwYW5kZWQoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhbCBhbHBoYSA9IDAuNWYKKyAgICAgICAgICAgIG92ZXJyaWRlUmVzb3VyY2UoUi5kaW1lbi5kdWFsX3NoYWRlX3NjcmltX2FscGhhLCBhbHBoYSkKKyAgICAgICAgICAgIG92ZXJyaWRlUmVzb3VyY2UoUi5ib29sLmR1YWxfc2hhZGVfZW5hYmxlZCwgdHJ1ZSkKKyAgICAgICAgICAgIHZhbCB1bmRlclRlc3QgPSBjcmVhdGUoKQorICAgICAgICAgICAgdmFsIHNjcmltQWxwaGE6IEZsb2F0PyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5zY3JpbUFscGhhKQorICAgICAgICAgICAgdmFsIGlzU2NyaW1FbmFibGVkOiBCb29sZWFuPyBieSBjb2xsZWN0TGFzdFZhbHVlKHVuZGVyVGVzdC5pc1NjcmltRW5hYmxlZCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoc2NyaW1BbHBoYSkuaXNaZXJvKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTY3JpbUVuYWJsZWQpLmlzRmFsc2UoKQorCisgICAgICAgICAgICB1bmRlclRlc3QubGVmdFNoYWRlLm9uRXhwYW5zaW9uQ2hhbmdlZCgwLjVmKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChzY3JpbUFscGhhKS5pc0VxdWFsVG8oYWxwaGEgKiAwLjVmKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NjcmltRW5hYmxlZCkuaXNUcnVlKCkKKworICAgICAgICAgICAgdW5kZXJUZXN0LnJpZ2h0U2hhZGUub25FeHBhbnNpb25DaGFuZ2VkKDFmKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChzY3JpbUFscGhhKS5pc0VxdWFsVG8oYWxwaGEgKiAxZikKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTY3JpbUVuYWJsZWQpLmlzVHJ1ZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNjcmltX3doZW5TaW5nbGVTaGFkZUNvbGxhcHNlZCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIGFscGhhID0gMC41ZgorICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmRpbWVuLmR1YWxfc2hhZGVfc2NyaW1fYWxwaGEsIGFscGhhKQorICAgICAgICAgICAgb3ZlcnJpZGVSZXNvdXJjZShSLmJvb2wuZHVhbF9zaGFkZV9lbmFibGVkLCBmYWxzZSkKKworICAgICAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZSgpCisgICAgICAgICAgICB2YWwgc2NyaW1BbHBoYTogRmxvYXQ/IGJ5IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LnNjcmltQWxwaGEpCisgICAgICAgICAgICB2YWwgaXNTY3JpbUVuYWJsZWQ6IEJvb2xlYW4/IGJ5IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LmlzU2NyaW1FbmFibGVkKQorCisgICAgICAgICAgICBhc3NlcnRUaGF0KHNjcmltQWxwaGEpLmlzWmVybygpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2NyaW1FbmFibGVkKS5pc0ZhbHNlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gc2NyaW1fd2hlblNpbmdsZVNoYWRlRXhwYW5kZWQoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhbCBhbHBoYSA9IDAuNWYKKyAgICAgICAgICAgIG92ZXJyaWRlUmVzb3VyY2UoUi5kaW1lbi5kdWFsX3NoYWRlX3NjcmltX2FscGhhLCBhbHBoYSkKKyAgICAgICAgICAgIG92ZXJyaWRlUmVzb3VyY2UoUi5ib29sLmR1YWxfc2hhZGVfZW5hYmxlZCwgZmFsc2UpCisgICAgICAgICAgICB2YWwgdW5kZXJUZXN0ID0gY3JlYXRlKCkKKyAgICAgICAgICAgIHZhbCBzY3JpbUFscGhhOiBGbG9hdD8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3Quc2NyaW1BbHBoYSkKKyAgICAgICAgICAgIHZhbCBpc1NjcmltRW5hYmxlZDogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNTY3JpbUVuYWJsZWQpCisKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zaW5nbGVTaGFkZS5vbkV4cGFuc2lvbkNoYW5nZWQoMC45NWYpCisKKyAgICAgICAgICAgIGFzc2VydFRoYXQoc2NyaW1BbHBoYSkuaXNaZXJvKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTY3JpbUVuYWJsZWQpLmlzRmFsc2UoKQorICAgICAgICB9CisKKyAgICBwcml2YXRlIGZ1biBjcmVhdGUoKTogTXVsdGlTaGFkZVZpZXdNb2RlbCB7CisgICAgICAgIHJldHVybiBNdWx0aVNoYWRlVmlld01vZGVsKAorICAgICAgICAgICAgdmlld01vZGVsU2NvcGUgPSB0ZXN0U2NvcGUuYmFja2dyb3VuZFNjb3BlLAorICAgICAgICAgICAgaW50ZXJhY3RvciA9CisgICAgICAgICAgICAgICAgTXVsdGlTaGFkZUludGVyYWN0b3JUZXN0LmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgdGVzdFNjb3BlID0gdGVzdFNjb3BlLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm94eSA9IGlucHV0UHJveHksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9tdWx0aXNoYWRlL3VpL3ZpZXdtb2RlbC9TaGFkZVZpZXdNb2RlbFRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3bW9kZWwvU2hhZGVWaWV3TW9kZWxUZXN0Lmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMmFhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbXVsdGlzaGFkZS91aS92aWV3bW9kZWwvU2hhZGVWaWV3TW9kZWxUZXN0Lmt0CkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS51aS52aWV3bW9kZWwKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3QKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNvcm91dGluZXMuY29sbGVjdExhc3RWYWx1ZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZW1vdGVwcm94eS5NdWx0aVNoYWRlSW5wdXRQcm94eQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZG9tYWluLmludGVyYWN0b3IuTXVsdGlTaGFkZUludGVyYWN0b3IKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRvbWFpbi5pbnRlcmFjdG9yLk11bHRpU2hhZGVJbnRlcmFjdG9yVGVzdAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuc2hhcmVkLm1vZGVsLlByb3hpZWRJbnB1dE1vZGVsCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5zaGFyZWQubW9kZWwuU2hhZGVJZAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRXaXRoTWVzc2FnZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5FeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QuVGVzdFNjb3BlCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QucnVuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5CZWZvcmUKK2ltcG9ydCBvcmcuanVuaXQuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAoraW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NAorCitAT3B0SW4oRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaTo6Y2xhc3MpCitAU21hbGxUZXN0CitAUnVuV2l0aChKVW5pdDQ6OmNsYXNzKQorY2xhc3MgU2hhZGVWaWV3TW9kZWxUZXN0IDogU3lzdWlUZXN0Q2FzZSgpIHsKKworICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHRlc3RTY29wZTogVGVzdFNjb3BlCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgaW5wdXRQcm94eTogTXVsdGlTaGFkZUlucHV0UHJveHkKKyAgICBwcml2YXRlIHZhciBpbnRlcmFjdG9yOiBNdWx0aVNoYWRlSW50ZXJhY3Rvcj8gPSBudWxsCisKKyAgICBAQmVmb3JlCisgICAgZnVuIHNldFVwKCkgeworICAgICAgICB0ZXN0U2NvcGUgPSBUZXN0U2NvcGUoKQorICAgICAgICBpbnB1dFByb3h5ID0gTXVsdGlTaGFkZUlucHV0UHJveHkoKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIGlzVmlzaWJsZV9kdWFsU2hhZGVDb25maWcoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIG92ZXJyaWRlUmVzb3VyY2UoUi5ib29sLmR1YWxfc2hhZGVfZW5hYmxlZCwgdHJ1ZSkKKyAgICAgICAgICAgIHZhbCBpc0xlZnRTaGFkZVZpc2libGU6IEJvb2xlYW4/IGJ5IGNvbGxlY3RMYXN0VmFsdWUoY3JlYXRlKFNoYWRlSWQuTEVGVCkuaXNWaXNpYmxlKQorICAgICAgICAgICAgdmFsIGlzUmlnaHRTaGFkZVZpc2libGU6IEJvb2xlYW4/IGJ5IGNvbGxlY3RMYXN0VmFsdWUoY3JlYXRlKFNoYWRlSWQuUklHSFQpLmlzVmlzaWJsZSkKKyAgICAgICAgICAgIHZhbCBpc1NpbmdsZVNoYWRlVmlzaWJsZTogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZShjcmVhdGUoU2hhZGVJZC5TSU5HTEUpLmlzVmlzaWJsZSkKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZVZpc2libGUpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZVZpc2libGUpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVWaXNpYmxlKS5pc0ZhbHNlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gaXNWaXNpYmxlX3NpbmdsZVNoYWRlQ29uZmlnKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICBvdmVycmlkZVJlc291cmNlKFIuYm9vbC5kdWFsX3NoYWRlX2VuYWJsZWQsIGZhbHNlKQorICAgICAgICAgICAgdmFsIGlzTGVmdFNoYWRlVmlzaWJsZTogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZShjcmVhdGUoU2hhZGVJZC5MRUZUKS5pc1Zpc2libGUpCisgICAgICAgICAgICB2YWwgaXNSaWdodFNoYWRlVmlzaWJsZTogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZShjcmVhdGUoU2hhZGVJZC5SSUdIVCkuaXNWaXNpYmxlKQorICAgICAgICAgICAgdmFsIGlzU2luZ2xlU2hhZGVWaXNpYmxlOiBCb29sZWFuPyBieSBjb2xsZWN0TGFzdFZhbHVlKGNyZWF0ZShTaGFkZUlkLlNJTkdMRSkuaXNWaXNpYmxlKQorCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlVmlzaWJsZSkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZVZpc2libGUpLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1NpbmdsZVNoYWRlVmlzaWJsZSkuaXNUcnVlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gaXNTd2lwaW5nRW5hYmxlZCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZShTaGFkZUlkLkxFRlQpCisgICAgICAgICAgICB2YWwgaXNTd2lwaW5nRW5hYmxlZDogQm9vbGVhbj8gYnkgY29sbGVjdExhc3RWYWx1ZSh1bmRlclRlc3QuaXNTd2lwaW5nRW5hYmxlZCkKKyAgICAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJpc1N3aXBpbmdFbmFibGVkIHNob3VsZCBzdGFydCBhcyB0cnVlISIpCisgICAgICAgICAgICAgICAgLnRoYXQoaXNTd2lwaW5nRW5hYmxlZCkKKyAgICAgICAgICAgICAgICAuaXNUcnVlKCkKKworICAgICAgICAgICAgLy8gTmVlZCB0byBjb2xsZWN0IHByb3hpZWQgaW5wdXQgc28gdGhlIGZsb3dzIGJlY29tZSBob3QgYXMgdGhlIGdlc3R1cmUgY2FuY2VsYXRpb24gY29kZQorICAgICAgICAgICAgLy8gbG9naWMgc2l0cyBpbiBzaWRlIHRoZSBwcm94aWVkSW5wdXQgZmxvdyBmb3IgZWFjaCBzaGFkZS4KKyAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LnByb3hpZWRJbnB1dCkKKyAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUoY3JlYXRlKFNoYWRlSWQuUklHSFQpLnByb3hpZWRJbnB1dCkKKworICAgICAgICAgICAgLy8gU3RhcnRpbmcgYSBwcm94aWVkIGludGVyYWN0aW9uIG9uIHRoZSBMRUZUIHNoYWRlIGRpc2FsbG93cyBub24tcHJveGllZCBpbnRlcmFjdGlvbiBvbgorICAgICAgICAgICAgLy8gdGhlCisgICAgICAgICAgICAvLyBzYW1lIHNoYWRlLgorICAgICAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dCgKKyAgICAgICAgICAgICAgICBQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoeEZyYWN0aW9uID0gMGYsIHlEcmFnQW1vdW50UHggPSAxMjNmKQorICAgICAgICAgICAgKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1N3aXBpbmdFbmFibGVkKS5pc0ZhbHNlKCkKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIGVuZCBvZiB0aGUgcHJveGllZCBpbnRlcmFjdGlvbiByZS1hbGxvd3MgaXQuCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZ0VuZCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTd2lwaW5nRW5hYmxlZCkuaXNUcnVlKCkKKworICAgICAgICAgICAgLy8gU3RhcnRpbmcgYSBwcm94aWVkIGludGVyYWN0aW9uIG9uIHRoZSBSSUdIVCBzaGFkZSBmb3JjZS1jb2xsYXBzZXMgdGhlIExFRlQgc2hhZGUsCisgICAgICAgICAgICAvLyBkaXNhbGxvd2luZyBub24tcHJveGllZCBpbnB1dCBvbiB0aGUgTEVGVCBzaGFkZS4KKyAgICAgICAgICAgIGlucHV0UHJveHkub25Qcm94aWVkSW5wdXQoCisgICAgICAgICAgICAgICAgUHJveGllZElucHV0TW9kZWwuT25EcmFnKHhGcmFjdGlvbiA9IDFmLCB5RHJhZ0Ftb3VudFB4ID0gMTIzZikKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTd2lwaW5nRW5hYmxlZCkuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBlbmQgb2YgdGhlIGludGVyYWN0aW9uIG9uIHRoZSBSSUdIVCBzaGFkZSByZS1hbGxvd3MgaXQuCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uRHJhZ0VuZCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTd2lwaW5nRW5hYmxlZCkuaXNUcnVlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gaXNGb3JjZUNvbGxhcHNlZF93aGVuT3RoZXJTaGFkZUludGVyYWN0aW9uVW5kZXJ3YXkoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhbCBsZWZ0U2hhZGUgPSBjcmVhdGUoU2hhZGVJZC5MRUZUKQorICAgICAgICAgICAgdmFsIHJpZ2h0U2hhZGUgPSBjcmVhdGUoU2hhZGVJZC5SSUdIVCkKKyAgICAgICAgICAgIHZhbCBpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieSBjb2xsZWN0TGFzdFZhbHVlKGxlZnRTaGFkZS5pc0ZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgdmFsIGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUocmlnaHRTaGFkZS5pc0ZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgdmFsIGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZDogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKGNyZWF0ZShTaGFkZUlkLlNJTkdMRSkuaXNGb3JjZUNvbGxhcHNlZCkKKworICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImlzRm9yY2VDb2xsYXBzZWQgc2hvdWxkIHN0YXJ0IGFzIGZhbHNlISIpCisgICAgICAgICAgICAgICAgLnRoYXQoaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICAgICAgLmlzRmFsc2UoKQorCisgICAgICAgICAgICAvLyBSZWdpc3RlcmluZyB0aGUgc3RhcnQgb2YgYW4gaW50ZXJhY3Rpb24gb24gdGhlIFJJR0hUIHNoYWRlIGZvcmNlLWNvbGxhcHNlcyB0aGUgTEVGVAorICAgICAgICAgICAgLy8gc2hhZGUuCisgICAgICAgICAgICByaWdodFNoYWRlLm9uRHJhZ1N0YXJ0ZWQoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc1RydWUoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBlbmQgb2YgdGhlIGludGVyYWN0aW9uIG9uIHRoZSBSSUdIVCBzaGFkZSByZS1hbGxvd3MgaXQuCisgICAgICAgICAgICByaWdodFNoYWRlLm9uRHJhZ0VuZGVkKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzUmlnaHRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIHN0YXJ0IG9mIGFuIGludGVyYWN0aW9uIG9uIHRoZSBMRUZUIHNoYWRlIGZvcmNlLWNvbGxhcHNlcyB0aGUgUklHSFQKKyAgICAgICAgICAgIC8vIHNoYWRlLgorICAgICAgICAgICAgbGVmdFNoYWRlLm9uRHJhZ1N0YXJ0ZWQoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc0ZhbHNlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNSaWdodFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzVHJ1ZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBlbmQgb2YgdGhlIGludGVyYWN0aW9uIG9uIHRoZSBMRUZUIHNoYWRlIHJlLWFsbG93cyBpdC4KKyAgICAgICAgICAgIGxlZnRTaGFkZS5vbkRyYWdFbmRlZCgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzTGVmdFNoYWRlRm9yY2VDb2xsYXBzZWQpLmlzRmFsc2UoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNGYWxzZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIG9uVGFwT3V0c2lkZV9jb2xsYXBzZXNBbGwoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhbCBpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkOiBCb29sZWFuPyBieQorICAgICAgICAgICAgICAgIGNvbGxlY3RMYXN0VmFsdWUoY3JlYXRlKFNoYWRlSWQuTEVGVCkuaXNGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgIHZhbCBpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZDogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKGNyZWF0ZShTaGFkZUlkLlJJR0hUKS5pc0ZvcmNlQ29sbGFwc2VkKQorICAgICAgICAgICAgdmFsIGlzU2luZ2xlU2hhZGVGb3JjZUNvbGxhcHNlZDogQm9vbGVhbj8gYnkKKyAgICAgICAgICAgICAgICBjb2xsZWN0TGFzdFZhbHVlKGNyZWF0ZShTaGFkZUlkLlNJTkdMRSkuaXNGb3JjZUNvbGxhcHNlZCkKKworICAgICAgICAgICAgYXNzZXJ0V2l0aE1lc3NhZ2UoImlzRm9yY2VDb2xsYXBzZWQgc2hvdWxkIHN0YXJ0IGFzIGZhbHNlISIpCisgICAgICAgICAgICAgICAgLnRoYXQoaXNMZWZ0U2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkKKyAgICAgICAgICAgICAgICAuaXNGYWxzZSgpCisgICAgICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiaXNGb3JjZUNvbGxhcHNlZCBzaG91bGQgc3RhcnQgYXMgZmFsc2UhIikKKyAgICAgICAgICAgICAgICAudGhhdChpc1NpbmdsZVNoYWRlRm9yY2VDb2xsYXBzZWQpCisgICAgICAgICAgICAgICAgLmlzRmFsc2UoKQorCisgICAgICAgICAgICBpbnB1dFByb3h5Lm9uUHJveGllZElucHV0KFByb3hpZWRJbnB1dE1vZGVsLk9uVGFwKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc0xlZnRTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc1RydWUoKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChpc1JpZ2h0U2hhZGVGb3JjZUNvbGxhcHNlZCkuaXNUcnVlKCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaXNTaW5nbGVTaGFkZUZvcmNlQ29sbGFwc2VkKS5pc1RydWUoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBwcm94aWVkSW5wdXRfaWdub3JlZFdoaWxlTm9uUHJveGllZEdlc3R1cmVVbmRlcndheSgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFsIHVuZGVyVGVzdCA9IGNyZWF0ZShTaGFkZUlkLlJJR0hUKQorICAgICAgICAgICAgdmFsIHByb3hpZWRJbnB1dDogUHJveGllZElucHV0TW9kZWw/IGJ5IGNvbGxlY3RMYXN0VmFsdWUodW5kZXJUZXN0LnByb3hpZWRJbnB1dCkKKyAgICAgICAgICAgIHVuZGVyVGVzdC5vbkRyYWdTdGFydGVkKCkKKworICAgICAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoMC45ZiwgMTAwZikpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHByb3hpZWRJbnB1dCkuaXNOdWxsKCkKKworICAgICAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoMC44ZiwgMTEwZikpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHByb3hpZWRJbnB1dCkuaXNOdWxsKCkKKworICAgICAgICAgICAgdW5kZXJUZXN0Lm9uRHJhZ0VuZGVkKCkKKworICAgICAgICAgICAgaW5wdXRQcm94eS5vblByb3hpZWRJbnB1dChQcm94aWVkSW5wdXRNb2RlbC5PbkRyYWcoMC45ZiwgMTAwZikpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHByb3hpZWRJbnB1dCkuaXNOb3ROdWxsKCkKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gY3JlYXRlKAorICAgICAgICBzaGFkZUlkOiBTaGFkZUlkLAorICAgICk6IFNoYWRlVmlld01vZGVsIHsKKyAgICAgICAgcmV0dXJuIFNoYWRlVmlld01vZGVsKAorICAgICAgICAgICAgdmlld01vZGVsU2NvcGUgPSB0ZXN0U2NvcGUuYmFja2dyb3VuZFNjb3BlLAorICAgICAgICAgICAgc2hhZGVJZCA9IHNoYWRlSWQsCisgICAgICAgICAgICBpbnRlcmFjdG9yID0gaW50ZXJhY3RvcgorICAgICAgICAgICAgICAgICAgICA/OiBNdWx0aVNoYWRlSW50ZXJhY3RvclRlc3QuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RTY29wZSA9IHRlc3RTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3h5ID0gaW5wdXRQcm94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbHNvIHsgaW50ZXJhY3RvciA9IGl0IH0sCisgICAgICAgICkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvbm90ZXRhc2svTm90ZVRhc2tDb250cm9sbGVyVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RldGFzay9Ob3RlVGFza0NvbnRyb2xsZXJUZXN0Lmt0CmluZGV4IDNmOTQwZDYuLjQwYzczM2EgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RldGFzay9Ob3RlVGFza0NvbnRyb2xsZXJUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9ub3RldGFzay9Ob3RlVGFza0NvbnRyb2xsZXJUZXN0Lmt0CkBAIC0yMzIsNyArMjMyLDcgQEAKIAogICAgICAgICB2ZXJpZnlaZXJvSW50ZXJhY3Rpb25zKGNvbnRleHQpCiAgICAgICAgIHZhbCBpbnRlbnRDYXB0b3IgPSBhcmd1bWVudENhcHRvcjxJbnRlbnQ+KCkKLSAgICAgICAgdmVyaWZ5KGJ1YmJsZXMpLnNob3dPckhpZGVBcHBCdWJibGUoY2FwdHVyZShpbnRlbnRDYXB0b3IpKQorICAgICAgICB2ZXJpZnkoYnViYmxlcykuc2hvd09ySGlkZUFwcEJ1YmJsZShjYXB0dXJlKGludGVudENhcHRvciksIGVxKHVzZXJUcmFja2VyLnVzZXJIYW5kbGUpKQogICAgICAgICBpbnRlbnRDYXB0b3IudmFsdWUubGV0IHsgaW50ZW50IC0+CiAgICAgICAgICAgICBhc3NlcnRUaGF0KGludGVudC5hY3Rpb24pLmlzRXF1YWxUbyhJbnRlbnQuQUNUSU9OX0NSRUFURV9OT1RFKQogICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnRlbnQuYHBhY2thZ2VgKS5pc0VxdWFsVG8oTk9URVNfUEFDS0FHRV9OQU1FKQpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgICAgIGNyZWF0ZU5vdGVUYXNrQ29udHJvbGxlcigpLnNob3dOb3RlVGFzayhlbnRyeVBvaW50ID0gTm90ZVRhc2tFbnRyeVBvaW50LlFVSUNLX0FGRk9SREFOQ0UpCiAKICAgICAgICAgdmFsIGludGVudENhcHRvciA9IGFyZ3VtZW50Q2FwdG9yPEludGVudD4oKQotICAgICAgICB2ZXJpZnkoYnViYmxlcykuc2hvd09ySGlkZUFwcEJ1YmJsZShjYXB0dXJlKGludGVudENhcHRvcikpCisgICAgICAgIHZlcmlmeShidWJibGVzKS5zaG93T3JIaWRlQXBwQnViYmxlKGNhcHR1cmUoaW50ZW50Q2FwdG9yKSwgZXEodXNlclRyYWNrZXIudXNlckhhbmRsZSkpCiAgICAgICAgIGludGVudENhcHRvci52YWx1ZS5sZXQgeyBpbnRlbnQgLT4KICAgICAgICAgICAgIGFzc2VydFRoYXQoaW50ZW50LmFjdGlvbikuaXNFcXVhbFRvKEludGVudC5BQ1RJT05fQ1JFQVRFX05PVEUpCiAgICAgICAgICAgICBhc3NlcnRUaGF0KGludGVudC5gcGFja2FnZWApLmlzRXF1YWxUbyhOT1RFU19QQUNLQUdFX05BTUUpCkBAIC0zODksNyArMzg5LDcgQEAKICAgICAgICAgY3JlYXRlTm90ZVRhc2tDb250cm9sbGVyKCkuc2hvd05vdGVUYXNrKGVudHJ5UG9pbnQgPSBOb3RlVGFza0VudHJ5UG9pbnQuUVVJQ0tfQUZGT1JEQU5DRSkKIAogICAgICAgICB2YWwgaW50ZW50Q2FwdG9yID0gYXJndW1lbnRDYXB0b3I8SW50ZW50PigpCi0gICAgICAgIHZlcmlmeShidWJibGVzKS5zaG93T3JIaWRlQXBwQnViYmxlKGNhcHR1cmUoaW50ZW50Q2FwdG9yKSkKKyAgICAgICAgdmVyaWZ5KGJ1YmJsZXMpLnNob3dPckhpZGVBcHBCdWJibGUoY2FwdHVyZShpbnRlbnRDYXB0b3IpLCBlcSh1c2VyVHJhY2tlci51c2VySGFuZGxlKSkKICAgICAgICAgaW50ZW50Q2FwdG9yLnZhbHVlLmxldCB7IGludGVudCAtPgogICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnRlbnQuYWN0aW9uKS5pc0VxdWFsVG8oSW50ZW50LkFDVElPTl9DUkVBVEVfTk9URSkKICAgICAgICAgICAgIGFzc2VydFRoYXQoaW50ZW50LmBwYWNrYWdlYCkuaXNFcXVhbFRvKE5PVEVTX1BBQ0tBR0VfTkFNRSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9leHRlcm5hbC9UaWxlU2VydmljZXNUZXN0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvZXh0ZXJuYWwvVGlsZVNlcnZpY2VzVGVzdC5qYXZhCmluZGV4IDY0ZTlhM2UuLjdlMDUyYmYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9leHRlcm5hbC9UaWxlU2VydmljZXNUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL2V4dGVybmFsL1RpbGVTZXJ2aWNlc1Rlc3QuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwpAQCAtNDEsNiArNDIsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlN5c3VpVGVzdENhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuYnJvYWRjYXN0LkJyb2FkY2FzdERpc3BhdGNoZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMuUVNIb3N0OworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLnBpcGVsaW5lLmRvbWFpbi5pbnRlcmFjdG9yLlBhbmVsSW50ZXJhY3RvcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zZXR0aW5ncy5Vc2VyVHJhY2tlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuQ29tbWFuZFF1ZXVlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waG9uZS5TdGF0dXNCYXJJY29uQ29udHJvbGxlcjsKQEAgLTkxLDYgKzkzLDggQEAKICAgICBwcml2YXRlIFRpbGVMaWZlY3ljbGVNYW5hZ2VyIG1UaWxlTGlmZWN5Y2xlTWFuYWdlcjsKICAgICBATW9jawogICAgIHByaXZhdGUgUVNIb3N0IG1RU0hvc3Q7CisgICAgQE1vY2sKKyAgICBwcml2YXRlIFBhbmVsSW50ZXJhY3RvciBtUGFuZWxJbnRlcmFjdG9yOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xMDcsNyArMTExLDggQEAKICAgICAgICAgUHJvdmlkZXI8SGFuZGxlcj4gcHJvdmlkZXIgPSAoKSAtPiBuZXcgSGFuZGxlcihtVGVzdGFibGVMb29wZXIuZ2V0TG9vcGVyKCkpOwogCiAgICAgICAgIG1UaWxlU2VydmljZSA9IG5ldyBUZXN0VGlsZVNlcnZpY2VzKG1RU0hvc3QsIHByb3ZpZGVyLCBtQnJvYWRjYXN0RGlzcGF0Y2hlciwKLSAgICAgICAgICAgICAgICBtVXNlclRyYWNrZXIsIG1LZXlndWFyZFN0YXRlQ29udHJvbGxlciwgbUNvbW1hbmRRdWV1ZSwgbVN0YXR1c0Jhckljb25Db250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICBtVXNlclRyYWNrZXIsIG1LZXlndWFyZFN0YXRlQ29udHJvbGxlciwgbUNvbW1hbmRRdWV1ZSwgbVN0YXR1c0Jhckljb25Db250cm9sbGVyLAorICAgICAgICAgICAgICAgIG1QYW5lbEludGVyYWN0b3IpOwogICAgIH0KIAogICAgIEBBZnRlcgpAQCAtMjIyLDEzICsyMjcsMzcgQEAKICAgICAgICAgdmVyaWZ5KHRpbGUsIG5ldmVyKCkpLnN0YXJ0QWN0aXZpdHlBbmRDb2xsYXBzZShwaSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25TdGFydEFjdGl2aXR5Q29sbGFwc2VzUGFuZWwoKSB7CisgICAgICAgIEN1c3RvbVRpbGUgdGlsZSA9IG1vY2soQ3VzdG9tVGlsZS5jbGFzcyk7CisgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSA9IG1vY2soQ29tcG9uZW50TmFtZS5jbGFzcyk7CisgICAgICAgIHdoZW4odGlsZS5nZXRDb21wb25lbnQoKSkudGhlblJldHVybihjb21wb25lbnROYW1lKTsKKyAgICAgICAgd2hlbihjb21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCkpLnRoZW5SZXR1cm4odGhpcy5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIFRpbGVTZXJ2aWNlTWFuYWdlciBtYW5hZ2VyID0gbVRpbGVTZXJ2aWNlLmdldFRpbGVXcmFwcGVyKHRpbGUpOworCisgICAgICAgIG1UaWxlU2VydmljZS5vblN0YXJ0QWN0aXZpdHkobWFuYWdlci5nZXRUb2tlbigpKTsKKyAgICAgICAgdmVyaWZ5KG1QYW5lbEludGVyYWN0b3IpLmZvcmNlQ29sbGFwc2VQYW5lbHMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblNob3dEaWFsb2dDb2xsYXBzZXNQYW5lbCgpIHsKKyAgICAgICAgQ3VzdG9tVGlsZSB0aWxlID0gbW9jayhDdXN0b21UaWxlLmNsYXNzKTsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lID0gbW9jayhDb21wb25lbnROYW1lLmNsYXNzKTsKKyAgICAgICAgd2hlbih0aWxlLmdldENvbXBvbmVudCgpKS50aGVuUmV0dXJuKGNvbXBvbmVudE5hbWUpOworICAgICAgICB3aGVuKGNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKSkudGhlblJldHVybih0aGlzLmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgVGlsZVNlcnZpY2VNYW5hZ2VyIG1hbmFnZXIgPSBtVGlsZVNlcnZpY2UuZ2V0VGlsZVdyYXBwZXIodGlsZSk7CisKKyAgICAgICAgbVRpbGVTZXJ2aWNlLm9uU2hvd0RpYWxvZyhtYW5hZ2VyLmdldFRva2VuKCkpOworICAgICAgICB2ZXJpZnkobVBhbmVsSW50ZXJhY3RvcikuZm9yY2VDb2xsYXBzZVBhbmVscygpOworICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgVGVzdFRpbGVTZXJ2aWNlcyBleHRlbmRzIFRpbGVTZXJ2aWNlcyB7CiAgICAgICAgIFRlc3RUaWxlU2VydmljZXMoUVNIb3N0IGhvc3QsIFByb3ZpZGVyPEhhbmRsZXI+IGhhbmRsZXJQcm92aWRlciwKICAgICAgICAgICAgICAgICBCcm9hZGNhc3REaXNwYXRjaGVyIGJyb2FkY2FzdERpc3BhdGNoZXIsIFVzZXJUcmFja2VyIHVzZXJUcmFja2VyLAogICAgICAgICAgICAgICAgIEtleWd1YXJkU3RhdGVDb250cm9sbGVyIGtleWd1YXJkU3RhdGVDb250cm9sbGVyLCBDb21tYW5kUXVldWUgY29tbWFuZFF1ZXVlLAotICAgICAgICAgICAgICAgIFN0YXR1c0Jhckljb25Db250cm9sbGVyIHN0YXR1c0Jhckljb25Db250cm9sbGVyKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzQmFySWNvbkNvbnRyb2xsZXIgc3RhdHVzQmFySWNvbkNvbnRyb2xsZXIsIFBhbmVsSW50ZXJhY3RvciBwYW5lbEludGVyYWN0b3IpIHsKICAgICAgICAgICAgIHN1cGVyKGhvc3QsIGhhbmRsZXJQcm92aWRlciwgYnJvYWRjYXN0RGlzcGF0Y2hlciwgdXNlclRyYWNrZXIsIGtleWd1YXJkU3RhdGVDb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBjb21tYW5kUXVldWUsIHN0YXR1c0Jhckljb25Db250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZFF1ZXVlLCBzdGF0dXNCYXJJY29uQ29udHJvbGxlciwgcGFuZWxJbnRlcmFjdG9yKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtMjM3LDYgKzI2Niw4IEBACiAgICAgICAgICAgICBUaWxlU2VydmljZU1hbmFnZXIgbWFuYWdlciA9IG1vY2soVGlsZVNlcnZpY2VNYW5hZ2VyLmNsYXNzKTsKICAgICAgICAgICAgIG1NYW5hZ2Vycy5hZGQobWFuYWdlcik7CiAgICAgICAgICAgICB3aGVuKG1hbmFnZXIuaXNMaWZlY3ljbGVTdGFydGVkKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgICAgICAgICBCaW5kZXIgYiA9IG5ldyBCaW5kZXIoKTsKKyAgICAgICAgICAgIHdoZW4obWFuYWdlci5nZXRUb2tlbigpKS50aGVuUmV0dXJuKGIpOwogICAgICAgICAgICAgcmV0dXJuIG1hbmFnZXI7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvcGlwZWxpbmUvZG9tYWluL2ludGVyYWN0b3IvUGFuZWxJbnRlcmFjdG9ySW1wbFRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvcGlwZWxpbmUvZG9tYWluL2ludGVyYWN0b3IvUGFuZWxJbnRlcmFjdG9ySW1wbFRlc3Qua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3ODNhYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy9waXBlbGluZS9kb21haW4vaW50ZXJhY3Rvci9QYW5lbEludGVyYWN0b3JJbXBsVGVzdC5rdApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5waXBlbGluZS5kb21haW4uaW50ZXJhY3RvcgorCitpbXBvcnQgYW5kcm9pZC50ZXN0aW5nLkFuZHJvaWRUZXN0aW5nUnVubmVyCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlN5c3VpVGVzdENhc2UKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuQ2VudHJhbFN1cmZhY2VzCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQoraW1wb3J0IG9yZy5qdW5pdC5UZXN0CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jaworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zCisKK0BSdW5XaXRoKEFuZHJvaWRUZXN0aW5nUnVubmVyOjpjbGFzcykKK0BTbWFsbFRlc3QKK2NsYXNzIFBhbmVsSW50ZXJhY3RvckltcGxUZXN0IDogU3lzdWlUZXN0Q2FzZSgpIHsKKworICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGNlbnRyYWxTdXJmYWNlczogQ2VudHJhbFN1cmZhY2VzCisKKyAgICBAQmVmb3JlCisgICAgZnVuIHNldHVwKCkgeworICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gb3BlblBhbmVsc19jYWxsc0NlbnRyYWxTdXJmYWNlcygpIHsKKyAgICAgICAgdmFsIHVuZGVyVGVzdCA9IFBhbmVsSW50ZXJhY3RvckltcGwoT3B0aW9uYWwub2YoY2VudHJhbFN1cmZhY2VzKSkKKworICAgICAgICB1bmRlclRlc3Qub3BlblBhbmVscygpCisKKyAgICAgICAgdmVyaWZ5KGNlbnRyYWxTdXJmYWNlcykucG9zdEFuaW1hdGVPcGVuUGFuZWxzKCkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBjb2xsYXBzZVBhbmVsc19jYWxsc0NlbnRyYWxTdXJmYWNlcygpIHsKKyAgICAgICAgdmFsIHVuZGVyVGVzdCA9IFBhbmVsSW50ZXJhY3RvckltcGwoT3B0aW9uYWwub2YoY2VudHJhbFN1cmZhY2VzKSkKKworICAgICAgICB1bmRlclRlc3QuY29sbGFwc2VQYW5lbHMoKQorCisgICAgICAgIHZlcmlmeShjZW50cmFsU3VyZmFjZXMpLnBvc3RBbmltYXRlQ29sbGFwc2VQYW5lbHMoKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIGZvcmNlQ29sbGFwc2VQYW5lbHNfY2FsbHNDZW50cmFsU3VyZmFjZXMoKSB7CisgICAgICAgIHZhbCB1bmRlclRlc3QgPSBQYW5lbEludGVyYWN0b3JJbXBsKE9wdGlvbmFsLm9mKGNlbnRyYWxTdXJmYWNlcykpCisKKyAgICAgICAgdW5kZXJUZXN0LmZvcmNlQ29sbGFwc2VQYW5lbHMoKQorCisgICAgICAgIHZlcmlmeShjZW50cmFsU3VyZmFjZXMpLnBvc3RBbmltYXRlRm9yY2VDb2xsYXBzZVBhbmVscygpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gd2hlbk9wdGlvbmFsRW1wdHlfZG9lc25UaHJvdygpIHsKKyAgICAgICAgdmFsIHVuZGVyVGVzdCA9IFBhbmVsSW50ZXJhY3RvckltcGwoT3B0aW9uYWwuZW1wdHkoKSkKKworICAgICAgICB1bmRlclRlc3Qub3BlblBhbmVscygpCisgICAgICAgIHVuZGVyVGVzdC5jb2xsYXBzZVBhbmVscygpCisgICAgICAgIHVuZGVyVGVzdC5mb3JjZUNvbGxhcHNlUGFuZWxzKCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcXMvdGlsZXMvTG9jYXRpb25UaWxlVGVzdC5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy90aWxlcy9Mb2NhdGlvblRpbGVUZXN0Lmt0CmluZGV4IDMzOTIxYzcuLjM2NDJlODcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy90aWxlcy9Mb2NhdGlvblRpbGVUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy90aWxlcy9Mb2NhdGlvblRpbGVUZXN0Lmt0CkBAIC0zMSw5ICszMSwxMiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuc3RhdHVzYmFyLlN0YXR1c0JhclN0YXRlQ29udHJvbGxlcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLlFTSG9zdAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLmxvZ2dpbmcuUVNMb2dnZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy5waXBlbGluZS5kb21haW4uaW50ZXJhY3Rvci5QYW5lbEludGVyYWN0b3IKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5xcy50aWxlaW1wbC5RU1RpbGVJbXBsCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5LZXlndWFyZFN0YXRlQ29udHJvbGxlcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuTG9jYXRpb25Db250cm9sbGVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLmFyZ3VtZW50Q2FwdG9yCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLmNhcHR1cmUKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQpAQCAtNDEsNiArNDQsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2sKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLmB3aGVuYAoraW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zCiAKIEBSdW5XaXRoKEFuZHJvaWRUZXN0aW5nUnVubmVyOjpjbGFzcykKQEAgLTY1LDYgKzY5LDggQEAKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciBsb2NhdGlvbkNvbnRyb2xsZXI6IExvY2F0aW9uQ29udHJvbGxlcgogICAgIEBNb2NrCiAgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIga2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXI6IEtleWd1YXJkU3RhdGVDb250cm9sbGVyCisgICAgQE1vY2sKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciBwYW5lbEludGVyYWN0b3I6IFBhbmVsSW50ZXJhY3RvcgogCiAgICAgcHJpdmF0ZSB2YWwgdWlFdmVudExvZ2dlciA9IFVpRXZlbnRMb2dnZXJGYWtlKCkKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciB0ZXN0YWJsZUxvb3BlcjogVGVzdGFibGVMb29wZXIKQEAgLTg2LDcgKzkyLDkgQEAKICAgICAgICAgICAgIGFjdGl2aXR5U3RhcnRlciwKICAgICAgICAgICAgIHFzTG9nZ2VyLAogICAgICAgICAgICAgbG9jYXRpb25Db250cm9sbGVyLAotICAgICAgICAgICAga2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIpCisgICAgICAgICAgICBrZXlndWFyZFN0YXRlQ29udHJvbGxlciwKKyAgICAgICAgICAgIHBhbmVsSW50ZXJhY3RvciwKKyAgICAgICAgKQogICAgIH0KIAogICAgIEBBZnRlcgpAQCAtMTE2LDQgKzEyNCwxOCBAQAogICAgICAgICBhc3NlcnRUaGF0KHN0YXRlLmljb24pCiAgICAgICAgICAgICAuaXNFcXVhbFRvKFFTVGlsZUltcGwuUmVzb3VyY2VJY29uLmdldChSLmRyYXdhYmxlLnFzX2xvY2F0aW9uX2ljb25fb24pKQogICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHRlc3RDbGlja1doZW5Mb2NrZWRXaWxsQ2FsbE9wZW5QYW5lbHMoKSB7CisgICAgICAgIGB3aGVuYChrZXlndWFyZFN0YXRlQ29udHJvbGxlci5pc01ldGhvZFNlY3VyZSkudGhlblJldHVybih0cnVlKQorICAgICAgICBgd2hlbmAoa2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIuaXNTaG93aW5nKS50aGVuUmV0dXJuKHRydWUpCisKKyAgICAgICAgdGlsZS5oYW5kbGVDbGljayhudWxsKQorCisgICAgICAgIHZhbCBjYXB0b3IgPSBhcmd1bWVudENhcHRvcjxSdW5uYWJsZT4oKQorICAgICAgICB2ZXJpZnkoYWN0aXZpdHlTdGFydGVyKS5wb3N0UVNSdW5uYWJsZURpc21pc3NpbmdLZXlndWFyZChjYXB0dXJlKGNhcHRvcikpCisgICAgICAgIGNhcHRvci52YWx1ZS5ydW4oKQorCisgICAgICAgIHZlcmlmeShwYW5lbEludGVyYWN0b3IpLm9wZW5QYW5lbHMoKQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9xcy90aWxlcy9TY3JlZW5SZWNvcmRUaWxlVGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL3RpbGVzL1NjcmVlblJlY29yZFRpbGVUZXN0LmphdmEKaW5kZXggNWFlZjc1OC4uZDllZDFhMiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL3RpbGVzL1NjcmVlblJlY29yZFRpbGVUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3FzL3RpbGVzL1NjcmVlblJlY29yZFRpbGVUZXN0LmphdmEKQEAgLTQ1LDYgKzQ1LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLnN0YXR1c2Jhci5TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMuUVNIb3N0OwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLmxvZ2dpbmcuUVNMb2dnZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucXMucGlwZWxpbmUuZG9tYWluLmludGVyYWN0b3IuUGFuZWxJbnRlcmFjdG9yOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnFzLnRpbGVpbXBsLlFTVGlsZUltcGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc2NyZWVucmVjb3JkLlJlY29yZGluZ0NvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBob25lLktleWd1YXJkRGlzbWlzc1V0aWw7CkBAIC04Myw2ICs4NCw4IEBACiAgICAgcHJpdmF0ZSBLZXlndWFyZFN0YXRlQ29udHJvbGxlciBtS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXI7CiAgICAgQE1vY2sKICAgICBwcml2YXRlIERpYWxvZ0xhdW5jaEFuaW1hdG9yIG1EaWFsb2dMYXVuY2hBbmltYXRvcjsKKyAgICBATW9jaworICAgIHByaXZhdGUgUGFuZWxJbnRlcmFjdG9yIG1QYW5lbEludGVyYWN0b3I7CiAKICAgICBwcml2YXRlIFRlc3RhYmxlTG9vcGVyIG1UZXN0YWJsZUxvb3BlcjsKICAgICBwcml2YXRlIFNjcmVlblJlY29yZFRpbGUgbVRpbGU7CkBAIC0xMDgsNyArMTExLDggQEAKICAgICAgICAgICAgICAgICBtQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICBtS2V5Z3VhcmREaXNtaXNzVXRpbCwKICAgICAgICAgICAgICAgICBtS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgbURpYWxvZ0xhdW5jaEFuaW1hdG9yCisgICAgICAgICAgICAgICAgbURpYWxvZ0xhdW5jaEFuaW1hdG9yLAorICAgICAgICAgICAgICAgIG1QYW5lbEludGVyYWN0b3IKICAgICAgICAgKTsKIAogICAgICAgICBtVGlsZS5pbml0aWFsaXplKCk7CkBAIC0xNDYsNyArMTUwLDcgQEAKICAgICAgICAgYXNzZXJ0Tm90TnVsbChvblN0YXJ0UmVjb3JkaW5nQ2xpY2tlZC5nZXRWYWx1ZSgpKTsKICAgICAgICAgb25TdGFydFJlY29yZGluZ0NsaWNrZWQuZ2V0VmFsdWUoKS5ydW4oKTsKICAgICAgICAgdmVyaWZ5KG1EaWFsb2dMYXVuY2hBbmltYXRvcikuZGlzYWJsZUFsbEN1cnJlbnREaWFsb2dzRXhpdEFuaW1hdGlvbnMoKTsKLSAgICAgICAgdmVyaWZ5KG1Ib3N0KS5jb2xsYXBzZVBhbmVscygpOworICAgICAgICB2ZXJpZnkobVBhbmVsSW50ZXJhY3RvcikuY29sbGFwc2VQYW5lbHMoKTsKICAgICB9CiAKICAgICAvLyBUZXN0IHRoYXQgdGhlIHRpbGUgaXMgYWN0aXZlIGFuZCBsYWJlbGVkIGNvcnJlY3RseSB3aGVuIHRoZSBjb250cm9sbGVyIGlzIHN0YXJ0aW5nCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlclRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyVGVzdC5qYXZhCmluZGV4IGQ4NmZmNjcuLjlhMmU0MTUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyVGVzdC5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uaW5PcmRlcjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnJlc2V0OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOwpAQCAtOTQwLDYgKzk0MSwzOCBAQAogCiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBvblNwbGl0U2hhZGVDaGFuZ2VkX2R1cmluZ1NoYWRlRXhwYW5zaW9uX3Jlc2V0c092ZXJTY3JvbGxTdGF0ZSgpIHsKKyAgICAgICAgLy8gVGhlcmUgd2FzIGEgYnVnIHdoZXJlIHRoZXJlIHdhcyBsZWZ0LW92ZXIgb3ZlcnNjcm9sbCBzdGF0ZSBhZnRlciBnb2luZyBmcm9tIHNwbGl0IHNoYWRlCisgICAgICAgIC8vIHRvIHNpbmdsZSBzaGFkZS4KKyAgICAgICAgLy8gU2luY2Ugb24gc2luZ2xlIHNoYWRlIHdlIGRvbid0IHNldCBvdmVyc2Nyb2xsIHZhbHVlcyBvbiBRUyBub3IgU2NyaW0sIHRob3NlIHZhbHVlcyB0aGF0CisgICAgICAgIC8vIHdlcmUgdGhlcmUgZnJvbSBzcGxpdCBzaGFkZSB3ZXJlIG5ldmVyIHJlc2V0LgorICAgICAgICAvLyBUbyBwcmV2ZW50IHRoaXMsIHdlIHdpbGwgcmVzZXQgYWxsIG92ZXJzY3JvbGwgc3RhdGUuCisgICAgICAgIGVuYWJsZVNwbGl0U2hhZGUodHJ1ZSk7CisgICAgICAgIHJlc2V0KG1Rc0NvbnRyb2xsZXIsIG1TY3JpbUNvbnRyb2xsZXIsIG1Ob3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dENvbnRyb2xsZXIpOworCisgICAgICAgIG1Ob3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLnNldE92ZXJFeHBhbnNpb24oMTIzKTsKKyAgICAgICAgdmVyaWZ5KG1Rc0NvbnRyb2xsZXIpLnNldE92ZXJTY3JvbGxBbW91bnQoMTIzKTsKKyAgICAgICAgdmVyaWZ5KG1TY3JpbUNvbnRyb2xsZXIpLnNldE5vdGlmaWNhdGlvbnNPdmVyU2Nyb2xsQW1vdW50KDEyMyk7CisgICAgICAgIHZlcmlmeShtTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXRDb250cm9sbGVyKS5zZXRPdmVyRXhwYW5zaW9uKDEyMyk7CisKKyAgICAgICAgZW5hYmxlU3BsaXRTaGFkZShmYWxzZSk7CisgICAgICAgIHZlcmlmeShtUXNDb250cm9sbGVyKS5zZXRPdmVyU2Nyb2xsQW1vdW50KDApOworICAgICAgICB2ZXJpZnkobVNjcmltQ29udHJvbGxlcikuc2V0Tm90aWZpY2F0aW9uc092ZXJTY3JvbGxBbW91bnQoMCk7CisgICAgICAgIHZlcmlmeShtTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXRDb250cm9sbGVyKS5zZXRPdmVyRXhwYW5zaW9uKDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgb25TcGxpdFNoYWRlQ2hhbmdlZF9hbHdheXNSZXNldHNPdmVyU2Nyb2xsU3RhdGUoKSB7CisgICAgICAgIGVuYWJsZVNwbGl0U2hhZGUodHJ1ZSk7CisgICAgICAgIGVuYWJsZVNwbGl0U2hhZGUoZmFsc2UpOworCisgICAgICAgIHZlcmlmeShtUXNDb250cm9sbGVyLCB0aW1lcygyKSkuc2V0T3ZlclNjcm9sbEFtb3VudCgwKTsKKyAgICAgICAgdmVyaWZ5KG1TY3JpbUNvbnRyb2xsZXIsIHRpbWVzKDIpKS5zZXROb3RpZmljYXRpb25zT3ZlclNjcm9sbEFtb3VudCgwKTsKKyAgICAgICAgdmVyaWZ5KG1Ob3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dENvbnRyb2xsZXIsIHRpbWVzKDIpKS5zZXRPdmVyRXhwYW5zaW9uKDApOworICAgICAgICB2ZXJpZnkobU5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0Q29udHJvbGxlciwgdGltZXMoMikpLnNldE92ZXJTY3JvbGxBbW91bnQoMCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogV2hlbiBzaGFkZSBpcyBmbGluZ2luZyB0byBjbG9zZSBhbmQgdGhpcyBmbGluZyBpcyBub3QgaW50ZXJjZXB0ZWQsCiAgICAgICoge0BsaW5rIEFtYmllbnRTdGF0ZSNzZXRJc0Nsb3NpbmcoYm9vbGVhbil9IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlclRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlclRlc3Qua3QKaW5kZXggNTE0OTJlYi4uYmRiMGU3ZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXJUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdDb250cm9sbGVyVGVzdC5rdApAQCAtMjksMTIgKzI5LDE3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuYmlvbWV0cmljcy5kb21haW4uaW50ZXJhY3Rvci5VZGZwc092ZXJsYXlJbnRlcmFjdG9yCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuY2xhc3NpZmllci5GYWxzaW5nQ29sbGVjdG9yRmFrZQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRvY2suRG9ja01hbmFnZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5mbGFncy5GYWtlRmVhdHVyZUZsYWdzCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmxhZ3MKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5LZXlndWFyZFVubG9ja0FuaW1hdGlvbkNvbnRyb2xsZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5kb21haW4uaW50ZXJhY3Rvci5BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3RvcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLmRvbWFpbi5pbnRlcmFjdG9yLktleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3IKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQubW9kZWwuVHJhbnNpdGlvblN0ZXAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC51aS52aWV3bW9kZWwuS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQudWkudmlld21vZGVsLlByaW1hcnlCb3VuY2VyVG9Hb25lVHJhbnNpdGlvblZpZXdNb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZW1vdGVwcm94eS5NdWx0aVNoYWRlSW5wdXRQcm94eQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZGF0YS5yZXBvc2l0b3J5Lk11bHRpU2hhZGVSZXBvc2l0b3J5CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubXVsdGlzaGFkZS5kb21haW4uaW50ZXJhY3Rvci5NdWx0aVNoYWRlSW50ZXJhY3RvcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNoYWRlLk5vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlldy5JbnRlcmFjdGlvbkV2ZW50SGFuZGxlcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5Mb2Nrc2NyZWVuU2hhZGVUcmFuc2l0aW9uQ29udHJvbGxlcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5Ob3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyCkBAIC00OCw4ICs1MywxMiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waG9uZS5TdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLndpbmRvdy5TdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8uYW55CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC50aW1lLkZha2VTeXN0ZW1DbG9jawogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaQogaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmVtcHR5RmxvdworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy50ZXN0LlRlc3RTY29wZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy50ZXN0LnJ1blRlc3QKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlCiBpbXBvcnQgb3JnLmp1bml0LlRlc3QKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGgKQEAgLTYzLDEwICs3MiwxMiBAQAogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8uYHdoZW5gIGFzIHdoZW5ldmVyCiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zCiAKK0BPcHRJbihFeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpOjpjbGFzcykKIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRUZXN0aW5nUnVubmVyOjpjbGFzcykKIEBSdW5XaXRoTG9vcGVyKHNldEFzTWFpbkxvb3BlciA9IHRydWUpCiBjbGFzcyBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdDb250cm9sbGVyVGVzdCA6IFN5c3VpVGVzdENhc2UoKSB7CisKICAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciB2aWV3OiBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXcKICAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBzeXN1aVN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjogU3lzdWlTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIKICAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBjZW50cmFsU3VyZmFjZXM6IENlbnRyYWxTdXJmYWNlcwpAQCAtMTAwLDYgKzExMSw4IEBACiAKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciB1bmRlclRlc3Q6IE5vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXIKIAorICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHRlc3RTY29wZTogVGVzdFNjb3BlCisKICAgICBAQmVmb3JlCiAgICAgZnVuIHNldFVwKCkgewogICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpCkBAIC0xMTIsNiArMTI1LDEzIEBACiAgICAgICAgICAgICAudGhlblJldHVybihrZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlcikKICAgICAgICAgd2hlbmV2ZXIoa2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3Rvci5sb2Nrc2NyZWVuVG9EcmVhbWluZ1RyYW5zaXRpb24pCiAgICAgICAgICAgICAudGhlblJldHVybihlbXB0eUZsb3c8VHJhbnNpdGlvblN0ZXA+KCkpCisKKyAgICAgICAgdmFsIGZlYXR1cmVGbGFncyA9IEZha2VGZWF0dXJlRmxhZ3MoKQorICAgICAgICBmZWF0dXJlRmxhZ3Muc2V0KEZsYWdzLlRSQUNLUEFEX0dFU1RVUkVfQkFDSywgZmFsc2UpCisgICAgICAgIGZlYXR1cmVGbGFncy5zZXQoRmxhZ3MuRFVBTF9TSEFERSwgZmFsc2UpCisKKyAgICAgICAgdmFsIGlucHV0UHJveHkgPSBNdWx0aVNoYWRlSW5wdXRQcm94eSgpCisgICAgICAgIHRlc3RTY29wZSA9IFRlc3RTY29wZSgpCiAgICAgICAgIHVuZGVyVGVzdCA9CiAgICAgICAgICAgICBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdDb250cm9sbGVyKAogICAgICAgICAgICAgICAgIGxvY2tzY3JlZW5TaGFkZVRyYW5zaXRpb25Db250cm9sbGVyLApAQCAtMTM4LDYgKzE1OCwxOSBAQAogICAgICAgICAgICAgICAgIHVkZnBzT3ZlcmxheUludGVyYWN0b3IsCiAgICAgICAgICAgICAgICAga2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3RvciwKICAgICAgICAgICAgICAgICBwcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwsCisgICAgICAgICAgICAgICAgZmVhdHVyZUZsYWdzLAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTXVsdGlTaGFkZUludGVyYWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvblNjb3BlID0gdGVzdFNjb3BlLmJhY2tncm91bmRTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpU2hhZGVSZXBvc2l0b3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkNvbnRleHQgPSBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3h5ID0gaW5wdXRQcm94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm94eSA9IGlucHV0UHJveHksCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEZha2VTeXN0ZW1DbG9jaygpLAogICAgICAgICAgICAgKQogICAgICAgICB1bmRlclRlc3Quc2V0dXBFeHBhbmRlZFN0YXR1c0JhcigpCiAKQEAgLTE1MCwxNDcgKzE4MywxNjIgQEAKICAgICAvLyB0ZXN0cyBuZWVkIHRvIGJlIGFkZGVkIHRvIHRlc3QgdGhlIHJlc3Qgb2YgaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50LgogCiAgICAgQFRlc3QKLSAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X251bGxTdGF0dXNCYXJWaWV3Q29udHJvbGxlcl9yZXR1cm5zRmFsc2UoKSB7Ci0gICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihudWxsKQorICAgIGZ1biBoYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnRfbnVsbFN0YXR1c0JhclZpZXdDb250cm9sbGVyX3JldHVybnNGYWxzZSgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdW5kZXJUZXN0LnNldFN0YXR1c0JhclZpZXdDb250cm9sbGVyKG51bGwpCiAKLSAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChkb3duRXYpCisgICAgICAgICAgICB2YWwgcmV0dXJuVmFsID0gaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50KERPV05fRVZFTlQpCiAKLSAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzRmFsc2UoKQotICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRoYXQocmV0dXJuVmFsKS5pc0ZhbHNlKCkKKyAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X2Rvd25Ub3VjaEJlbG93Vmlld19zZW5kc1RvdWNoVG9TYigpIHsKLSAgICAgICAgdW5kZXJUZXN0LnNldFN0YXR1c0JhclZpZXdDb250cm9sbGVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpCi0gICAgICAgIHZhbCBldiA9IE1vdGlvbkV2ZW50Lm9idGFpbigwTCwgMEwsIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCAwZiwgVklFV19CT1RUT00gKyA0ZiwgMCkKLSAgICAgICAgd2hlbmV2ZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlci5zZW5kVG91Y2hUb1ZpZXcoZXYpKS50aGVuUmV0dXJuKHRydWUpCisgICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9kb3duVG91Y2hCZWxvd1ZpZXdfc2VuZHNUb3VjaFRvU2IoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQorICAgICAgICAgICAgdmFsIGV2ID0gTW90aW9uRXZlbnQub2J0YWluKDBMLCAwTCwgTW90aW9uRXZlbnQuQUNUSU9OX0RPV04sIDBmLCBWSUVXX0JPVFRPTSArIDRmLCAwKQorICAgICAgICAgICAgd2hlbmV2ZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlci5zZW5kVG91Y2hUb1ZpZXcoZXYpKS50aGVuUmV0dXJuKHRydWUpCiAKLSAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChldikKKyAgICAgICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoZXYpCiAKLSAgICAgICAgdmVyaWZ5KHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpLnNlbmRUb3VjaFRvVmlldyhldikKLSAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzVHJ1ZSgpCi0gICAgfQorICAgICAgICAgICAgdmVyaWZ5KHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpLnNlbmRUb3VjaFRvVmlldyhldikKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmV0dXJuVmFsKS5pc1RydWUoKQorICAgICAgICB9CiAKICAgICBAVGVzdAotICAgIGZ1biBoYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnRfZG93blRvdWNoQmVsb3dWaWV3VGhlbkFub3RoZXJUb3VjaF9zZW5kc1RvdWNoVG9TYigpIHsKLSAgICAgICAgdW5kZXJUZXN0LnNldFN0YXR1c0JhclZpZXdDb250cm9sbGVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpCi0gICAgICAgIHZhbCBkb3duRXZCZWxvdyA9Ci0gICAgICAgICAgICBNb3Rpb25FdmVudC5vYnRhaW4oMEwsIDBMLCBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgMGYsIFZJRVdfQk9UVE9NICsgNGYsIDApCi0gICAgICAgIGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChkb3duRXZCZWxvdykKKyAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X2Rvd25Ub3VjaEJlbG93Vmlld1RoZW5Bbm90aGVyVG91Y2hfc2VuZHNUb3VjaFRvU2IoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQorICAgICAgICAgICAgdmFsIGRvd25FdkJlbG93ID0KKyAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5vYnRhaW4oMEwsIDBMLCBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgMGYsIFZJRVdfQk9UVE9NICsgNGYsIDApCisgICAgICAgICAgICBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoZG93bkV2QmVsb3cpCiAKLSAgICAgICAgdmFsIG5leHRFdmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbigwTCwgMEwsIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFLCAwZiwgVklFV19CT1RUT00gKyA1ZiwgMCkKLSAgICAgICAgd2hlbmV2ZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlci5zZW5kVG91Y2hUb1ZpZXcobmV4dEV2ZW50KSkudGhlblJldHVybih0cnVlKQorICAgICAgICAgICAgdmFsIG5leHRFdmVudCA9CisgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQub2J0YWluKDBMLCAwTCwgTW90aW9uRXZlbnQuQUNUSU9OX01PVkUsIDBmLCBWSUVXX0JPVFRPTSArIDVmLCAwKQorICAgICAgICAgICAgd2hlbmV2ZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlci5zZW5kVG91Y2hUb1ZpZXcobmV4dEV2ZW50KSkudGhlblJldHVybih0cnVlKQogCi0gICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQobmV4dEV2ZW50KQorICAgICAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChuZXh0RXZlbnQpCiAKLSAgICAgICAgdmVyaWZ5KHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpLnNlbmRUb3VjaFRvVmlldyhuZXh0RXZlbnQpCi0gICAgICAgIGFzc2VydFRoYXQocmV0dXJuVmFsKS5pc1RydWUoKQotICAgIH0KKyAgICAgICAgICAgIHZlcmlmeShwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKS5zZW5kVG91Y2hUb1ZpZXcobmV4dEV2ZW50KQorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzVHJ1ZSgpCisgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9kb3duQW5kUGFuZWxDb2xsYXBzZWRBbmRJblNiQm91bmRBbmRTYldpbmRvd1Nob3dfc2VuZHNUb3VjaFRvU2IoKSB7Ci0gICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQotICAgICAgICB3aGVuZXZlcihzdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIud2luZG93SXNTaG93aW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgd2hlbmV2ZXIobm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlci5pc0Z1bGx5Q29sbGFwc2VkKS50aGVuUmV0dXJuKHRydWUpCi0gICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIudG91Y2hJc1dpdGhpblZpZXcoYW55RmxvYXQoKSwgYW55RmxvYXQoKSkpCi0gICAgICAgICAgICAudGhlblJldHVybih0cnVlKQotICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnNlbmRUb3VjaFRvVmlldyhkb3duRXYpKS50aGVuUmV0dXJuKHRydWUpCisgICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9kb3duQW5kUGFuZWxDb2xsYXBzZWRBbmRJblNiQm91bmRBbmRTYldpbmRvd1Nob3dfc2VuZHNUb3VjaFRvU2IoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQorICAgICAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyLndpbmRvd0lzU2hvd2luZygpKS50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICB3aGVuZXZlcihub3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLmlzRnVsbHlDb2xsYXBzZWQpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIudG91Y2hJc1dpdGhpblZpZXcoYW55RmxvYXQoKSwgYW55RmxvYXQoKSkpCisgICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIuc2VuZFRvdWNoVG9WaWV3KERPV05fRVZFTlQpKS50aGVuUmV0dXJuKHRydWUpCiAKLSAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChkb3duRXYpCisgICAgICAgICAgICB2YWwgcmV0dXJuVmFsID0gaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50KERPV05fRVZFTlQpCiAKLSAgICAgICAgdmVyaWZ5KHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpLnNlbmRUb3VjaFRvVmlldyhkb3duRXYpCi0gICAgICAgIGFzc2VydFRoYXQocmV0dXJuVmFsKS5pc1RydWUoKQotICAgIH0KKyAgICAgICAgICAgIHZlcmlmeShwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKS5zZW5kVG91Y2hUb1ZpZXcoRE9XTl9FVkVOVCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmV0dXJuVmFsKS5pc1RydWUoKQorICAgICAgICB9CiAKICAgICBAVGVzdAotICAgIGZ1biBoYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnRfcGFuZWxOb3RDb2xsYXBzZWRfcmV0dXJuc051bGwoKSB7Ci0gICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQotICAgICAgICB3aGVuZXZlcihzdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIud2luZG93SXNTaG93aW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgd2hlbmV2ZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlci50b3VjaElzV2l0aGluVmlldyhhbnlGbG9hdCgpLCBhbnlGbG9hdCgpKSkKLSAgICAgICAgICAgIC50aGVuUmV0dXJuKHRydWUpCi0gICAgICAgIC8vIEl0ZW0gd2UncmUgdGVzdGluZwotICAgICAgICB3aGVuZXZlcihub3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLmlzRnVsbHlDb2xsYXBzZWQpLnRoZW5SZXR1cm4oZmFsc2UpCisgICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9wYW5lbE5vdENvbGxhcHNlZF9yZXR1cm5zTnVsbCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdW5kZXJUZXN0LnNldFN0YXR1c0JhclZpZXdDb250cm9sbGVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpCisgICAgICAgICAgICB3aGVuZXZlcihzdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIud2luZG93SXNTaG93aW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIudG91Y2hJc1dpdGhpblZpZXcoYW55RmxvYXQoKSwgYW55RmxvYXQoKSkpCisgICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIC8vIEl0ZW0gd2UncmUgdGVzdGluZworICAgICAgICAgICAgd2hlbmV2ZXIobm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlci5pc0Z1bGx5Q29sbGFwc2VkKS50aGVuUmV0dXJuKGZhbHNlKQogCi0gICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoZG93bkV2KQorICAgICAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChET1dOX0VWRU5UKQogCi0gICAgICAgIHZlcmlmeShwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLCBuZXZlcigpKS5zZW5kVG91Y2hUb1ZpZXcoZG93bkV2KQotICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNOdWxsKCkKLSAgICB9CisgICAgICAgICAgICB2ZXJpZnkocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlciwgbmV2ZXIoKSkuc2VuZFRvdWNoVG9WaWV3KERPV05fRVZFTlQpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNOdWxsKCkKKyAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X3RvdWNoTm90SW5TYkJvdW5kc19yZXR1cm5zTnVsbCgpIHsKLSAgICAgICAgdW5kZXJUZXN0LnNldFN0YXR1c0JhclZpZXdDb250cm9sbGVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpCi0gICAgICAgIHdoZW5ldmVyKHN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlci53aW5kb3dJc1Nob3dpbmcoKSkudGhlblJldHVybih0cnVlKQotICAgICAgICB3aGVuZXZlcihub3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLmlzRnVsbHlDb2xsYXBzZWQpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgLy8gSXRlbSB3ZSdyZSB0ZXN0aW5nCi0gICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIudG91Y2hJc1dpdGhpblZpZXcoYW55RmxvYXQoKSwgYW55RmxvYXQoKSkpCi0gICAgICAgICAgICAudGhlblJldHVybihmYWxzZSkKKyAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X3RvdWNoTm90SW5TYkJvdW5kc19yZXR1cm5zTnVsbCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdW5kZXJUZXN0LnNldFN0YXR1c0JhclZpZXdDb250cm9sbGVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpCisgICAgICAgICAgICB3aGVuZXZlcihzdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIud2luZG93SXNTaG93aW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKG5vdGlmaWNhdGlvblBhbmVsVmlld0NvbnRyb2xsZXIuaXNGdWxseUNvbGxhcHNlZCkudGhlblJldHVybih0cnVlKQorICAgICAgICAgICAgLy8gSXRlbSB3ZSdyZSB0ZXN0aW5nCisgICAgICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnRvdWNoSXNXaXRoaW5WaWV3KGFueUZsb2F0KCksIGFueUZsb2F0KCkpKQorICAgICAgICAgICAgICAgIC50aGVuUmV0dXJuKGZhbHNlKQogCi0gICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoZG93bkV2KQorICAgICAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChET1dOX0VWRU5UKQogCi0gICAgICAgIHZlcmlmeShwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLCBuZXZlcigpKS5zZW5kVG91Y2hUb1ZpZXcoZG93bkV2KQotICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNOdWxsKCkKLSAgICB9CisgICAgICAgICAgICB2ZXJpZnkocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlciwgbmV2ZXIoKSkuc2VuZFRvdWNoVG9WaWV3KERPV05fRVZFTlQpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNOdWxsKCkKKyAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X3NiV2luZG93Tm90U2hvd2luZ19ub1NlbmRUb3VjaFRvU2JBbmRSZXR1cm5zVHJ1ZSgpIHsKLSAgICAgICAgdW5kZXJUZXN0LnNldFN0YXR1c0JhclZpZXdDb250cm9sbGVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpCi0gICAgICAgIHdoZW5ldmVyKG5vdGlmaWNhdGlvblBhbmVsVmlld0NvbnRyb2xsZXIuaXNGdWxseUNvbGxhcHNlZCkudGhlblJldHVybih0cnVlKQotICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnRvdWNoSXNXaXRoaW5WaWV3KGFueUZsb2F0KCksIGFueUZsb2F0KCkpKQotICAgICAgICAgICAgLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgLy8gSXRlbSB3ZSdyZSB0ZXN0aW5nCi0gICAgICAgIHdoZW5ldmVyKHN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlci53aW5kb3dJc1Nob3dpbmcoKSkudGhlblJldHVybihmYWxzZSkKKyAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X3NiV2luZG93Tm90U2hvd2luZ19ub1NlbmRUb3VjaFRvU2JBbmRSZXR1cm5zVHJ1ZSgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdW5kZXJUZXN0LnNldFN0YXR1c0JhclZpZXdDb250cm9sbGVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpCisgICAgICAgICAgICB3aGVuZXZlcihub3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLmlzRnVsbHlDb2xsYXBzZWQpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIudG91Y2hJc1dpdGhpblZpZXcoYW55RmxvYXQoKSwgYW55RmxvYXQoKSkpCisgICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIC8vIEl0ZW0gd2UncmUgdGVzdGluZworICAgICAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyLndpbmRvd0lzU2hvd2luZygpKS50aGVuUmV0dXJuKGZhbHNlKQogCi0gICAgICAgIHZhbCByZXR1cm5WYWwgPSBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoZG93bkV2KQorICAgICAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChET1dOX0VWRU5UKQogCi0gICAgICAgIHZlcmlmeShwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLCBuZXZlcigpKS5zZW5kVG91Y2hUb1ZpZXcoZG93bkV2KQotICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNUcnVlKCkKLSAgICB9CisgICAgICAgICAgICB2ZXJpZnkocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlciwgbmV2ZXIoKSkuc2VuZFRvdWNoVG9WaWV3KERPV05fRVZFTlQpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNUcnVlKCkKKyAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50X2Rvd25FdmVudFNlbnRUb1NiVGhlbkFub3RoZXJFdmVudF9zZW5kc1RvdWNoVG9TYigpIHsKLSAgICAgICAgdW5kZXJUZXN0LnNldFN0YXR1c0JhclZpZXdDb250cm9sbGVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpCi0gICAgICAgIHdoZW5ldmVyKHN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlci53aW5kb3dJc1Nob3dpbmcoKSkudGhlblJldHVybih0cnVlKQotICAgICAgICB3aGVuZXZlcihub3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLmlzRnVsbHlDb2xsYXBzZWQpLnRoZW5SZXR1cm4odHJ1ZSkKLSAgICAgICAgd2hlbmV2ZXIocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlci50b3VjaElzV2l0aGluVmlldyhhbnlGbG9hdCgpLCBhbnlGbG9hdCgpKSkKLSAgICAgICAgICAgIC50aGVuUmV0dXJuKHRydWUpCisgICAgZnVuIGhhbmRsZURpc3BhdGNoVG91Y2hFdmVudF9kb3duRXZlbnRTZW50VG9TYlRoZW5Bbm90aGVyRXZlbnRfc2VuZHNUb3VjaFRvU2IoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHVuZGVyVGVzdC5zZXRTdGF0dXNCYXJWaWV3Q29udHJvbGxlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyKQorICAgICAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyLndpbmRvd0lzU2hvd2luZygpKS50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICB3aGVuZXZlcihub3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLmlzRnVsbHlDb2xsYXBzZWQpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIudG91Y2hJc1dpdGhpblZpZXcoYW55RmxvYXQoKSwgYW55RmxvYXQoKSkpCisgICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4odHJ1ZSkKIAotICAgICAgICAvLyBEb3duIGV2ZW50IGZpcnN0Ci0gICAgICAgIGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChkb3duRXYpCisgICAgICAgICAgICAvLyBEb3duIGV2ZW50IGZpcnN0CisgICAgICAgICAgICBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVEaXNwYXRjaFRvdWNoRXZlbnQoRE9XTl9FVkVOVCkKIAotICAgICAgICAvLyBUaGVuIGFub3RoZXIgZXZlbnQKLSAgICAgICAgdmFsIG5leHRFdmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbigwTCwgMEwsIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFLCAwZiwgMGYsIDApCi0gICAgICAgIHdoZW5ldmVyKHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIuc2VuZFRvdWNoVG9WaWV3KG5leHRFdmVudCkpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICAgICAgICAgIC8vIFRoZW4gYW5vdGhlciBldmVudAorICAgICAgICAgICAgdmFsIG5leHRFdmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbigwTCwgMEwsIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFLCAwZiwgMGYsIDApCisgICAgICAgICAgICB3aGVuZXZlcihwaG9uZVN0YXR1c0JhclZpZXdDb250cm9sbGVyLnNlbmRUb3VjaFRvVmlldyhuZXh0RXZlbnQpKS50aGVuUmV0dXJuKHRydWUpCiAKLSAgICAgICAgdmFsIHJldHVyblZhbCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZURpc3BhdGNoVG91Y2hFdmVudChuZXh0RXZlbnQpCisgICAgICAgICAgICB2YWwgcmV0dXJuVmFsID0gaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuaGFuZGxlRGlzcGF0Y2hUb3VjaEV2ZW50KG5leHRFdmVudCkKIAotICAgICAgICB2ZXJpZnkocGhvbmVTdGF0dXNCYXJWaWV3Q29udHJvbGxlcikuc2VuZFRvdWNoVG9WaWV3KG5leHRFdmVudCkKLSAgICAgICAgYXNzZXJ0VGhhdChyZXR1cm5WYWwpLmlzVHJ1ZSgpCi0gICAgfQorICAgICAgICAgICAgdmVyaWZ5KHBob25lU3RhdHVzQmFyVmlld0NvbnRyb2xsZXIpLnNlbmRUb3VjaFRvVmlldyhuZXh0RXZlbnQpCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJldHVyblZhbCkuaXNUcnVlKCkKKyAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gc2hvdWxkSW50ZXJjZXB0VG91Y2hFdmVudF9kb3duRXZlbnRBbHRlcm5hdGVCb3VuY2VyX2lnbm9yZUlmSW5VZGZwc092ZXJsYXkoKSB7Ci0gICAgICAgIC8vIERvd24gZXZlbnQgd2l0aGluIHVkZnBzT3ZlcmxheSBib3VuZHMgd2hpbGUgYWx0ZXJuYXRlQm91bmNlciBpcyBzaG93aW5nCi0gICAgICAgIHdoZW5ldmVyKHVkZnBzT3ZlcmxheUludGVyYWN0b3IuY2FuSW50ZXJjZXB0VG91Y2hJblVkZnBzQm91bmRzKGRvd25FdikpLnRoZW5SZXR1cm4oZmFsc2UpCi0gICAgICAgIHdoZW5ldmVyKGFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLmlzVmlzaWJsZVN0YXRlKCkpLnRoZW5SZXR1cm4odHJ1ZSkKKyAgICBmdW4gc2hvdWxkSW50ZXJjZXB0VG91Y2hFdmVudF9kb3duRXZlbnRBbHRlcm5hdGVCb3VuY2VyX2lnbm9yZUlmSW5VZGZwc092ZXJsYXkoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIC8vIERvd24gZXZlbnQgd2l0aGluIHVkZnBzT3ZlcmxheSBib3VuZHMgd2hpbGUgYWx0ZXJuYXRlQm91bmNlciBpcyBzaG93aW5nCisgICAgICAgICAgICB3aGVuZXZlcih1ZGZwc092ZXJsYXlJbnRlcmFjdG9yLmNhbkludGVyY2VwdFRvdWNoSW5VZGZwc0JvdW5kcyhET1dOX0VWRU5UKSkKKyAgICAgICAgICAgICAgICAudGhlblJldHVybihmYWxzZSkKKyAgICAgICAgICAgIHdoZW5ldmVyKGFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLmlzVmlzaWJsZVN0YXRlKCkpLnRoZW5SZXR1cm4odHJ1ZSkKIAotICAgICAgICAvLyBUaGVuIHRvdWNoIHNob3VsZCBub3QgYmUgaW50ZXJjZXB0ZWQKLSAgICAgICAgdmFsIHNob3VsZEludGVyY2VwdCA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLnNob3VsZEludGVyY2VwdFRvdWNoRXZlbnQoZG93bkV2KQotICAgICAgICBhc3NlcnRUaGF0KHNob3VsZEludGVyY2VwdCkuaXNGYWxzZSgpCi0gICAgfQorICAgICAgICAgICAgLy8gVGhlbiB0b3VjaCBzaG91bGQgbm90IGJlIGludGVyY2VwdGVkCisgICAgICAgICAgICB2YWwgc2hvdWxkSW50ZXJjZXB0ID0gaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuc2hvdWxkSW50ZXJjZXB0VG91Y2hFdmVudChET1dOX0VWRU5UKQorICAgICAgICAgICAgYXNzZXJ0VGhhdChzaG91bGRJbnRlcmNlcHQpLmlzRmFsc2UoKQorICAgICAgICB9CiAKICAgICBAVGVzdAotICAgIGZ1biB0ZXN0R2V0Qm91bmNlckNvbnRhaW5lcigpIHsKLSAgICAgICAgTW9ja2l0by5jbGVhckludm9jYXRpb25zKHZpZXcpCi0gICAgICAgIHVuZGVyVGVzdC5ib3VuY2VyQ29udGFpbmVyCi0gICAgICAgIHZlcmlmeSh2aWV3KS5maW5kVmlld0J5SWQ8Vmlld0dyb3VwPihSLmlkLmtleWd1YXJkX2JvdW5jZXJfY29udGFpbmVyKQotICAgIH0KKyAgICBmdW4gdGVzdEdldEJvdW5jZXJDb250YWluZXIoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIE1vY2tpdG8uY2xlYXJJbnZvY2F0aW9ucyh2aWV3KQorICAgICAgICAgICAgdW5kZXJUZXN0LmJvdW5jZXJDb250YWluZXIKKyAgICAgICAgICAgIHZlcmlmeSh2aWV3KS5maW5kVmlld0J5SWQ8Vmlld0dyb3VwPihSLmlkLmtleWd1YXJkX2JvdW5jZXJfY29udGFpbmVyKQorICAgICAgICB9CiAKICAgICBAVGVzdAotICAgIGZ1biB0ZXN0R2V0S2V5Z3VhcmRNZXNzYWdlQXJlYSgpIHsKLSAgICAgICAgdW5kZXJUZXN0LmtleWd1YXJkTWVzc2FnZUFyZWEKLSAgICAgICAgdmVyaWZ5KHZpZXcpLmZpbmRWaWV3QnlJZDxWaWV3R3JvdXA+KFIuaWQua2V5Z3VhcmRfbWVzc2FnZV9hcmVhKQorICAgIGZ1biB0ZXN0R2V0S2V5Z3VhcmRNZXNzYWdlQXJlYSgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdW5kZXJUZXN0LmtleWd1YXJkTWVzc2FnZUFyZWEKKyAgICAgICAgICAgIHZlcmlmeSh2aWV3KS5maW5kVmlld0J5SWQ8Vmlld0dyb3VwPihSLmlkLmtleWd1YXJkX21lc3NhZ2VfYXJlYSkKKyAgICAgICAgfQorCisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIHByaXZhdGUgdmFsIERPV05fRVZFTlQgPSBNb3Rpb25FdmVudC5vYnRhaW4oMEwsIDBMLCBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgMGYsIDBmLCAwKQorICAgICAgICBwcml2YXRlIGNvbnN0IHZhbCBWSUVXX0JPVFRPTSA9IDEwMAogICAgIH0KIH0KLQotcHJpdmF0ZSB2YWwgZG93bkV2ID0gTW90aW9uRXZlbnQub2J0YWluKDBMLCAwTCwgTW90aW9uRXZlbnQuQUNUSU9OX0RPV04sIDBmLCAwZiwgMCkKLXByaXZhdGUgY29uc3QgdmFsIFZJRVdfQk9UVE9NID0gMTAwCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3VGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1MjhhOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnNoYWRlOwotCi1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5zcHk7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47Ci0KLWltcG9ydCBzdGF0aWMga290bGlueC5jb3JvdXRpbmVzLmZsb3cuRmxvd0t0LmVtcHR5RmxvdzsKLQotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0aW5nLkFuZHJvaWRUZXN0aW5nUnVubmVyOwotaW1wb3J0IGFuZHJvaWQudGVzdGluZy5UZXN0YWJsZUxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3Q7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5rZXlndWFyZC5LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5rZXlndWFyZC5Mb2NrSWNvblZpZXdDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmtleWd1YXJkLmRhZ2dlci5LZXlndWFyZEJvdW5jZXJDb21wb25lbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5TeXN1aVRlc3RDYXNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmJpb21ldHJpY3MuZG9tYWluLmludGVyYWN0b3IuVWRmcHNPdmVybGF5SW50ZXJhY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jbGFzc2lmaWVyLkZhbHNpbmdDb2xsZWN0b3JGYWtlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmRvY2suRG9ja01hbmFnZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuS2V5Z3VhcmRVbmxvY2tBbmltYXRpb25Db250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLmRvbWFpbi5pbnRlcmFjdG9yLkFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLmRvbWFpbi5pbnRlcmFjdG9yLktleWd1YXJkVHJhbnNpdGlvbkludGVyYWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQudWkudmlld21vZGVsLktleWd1YXJkQm91bmNlclZpZXdNb2RlbDsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC51aS52aWV3bW9kZWwuUHJpbWFyeUJvdW5jZXJUb0dvbmVUcmFuc2l0aW9uVmlld01vZGVsOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5EcmFnRG93bkhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTG9ja3NjcmVlblNoYWRlVHJhbnNpdGlvbkNvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLk5vdGlmaWNhdGlvbkluc2V0c0NvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLk5vdGlmaWNhdGlvblNoYWRlRGVwdGhDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5Ob3RpZmljYXRpb25TaGFkZVdpbmRvd0NvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlN5c3VpU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uc3RhY2suQW1iaWVudFN0YXRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uc3RhY2suTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5zdGFjay5Ob3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dENvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBob25lLkNlbnRyYWxTdXJmYWNlczsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuU3RhdHVzQmFyS2V5Z3VhcmRWaWV3TWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIud2luZG93LlN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS50dW5lci5UdW5lclNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcjsKLWltcG9ydCBvcmcubW9ja2l0by5DYXB0b3I7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKLWltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7Ci0KLUBSdW5XaXRoKEFuZHJvaWRUZXN0aW5nUnVubmVyLmNsYXNzKQotQFRlc3RhYmxlTG9vcGVyLlJ1bldpdGhMb29wZXIoc2V0QXNNYWluTG9vcGVyID0gdHJ1ZSkKLUBTbWFsbFRlc3QKLXB1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdUZXN0IGV4dGVuZHMgU3lzdWlUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvblNoYWRlV2luZG93VmlldyBtVmlldzsKLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld0NvbnRyb2xsZXIgbUNvbnRyb2xsZXI7Ci0KLSAgICBATW9jayBwcml2YXRlIFR1bmVyU2VydmljZSBtVHVuZXJTZXJ2aWNlOwotICAgIEBNb2NrIHByaXZhdGUgRHJhZ0Rvd25IZWxwZXIgbURyYWdEb3duSGVscGVyOwotICAgIEBNb2NrIHByaXZhdGUgU3lzdWlTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIgbVN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjsKLSAgICBATW9jayBwcml2YXRlIFNoYWRlQ29udHJvbGxlciBtU2hhZGVDb250cm9sbGVyOwotICAgIEBNb2NrIHByaXZhdGUgQ2VudHJhbFN1cmZhY2VzIG1DZW50cmFsU3VyZmFjZXM7Ci0gICAgQE1vY2sgcHJpdmF0ZSBEb2NrTWFuYWdlciBtRG9ja01hbmFnZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBOb3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyIG1Ob3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyOwotICAgIEBNb2NrIHByaXZhdGUgTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXQgbU5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0OwotICAgIEBNb2NrIHByaXZhdGUgTm90aWZpY2F0aW9uU2hhZGVEZXB0aENvbnRyb2xsZXIgbU5vdGlmaWNhdGlvblNoYWRlRGVwdGhDb250cm9sbGVyOwotICAgIEBNb2NrIHByaXZhdGUgTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dDb250cm9sbGVyIG1Ob3RpZmljYXRpb25TaGFkZVdpbmRvd0NvbnRyb2xsZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBOb3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dENvbnRyb2xsZXIgbU5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0Q29udHJvbGxlcjsKLSAgICBATW9jayBwcml2YXRlIFN0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXIgbVN0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBTdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXIgbVN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlcjsKLSAgICBATW9jayBwcml2YXRlIExvY2tzY3JlZW5TaGFkZVRyYW5zaXRpb25Db250cm9sbGVyIG1Mb2Nrc2NyZWVuU2hhZGVUcmFuc2l0aW9uQ29udHJvbGxlcjsKLSAgICBATW9jayBwcml2YXRlIExvY2tJY29uVmlld0NvbnRyb2xsZXIgbUxvY2tJY29uVmlld0NvbnRyb2xsZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBLZXlndWFyZFVubG9ja0FuaW1hdGlvbkNvbnRyb2xsZXIgbUtleWd1YXJkVW5sb2NrQW5pbWF0aW9uQ29udHJvbGxlcjsKLSAgICBATW9jayBwcml2YXRlIEFtYmllbnRTdGF0ZSBtQW1iaWVudFN0YXRlOwotICAgIEBNb2NrIHByaXZhdGUgUHVsc2luZ0dlc3R1cmVMaXN0ZW5lciBtUHVsc2luZ0dlc3R1cmVMaXN0ZW5lcjsKLSAgICBATW9jayBwcml2YXRlIEtleWd1YXJkQm91bmNlclZpZXdNb2RlbCBtS2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsOwotICAgIEBNb2NrIHByaXZhdGUgS2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50LkZhY3RvcnkgbUtleWd1YXJkQm91bmNlckNvbXBvbmVudEZhY3Rvcnk7Ci0gICAgQE1vY2sgcHJpdmF0ZSBLZXlndWFyZEJvdW5jZXJDb21wb25lbnQgbUtleWd1YXJkQm91bmNlckNvbXBvbmVudDsKLSAgICBATW9jayBwcml2YXRlIEtleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyIG1LZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlcjsKLSAgICBATW9jayBwcml2YXRlIE5vdGlmaWNhdGlvbkluc2V0c0NvbnRyb2xsZXIgbU5vdGlmaWNhdGlvbkluc2V0c0NvbnRyb2xsZXI7Ci0gICAgQE1vY2sgcHJpdmF0ZSBBbHRlcm5hdGVCb3VuY2VySW50ZXJhY3RvciBtQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3I7Ci0gICAgQE1vY2sgcHJpdmF0ZSBVZGZwc092ZXJsYXlJbnRlcmFjdG9yIG1VZGZwc092ZXJsYXlJbnRlcmFjdG9yOwotICAgIEBNb2NrIHByaXZhdGUgS2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3RvciBtS2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3RvcjsKLSAgICBATW9jayBwcml2YXRlIFByaW1hcnlCb3VuY2VyVG9Hb25lVHJhbnNpdGlvblZpZXdNb2RlbCBtUHJpbWFyeUJvdW5jZXJUb0dvbmVUcmFuc2l0aW9uVmlld01vZGVsOwotCi0gICAgQENhcHRvciBwcml2YXRlIEFyZ3VtZW50Q2FwdG9yPE5vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlldy5JbnRlcmFjdGlvbkV2ZW50SGFuZGxlcj4KLSAgICAgICAgICAgIG1JbnRlcmFjdGlvbkV2ZW50SGFuZGxlckNhcHRvcjsKLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlldy5JbnRlcmFjdGlvbkV2ZW50SGFuZGxlciBtSW50ZXJhY3Rpb25FdmVudEhhbmRsZXI7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcyk7Ci0KLSAgICAgICAgbVZpZXcgPSBzcHkobmV3IE5vdGlmaWNhdGlvblNoYWRlV2luZG93VmlldyhnZXRDb250ZXh0KCksIG51bGwpKTsKLSAgICAgICAgd2hlbihtVmlldy5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25fc3RhY2tfc2Nyb2xsZXIpKQotICAgICAgICAgICAgICAgIC50aGVuUmV0dXJuKG1Ob3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dCk7Ci0KLSAgICAgICAgd2hlbihtVmlldy5maW5kVmlld0J5SWQoUi5pZC5rZXlndWFyZF9ib3VuY2VyX2NvbnRhaW5lcikpLnRoZW5SZXR1cm4obW9jayhWaWV3R3JvdXAuY2xhc3MpKTsKLSAgICAgICAgd2hlbihtS2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50RmFjdG9yeS5jcmVhdGUoYW55KFZpZXdHcm91cC5jbGFzcykpKS50aGVuUmV0dXJuKAotICAgICAgICAgICAgICAgIG1LZXlndWFyZEJvdW5jZXJDb21wb25lbnQpOwotICAgICAgICB3aGVuKG1LZXlndWFyZEJvdW5jZXJDb21wb25lbnQuZ2V0U2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyKCkpLnRoZW5SZXR1cm4oCi0gICAgICAgICAgICAgICAgbUtleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyKTsKLQotICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEb3ppbmcoKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIG1EZXBlbmRlbmN5LmluamVjdFRlc3REZXBlbmRlbmN5KFNoYWRlQ29udHJvbGxlci5jbGFzcywgbVNoYWRlQ29udHJvbGxlcik7Ci0KLSAgICAgICAgd2hlbihtRG9ja01hbmFnZXIuaXNEb2NrZWQoKSkudGhlblJldHVybihmYWxzZSk7Ci0KLSAgICAgICAgd2hlbihtS2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3Rvci5nZXRMb2Nrc2NyZWVuVG9EcmVhbWluZ1RyYW5zaXRpb24oKSkKLSAgICAgICAgICAgICAgICAudGhlblJldHVybihlbXB0eUZsb3coKSk7Ci0KLSAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlcigKLSAgICAgICAgICAgICAgICBtTG9ja3NjcmVlblNoYWRlVHJhbnNpdGlvbkNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgbmV3IEZhbHNpbmdDb2xsZWN0b3JGYWtlKCksCi0gICAgICAgICAgICAgICAgbVN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBtRG9ja01hbmFnZXIsCi0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvblNoYWRlRGVwdGhDb250cm9sbGVyLAotICAgICAgICAgICAgICAgIG1WaWV3LAotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25QYW5lbFZpZXdDb250cm9sbGVyLAotICAgICAgICAgICAgICAgIG5ldyBTaGFkZUV4cGFuc2lvblN0YXRlTWFuYWdlcigpLAotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dENvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgbVN0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXIsCi0gICAgICAgICAgICAgICAgbVN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBtTG9ja0ljb25WaWV3Q29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBtQ2VudHJhbFN1cmZhY2VzLAotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25TaGFkZVdpbmRvd0NvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgbUtleWd1YXJkVW5sb2NrQW5pbWF0aW9uQ29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSW5zZXRzQ29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBtQW1iaWVudFN0YXRlLAotICAgICAgICAgICAgICAgIG1QdWxzaW5nR2VzdHVyZUxpc3RlbmVyLAotICAgICAgICAgICAgICAgIG1LZXlndWFyZEJvdW5jZXJWaWV3TW9kZWwsCi0gICAgICAgICAgICAgICAgbUtleWd1YXJkQm91bmNlckNvbXBvbmVudEZhY3RvcnksCi0gICAgICAgICAgICAgICAgbUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLAotICAgICAgICAgICAgICAgIG1VZGZwc092ZXJsYXlJbnRlcmFjdG9yLAotICAgICAgICAgICAgICAgIG1LZXlndWFyZFRyYW5zaXRpb25JbnRlcmFjdG9yLAotICAgICAgICAgICAgICAgIG1QcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwKLSAgICAgICAgKTsKLSAgICAgICAgbUNvbnRyb2xsZXIuc2V0dXBFeHBhbmRlZFN0YXR1c0JhcigpOwotICAgICAgICBtQ29udHJvbGxlci5zZXREcmFnRG93bkhlbHBlcihtRHJhZ0Rvd25IZWxwZXIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERyYWdEb3duSGVscGVyQ2FsbGVkV2hlbkRyYWdnaW5nRG93bigpIHsKLSAgICAgICAgd2hlbihtRHJhZ0Rvd25IZWxwZXIuaXNEcmFnZ2luZ0Rvd24oKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgTW90aW9uRXZlbnQgZXYgPSBNb3Rpb25FdmVudC5vYnRhaW4obm93LCBub3csIE1vdGlvbkV2ZW50LkFDVElPTl9VUCwgMCAvKiB4ICovLCAwIC8qIHkgKi8sCi0gICAgICAgICAgICAgICAgMCAvKiBtZXRhICovKTsKLSAgICAgICAgbVZpZXcub25Ub3VjaEV2ZW50KGV2KTsKLSAgICAgICAgdmVyaWZ5KG1EcmFnRG93bkhlbHBlcikub25Ub3VjaEV2ZW50KGV2KTsKLSAgICAgICAgZXYucmVjeWNsZSgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEludGVyY2VwdFRvdWNoV2hlblNob3dpbmdBbHRBdXRoKCkgewotICAgICAgICBjYXB0dXJlSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIoKTsKLQotICAgICAgICAvLyBXSEVOIHNob3dpbmcgYWx0IGF1dGgsIG5vdCBkb3ppbmcsIGRyYWcgZG93biBoZWxwZXIgZG9lc24ndCB3YW50IHRvIGludGVyY2VwdAotICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEb3ppbmcoKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLmlzVmlzaWJsZVN0YXRlKCkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obVVkZnBzT3ZlcmxheUludGVyYWN0b3IuY2FuSW50ZXJjZXB0VG91Y2hJblVkZnBzQm91bmRzKGFueSgpKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtRHJhZ0Rvd25IZWxwZXIub25JbnRlcmNlcHRUb3VjaEV2ZW50KGFueSgpKSkudGhlblJldHVybihmYWxzZSk7Ci0KLSAgICAgICAgLy8gVEhFTiB3ZSBzaG91bGQgaW50ZXJjZXB0IHRvdWNoCi0gICAgICAgIGFzc2VydFRydWUobUludGVyYWN0aW9uRXZlbnRIYW5kbGVyLnNob3VsZEludGVyY2VwdFRvdWNoRXZlbnQobW9jayhNb3Rpb25FdmVudC5jbGFzcykpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0ludGVyY2VwdFRvdWNoKCkgewotICAgICAgICBjYXB0dXJlSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIoKTsKLQotICAgICAgICAvLyBXSEVOIG5vdCBzaG93aW5nIGFsdCBhdXRoLCBub3QgZG96aW5nLCBkcmFnIGRvd24gaGVscGVyIGRvZXNuJ3Qgd2FudCB0byBpbnRlcmNlcHQKLSAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRG96aW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICB3aGVuKG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5pc1Zpc2libGVTdGF0ZSgpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtRHJhZ0Rvd25IZWxwZXIub25JbnRlcmNlcHRUb3VjaEV2ZW50KGFueSgpKSkudGhlblJldHVybihmYWxzZSk7Ci0KLSAgICAgICAgLy8gVEhFTiB3ZSBzaG91bGRuJ3QgaW50ZXJjZXB0IHRvdWNoCi0gICAgICAgIGFzc2VydEZhbHNlKG1JbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5zaG91bGRJbnRlcmNlcHRUb3VjaEV2ZW50KG1vY2soTW90aW9uRXZlbnQuY2xhc3MpKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlVG91Y2hFdmVudFdoZW5TaG93aW5nQWx0QXV0aCgpIHsKLSAgICAgICAgY2FwdHVyZUludGVyYWN0aW9uRXZlbnRIYW5kbGVyKCk7Ci0KLSAgICAgICAgLy8gV0hFTiBzaG93aW5nIGFsdCBhdXRoLCBub3QgZG96aW5nLCBkcmFnIGRvd24gaGVscGVyIGRvZXNuJ3Qgd2FudCB0byBpbnRlcmNlcHQKLSAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRG96aW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICB3aGVuKG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5pc1Zpc2libGVTdGF0ZSgpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmFnRG93bkhlbHBlci5vbkludGVyY2VwdFRvdWNoRXZlbnQoYW55KCkpKS50aGVuUmV0dXJuKGZhbHNlKTsKLQotICAgICAgICAvLyBUSEVOIHdlIHNob3VsZCBoYW5kbGUgdGhlIHRvdWNoCi0gICAgICAgIGFzc2VydFRydWUobUludGVyYWN0aW9uRXZlbnRIYW5kbGVyLmhhbmRsZVRvdWNoRXZlbnQobW9jayhNb3Rpb25FdmVudC5jbGFzcykpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FwdHVyZUludGVyYWN0aW9uRXZlbnRIYW5kbGVyKCkgewotICAgICAgICB2ZXJpZnkobVZpZXcpLnNldEludGVyYWN0aW9uRXZlbnRIYW5kbGVyKG1JbnRlcmFjdGlvbkV2ZW50SGFuZGxlckNhcHRvci5jYXB0dXJlKCkpOwotICAgICAgICBtSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIgPSBtSW50ZXJhY3Rpb25FdmVudEhhbmRsZXJDYXB0b3IuZ2V0VmFsdWUoKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL05vdGlmaWNhdGlvblNoYWRlV2luZG93Vmlld1Rlc3Qua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwZjQwOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdUZXN0Lmt0CkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc2hhZGUKKworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2sKK2ltcG9ydCBhbmRyb2lkLnRlc3RpbmcuQW5kcm9pZFRlc3RpbmdSdW5uZXIKK2ltcG9ydCBhbmRyb2lkLnRlc3RpbmcuVGVzdGFibGVMb29wZXIuUnVuV2l0aExvb3BlcgoraW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudAoraW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0CitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdAoraW1wb3J0IGNvbS5hbmRyb2lkLmtleWd1YXJkLktleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyCitpbXBvcnQgY29tLmFuZHJvaWQua2V5Z3VhcmQuTG9ja0ljb25WaWV3Q29udHJvbGxlcgoraW1wb3J0IGNvbS5hbmRyb2lkLmtleWd1YXJkLmRhZ2dlci5LZXlndWFyZEJvdW5jZXJDb21wb25lbnQKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmJpb21ldHJpY3MuZG9tYWluLmludGVyYWN0b3IuVWRmcHNPdmVybGF5SW50ZXJhY3RvcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNsYXNzaWZpZXIuRmFsc2luZ0NvbGxlY3RvckZha2UKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5kb2NrLkRvY2tNYW5hZ2VyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmFrZUZlYXR1cmVGbGFncworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZsYWdzCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuS2V5Z3VhcmRVbmxvY2tBbmltYXRpb25Db250cm9sbGVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQuZG9tYWluLmludGVyYWN0b3IuQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5kb21haW4uaW50ZXJhY3Rvci5LZXlndWFyZFRyYW5zaXRpb25JbnRlcmFjdG9yCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkua2V5Z3VhcmQudWkudmlld21vZGVsLktleWd1YXJkQm91bmNlclZpZXdNb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLnVpLnZpZXdtb2RlbC5QcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVtb3RlcHJveHkuTXVsdGlTaGFkZUlucHV0UHJveHkKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5tdWx0aXNoYWRlLmRhdGEucmVwb3NpdG9yeS5NdWx0aVNoYWRlUmVwb3NpdG9yeQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLm11bHRpc2hhZGUuZG9tYWluLmludGVyYWN0b3IuTXVsdGlTaGFkZUludGVyYWN0b3IKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zaGFkZS5Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXcuSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuRHJhZ0Rvd25IZWxwZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTG9ja3NjcmVlblNoYWRlVHJhbnNpdGlvbkNvbnRyb2xsZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTm90aWZpY2F0aW9uSW5zZXRzQ29udHJvbGxlcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5Ob3RpZmljYXRpb25TaGFkZURlcHRoQ29udHJvbGxlcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5Ob3RpZmljYXRpb25TaGFkZVdpbmRvd0NvbnRyb2xsZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuU3lzdWlTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLnN0YWNrLkFtYmllbnRTdGF0ZQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uc3RhY2suTm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXQKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLnN0YWNrLk5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0Q29udHJvbGxlcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waG9uZS5DZW50cmFsU3VyZmFjZXMKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuU3RhdHVzQmFyS2V5Z3VhcmRWaWV3TWFuYWdlcgoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci53aW5kb3cuU3RhdHVzQmFyV2luZG93U3RhdGVDb250cm9sbGVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLmFueQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwubW9ja2l0by5tb2NrCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLndoZW5ldmVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC50aW1lLkZha2VTeXN0ZW1DbG9jaworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmVtcHR5RmxvdworaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy50ZXN0LlRlc3RTY29wZQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy50ZXN0LnJ1blRlc3QKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGgKK2ltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcgoraW1wb3J0IG9yZy5tb2NraXRvLkNhcHRvcgoraW1wb3J0IG9yZy5tb2NraXRvLk1vY2sKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLnNweQoraW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zCisKK0BPcHRJbihFeHBlcmltZW50YWxDb3JvdXRpbmVzQXBpOjpjbGFzcykKK0BSdW5XaXRoKEFuZHJvaWRUZXN0aW5nUnVubmVyOjpjbGFzcykKK0BSdW5XaXRoTG9vcGVyKHNldEFzTWFpbkxvb3BlciA9IHRydWUpCitAU21hbGxUZXN0CitjbGFzcyBOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXdUZXN0IDogU3lzdWlUZXN0Q2FzZSgpIHsKKworICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGRyYWdEb3duSGVscGVyOiBEcmFnRG93bkhlbHBlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIHN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjogU3lzdWlTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBzaGFkZUNvbnRyb2xsZXI6IFNoYWRlQ29udHJvbGxlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGNlbnRyYWxTdXJmYWNlczogQ2VudHJhbFN1cmZhY2VzCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgZG9ja01hbmFnZXI6IERvY2tNYW5hZ2VyCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlcjogTm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIG5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0OiBOb3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dAorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIG5vdGlmaWNhdGlvblNoYWRlRGVwdGhDb250cm9sbGVyOiBOb3RpZmljYXRpb25TaGFkZURlcHRoQ29udHJvbGxlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIG5vdGlmaWNhdGlvblNoYWRlV2luZG93Q29udHJvbGxlcjogTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dDb250cm9sbGVyCisgICAgQE1vY2sKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciBub3RpZmljYXRpb25TdGFja1Njcm9sbExheW91dENvbnRyb2xsZXI6CisgICAgICAgIE5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0Q29udHJvbGxlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIHN0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXI6IFN0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXIKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBzdGF0dXNCYXJXaW5kb3dTdGF0ZUNvbnRyb2xsZXI6IFN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlcgorICAgIEBNb2NrCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbG9ja3NjcmVlblNoYWRlVHJhbnNpdGlvbkNvbnRyb2xsZXI6IExvY2tzY3JlZW5TaGFkZVRyYW5zaXRpb25Db250cm9sbGVyCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbG9ja0ljb25WaWV3Q29udHJvbGxlcjogTG9ja0ljb25WaWV3Q29udHJvbGxlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGtleWd1YXJkVW5sb2NrQW5pbWF0aW9uQ29udHJvbGxlcjogS2V5Z3VhcmRVbmxvY2tBbmltYXRpb25Db250cm9sbGVyCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgYW1iaWVudFN0YXRlOiBBbWJpZW50U3RhdGUKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBwdWxzaW5nR2VzdHVyZUxpc3RlbmVyOiBQdWxzaW5nR2VzdHVyZUxpc3RlbmVyCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIga2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsOiBLZXlndWFyZEJvdW5jZXJWaWV3TW9kZWwKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBrZXlndWFyZEJvdW5jZXJDb21wb25lbnRGYWN0b3J5OiBLZXlndWFyZEJvdW5jZXJDb21wb25lbnQuRmFjdG9yeQorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGtleWd1YXJkQm91bmNlckNvbXBvbmVudDogS2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50CisgICAgQE1vY2sKKyAgICBwcml2YXRlIGxhdGVpbml0IHZhciBrZXlndWFyZFNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlcjogS2V5Z3VhcmRTZWN1cml0eUNvbnRhaW5lckNvbnRyb2xsZXIKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciBub3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyOiBOb3RpZmljYXRpb25JbnNldHNDb250cm9sbGVyCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgYWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3I6IEFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIga2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3RvcjogS2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3RvcgorICAgIEBNb2NrCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgcHJpbWFyeUJvdW5jZXJUb0dvbmVUcmFuc2l0aW9uVmlld01vZGVsOgorICAgICAgICBQcmltYXJ5Qm91bmNlclRvR29uZVRyYW5zaXRpb25WaWV3TW9kZWwKKyAgICBAQ2FwdG9yCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgaW50ZXJhY3Rpb25FdmVudEhhbmRsZXJDYXB0b3I6IEFyZ3VtZW50Q2FwdG9yPEludGVyYWN0aW9uRXZlbnRIYW5kbGVyPgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIHVkZnBzT3ZlcmxheUludGVyYWN0b3I6IFVkZnBzT3ZlcmxheUludGVyYWN0b3IKKworICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHVuZGVyVGVzdDogTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3CisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgY29udHJvbGxlcjogTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlcgorICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGludGVyYWN0aW9uRXZlbnRIYW5kbGVyOiBJbnRlcmFjdGlvbkV2ZW50SGFuZGxlcgorICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHRlc3RTY29wZTogVGVzdFNjb3BlCisKKyAgICBAQmVmb3JlCisgICAgZnVuIHNldFVwKCkgeworICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpCisgICAgICAgIHVuZGVyVGVzdCA9IHNweShOb3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXcoY29udGV4dCwgbnVsbCkpCisgICAgICAgIHdoZW5ldmVyKAorICAgICAgICAgICAgICAgIHVuZGVyVGVzdC5maW5kVmlld0J5SWQ8Tm90aWZpY2F0aW9uU3RhY2tTY3JvbGxMYXlvdXQ+KAorICAgICAgICAgICAgICAgICAgICBSLmlkLm5vdGlmaWNhdGlvbl9zdGFja19zY3JvbGxlcgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIC50aGVuUmV0dXJuKG5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0KQorICAgICAgICB3aGVuZXZlcih1bmRlclRlc3QuZmluZFZpZXdCeUlkPEZyYW1lTGF5b3V0PihSLmlkLmtleWd1YXJkX2JvdW5jZXJfY29udGFpbmVyKSkKKyAgICAgICAgICAgIC50aGVuUmV0dXJuKG1vY2soKSkKKyAgICAgICAgd2hlbmV2ZXIoa2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50RmFjdG9yeS5jcmVhdGUoYW55KCkpKS50aGVuUmV0dXJuKGtleWd1YXJkQm91bmNlckNvbXBvbmVudCkKKyAgICAgICAgd2hlbmV2ZXIoa2V5Z3VhcmRCb3VuY2VyQ29tcG9uZW50LnNlY3VyaXR5Q29udGFpbmVyQ29udHJvbGxlcikKKyAgICAgICAgICAgIC50aGVuUmV0dXJuKGtleWd1YXJkU2VjdXJpdHlDb250YWluZXJDb250cm9sbGVyKQorICAgICAgICB3aGVuZXZlcihzdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEb3ppbmcpLnRoZW5SZXR1cm4oZmFsc2UpCisgICAgICAgIG1EZXBlbmRlbmN5LmluamVjdFRlc3REZXBlbmRlbmN5KFNoYWRlQ29udHJvbGxlcjo6Y2xhc3MuamF2YSwgc2hhZGVDb250cm9sbGVyKQorICAgICAgICB3aGVuZXZlcihkb2NrTWFuYWdlci5pc0RvY2tlZCkudGhlblJldHVybihmYWxzZSkKKyAgICAgICAgd2hlbmV2ZXIoa2V5Z3VhcmRUcmFuc2l0aW9uSW50ZXJhY3Rvci5sb2Nrc2NyZWVuVG9EcmVhbWluZ1RyYW5zaXRpb24pCisgICAgICAgICAgICAudGhlblJldHVybihlbXB0eUZsb3coKSkKKworICAgICAgICB2YWwgZmVhdHVyZUZsYWdzID0gRmFrZUZlYXR1cmVGbGFncygpCisgICAgICAgIGZlYXR1cmVGbGFncy5zZXQoRmxhZ3MuVFJBQ0tQQURfR0VTVFVSRV9CQUNLLCBmYWxzZSkKKyAgICAgICAgZmVhdHVyZUZsYWdzLnNldChGbGFncy5EVUFMX1NIQURFLCBmYWxzZSkKKyAgICAgICAgdmFsIGlucHV0UHJveHkgPSBNdWx0aVNoYWRlSW5wdXRQcm94eSgpCisgICAgICAgIHRlc3RTY29wZSA9IFRlc3RTY29wZSgpCisgICAgICAgIGNvbnRyb2xsZXIgPQorICAgICAgICAgICAgTm90aWZpY2F0aW9uU2hhZGVXaW5kb3dWaWV3Q29udHJvbGxlcigKKyAgICAgICAgICAgICAgICBsb2Nrc2NyZWVuU2hhZGVUcmFuc2l0aW9uQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICBGYWxzaW5nQ29sbGVjdG9yRmFrZSgpLAorICAgICAgICAgICAgICAgIHN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICBkb2NrTWFuYWdlciwKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TaGFkZURlcHRoQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICB1bmRlclRlc3QsCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uUGFuZWxWaWV3Q29udHJvbGxlciwKKyAgICAgICAgICAgICAgICBTaGFkZUV4cGFuc2lvblN0YXRlTWFuYWdlcigpLAorICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvblN0YWNrU2Nyb2xsTGF5b3V0Q29udHJvbGxlciwKKyAgICAgICAgICAgICAgICBzdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyLAorICAgICAgICAgICAgICAgIHN0YXR1c0JhcldpbmRvd1N0YXRlQ29udHJvbGxlciwKKyAgICAgICAgICAgICAgICBsb2NrSWNvblZpZXdDb250cm9sbGVyLAorICAgICAgICAgICAgICAgIGNlbnRyYWxTdXJmYWNlcywKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TaGFkZVdpbmRvd0NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAga2V5Z3VhcmRVbmxvY2tBbmltYXRpb25Db250cm9sbGVyLAorICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkluc2V0c0NvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgYW1iaWVudFN0YXRlLAorICAgICAgICAgICAgICAgIHB1bHNpbmdHZXN0dXJlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAga2V5Z3VhcmRCb3VuY2VyVmlld01vZGVsLAorICAgICAgICAgICAgICAgIGtleWd1YXJkQm91bmNlckNvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICAgICAgYWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IsCisgICAgICAgICAgICAgICAgdWRmcHNPdmVybGF5SW50ZXJhY3RvciwKKyAgICAgICAgICAgICAgICBrZXlndWFyZFRyYW5zaXRpb25JbnRlcmFjdG9yLAorICAgICAgICAgICAgICAgIHByaW1hcnlCb3VuY2VyVG9Hb25lVHJhbnNpdGlvblZpZXdNb2RlbCwKKyAgICAgICAgICAgICAgICBmZWF0dXJlRmxhZ3MsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNdWx0aVNoYWRlSW50ZXJhY3RvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uU2NvcGUgPSB0ZXN0U2NvcGUuYmFja2dyb3VuZFNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlTaGFkZVJlcG9zaXRvcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uQ29udGV4dCA9IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJveHkgPSBpbnB1dFByb3h5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3h5ID0gaW5wdXRQcm94eSwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgRmFrZVN5c3RlbUNsb2NrKCksCisgICAgICAgICAgICApCisKKyAgICAgICAgY29udHJvbGxlci5zZXR1cEV4cGFuZGVkU3RhdHVzQmFyKCkKKyAgICAgICAgY29udHJvbGxlci5zZXREcmFnRG93bkhlbHBlcihkcmFnRG93bkhlbHBlcikKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biB0ZXN0RHJhZ0Rvd25IZWxwZXJDYWxsZWRXaGVuRHJhZ2dpbmdEb3duKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB3aGVuZXZlcihkcmFnRG93bkhlbHBlci5pc0RyYWdnaW5nRG93bikudGhlblJldHVybih0cnVlKQorICAgICAgICAgICAgdmFsIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpCisgICAgICAgICAgICB2YWwgZXYgPSBNb3Rpb25FdmVudC5vYnRhaW4obm93LCBub3csIE1vdGlvbkV2ZW50LkFDVElPTl9VUCwgMGYsIDBmLCAwIC8qIG1ldGEgKi8pCisgICAgICAgICAgICB1bmRlclRlc3Qub25Ub3VjaEV2ZW50KGV2KQorICAgICAgICAgICAgdmVyaWZ5KGRyYWdEb3duSGVscGVyKS5vblRvdWNoRXZlbnQoZXYpCisgICAgICAgICAgICBldi5yZWN5Y2xlKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gdGVzdEludGVyY2VwdFRvdWNoV2hlblNob3dpbmdBbHRBdXRoKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICBjYXB0dXJlSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIoKQorCisgICAgICAgICAgICAvLyBXSEVOIHNob3dpbmcgYWx0IGF1dGgsIG5vdCBkb3ppbmcsIGRyYWcgZG93biBoZWxwZXIgZG9lc24ndCB3YW50IHRvIGludGVyY2VwdAorICAgICAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRG96aW5nKS50aGVuUmV0dXJuKGZhbHNlKQorICAgICAgICAgICAgd2hlbmV2ZXIoYWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IuaXNWaXNpYmxlU3RhdGUoKSkudGhlblJldHVybih0cnVlKQorICAgICAgICAgICAgd2hlbmV2ZXIodWRmcHNPdmVybGF5SW50ZXJhY3Rvci5jYW5JbnRlcmNlcHRUb3VjaEluVWRmcHNCb3VuZHMoYW55KCkpKS50aGVuUmV0dXJuKHRydWUpCisgICAgICAgICAgICB3aGVuZXZlcihkcmFnRG93bkhlbHBlci5vbkludGVyY2VwdFRvdWNoRXZlbnQoYW55KCkpKS50aGVuUmV0dXJuKGZhbHNlKQorCisgICAgICAgICAgICAvLyBUSEVOIHdlIHNob3VsZCBpbnRlcmNlcHQgdG91Y2gKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW50ZXJhY3Rpb25FdmVudEhhbmRsZXIuc2hvdWxkSW50ZXJjZXB0VG91Y2hFdmVudChtb2NrKCkpKS5pc1RydWUoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biB0ZXN0Tm9JbnRlcmNlcHRUb3VjaCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgY2FwdHVyZUludGVyYWN0aW9uRXZlbnRIYW5kbGVyKCkKKworICAgICAgICAgICAgLy8gV0hFTiBub3Qgc2hvd2luZyBhbHQgYXV0aCwgbm90IGRvemluZywgZHJhZyBkb3duIGhlbHBlciBkb2Vzbid0IHdhbnQgdG8gaW50ZXJjZXB0CisgICAgICAgICAgICB3aGVuZXZlcihzdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEb3ppbmcpLnRoZW5SZXR1cm4oZmFsc2UpCisgICAgICAgICAgICB3aGVuZXZlcihhbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5pc1Zpc2libGVTdGF0ZSgpKS50aGVuUmV0dXJuKGZhbHNlKQorICAgICAgICAgICAgd2hlbmV2ZXIoZHJhZ0Rvd25IZWxwZXIub25JbnRlcmNlcHRUb3VjaEV2ZW50KGFueSgpKSkudGhlblJldHVybihmYWxzZSkKKworICAgICAgICAgICAgLy8gVEhFTiB3ZSBzaG91bGRuJ3QgaW50ZXJjZXB0IHRvdWNoCisgICAgICAgICAgICBhc3NlcnRUaGF0KGludGVyYWN0aW9uRXZlbnRIYW5kbGVyLnNob3VsZEludGVyY2VwdFRvdWNoRXZlbnQobW9jaygpKSkuaXNGYWxzZSgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHRlc3RIYW5kbGVUb3VjaEV2ZW50V2hlblNob3dpbmdBbHRBdXRoKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICBjYXB0dXJlSW50ZXJhY3Rpb25FdmVudEhhbmRsZXIoKQorCisgICAgICAgICAgICAvLyBXSEVOIHNob3dpbmcgYWx0IGF1dGgsIG5vdCBkb3ppbmcsIGRyYWcgZG93biBoZWxwZXIgZG9lc24ndCB3YW50IHRvIGludGVyY2VwdAorICAgICAgICAgICAgd2hlbmV2ZXIoc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRG96aW5nKS50aGVuUmV0dXJuKGZhbHNlKQorICAgICAgICAgICAgd2hlbmV2ZXIoYWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IuaXNWaXNpYmxlU3RhdGUoKSkudGhlblJldHVybih0cnVlKQorICAgICAgICAgICAgd2hlbmV2ZXIoZHJhZ0Rvd25IZWxwZXIub25JbnRlcmNlcHRUb3VjaEV2ZW50KGFueSgpKSkudGhlblJldHVybihmYWxzZSkKKworICAgICAgICAgICAgLy8gVEhFTiB3ZSBzaG91bGQgaGFuZGxlIHRoZSB0b3VjaAorICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnRlcmFjdGlvbkV2ZW50SGFuZGxlci5oYW5kbGVUb3VjaEV2ZW50KG1vY2soKSkpLmlzVHJ1ZSgpCisgICAgICAgIH0KKworICAgIHByaXZhdGUgZnVuIGNhcHR1cmVJbnRlcmFjdGlvbkV2ZW50SGFuZGxlcigpIHsKKyAgICAgICAgdmVyaWZ5KHVuZGVyVGVzdCkuc2V0SW50ZXJhY3Rpb25FdmVudEhhbmRsZXIoaW50ZXJhY3Rpb25FdmVudEhhbmRsZXJDYXB0b3IuY2FwdHVyZSgpKQorICAgICAgICBpbnRlcmFjdGlvbkV2ZW50SGFuZGxlciA9IGludGVyYWN0aW9uRXZlbnRIYW5kbGVyQ2FwdG9yLnZhbHVlCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL1F1aWNrU2V0dGluZ3NDb250cm9sbGVyVGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYWRlL1F1aWNrU2V0dGluZ3NDb250cm9sbGVyVGVzdC5qYXZhCmluZGV4IDE1Yjg0MjMuLmQ4ZmZlMzkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFkZS9RdWlja1NldHRpbmdzQ29udHJvbGxlclRlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhZGUvUXVpY2tTZXR0aW5nc0NvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTI3NSw5ICsyNzUsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFuZWxTdGF5c09wZW5XaGVuQ2xvc2luZ1FzKCkgewotICAgICAgICBtU2hhZGVFeHBhbnNpb25TdGF0ZU1hbmFnZXIub25QYW5lbEV4cGFuc2lvbkNoYW5nZWQoLyogZnJhY3Rpb249ICovIDEsCi0gICAgICAgICAgICAgICAgLyogZXhwYW5kZWQ9ICovIHRydWUsIC8qIHRyYWNraW5nPSAqLyBmYWxzZSwgLyogZHJhZ0Rvd25QeEFtb3VudD0gKi8gMCk7Ci0gICAgICAgIG1Rc0NvbnRyb2xsZXIuc2V0U2hhZGVFeHBhbmRlZEhlaWdodCgxKTsKKyAgICAgICAgbVFzQ29udHJvbGxlci5zZXRTaGFkZUV4cGFuc2lvbigvKiBzaGFkZUV4cGFuZGVkSGVpZ2h0PSAqLyAxLCAvKiBleHBhbmRlZEZyYWN0aW9uPSovIDEpOwogCiAgICAgICAgIGZsb2F0IHNoYWRlRXhwYW5kZWRIZWlnaHQgPSBtUXNDb250cm9sbGVyLmdldFNoYWRlRXhwYW5kZWRIZWlnaHQoKTsKICAgICAgICAgbVFzQ29udHJvbGxlci5hbmltYXRlQ2xvc2VRcyhmYWxzZSk7CkBAIC0yODksNyArMjg3LDcgQEAKICAgICBwdWJsaWMgdm9pZCBpbnRlcmNlcHRUb3VjaEV2ZW50X3dpdGhpblFzX3NoYWRlRXhwYW5kZWRfc3RhcnRzUXNUcmFja2luZygpIHsKICAgICAgICAgbVFzQ29udHJvbGxlci5zZXRRcyhtUXMpOwogCi0gICAgICAgIG1Rc0NvbnRyb2xsZXIuc2V0U2hhZGVFeHBhbmRlZEhlaWdodCgxZik7CisgICAgICAgIG1Rc0NvbnRyb2xsZXIuc2V0U2hhZGVFeHBhbnNpb24oLyogc2hhZGVFeHBhbmRlZEhlaWdodD0gKi8gMSwgLyogZXhwYW5kZWRGcmFjdGlvbj0qLyAxKTsKICAgICAgICAgbVFzQ29udHJvbGxlci5vbkludGVyY2VwdCgKICAgICAgICAgICAgICAgICBjcmVhdGVNb3Rpb25FdmVudCgwLCAwLCBBQ1RJT05fRE9XTikpOwogICAgICAgICBtUXNDb250cm9sbGVyLm9uSW50ZXJjZXB0KApAQCAtMzAzLDcgKzMwMSw3IEBACiAgICAgICAgIGVuYWJsZVNwbGl0U2hhZGUodHJ1ZSk7CiAgICAgICAgIG1Rc0NvbnRyb2xsZXIuc2V0UXMobVFzKTsKIAotICAgICAgICBtUXNDb250cm9sbGVyLnNldFNoYWRlRXhwYW5kZWRIZWlnaHQoMWYpOworICAgICAgICBtUXNDb250cm9sbGVyLnNldFNoYWRlRXhwYW5zaW9uKC8qIHNoYWRlRXhwYW5kZWRIZWlnaHQ9ICovIDEsIC8qIGV4cGFuZGVkRnJhY3Rpb249Ki8gMSk7CiAgICAgICAgIG1Rc0NvbnRyb2xsZXIub25JbnRlcmNlcHQoCiAgICAgICAgICAgICAgICAgY3JlYXRlTW90aW9uRXZlbnQoMCwgMCwgQUNUSU9OX0RPV04pKTsKICAgICAgICAgbVFzQ29udHJvbGxlci5vbkludGVyY2VwdCgKQEAgLTM0MiwxMyArMzQwLDggQEAKICAgICBwdWJsaWMgdm9pZCBoYW5kbGVUb3VjaF9kb3duQWN0aW9uSW5Rc0FyZWEoKSB7CiAgICAgICAgIG1Rc0NvbnRyb2xsZXIuc2V0UXMobVFzKTsKICAgICAgICAgbVFzQ29udHJvbGxlci5zZXRCYXJTdGF0ZShTSEFERSk7Ci0gICAgICAgIG1Rc0NvbnRyb2xsZXIub25QYW5lbEV4cGFuc2lvbkNoYW5nZWQoCi0gICAgICAgICAgICAgICAgbmV3IFNoYWRlRXhwYW5zaW9uQ2hhbmdlRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAwLjVmLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgICAgKSk7CisgICAgICAgIG1Rc0NvbnRyb2xsZXIuc2V0U2hhZGVFeHBhbnNpb24oLyogc2hhZGVFeHBhbmRlZEhlaWdodD0gKi8gMSwgLyogZXhwYW5kZWRGcmFjdGlvbj0qLyAwLjVmKTsKKwogICAgICAgICBNb3Rpb25FdmVudCBldmVudCA9CiAgICAgICAgICAgICAgICAgY3JlYXRlTW90aW9uRXZlbnQoUVNfRlJBTUVfV0lEVEggLyAyLCBRU19GUkFNRV9CT1RUT00gLyAyLCBBQ1RJT05fRE9XTik7CiAgICAgICAgIG1Rc0NvbnRyb2xsZXIuaGFuZGxlVG91Y2goZXZlbnQsIGZhbHNlLCBmYWxzZSk7CkBAIC0zODUsNyArMzc4LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGhhbmRsZVRvdWNoX2lzQ29uZmxpY3RpbmdFeHBhbnNpb25HZXN0dXJlU2V0KCkgewogICAgICAgICBhc3NlcnRUaGF0KG1Rc0NvbnRyb2xsZXIuaXNDb25mbGljdGluZ0V4cGFuc2lvbkdlc3R1cmUoKSkuaXNGYWxzZSgpOwotICAgICAgICBtU2hhZGVFeHBhbnNpb25TdGF0ZU1hbmFnZXIub25QYW5lbEV4cGFuc2lvbkNoYW5nZWQoMWYsIHRydWUsIGZhbHNlLCAwZik7CisgICAgICAgIG1Rc0NvbnRyb2xsZXIuc2V0U2hhZGVFeHBhbnNpb24oLyogc2hhZGVFeHBhbmRlZEhlaWdodD0gKi8gMSwgLyogZXhwYW5kZWRGcmFjdGlvbj0qLyAxKTsKICAgICAgICAgbVFzQ29udHJvbGxlci5oYW5kbGVUb3VjaChNb3Rpb25FdmVudC5vYnRhaW4oMEwgLyogZG93blRpbWUgKi8sCiAgICAgICAgICAgICAgICAgMEwgLyogZXZlbnRUaW1lICovLCBBQ1RJT05fRE9XTiwgMGYgLyogeCAqLywgMGYgLyogeSAqLywKICAgICAgICAgICAgICAgICAwIC8qIG1ldGFTdGF0ZSAqLyksIGZhbHNlLCBmYWxzZSk7CkBAIC0zOTQsNyArMzg3LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgaGFuZGxlVG91Y2hfaXNDb25mbGljdGluZ0V4cGFuc2lvbkdlc3R1cmVTZXRfY2FuY2VsKCkgewotICAgICAgICBtU2hhZGVFeHBhbnNpb25TdGF0ZU1hbmFnZXIub25QYW5lbEV4cGFuc2lvbkNoYW5nZWQoMWYsIHRydWUsIGZhbHNlLCAwZik7CisgICAgICAgIG1Rc0NvbnRyb2xsZXIuc2V0U2hhZGVFeHBhbnNpb24oLyogc2hhZGVFeHBhbmRlZEhlaWdodD0gKi8gMSwgLyogZXhwYW5kZWRGcmFjdGlvbj0qLyAxKTsKICAgICAgICAgbVFzQ29udHJvbGxlci5oYW5kbGVUb3VjaChjcmVhdGVNb3Rpb25FdmVudCgwLCAwLCBBQ1RJT05fRE9XTiksIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFRoYXQobVFzQ29udHJvbGxlci5pc0NvbmZsaWN0aW5nRXhwYW5zaW9uR2VzdHVyZSgpKS5pc1RydWUoKTsKICAgICAgICAgbVFzQ29udHJvbGxlci5oYW5kbGVUb3VjaChjcmVhdGVNb3Rpb25FdmVudCgwLCAwLCBBQ1RJT05fVVApLCB0cnVlLCB0cnVlKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFyZWQvY2xvY2tzL0Nsb2NrUmVnaXN0cnlUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9jbG9ja3MvQ2xvY2tSZWdpc3RyeVRlc3Qua3QKaW5kZXggMWZkYjM2NC4uMzc0YWFlMSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9jbG9ja3MvQ2xvY2tSZWdpc3RyeVRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9jbG9ja3MvQ2xvY2tSZWdpc3RyeVRlc3Qua3QKQEAgLTI3LDEzICsyNywxNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuQ2xvY2tQcm92aWRlclBsdWdpbgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuQ2xvY2tTZXR0aW5ncwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuUGx1Z2luTGlzdGVuZXIKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLlBsdWdpbkxpZmVjeWNsZU1hbmFnZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLlBsdWdpbk1hbmFnZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8uYXJndW1lbnRDYXB0b3IKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8uZXEKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8ubW9jawogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RXF1YWxzCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydC5mYWlsCiBpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkNvcm91dGluZURpc3BhdGNoZXIKIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5TdGFuZGFyZFRlc3REaXNwYXRjaGVyCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QuVGVzdENvcm91dGluZVNjaGVkdWxlcgogaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy50ZXN0LlRlc3RTY29wZQogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmUKIGltcG9ydCBvcmcuanVuaXQuUnVsZQpAQCAtNDksNiArNTIsNyBAQAogY2xhc3MgQ2xvY2tSZWdpc3RyeVRlc3QgOiBTeXN1aVRlc3RDYXNlKCkgewogCiAgICAgQEp2bUZpZWxkIEBSdWxlIHZhbCBtb2NraXRvID0gTW9ja2l0b0pVbml0LnJ1bGUoKQorICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHNjaGVkdWxlcjogVGVzdENvcm91dGluZVNjaGVkdWxlcgogICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGRpc3BhdGNoZXI6IENvcm91dGluZURpc3BhdGNoZXIKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciBzY29wZTogVGVzdFNjb3BlCiAKQEAgLTU4LDM3ICs2MiwzOCBAQAogICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIG1vY2tEZWZhdWx0Q2xvY2s6IENsb2NrQ29udHJvbGxlcgogICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIG1vY2tUaHVtYm5haWw6IERyYXdhYmxlCiAgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbW9ja0NvbnRlbnRSZXNvbHZlcjogQ29udGVudFJlc29sdmVyCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbW9ja1BsdWdpbkxpZmVjeWNsZTogUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcjxDbG9ja1Byb3ZpZGVyUGx1Z2luPgogICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGZha2VEZWZhdWx0UHJvdmlkZXI6IEZha2VDbG9ja1BsdWdpbgogICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHBsdWdpbkxpc3RlbmVyOiBQbHVnaW5MaXN0ZW5lcjxDbG9ja1Byb3ZpZGVyUGx1Z2luPgogICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHJlZ2lzdHJ5OiBDbG9ja1JlZ2lzdHJ5CiAKICAgICBjb21wYW5pb24gb2JqZWN0IHsKLSAgICAgICAgcHJpdmF0ZSBmdW4gZmFpbEZhY3RvcnkoKTogQ2xvY2tDb250cm9sbGVyIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgY2FsbCB0byBjcmVhdGVDbG9jayIpCisgICAgICAgIHByaXZhdGUgZnVuIGZhaWxGYWN0b3J5KGNsb2NrSWQ6IENsb2NrSWQpOiBDbG9ja0NvbnRyb2xsZXIgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBjYWxsIHRvIGNyZWF0ZUNsb2NrOiAkY2xvY2tJZCIpCiAgICAgICAgICAgICByZXR1cm4gbnVsbCEhCiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIGZ1biBmYWlsVGh1bWJuYWlsKCk6IERyYXdhYmxlPyB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGNhbGwgdG8gZ2V0VGh1bWJuYWlsIikKKyAgICAgICAgcHJpdmF0ZSBmdW4gZmFpbFRodW1ibmFpbChjbG9ja0lkOiBDbG9ja0lkKTogRHJhd2FibGU/IHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgY2FsbCB0byBnZXRUaHVtYm5haWw6ICRjbG9ja0lkIikKICAgICAgICAgICAgIHJldHVybiBudWxsCiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIEZha2VDbG9ja1BsdWdpbiA6IENsb2NrUHJvdmlkZXJQbHVnaW4gewogICAgICAgICBwcml2YXRlIHZhbCBtZXRhZGF0YSA9IG11dGFibGVMaXN0T2Y8Q2xvY2tNZXRhZGF0YT4oKQotICAgICAgICBwcml2YXRlIHZhbCBjcmVhdGVDYWxsYmFja3MgPSBtdXRhYmxlTWFwT2Y8Q2xvY2tJZCwgKCkgLT4gQ2xvY2tDb250cm9sbGVyPigpCi0gICAgICAgIHByaXZhdGUgdmFsIHRodW1ibmFpbENhbGxiYWNrcyA9IG11dGFibGVNYXBPZjxDbG9ja0lkLCAoKSAtPiBEcmF3YWJsZT8+KCkKKyAgICAgICAgcHJpdmF0ZSB2YWwgY3JlYXRlQ2FsbGJhY2tzID0gbXV0YWJsZU1hcE9mPENsb2NrSWQsIChDbG9ja0lkKSAtPiBDbG9ja0NvbnRyb2xsZXI+KCkKKyAgICAgICAgcHJpdmF0ZSB2YWwgdGh1bWJuYWlsQ2FsbGJhY2tzID0gbXV0YWJsZU1hcE9mPENsb2NrSWQsIChDbG9ja0lkKSAtPiBEcmF3YWJsZT8+KCkKIAogICAgICAgICBvdmVycmlkZSBmdW4gZ2V0Q2xvY2tzKCkgPSBtZXRhZGF0YQogICAgICAgICBvdmVycmlkZSBmdW4gY3JlYXRlQ2xvY2soc2V0dGluZ3M6IENsb2NrU2V0dGluZ3MpOiBDbG9ja0NvbnRyb2xsZXIgPQotICAgICAgICAgICAgY3JlYXRlQ2FsbGJhY2tzW3NldHRpbmdzLmNsb2NrSWQhIV0hISgpCi0gICAgICAgIG92ZXJyaWRlIGZ1biBnZXRDbG9ja1RodW1ibmFpbChpZDogQ2xvY2tJZCk6IERyYXdhYmxlPyA9IHRodW1ibmFpbENhbGxiYWNrc1tpZF0hISgpCisgICAgICAgICAgICBjcmVhdGVDYWxsYmFja3Nbc2V0dGluZ3MuY2xvY2tJZCEhXSEhKHNldHRpbmdzLmNsb2NrSWQhISkKKyAgICAgICAgb3ZlcnJpZGUgZnVuIGdldENsb2NrVGh1bWJuYWlsKGlkOiBDbG9ja0lkKTogRHJhd2FibGU/ID0gdGh1bWJuYWlsQ2FsbGJhY2tzW2lkXSEhKGlkKQogCiAgICAgICAgIGZ1biBhZGRDbG9jaygKICAgICAgICAgICAgIGlkOiBDbG9ja0lkLAogICAgICAgICAgICAgbmFtZTogU3RyaW5nLAotICAgICAgICAgICAgY3JlYXRlOiAoKSAtPiBDbG9ja0NvbnRyb2xsZXIgPSA6OmZhaWxGYWN0b3J5LAotICAgICAgICAgICAgZ2V0VGh1bWJuYWlsOiAoKSAtPiBEcmF3YWJsZT8gPSA6OmZhaWxUaHVtYm5haWwKKyAgICAgICAgICAgIGNyZWF0ZTogKENsb2NrSWQpIC0+IENsb2NrQ29udHJvbGxlciA9IDo6ZmFpbEZhY3RvcnksCisgICAgICAgICAgICBnZXRUaHVtYm5haWw6IChDbG9ja0lkKSAtPiBEcmF3YWJsZT8gPSA6OmZhaWxUaHVtYm5haWwKICAgICAgICAgKTogRmFrZUNsb2NrUGx1Z2luIHsKICAgICAgICAgICAgIG1ldGFkYXRhLmFkZChDbG9ja01ldGFkYXRhKGlkLCBuYW1lKSkKICAgICAgICAgICAgIGNyZWF0ZUNhbGxiYWNrc1tpZF0gPSBjcmVhdGUKQEAgLTk5LDcgKzEwNCw4IEBACiAKICAgICBAQmVmb3JlCiAgICAgZnVuIHNldFVwKCkgewotICAgICAgICBkaXNwYXRjaGVyID0gU3RhbmRhcmRUZXN0RGlzcGF0Y2hlcigpCisgICAgICAgIHNjaGVkdWxlciA9IFRlc3RDb3JvdXRpbmVTY2hlZHVsZXIoKQorICAgICAgICBkaXNwYXRjaGVyID0gU3RhbmRhcmRUZXN0RGlzcGF0Y2hlcihzY2hlZHVsZXIpCiAgICAgICAgIHNjb3BlID0gVGVzdFNjb3BlKGRpc3BhdGNoZXIpCiAKICAgICAgICAgZmFrZURlZmF1bHRQcm92aWRlciA9IEZha2VDbG9ja1BsdWdpbigpCkBAIC0xMTYsNiArMTIyLDggQEAKICAgICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWUsCiAgICAgICAgICAgICBoYW5kbGVBbGxVc2VycyA9IHRydWUsCiAgICAgICAgICAgICBkZWZhdWx0Q2xvY2tQcm92aWRlciA9IGZha2VEZWZhdWx0UHJvdmlkZXIsCisgICAgICAgICAgICBrZWVwQWxsTG9hZGVkID0gdHJ1ZSwKKyAgICAgICAgICAgIHN1YlRhZyA9ICJUZXN0IiwKICAgICAgICAgKSB7CiAgICAgICAgICAgICBvdmVycmlkZSBmdW4gcXVlcnlTZXR0aW5ncygpIHsgfQogICAgICAgICAgICAgb3ZlcnJpZGUgZnVuIGFwcGx5U2V0dGluZ3ModmFsdWU6IENsb2NrU2V0dGluZ3M/KSB7CkBAIC0xNDIsOCArMTUwLDggQEAKICAgICAgICAgICAgIC5hZGRDbG9jaygiY2xvY2tfMyIsICJjbG9jayAzIikKICAgICAgICAgICAgIC5hZGRDbG9jaygiY2xvY2tfNCIsICJjbG9jayA0IikKIAotICAgICAgICBwbHVnaW5MaXN0ZW5lci5vblBsdWdpbkNvbm5lY3RlZChwbHVnaW4xLCBtb2NrQ29udGV4dCkKLSAgICAgICAgcGx1Z2luTGlzdGVuZXIub25QbHVnaW5Db25uZWN0ZWQocGx1Z2luMiwgbW9ja0NvbnRleHQpCisgICAgICAgIHBsdWdpbkxpc3RlbmVyLm9uUGx1Z2luTG9hZGVkKHBsdWdpbjEsIG1vY2tDb250ZXh0LCBtb2NrUGx1Z2luTGlmZWN5Y2xlKQorICAgICAgICBwbHVnaW5MaXN0ZW5lci5vblBsdWdpbkxvYWRlZChwbHVnaW4yLCBtb2NrQ29udGV4dCwgbW9ja1BsdWdpbkxpZmVjeWNsZSkKICAgICAgICAgdmFsIGxpc3QgPSByZWdpc3RyeS5nZXRDbG9ja3MoKQogICAgICAgICBhc3NlcnRFcXVhbHMoCiAgICAgICAgICAgICBsaXN0LApAQCAtMTY1LDE2ICsxNzMsMTggQEAKIAogICAgIEBUZXN0CiAgICAgZnVuIGNsb2NrSWRDb25mbGljdF9FcnJvcldpdGhvdXRDcmFzaCgpIHsKKyAgICAgICAgdmFsIG1vY2tQbHVnaW5MaWZlY3ljbGUxID0gbW9jazxQbHVnaW5MaWZlY3ljbGVNYW5hZ2VyPENsb2NrUHJvdmlkZXJQbHVnaW4+PigpCiAgICAgICAgIHZhbCBwbHVnaW4xID0gRmFrZUNsb2NrUGx1Z2luKCkKICAgICAgICAgICAgIC5hZGRDbG9jaygiY2xvY2tfMSIsICJjbG9jayAxIiwgeyBtb2NrQ2xvY2sgfSwgeyBtb2NrVGh1bWJuYWlsIH0pCiAgICAgICAgICAgICAuYWRkQ2xvY2soImNsb2NrXzIiLCAiY2xvY2sgMiIsIHsgbW9ja0Nsb2NrIH0sIHsgbW9ja1RodW1ibmFpbCB9KQogCisgICAgICAgIHZhbCBtb2NrUGx1Z2luTGlmZWN5Y2xlMiA9IG1vY2s8UGx1Z2luTGlmZWN5Y2xlTWFuYWdlcjxDbG9ja1Byb3ZpZGVyUGx1Z2luPj4oKQogICAgICAgICB2YWwgcGx1Z2luMiA9IEZha2VDbG9ja1BsdWdpbigpCiAgICAgICAgICAgICAuYWRkQ2xvY2soImNsb2NrXzEiLCAiY2xvY2sgMSIpCiAgICAgICAgICAgICAuYWRkQ2xvY2soImNsb2NrXzIiLCAiY2xvY2sgMiIpCiAKLSAgICAgICAgcGx1Z2luTGlzdGVuZXIub25QbHVnaW5Db25uZWN0ZWQocGx1Z2luMSwgbW9ja0NvbnRleHQpCi0gICAgICAgIHBsdWdpbkxpc3RlbmVyLm9uUGx1Z2luQ29ubmVjdGVkKHBsdWdpbjIsIG1vY2tDb250ZXh0KQorICAgICAgICBwbHVnaW5MaXN0ZW5lci5vblBsdWdpbkxvYWRlZChwbHVnaW4xLCBtb2NrQ29udGV4dCwgbW9ja1BsdWdpbkxpZmVjeWNsZTEpCisgICAgICAgIHBsdWdpbkxpc3RlbmVyLm9uUGx1Z2luTG9hZGVkKHBsdWdpbjIsIG1vY2tDb250ZXh0LCBtb2NrUGx1Z2luTGlmZWN5Y2xlMikKICAgICAgICAgdmFsIGxpc3QgPSByZWdpc3RyeS5nZXRDbG9ja3MoKQogICAgICAgICBhc3NlcnRFcXVhbHMoCiAgICAgICAgICAgICBsaXN0LApAQCAtMjAyLDggKzIxMiw4IEBACiAgICAgICAgICAgICAuYWRkQ2xvY2soImNsb2NrXzQiLCAiY2xvY2sgNCIpCiAKICAgICAgICAgcmVnaXN0cnkuYXBwbHlTZXR0aW5ncyhDbG9ja1NldHRpbmdzKCJjbG9ja18zIiwgbnVsbCkpCi0gICAgICAgIHBsdWdpbkxpc3RlbmVyLm9uUGx1Z2luQ29ubmVjdGVkKHBsdWdpbjEsIG1vY2tDb250ZXh0KQotICAgICAgICBwbHVnaW5MaXN0ZW5lci5vblBsdWdpbkNvbm5lY3RlZChwbHVnaW4yLCBtb2NrQ29udGV4dCkKKyAgICAgICAgcGx1Z2luTGlzdGVuZXIub25QbHVnaW5Mb2FkZWQocGx1Z2luMSwgbW9ja0NvbnRleHQsIG1vY2tQbHVnaW5MaWZlY3ljbGUpCisgICAgICAgIHBsdWdpbkxpc3RlbmVyLm9uUGx1Z2luTG9hZGVkKHBsdWdpbjIsIG1vY2tDb250ZXh0LCBtb2NrUGx1Z2luTGlmZWN5Y2xlKQogCiAgICAgICAgIHZhbCBjbG9jayA9IHJlZ2lzdHJ5LmNyZWF0ZUN1cnJlbnRDbG9jaygpCiAgICAgICAgIGFzc2VydEVxdWFscyhtb2NrQ2xvY2ssIGNsb2NrKQpAQCAtMjIwLDkgKzIzMCw5IEBACiAgICAgICAgICAgICAuYWRkQ2xvY2soImNsb2NrXzQiLCAiY2xvY2sgNCIpCiAKICAgICAgICAgcmVnaXN0cnkuYXBwbHlTZXR0aW5ncyhDbG9ja1NldHRpbmdzKCJjbG9ja18zIiwgbnVsbCkpCi0gICAgICAgIHBsdWdpbkxpc3RlbmVyLm9uUGx1Z2luQ29ubmVjdGVkKHBsdWdpbjEsIG1vY2tDb250ZXh0KQotICAgICAgICBwbHVnaW5MaXN0ZW5lci5vblBsdWdpbkNvbm5lY3RlZChwbHVnaW4yLCBtb2NrQ29udGV4dCkKLSAgICAgICAgcGx1Z2luTGlzdGVuZXIub25QbHVnaW5EaXNjb25uZWN0ZWQocGx1Z2luMikKKyAgICAgICAgcGx1Z2luTGlzdGVuZXIub25QbHVnaW5Mb2FkZWQocGx1Z2luMSwgbW9ja0NvbnRleHQsIG1vY2tQbHVnaW5MaWZlY3ljbGUpCisgICAgICAgIHBsdWdpbkxpc3RlbmVyLm9uUGx1Z2luTG9hZGVkKHBsdWdpbjIsIG1vY2tDb250ZXh0LCBtb2NrUGx1Z2luTGlmZWN5Y2xlKQorICAgICAgICBwbHVnaW5MaXN0ZW5lci5vblBsdWdpblVubG9hZGVkKHBsdWdpbjIsIG1vY2tQbHVnaW5MaWZlY3ljbGUpCiAKICAgICAgICAgdmFsIGNsb2NrID0gcmVnaXN0cnkuY3JlYXRlQ3VycmVudENsb2NrKCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKGNsb2NrLCBtb2NrRGVmYXVsdENsb2NrKQpAQCAtMjMwLDE1ICsyNDAsMTYgQEAKIAogICAgIEBUZXN0CiAgICAgZnVuIHBsdWdpblJlbW92ZWRfY2xvY2tBbmRMaXN0Q2hhbmdlZCgpIHsKKyAgICAgICAgdmFsIG1vY2tQbHVnaW5MaWZlY3ljbGUxID0gbW9jazxQbHVnaW5MaWZlY3ljbGVNYW5hZ2VyPENsb2NrUHJvdmlkZXJQbHVnaW4+PigpCiAgICAgICAgIHZhbCBwbHVnaW4xID0gRmFrZUNsb2NrUGx1Z2luKCkKICAgICAgICAgICAgIC5hZGRDbG9jaygiY2xvY2tfMSIsICJjbG9jayAxIikKICAgICAgICAgICAgIC5hZGRDbG9jaygiY2xvY2tfMiIsICJjbG9jayAyIikKIAorICAgICAgICB2YWwgbW9ja1BsdWdpbkxpZmVjeWNsZTIgPSBtb2NrPFBsdWdpbkxpZmVjeWNsZU1hbmFnZXI8Q2xvY2tQcm92aWRlclBsdWdpbj4+KCkKICAgICAgICAgdmFsIHBsdWdpbjIgPSBGYWtlQ2xvY2tQbHVnaW4oKQogICAgICAgICAgICAgLmFkZENsb2NrKCJjbG9ja18zIiwgImNsb2NrIDMiLCB7IG1vY2tDbG9jayB9KQogICAgICAgICAgICAgLmFkZENsb2NrKCJjbG9ja180IiwgImNsb2NrIDQiKQogCi0KICAgICAgICAgdmFyIGNoYW5nZUNhbGxDb3VudCA9IDAKICAgICAgICAgdmFyIGxpc3RDaGFuZ2VDYWxsQ291bnQgPSAwCiAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQ2xvY2tDaGFuZ2VMaXN0ZW5lcihvYmplY3QgOiBDbG9ja1JlZ2lzdHJ5LkNsb2NrQ2hhbmdlTGlzdGVuZXIgewpAQCAtMjQ3LDIzICsyNTgsMzggQEAKICAgICAgICAgfSkKIAogICAgICAgICByZWdpc3RyeS5hcHBseVNldHRpbmdzKENsb2NrU2V0dGluZ3MoImNsb2NrXzMiLCBudWxsKSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNoYW5nZUNhbGxDb3VudCkKKyAgICAgICAgc2NoZWR1bGVyLnJ1bkN1cnJlbnQoKQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2hhbmdlQ2FsbENvdW50KQogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdENoYW5nZUNhbGxDb3VudCkKIAotICAgICAgICBwbHVnaW5MaXN0ZW5lci5vblBsdWdpbkNvbm5lY3RlZChwbHVnaW4xLCBtb2NrQ29udGV4dCkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNoYW5nZUNhbGxDb3VudCkKKyAgICAgICAgcGx1Z2luTGlzdGVuZXIub25QbHVnaW5Mb2FkZWQocGx1Z2luMSwgbW9ja0NvbnRleHQsIG1vY2tQbHVnaW5MaWZlY3ljbGUxKQorICAgICAgICBzY2hlZHVsZXIucnVuQ3VycmVudCgpCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjaGFuZ2VDYWxsQ291bnQpCiAgICAgICAgIGFzc2VydEVxdWFscygxLCBsaXN0Q2hhbmdlQ2FsbENvdW50KQogCi0gICAgICAgIHBsdWdpbkxpc3RlbmVyLm9uUGx1Z2luQ29ubmVjdGVkKHBsdWdpbjIsIG1vY2tDb250ZXh0KQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2hhbmdlQ2FsbENvdW50KQorICAgICAgICBwbHVnaW5MaXN0ZW5lci5vblBsdWdpbkxvYWRlZChwbHVnaW4yLCBtb2NrQ29udGV4dCwgbW9ja1BsdWdpbkxpZmVjeWNsZTIpCisgICAgICAgIHNjaGVkdWxlci5ydW5DdXJyZW50KCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNoYW5nZUNhbGxDb3VudCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3RDaGFuZ2VDYWxsQ291bnQpCiAKLSAgICAgICAgcGx1Z2luTGlzdGVuZXIub25QbHVnaW5EaXNjb25uZWN0ZWQocGx1Z2luMSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNoYW5nZUNhbGxDb3VudCkKKyAgICAgICAgcGx1Z2luTGlzdGVuZXIub25QbHVnaW5VbmxvYWRlZChwbHVnaW4xLCBtb2NrUGx1Z2luTGlmZWN5Y2xlMSkKKyAgICAgICAgc2NoZWR1bGVyLnJ1bkN1cnJlbnQoKQorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY2hhbmdlQ2FsbENvdW50KQorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbGlzdENoYW5nZUNhbGxDb3VudCkKKworICAgICAgICBwbHVnaW5MaXN0ZW5lci5vblBsdWdpblVubG9hZGVkKHBsdWdpbjIsIG1vY2tQbHVnaW5MaWZlY3ljbGUyKQorICAgICAgICBzY2hlZHVsZXIucnVuQ3VycmVudCgpCisgICAgICAgIGFzc2VydEVxdWFscygzLCBjaGFuZ2VDYWxsQ291bnQpCisgICAgICAgIGFzc2VydEVxdWFscygyLCBsaXN0Q2hhbmdlQ2FsbENvdW50KQorCisgICAgICAgIHBsdWdpbkxpc3RlbmVyLm9uUGx1Z2luRGV0YWNoZWQobW9ja1BsdWdpbkxpZmVjeWNsZTEpCisgICAgICAgIHNjaGVkdWxlci5ydW5DdXJyZW50KCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNoYW5nZUNhbGxDb3VudCkKICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3RDaGFuZ2VDYWxsQ291bnQpCiAKLSAgICAgICAgcGx1Z2luTGlzdGVuZXIub25QbHVnaW5EaXNjb25uZWN0ZWQocGx1Z2luMikKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNoYW5nZUNhbGxDb3VudCkKKyAgICAgICAgcGx1Z2luTGlzdGVuZXIub25QbHVnaW5EZXRhY2hlZChtb2NrUGx1Z2luTGlmZWN5Y2xlMikKKyAgICAgICAgc2NoZWR1bGVyLnJ1bkN1cnJlbnQoKQorICAgICAgICBhc3NlcnRFcXVhbHMoMywgY2hhbmdlQ2FsbENvdW50KQogICAgICAgICBhc3NlcnRFcXVhbHMoNCwgbGlzdENoYW5nZUNhbGxDb3VudCkKICAgICB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFyZWQvcGx1Z2lucy9QbHVnaW5BY3Rpb25NYW5hZ2VyVGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9wbHVnaW5zL1BsdWdpbkFjdGlvbk1hbmFnZXJUZXN0LmphdmEKaW5kZXggMDUyODBmYS4uYzM5YjI5ZiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9wbHVnaW5zL1BsdWdpbkFjdGlvbk1hbmFnZXJUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9wbHVnaW5zL1BsdWdpbkFjdGlvbk1hbmFnZXJUZXN0LmphdmEKQEAgLTc5LDExICs3OSwxMSBAQAogICAgIHByaXZhdGUgUGx1Z2luSW5zdGFuY2U8VGVzdFBsdWdpbj4gbVBsdWdpbkluc3RhbmNlOwogICAgIHByaXZhdGUgUGx1Z2luSW5zdGFuY2UuRmFjdG9yeSBtUGx1Z2luSW5zdGFuY2VGYWN0b3J5ID0gbmV3IFBsdWdpbkluc3RhbmNlLkZhY3RvcnkoCiAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgIG5ldyBQbHVnaW5JbnN0YW5jZS5JbnN0YW5jZUZhY3Rvcnk8PigpLCBuZXcgUGx1Z2luSW5zdGFuY2UuVmVyc2lvbkNoZWNrZXIoKSwKKyAgICAgICAgICAgIG5ldyBQbHVnaW5JbnN0YW5jZS5JbnN0YW5jZUZhY3Rvcnk8PigpLCBuZXcgUGx1Z2luSW5zdGFuY2UuVmVyc2lvbkNoZWNrZXJJbXBsKCksCiAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgZmFsc2UpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyA8VCBleHRlbmRzIFBsdWdpbj4gUGx1Z2luSW5zdGFuY2U8VD4gY3JlYXRlKENvbnRleHQgY29udGV4dCwgQXBwbGljYXRpb25JbmZvIGFwcEluZm8sCi0gICAgICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lLCBDbGFzczxUPiBwbHVnaW5DbGFzcykgeworICAgICAgICAgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSwgQ2xhc3M8VD4gcGx1Z2luQ2xhc3MsIFBsdWdpbkxpc3RlbmVyPFQ+IGxpc3RlbmVyKSB7CiAgICAgICAgICAgICByZXR1cm4gKFBsdWdpbkluc3RhbmNlPFQ+KSBtUGx1Z2luSW5zdGFuY2U7CiAgICAgICAgIH0KICAgICB9OwpAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgICAgIGNyZWF0ZVBsdWdpbigpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzdGFydHVwIGxpZmVjeWNsZQotICAgICAgICB2ZXJpZnkobVBsdWdpbkluc3RhbmNlKS5vbkNyZWF0ZShtQ29udGV4dCwgbU1vY2tMaXN0ZW5lcik7CisgICAgICAgIHZlcmlmeShtUGx1Z2luSW5zdGFuY2UpLm9uQ3JlYXRlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgICAgICBtRmFrZUV4ZWN1dG9yLnJ1bkFsbFJlYWR5KCk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNodXRkb3duIGxpZmVjeWNsZQotICAgICAgICB2ZXJpZnkobVBsdWdpbkluc3RhbmNlKS5vbkRlc3Ryb3kobU1vY2tMaXN0ZW5lcik7CisgICAgICAgIHZlcmlmeShtUGx1Z2luSW5zdGFuY2UpLm9uRGVzdHJveSgpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNTIsOSArMTUyLDkgQEAKICAgICAgICAgbUZha2VFeGVjdXRvci5ydW5BbGxSZWFkeSgpOwogCiAgICAgICAgIC8vIFZlcmlmeSB0aGUgb2xkIG9uZSB3YXMgZGVzdHJveWVkLgotICAgICAgICB2ZXJpZnkobVBsdWdpbkluc3RhbmNlKS5vbkRlc3Ryb3kobU1vY2tMaXN0ZW5lcik7CisgICAgICAgIHZlcmlmeShtUGx1Z2luSW5zdGFuY2UpLm9uRGVzdHJveSgpOwogICAgICAgICB2ZXJpZnkobVBsdWdpbkluc3RhbmNlLCBNb2NraXRvLnRpbWVzKDIpKQotICAgICAgICAgICAgICAgIC5vbkNyZWF0ZShtQ29udGV4dCwgbU1vY2tMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgLm9uQ3JlYXRlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgICAgICBtRmFrZUV4ZWN1dG9yLnJ1bkFsbFJlYWR5KCk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHN0YXJ0dXAgbGlmZWN5Y2xlCi0gICAgICAgIHZlcmlmeShtUGx1Z2luSW5zdGFuY2UpLm9uQ3JlYXRlKG1Db250ZXh0LCBtTW9ja0xpc3RlbmVyKTsKKyAgICAgICAgdmVyaWZ5KG1QbHVnaW5JbnN0YW5jZSkub25DcmVhdGUoKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9wbHVnaW5zL1BsdWdpbkluc3RhbmNlVGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9wbHVnaW5zL1BsdWdpbkluc3RhbmNlVGVzdC5qYXZhCmluZGV4IGJiOWExZTkuLmQ1ZTkwNGMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFyZWQvcGx1Z2lucy9QbHVnaW5JbnN0YW5jZVRlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhcmVkL3BsdWdpbnMvUGx1Z2luSW5zdGFuY2VUZXN0LmphdmEKQEAgLTE2LDExICsxNiw5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc2hhcmVkLnBsdWdpbnM7CiAKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0TnVsbDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtMzEsNiArMjksNyBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLlBsdWdpbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLlBsdWdpbkxpZmVjeWNsZU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucGx1Z2lucy5QbHVnaW5MaXN0ZW5lcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLmFubm90YXRpb25zLlByb3ZpZGVzSW50ZXJmYWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXM7CkBAIC0zOCw0NiArMzcsNjQgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcubW9ja2l0by5Nb2NrOwotaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKIAoraW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUGx1Z2luSW5zdGFuY2VUZXN0IGV4dGVuZHMgU3lzdWlUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJVklMRUdFRF9QQUNLQUdFID0gImNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMiOwotCi0gICAgQE1vY2sKLSAgICBwcml2YXRlIFRlc3RQbHVnaW5JbXBsIG1Nb2NrUGx1Z2luOwotICAgIEBNb2NrCi0gICAgcHJpdmF0ZSBQbHVnaW5MaXN0ZW5lcjxUZXN0UGx1Z2luPiBtTW9ja0xpc3RlbmVyOwotICAgIEBNb2NrCi0gICAgcHJpdmF0ZSBWZXJzaW9uSW5mbyBtVmVyc2lvbkluZm87Ci0gICAgQ29tcG9uZW50TmFtZSBtVGVzdFBsdWdpbkNvbXBvbmVudE5hbWUgPQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgVEVTVF9QTFVHSU5fQ09NUE9ORU5UX05BTUUgPQogICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoUFJJVklMRUdFRF9QQUNLQUdFLCBUZXN0UGx1Z2luSW1wbC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBGYWtlTGlzdGVuZXIgbVBsdWdpbkxpc3RlbmVyOworICAgIHByaXZhdGUgVmVyc2lvbkluZm8gbVZlcnNpb25JbmZvOworICAgIHByaXZhdGUgVmVyc2lvbkluZm8uSW52YWxpZFZlcnNpb25FeGNlcHRpb24gbVZlcnNpb25FeGNlcHRpb247CisgICAgcHJpdmF0ZSBQbHVnaW5JbnN0YW5jZS5WZXJzaW9uQ2hlY2tlciBtVmVyc2lvbkNoZWNrZXI7CisKKyAgICBwcml2YXRlIFJlZkNvdW50ZXIgbUNvdW50ZXI7CiAgICAgcHJpdmF0ZSBQbHVnaW5JbnN0YW5jZTxUZXN0UGx1Z2luPiBtUGx1Z2luSW5zdGFuY2U7CiAgICAgcHJpdmF0ZSBQbHVnaW5JbnN0YW5jZS5GYWN0b3J5IG1QbHVnaW5JbnN0YW5jZUZhY3Rvcnk7Ci0KICAgICBwcml2YXRlIEFwcGxpY2F0aW9uSW5mbyBtQXBwSW5mbzsKLSAgICBwcml2YXRlIENvbnRleHQgbVBsdWdpbkNvbnRleHQ7Ci0gICAgQE1vY2sKLSAgICBwcml2YXRlIFBsdWdpbkluc3RhbmNlLlZlcnNpb25DaGVja2VyIG1WZXJzaW9uQ2hlY2tlcjsKKworICAgIC8vIEJlY2F1c2Ugd2UncmUgdGVzdGluZyBtZW1vcnkgaW4gdGhpcyBmaWxlLCB3ZSBtdXN0IGJlIGNhcmVmdWwgbm90IHRvIGFzc2VydCB0aGUgdGFyZ2V0CisgICAgLy8gb2JqZWN0cywgb3IgY2FwdHVyZSB0aGVtIHZpYSBtb2NraXRvIGlmIHdlIGV4cGVjdCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdG8gbGF0ZXIgZnJlZSB0aGVtLgorICAgIC8vIEJvdGggSlVuaXQgYW5kIE1vY2tpdG8gd2lsbCBzYXZlIHJlZmVyZW5jZXMgYW5kIHByZXZlbnQgdGhlc2Ugb2JqZWN0cyBmcm9tIGJlaW5nIGNsZWFuZWQgdXAuCisgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFRlc3RQbHVnaW5JbXBsPiBtUGx1Z2luOworICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxDb250ZXh0PiBtUGx1Z2luQ29udGV4dDsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworICAgICAgICBtQ291bnRlciA9IG5ldyBSZWZDb3VudGVyKCk7CiAgICAgICAgIG1BcHBJbmZvID0gbUNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCk7Ci0gICAgICAgIG1BcHBJbmZvLnBhY2thZ2VOYW1lID0gbVRlc3RQbHVnaW5Db21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIHdoZW4obVZlcnNpb25DaGVja2VyLmNoZWNrVmVyc2lvbihhbnkoKSwgYW55KCksIGFueSgpKSkudGhlblJldHVybihtVmVyc2lvbkluZm8pOworICAgICAgICBtQXBwSW5mby5wYWNrYWdlTmFtZSA9IFRFU1RfUExVR0lOX0NPTVBPTkVOVF9OQU1FLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIG1QbHVnaW5MaXN0ZW5lciA9IG5ldyBGYWtlTGlzdGVuZXIoKTsKKyAgICAgICAgbVZlcnNpb25JbmZvID0gbmV3IFZlcnNpb25JbmZvKCk7CisgICAgICAgIG1WZXJzaW9uQ2hlY2tlciA9IG5ldyBQbHVnaW5JbnN0YW5jZS5WZXJzaW9uQ2hlY2tlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIDxUIGV4dGVuZHMgUGx1Z2luPiBWZXJzaW9uSW5mbyBjaGVja1ZlcnNpb24oCisgICAgICAgICAgICAgICAgICAgIENsYXNzPFQ+IGluc3RhbmNlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgIENsYXNzPFQ+IHBsdWdpbkNsYXNzLAorICAgICAgICAgICAgICAgICAgICBQbHVnaW4gcGx1Z2luCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBpZiAobVZlcnNpb25FeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBtVmVyc2lvbkV4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1WZXJzaW9uSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKIAogICAgICAgICBtUGx1Z2luSW5zdGFuY2VGYWN0b3J5ID0gbmV3IFBsdWdpbkluc3RhbmNlLkZhY3RvcnkoCiAgICAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksCiAgICAgICAgICAgICAgICAgbmV3IFBsdWdpbkluc3RhbmNlLkluc3RhbmNlRmFjdG9yeTxUZXN0UGx1Z2luPigpIHsKICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIFRlc3RQbHVnaW4gY3JlYXRlKENsYXNzIGNscykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Nb2NrUGx1Z2luOworICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFBsdWdpbkltcGwgcGx1Z2luID0gbmV3IFRlc3RQbHVnaW5JbXBsKG1Db3VudGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbHVnaW4gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHBsdWdpbik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2luOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICBtVmVyc2lvbkNoZWNrZXIsCkBAIC04NSw4ICsxMDIsOSBAQAogICAgICAgICAgICAgICAgIGZhbHNlKTsKIAogICAgICAgICBtUGx1Z2luSW5zdGFuY2UgPSBtUGx1Z2luSW5zdGFuY2VGYWN0b3J5LmNyZWF0ZSgKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgbUFwcEluZm8sIG1UZXN0UGx1Z2luQ29tcG9uZW50TmFtZSwgVGVzdFBsdWdpbi5jbGFzcyk7Ci0gICAgICAgIG1QbHVnaW5Db250ZXh0ID0gbVBsdWdpbkluc3RhbmNlLmdldFBsdWdpbkNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCwgbUFwcEluZm8sIFRFU1RfUExVR0lOX0NPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIFRlc3RQbHVnaW4uY2xhc3MsIG1QbHVnaW5MaXN0ZW5lcik7CisgICAgICAgIG1QbHVnaW5Db250ZXh0ID0gbmV3IFdlYWtSZWZlcmVuY2U8PihtUGx1Z2luSW5zdGFuY2UuZ2V0UGx1Z2luQ29udGV4dCgpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtOTYsMjkgKzExNCw1MSBAQAogCiAgICAgQFRlc3QoZXhwZWN0ZWQgPSBWZXJzaW9uSW5mby5JbnZhbGlkVmVyc2lvbkV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jb3JyZWN0VmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCiAgICAgICAgIENvbXBvbmVudE5hbWUgd3JvbmdWZXJzaW9uVGVzdFBsdWdpbkNvbXBvbmVudE5hbWUgPQogICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKFBSSVZJTEVHRURfUEFDS0FHRSwgVGVzdFBsdWdpbi5jbGFzcy5nZXROYW1lKCkpOwogCi0gICAgICAgIHdoZW4obVZlcnNpb25DaGVja2VyLmNoZWNrVmVyc2lvbihhbnkoKSwgYW55KCksIGFueSgpKSkudGhlblRocm93KAotICAgICAgICAgICAgICAgIG5ldyBWZXJzaW9uSW5mby5JbnZhbGlkVmVyc2lvbkV4Y2VwdGlvbigidGVzdCIsIHRydWUpKTsKKyAgICAgICAgbVZlcnNpb25FeGNlcHRpb24gPSBuZXcgVmVyc2lvbkluZm8uSW52YWxpZFZlcnNpb25FeGNlcHRpb24oInRlc3QiLCB0cnVlKTsKIAogICAgICAgICBtUGx1Z2luSW5zdGFuY2VGYWN0b3J5LmNyZWF0ZSgKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgbUFwcEluZm8sIHdyb25nVmVyc2lvblRlc3RQbHVnaW5Db21wb25lbnROYW1lLCBUZXN0UGx1Z2luLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCwgbUFwcEluZm8sIHdyb25nVmVyc2lvblRlc3RQbHVnaW5Db21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgIFRlc3RQbHVnaW4uY2xhc3MsIG1QbHVnaW5MaXN0ZW5lcik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0T25DcmVhdGUoKSB7Ci0gICAgICAgIG1QbHVnaW5JbnN0YW5jZS5vbkNyZWF0ZShtQ29udGV4dCwgbU1vY2tMaXN0ZW5lcik7Ci0gICAgICAgIHZlcmlmeShtTW9ja1BsdWdpbikub25DcmVhdGUobUNvbnRleHQsIG1QbHVnaW5Db250ZXh0KTsKLSAgICAgICAgdmVyaWZ5KG1Nb2NrTGlzdGVuZXIpLm9uUGx1Z2luQ29ubmVjdGVkKG1Nb2NrUGx1Z2luLCBtUGx1Z2luQ29udGV4dCk7CisgICAgICAgIG1QbHVnaW5JbnN0YW5jZS5vbkNyZWF0ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVBsdWdpbkxpc3RlbmVyLm1BdHRhY2hlZENvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1QbHVnaW5MaXN0ZW5lci5tTG9hZENvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1QbHVnaW4uZ2V0KCksIG1QbHVnaW5JbnN0YW5jZS5nZXRQbHVnaW4oKSk7CisgICAgICAgIGFzc2VydEluc3RhbmNlcygxLCAxKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RPbkRlc3Ryb3koKSB7Ci0gICAgICAgIG1QbHVnaW5JbnN0YW5jZS5vbkRlc3Ryb3kobU1vY2tMaXN0ZW5lcik7Ci0gICAgICAgIHZlcmlmeShtTW9ja0xpc3RlbmVyKS5vblBsdWdpbkRpc2Nvbm5lY3RlZChtTW9ja1BsdWdpbik7Ci0gICAgICAgIHZlcmlmeShtTW9ja1BsdWdpbikub25EZXN0cm95KCk7CisgICAgICAgIG1QbHVnaW5JbnN0YW5jZS5vbkRlc3Ryb3koKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1QbHVnaW5MaXN0ZW5lci5tRGV0YWNoZWRDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtUGx1Z2luTGlzdGVuZXIubVVubG9hZENvdW50KTsKKyAgICAgICAgYXNzZXJ0TnVsbChtUGx1Z2luSW5zdGFuY2UuZ2V0UGx1Z2luKCkpOworICAgICAgICBhc3NlcnRJbnN0YW5jZXMoMCwgLTEpOyAvLyBEZXN0cm95ZWQgYnV0IG5ldmVyIGNyZWF0ZWQKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblJlcGVhdGVkbHlMb2FkVW5sb2FkX1BsdWdpbkZyZWVkKCkgeworICAgICAgICBtUGx1Z2luSW5zdGFuY2Uub25DcmVhdGUoKTsKKyAgICAgICAgbVBsdWdpbkluc3RhbmNlLmxvYWRQbHVnaW4oKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFuY2VzKDEsIDEpOworCisgICAgICAgIG1QbHVnaW5JbnN0YW5jZS51bmxvYWRQbHVnaW4oKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtUGx1Z2luSW5zdGFuY2UuZ2V0UGx1Z2luKCkpOworICAgICAgICBhc3NlcnRJbnN0YW5jZXMoMCwgMCk7CisKKyAgICAgICAgbVBsdWdpbkluc3RhbmNlLmxvYWRQbHVnaW4oKTsKKyAgICAgICAgYXNzZXJ0SW5zdGFuY2VzKDEsIDEpOworCisgICAgICAgIG1QbHVnaW5JbnN0YW5jZS51bmxvYWRQbHVnaW4oKTsKKyAgICAgICAgbVBsdWdpbkluc3RhbmNlLm9uRGVzdHJveSgpOworICAgICAgICBhc3NlcnROdWxsKG1QbHVnaW5JbnN0YW5jZS5nZXRQbHVnaW4oKSk7CisgICAgICAgIGFzc2VydEluc3RhbmNlcygwLCAwKTsKICAgICB9CiAKICAgICAvLyBUaGlzIHRhcmdldCBjbGFzcyBkb2Vzbid0IG1hdHRlciwgaXQganVzdCBuZWVkcyB0byBoYXZlIGEgUmVxdWlyZXMgdG8gaGl0IHRoZSBmbG93IHdoZXJlCkBAIC0xMjksMTAgKzE2OSwxMDMgQEAKICAgICAgICAgU3RyaW5nIEFDVElPTiA9ICJ0ZXN0QWN0aW9uIjsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRJbnN0YW5jZXMoSW50ZWdlciBhbGxvY2F0ZWQsIEludGVnZXIgY3JlYXRlZCkgeworICAgICAgICAvLyBSdW4gdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGZpbmFsaXplIGFuZCBkZWFsbG9jYXRlIG91dHN0YW5kaW5nCisgICAgICAgIC8vIGluc3RhbmNlcy4gU2luY2UgdGhlIEdDIGRvZXNuJ3QgYWx3YXlzIGFwcGVhciB0byB3YW50IHRvIHJ1bgorICAgICAgICAvLyBjb21wbGV0ZWx5IHdoZW4gd2UgYXNrLCB3ZSBhc2sgaXQgMTAgdGltZXMgaW4gYSBzaG9ydCBsb29wLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIFN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKKyAgICAgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgICB9CisKKyAgICAgICAgbUNvdW50ZXIuYXNzZXJ0SW5zdGFuY2VzKGFsbG9jYXRlZCwgY3JlYXRlZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWZDb3VudGVyIHsKKyAgICAgICAgcHVibGljIGZpbmFsIEF0b21pY0ludGVnZXIgbUFsbG9jYXRlZEluc3RhbmNlcyA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgICAgIHB1YmxpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIG1DcmVhdGVkSW5zdGFuY2VzID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgICAgICBwdWJsaWMgdm9pZCBhc3NlcnRJbnN0YW5jZXMoSW50ZWdlciBhbGxvY2F0ZWQsIEludGVnZXIgY3JlYXRlZCkgeworICAgICAgICAgICAgaWYgKGFsbG9jYXRlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFsbG9jYXRlZC5pbnRWYWx1ZSgpLCBtQWxsb2NhdGVkSW5zdGFuY2VzLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjcmVhdGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3JlYXRlZC5pbnRWYWx1ZSgpLCBtQ3JlYXRlZEluc3RhbmNlcy5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBAUmVxdWlyZXModGFyZ2V0ID0gVGVzdFBsdWdpbi5jbGFzcywgdmVyc2lvbiA9IFRlc3RQbHVnaW4uVkVSU0lPTikKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RQbHVnaW5JbXBsIGltcGxlbWVudHMgVGVzdFBsdWdpbiB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBSZWZDb3VudGVyIG1Db3VudGVyOworICAgICAgICBwdWJsaWMgVGVzdFBsdWdpbkltcGwoUmVmQ291bnRlciBjb3VudGVyKSB7CisgICAgICAgICAgICBtQ291bnRlciA9IGNvdW50ZXI7CisgICAgICAgICAgICBtQ291bnRlci5tQWxsb2NhdGVkSW5zdGFuY2VzLmdldEFuZEluY3JlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICAgICAgbUNvdW50ZXIubUFsbG9jYXRlZEluc3RhbmNlcy5nZXRBbmREZWNyZW1lbnQoKTsKKyAgICAgICAgfQorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShDb250ZXh0IHN5c3VpQ29udGV4dCwgQ29udGV4dCBwbHVnaW5Db250ZXh0KSB7CisgICAgICAgICAgICBtQ291bnRlci5tQ3JlYXRlZEluc3RhbmNlcy5nZXRBbmRJbmNyZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgICAgICBtQ291bnRlci5tQ3JlYXRlZEluc3RhbmNlcy5nZXRBbmREZWNyZW1lbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBGYWtlTGlzdGVuZXIgaW1wbGVtZW50cyBQbHVnaW5MaXN0ZW5lcjxUZXN0UGx1Z2luPiB7CisgICAgICAgIHB1YmxpYyBpbnQgbUF0dGFjaGVkQ291bnQgPSAwOworICAgICAgICBwdWJsaWMgaW50IG1EZXRhY2hlZENvdW50ID0gMDsKKyAgICAgICAgcHVibGljIGludCBtTG9hZENvdW50ID0gMDsKKyAgICAgICAgcHVibGljIGludCBtVW5sb2FkQ291bnQgPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsdWdpbkF0dGFjaGVkKFBsdWdpbkxpZmVjeWNsZU1hbmFnZXI8VGVzdFBsdWdpbj4gbWFuYWdlcikgeworICAgICAgICAgICAgbUF0dGFjaGVkQ291bnQrKzsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQbHVnaW5JbnN0YW5jZVRlc3QudGhpcy5tUGx1Z2luSW5zdGFuY2UsIG1hbmFnZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGx1Z2luRGV0YWNoZWQoUGx1Z2luTGlmZWN5Y2xlTWFuYWdlcjxUZXN0UGx1Z2luPiBtYW5hZ2VyKSB7CisgICAgICAgICAgICBtRGV0YWNoZWRDb3VudCsrOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFBsdWdpbkluc3RhbmNlVGVzdC50aGlzLm1QbHVnaW5JbnN0YW5jZSwgbWFuYWdlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbHVnaW5Mb2FkZWQoCisgICAgICAgICAgICAgICAgVGVzdFBsdWdpbiBwbHVnaW4sCisgICAgICAgICAgICAgICAgQ29udGV4dCBwbHVnaW5Db250ZXh0LAorICAgICAgICAgICAgICAgIFBsdWdpbkxpZmVjeWNsZU1hbmFnZXI8VGVzdFBsdWdpbj4gbWFuYWdlcgorICAgICAgICApIHsKKyAgICAgICAgICAgIG1Mb2FkQ291bnQrKzsKKyAgICAgICAgICAgIFRlc3RQbHVnaW4gZXhwZWN0ZWRQbHVnaW4gPSBQbHVnaW5JbnN0YW5jZVRlc3QudGhpcy5tUGx1Z2luLmdldCgpOworICAgICAgICAgICAgaWYgKGV4cGVjdGVkUGx1Z2luICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQbHVnaW4sIHBsdWdpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb250ZXh0IGV4cGVjdGVkQ29udGV4dCA9IFBsdWdpbkluc3RhbmNlVGVzdC50aGlzLm1QbHVnaW5Db250ZXh0LmdldCgpOworICAgICAgICAgICAgaWYgKGV4cGVjdGVkQ29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQ29udGV4dCwgcGx1Z2luQ29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUGx1Z2luSW5zdGFuY2VUZXN0LnRoaXMubVBsdWdpbkluc3RhbmNlLCBtYW5hZ2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsdWdpblVubG9hZGVkKAorICAgICAgICAgICAgICAgIFRlc3RQbHVnaW4gcGx1Z2luLAorICAgICAgICAgICAgICAgIFBsdWdpbkxpZmVjeWNsZU1hbmFnZXI8VGVzdFBsdWdpbj4gbWFuYWdlcgorICAgICAgICApIHsKKyAgICAgICAgICAgIG1VbmxvYWRDb3VudCsrOworICAgICAgICAgICAgVGVzdFBsdWdpbiBleHBlY3RlZFBsdWdpbiA9IFBsdWdpbkluc3RhbmNlVGVzdC50aGlzLm1QbHVnaW4uZ2V0KCk7CisgICAgICAgICAgICBpZiAoZXhwZWN0ZWRQbHVnaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFBsdWdpbiwgcGx1Z2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQbHVnaW5JbnN0YW5jZVRlc3QudGhpcy5tUGx1Z2luSW5zdGFuY2UsIG1hbmFnZXIpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9zeXN0ZW0vUmVtb3RlVHJhbnNpdGlvblRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zaGFyZWQvc3lzdGVtL1JlbW90ZVRyYW5zaXRpb25UZXN0LmphdmEKaW5kZXggNjRlNThkMC4uMGUyYTNhYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NoYXJlZC9zeXN0ZW0vUmVtb3RlVHJhbnNpdGlvblRlc3QuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2hhcmVkL3N5c3RlbS9SZW1vdGVUcmFuc2l0aW9uVGVzdC5qYXZhCkBAIC0xMzQsNyArMTM0LDcgQEAKIAogICAgICAgICBUcmFuc2l0aW9uSW5mb0J1aWxkZXIoQFdpbmRvd01hbmFnZXIuVHJhbnNpdGlvblR5cGUgaW50IHR5cGUpIHsKICAgICAgICAgICAgIG1JbmZvID0gbmV3IFRyYW5zaXRpb25JbmZvKHR5cGUsIDAgLyogZmxhZ3MgKi8pOwotICAgICAgICAgICAgbUluZm8uc2V0Um9vdExlYXNoKGNyZWF0ZU1vY2tTdXJmYWNlKHRydWUgLyogdmFsaWQgKi8pLCAwLCAwKTsKKyAgICAgICAgICAgIG1JbmZvLmFkZFJvb3RMZWFzaCgwLCBjcmVhdGVNb2NrU3VyZmFjZSh0cnVlIC8qIHZhbGlkICovKSwgMCwgMCk7CiAgICAgICAgIH0KIAogICAgICAgICBUcmFuc2l0aW9uSW5mb0J1aWxkZXIgYWRkQ2hhbmdlKEBXaW5kb3dNYW5hZ2VyLlRyYW5zaXRpb25UeXBlIGludCBtb2RlLApAQCAtMTQ0LDYgKzE0NCw3IEBACiAgICAgICAgICAgICBjaGFuZ2Uuc2V0TW9kZShtb2RlKTsKICAgICAgICAgICAgIGNoYW5nZS5zZXRGbGFncyhmbGFncyk7CiAgICAgICAgICAgICBjaGFuZ2Uuc2V0VGFza0luZm8odGFza0luZm8pOworICAgICAgICAgICAgY2hhbmdlLnNldERpc3BsYXlJZCgwLCAwKTsKICAgICAgICAgICAgIG1JbmZvLmFkZENoYW5nZShjaGFuZ2UpOwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zbWFydHNwYWNlL0RyZWFtU21hcnRzcGFjZUNvbnRyb2xsZXJUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlclRlc3Qua3QKaW5kZXggYTI4MDUxMC4uNThiNDRhZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlclRlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NtYXJ0c3BhY2UvRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlclRlc3Qua3QKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3RpbmcuVGVzdGFibGVMb29wZXIKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dAogaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3QKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5TeXN1aVRlc3RDYXNlCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZHJlYW1zLnNtYXJ0c3BhY2UuRHJlYW1TbWFydHNwYWNlQ29udHJvbGxlcgpAQCAtNDYsNiArNDcsNyBAQAogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8KIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeQogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8uYHdoZW5gCitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by5hbnlJbnQKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnMKIGltcG9ydCBvcmcubW9ja2l0by5TcHkKIApAQCAtNjksMTIgKzcxLDIxIEBACiAgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgdmlld0NvbXBvbmVudDogU21hcnRzcGFjZVZpZXdDb21wb25lbnQKIAogICAgIEBNb2NrCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgd2VhdGhlclZpZXdDb21wb25lbnQ6IFNtYXJ0c3BhY2VWaWV3Q29tcG9uZW50CisKKyAgICBAU3B5CisgICAgcHJpdmF0ZSB2YXIgd2VhdGhlclNtYXJ0c3BhY2VWaWV3OiBTbWFydHNwYWNlVmlldyA9IFRlc3RWaWV3KGNvbnRleHQpCisKKyAgICBATW9jawogICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHRhcmdldEZpbHRlcjogU21hcnRzcGFjZVRhcmdldEZpbHRlcgogCiAgICAgQE1vY2sKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciBwbHVnaW46IEJjU21hcnRzcGFjZURhdGFQbHVnaW4KIAogICAgIEBNb2NrCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgd2VhdGhlclBsdWdpbjogQmNTbWFydHNwYWNlRGF0YVBsdWdpbgorCisgICAgQE1vY2sKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciBwcmVjb25kaXRpb246IFNtYXJ0c3BhY2VQcmVjb25kaXRpb24KIAogICAgIEBTcHkKQEAgLTg4LDYgKzk5LDkgQEAKIAogICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIGNvbnRyb2xsZXI6IERyZWFtU21hcnRzcGFjZUNvbnRyb2xsZXIKIAorICAgIC8vIFRPRE8oYi8yNzI4MTEyODApOiBSZW1vdmUgdXNhZ2Ugb2YgcmVhbCB2aWV3CisgICAgcHJpdmF0ZSB2YWwgZmFrZVBhcmVudCA9IEZyYW1lTGF5b3V0KGNvbnRleHQpCisKICAgICAvKioKICAgICAgKiBBIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgU21hcnRzcGFjZVZpZXcgYW5kIGV4dGVuZHMgVmlldy4gVGhpcyBpcyBtb2NrZWQgdG8gcHJvdmlkZSB0aGUgcmlnaHQKICAgICAgKiBvYmplY3QgaW5oZXJpdGFuY2UgYW5kIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGluIERyZWFtU21hcnRzcGFjZUNvbnRyb2xsZXIKQEAgLTEyMSwxMyArMTM1LDE3IEBACiAgICAgQEJlZm9yZQogICAgIGZ1biBzZXR1cCgpIHsKICAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKQotICAgICAgICBgd2hlbmAodmlld0NvbXBvbmVudEZhY3RvcnkuY3JlYXRlKGFueSgpLCBlcShwbHVnaW4pLCBhbnkoKSkpCisgICAgICAgIGB3aGVuYCh2aWV3Q29tcG9uZW50RmFjdG9yeS5jcmVhdGUoYW55KCksIGVxKHBsdWdpbiksIGFueSgpLCBlcShudWxsKSkpCiAgICAgICAgICAgICAgICAgLnRoZW5SZXR1cm4odmlld0NvbXBvbmVudCkKICAgICAgICAgYHdoZW5gKHZpZXdDb21wb25lbnQuZ2V0VmlldygpKS50aGVuUmV0dXJuKHNtYXJ0c3BhY2VWaWV3KQorICAgICAgICBgd2hlbmAodmlld0NvbXBvbmVudEZhY3RvcnkuY3JlYXRlKGFueSgpLCBlcSh3ZWF0aGVyUGx1Z2luKSwgYW55KCksIGFueSgpKSkKKyAgICAgICAgICAgIC50aGVuUmV0dXJuKHdlYXRoZXJWaWV3Q29tcG9uZW50KQorICAgICAgICBgd2hlbmAod2VhdGhlclZpZXdDb21wb25lbnQuZ2V0VmlldygpKS50aGVuUmV0dXJuKHdlYXRoZXJTbWFydHNwYWNlVmlldykKICAgICAgICAgYHdoZW5gKHNtYXJ0c3BhY2VNYW5hZ2VyLmNyZWF0ZVNtYXJ0c3BhY2VTZXNzaW9uKGFueSgpKSkudGhlblJldHVybihzZXNzaW9uKQogCiAgICAgICAgIGNvbnRyb2xsZXIgPSBEcmVhbVNtYXJ0c3BhY2VDb250cm9sbGVyKGNvbnRleHQsIHNtYXJ0c3BhY2VNYW5hZ2VyLCBleGVjdXRpb24sIHVpRXhlY3V0b3IsCi0gICAgICAgICAgICAgICAgdmlld0NvbXBvbmVudEZhY3RvcnksIHByZWNvbmRpdGlvbiwgT3B0aW9uYWwub2YodGFyZ2V0RmlsdGVyKSwgT3B0aW9uYWwub2YocGx1Z2luKSkKKyAgICAgICAgICAgICAgICB2aWV3Q29tcG9uZW50RmFjdG9yeSwgcHJlY29uZGl0aW9uLCBPcHRpb25hbC5vZih0YXJnZXRGaWx0ZXIpLCBPcHRpb25hbC5vZihwbHVnaW4pLAorICAgICAgICBPcHRpb25hbC5vZih3ZWF0aGVyUGx1Z2luKSkKICAgICB9CiAKICAgICAvKioKQEAgLTE2OCwxMSArMTg2LDExIEBACiAgICAgICAgIGB3aGVuYChwcmVjb25kaXRpb24uY29uZGl0aW9uc01ldCgpKS50aGVuUmV0dXJuKHRydWUpCiAgICAgICAgIGNvbnRyb2xsZXIuYnVpbGRBbmRDb25uZWN0VmlldyhNb2NraXRvLm1vY2soVmlld0dyb3VwOjpjbGFzcy5qYXZhKSkKIAotICAgICAgICB2YXIgc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHdpdGhBcmdDYXB0b3I8Vmlldy5PbkF0dGFjaFN0YXRlQ2hhbmdlTGlzdGVuZXI+IHsKLSAgICAgICAgICAgIHZlcmlmeSh2aWV3Q29tcG9uZW50RmFjdG9yeSkuY3JlYXRlKGFueSgpLCBlcShwbHVnaW4pLCBjYXB0dXJlKCkpCisgICAgICAgIHZhbCBzdGF0ZUNoYW5nZUxpc3RlbmVyID0gd2l0aEFyZ0NhcHRvcjxWaWV3Lk9uQXR0YWNoU3RhdGVDaGFuZ2VMaXN0ZW5lcj4geworICAgICAgICAgICAgdmVyaWZ5KHZpZXdDb21wb25lbnRGYWN0b3J5KS5jcmVhdGUoYW55KCksIGVxKHBsdWdpbiksIGNhcHR1cmUoKSwgZXEobnVsbCkpCiAgICAgICAgIH0KIAotICAgICAgICB2YXIgbW9ja1ZpZXcgPSBNb2NraXRvLm1vY2soVGVzdFZpZXc6OmNsYXNzLmphdmEpCisgICAgICAgIHZhbCBtb2NrVmlldyA9IE1vY2tpdG8ubW9jayhUZXN0Vmlldzo6Y2xhc3MuamF2YSkKICAgICAgICAgYHdoZW5gKHByZWNvbmRpdGlvbi5jb25kaXRpb25zTWV0KCkpLnRoZW5SZXR1cm4odHJ1ZSkKICAgICAgICAgc3RhdGVDaGFuZ2VMaXN0ZW5lci5vblZpZXdBdHRhY2hlZFRvV2luZG93KG1vY2tWaWV3KQogCkBAIC0xODMsNCArMjAxLDc0IEBACiAKICAgICAgICAgdmVyaWZ5KHNlc3Npb24pLmNsb3NlKCkKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHNlc3Npb24gaXMgY3JlYXRlZCB3aGVuIHdlYXRoZXIgc21hcnRzcGFjZSB2aWV3IGlzIGNyZWF0ZWQgYW5kIGF0dGFjaGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgZnVuIHRlc3RDb25uZWN0T25XZWF0aGVyVmlld0NyZWF0ZSgpIHsKKyAgICAgICAgYHdoZW5gKHByZWNvbmRpdGlvbi5jb25kaXRpb25zTWV0KCkpLnRoZW5SZXR1cm4odHJ1ZSkKKworICAgICAgICB2YWwgY3VzdG9tVmlldyA9IE1vY2tpdG8ubW9jayhUZXN0Vmlldzo6Y2xhc3MuamF2YSkKKyAgICAgICAgdmFsIHdlYXRoZXJWaWV3ID0gY29udHJvbGxlci5idWlsZEFuZENvbm5lY3RXZWF0aGVyVmlldyhmYWtlUGFyZW50LCBjdXN0b21WaWV3KQorICAgICAgICB2YWwgd2VhdGhlclNtYXJ0c3BhY2VWaWV3ID0gd2VhdGhlclZpZXcgYXMgU21hcnRzcGFjZVZpZXcKKyAgICAgICAgZmFrZVBhcmVudC5hZGRWaWV3KHdlYXRoZXJWaWV3KQorCisgICAgICAgIC8vIFRoZW4gd2VhdGhlciB2aWV3IGlzIGNyZWF0ZWQgd2l0aCBjdXN0b20gdmlldyBhbmQgdGhlIGRlZmF1bHQgd2VhdGhlclBsdWdpbi5nZXRWaWV3CisgICAgICAgIC8vIHNob3VsZCBub3QgYmUgY2FsbGVkCisgICAgICAgIHZlcmlmeSh2aWV3Q29tcG9uZW50RmFjdG9yeSkuY3JlYXRlKGVxKGZha2VQYXJlbnQpLCBlcSh3ZWF0aGVyUGx1Z2luKSwgYW55KCksCisgICAgICAgICAgICBlcShjdXN0b21WaWV3KSkKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJQbHVnaW4sIE1vY2tpdG8ubmV2ZXIoKSkuZ2V0VmlldyhmYWtlUGFyZW50KQorCisgICAgICAgIC8vIEFuZCB0aGVuIHNlc3Npb24gaXMgY3JlYXRlZAorICAgICAgICBjb250cm9sbGVyLnN0YXRlQ2hhbmdlTGlzdGVuZXIub25WaWV3QXR0YWNoZWRUb1dpbmRvdyh3ZWF0aGVyVmlldykKKyAgICAgICAgdmVyaWZ5KHNtYXJ0c3BhY2VNYW5hZ2VyKS5jcmVhdGVTbWFydHNwYWNlU2Vzc2lvbihhbnkoKSkKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJTbWFydHNwYWNlVmlldykuc2V0UHJpbWFyeVRleHRDb2xvcihhbnlJbnQoKSkKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJTbWFydHNwYWNlVmlldykuc2V0RG96ZUFtb3VudCgwZikKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHdlYXRoZXIgcGx1Z2luIHJlZ2lzdGVycyB0YXJnZXQgbGlzdGVuZXIgd2hlbiBpdCBpcyBhZGRlZCBmcm9tIHRoZSBjb250cm9sbGVyLgorICAgICAqLworICAgIEBUZXN0CisgICAgZnVuIHRlc3RBZGRMaXN0ZW5lckluQ29udHJvbGxlcl9yZWdpc3RlcnNMaXN0ZW5lckZvcldlYXRoZXJQbHVnaW4oKSB7CisgICAgICAgIHZhbCBjdXN0b21WaWV3ID0gTW9ja2l0by5tb2NrKFRlc3RWaWV3OjpjbGFzcy5qYXZhKQorICAgICAgICBgd2hlbmAocHJlY29uZGl0aW9uLmNvbmRpdGlvbnNNZXQoKSkudGhlblJldHVybih0cnVlKQorCisgICAgICAgIC8vIEdpdmVuIGEgc2Vzc2lvbiBpcyBjcmVhdGVkCisgICAgICAgIHZhbCB3ZWF0aGVyVmlldyA9IGNvbnRyb2xsZXIuYnVpbGRBbmRDb25uZWN0V2VhdGhlclZpZXcoZmFrZVBhcmVudCwgY3VzdG9tVmlldykKKyAgICAgICAgY29udHJvbGxlci5zdGF0ZUNoYW5nZUxpc3RlbmVyLm9uVmlld0F0dGFjaGVkVG9XaW5kb3cod2VhdGhlclZpZXcpCisgICAgICAgIHZlcmlmeShzbWFydHNwYWNlTWFuYWdlcikuY3JlYXRlU21hcnRzcGFjZVNlc3Npb24oYW55KCkpCisKKyAgICAgICAgLy8gV2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCisgICAgICAgIGNvbnRyb2xsZXIuYWRkTGlzdGVuZXJGb3JXZWF0aGVyUGx1Z2luKGxpc3RlbmVyKQorCisgICAgICAgIC8vIFRoZW4gdGhlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgdG8gdGhlIHdlYXRoZXIgcGx1Z2luIG9ubHkKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJQbHVnaW4pLnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpCisgICAgICAgIHZlcmlmeShwbHVnaW4sIE1vY2tpdG8ubmV2ZXIoKSkucmVnaXN0ZXJMaXN0ZW5lcihhbnkoKSkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHNlc3Npb24gaXMgY2xvc2VkIGFuZCB3ZWF0aGVyIHBsdWdpbiB1bnJlZ2lzdGVycyB0aGUgbm90aWZpZXIgd2hlbiB3ZWF0aGVyIHNtYXJ0c3BhY2UKKyAgICAgKiB2aWV3IGlzIGRldGFjaGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgZnVuIHRlc3REaXNjb25uZWN0X2VtaXRzRW1wdHlMaXN0QW5kUmVtb3Zlc05vdGlmaWVyKCkgeworICAgICAgICBgd2hlbmAocHJlY29uZGl0aW9uLmNvbmRpdGlvbnNNZXQoKSkudGhlblJldHVybih0cnVlKQorCisgICAgICAgIC8vIEdpdmVuIGEgc2Vzc2lvbiBpcyBjcmVhdGVkCisgICAgICAgIHZhbCBjdXN0b21WaWV3ID0gTW9ja2l0by5tb2NrKFRlc3RWaWV3OjpjbGFzcy5qYXZhKQorICAgICAgICB2YWwgd2VhdGhlclZpZXcgPSBjb250cm9sbGVyLmJ1aWxkQW5kQ29ubmVjdFdlYXRoZXJWaWV3KGZha2VQYXJlbnQsIGN1c3RvbVZpZXcpCisgICAgICAgIGNvbnRyb2xsZXIuc3RhdGVDaGFuZ2VMaXN0ZW5lci5vblZpZXdBdHRhY2hlZFRvV2luZG93KHdlYXRoZXJWaWV3KQorICAgICAgICB2ZXJpZnkoc21hcnRzcGFjZU1hbmFnZXIpLmNyZWF0ZVNtYXJ0c3BhY2VTZXNzaW9uKGFueSgpKQorCisgICAgICAgIC8vIFdoZW4gdmlldyBpcyBkZXRhY2hlZAorICAgICAgICBjb250cm9sbGVyLnN0YXRlQ2hhbmdlTGlzdGVuZXIub25WaWV3RGV0YWNoZWRGcm9tV2luZG93KHdlYXRoZXJWaWV3KQorICAgICAgICAvLyBUaGVuIHRoZSBzZXNzaW9uIGlzIGNsb3NlZAorICAgICAgICB2ZXJpZnkoc2Vzc2lvbikuY2xvc2UoKQorCisgICAgICAgIC8vIEFuZCB0aGUgbGlzdGVuZXIgcmVjZWl2ZXMgYW4gZW1wdHkgbGlzdCBvZiB0YXJnZXRzIGFuZCB1bnJlZ2lzdGVycyB0aGUgbm90aWZpZXIKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJQbHVnaW4pLm9uVGFyZ2V0c0F2YWlsYWJsZShlbXB0eUxpc3QoKSkKKyAgICAgICAgdmVyaWZ5KHdlYXRoZXJQbHVnaW4pLnJlZ2lzdGVyU21hcnRzcGFjZUV2ZW50Tm90aWZpZXIobnVsbCkKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvblJlbW90ZUlucHV0TWFuYWdlclRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRNYW5hZ2VyVGVzdC5qYXZhCmluZGV4IDUxNzA2NzguLmNlZDA3MzQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRNYW5hZ2VyVGVzdC5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZHVtcC5EdW1wTWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLnN0YXR1c2Jhci5TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5Ob3RpZlBpcGVsaW5lRmxhZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5SZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uLk5vdGlmaWNhdGlvbkVudHJ5OwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5ub3RpZmljYXRpb24uY29sbGVjdGlvbi5Ob3RpZmljYXRpb25FbnRyeUJ1aWxkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uLnJlbmRlci5Ob3RpZmljYXRpb25WaXNpYmlsaXR5UHJvdmlkZXI7CkBAIC00MSw2ICs0Miw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBob25lLkNlbnRyYWxTdXJmYWNlczsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LlJlbW90ZUlucHV0VXJpQ29udHJvbGxlcjsKIAoraW1wb3J0IGRhZ2dlci5MYXp5OworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC00OSw4ICs1Miw2IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiAKLWltcG9ydCBkYWdnZXIuTGF6eTsKLQogQFNtYWxsVGVzdAogQFJ1bldpdGgoQW5kcm9pZFRlc3RpbmdSdW5uZXIuY2xhc3MpCiBAVGVzdGFibGVMb29wZXIuUnVuV2l0aExvb3BlcgpAQCAtODQsNiArODUsNyBAQAogICAgICAgICAgICAgICAgICgpIC0+IE9wdGlvbmFsLm9mKG1vY2soQ2VudHJhbFN1cmZhY2VzLmNsYXNzKSksCiAgICAgICAgICAgICAgICAgbVN0YXRlQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICBtUmVtb3RlSW5wdXRVcmlDb250cm9sbGVyLAorICAgICAgICAgICAgICAgIG1vY2soUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyLmNsYXNzKSwKICAgICAgICAgICAgICAgICBtQ2xpY2tOb3RpZmllciwKICAgICAgICAgICAgICAgICBtb2NrKEFjdGlvbkNsaWNrTG9nZ2VyLmNsYXNzKSwKICAgICAgICAgICAgICAgICBtb2NrKER1bXBNYW5hZ2VyLmNsYXNzKSk7CkBAIC0xNDEsNiArMTQzLDcgQEAKICAgICAgICAgICAgICAgICBMYXp5PE9wdGlvbmFsPENlbnRyYWxTdXJmYWNlcz4+IGNlbnRyYWxTdXJmYWNlc09wdGlvbmFsTGF6eSwKICAgICAgICAgICAgICAgICBTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIgc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLAogICAgICAgICAgICAgICAgIFJlbW90ZUlucHV0VXJpQ29udHJvbGxlciByZW1vdGVJbnB1dFVyaUNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgUmVtb3RlSW5wdXRDb250cm9sbGVyTG9nZ2VyIHJlbW90ZUlucHV0Q29udHJvbGxlckxvZ2dlciwKICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGlja05vdGlmaWVyIGNsaWNrTm90aWZpZXIsCiAgICAgICAgICAgICAgICAgQWN0aW9uQ2xpY2tMb2dnZXIgYWN0aW9uQ2xpY2tMb2dnZXIsCiAgICAgICAgICAgICAgICAgRHVtcE1hbmFnZXIgZHVtcE1hbmFnZXIpIHsKQEAgLTE1Myw2ICsxNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICBjZW50cmFsU3VyZmFjZXNPcHRpb25hbExhenksCiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICAgICAgcmVtb3RlSW5wdXRVcmlDb250cm9sbGVyLAorICAgICAgICAgICAgICAgICAgICByZW1vdGVJbnB1dENvbnRyb2xsZXJMb2dnZXIsCiAgICAgICAgICAgICAgICAgICAgIGNsaWNrTm90aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNsaWNrTG9nZ2VyLAogICAgICAgICAgICAgICAgICAgICBkdW1wTWFuYWdlcik7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclN0YXRlQ29udHJvbGxlckltcGxUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXJJbXBsVGVzdC5rdAppbmRleCBlNmYyNzJiLi4zMzI3ZTQyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclN0YXRlQ29udHJvbGxlckltcGxUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU3RhdGVDb250cm9sbGVySW1wbFRlc3Qua3QKQEAgLTE2Nyw0ICsxNjcsMTMgQEAKICAgICAgICAgY29udHJvbGxlci5zZXRJc0RyZWFtaW5nKGZhbHNlKQogICAgICAgICB2ZXJpZnkobGlzdGVuZXIpLm9uRHJlYW1pbmdDaGFuZ2VkKGZhbHNlKQogICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHRlc3RTZXREcmVhbVN0YXRlX2dldHRlclJldHVybnNDdXJyZW50U3RhdGUoKSB7CisgICAgICAgIGNvbnRyb2xsZXIuc2V0SXNEcmVhbWluZyh0cnVlKQorICAgICAgICBhc3NlcnRUcnVlKGNvbnRyb2xsZXIuaXNEcmVhbWluZygpKQorCisgICAgICAgIGNvbnRyb2xsZXIuc2V0SXNEcmVhbWluZyhmYWxzZSkKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29udHJvbGxlci5pc0RyZWFtaW5nKCkpCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vY29sbGVjdGlvbi9jb29yZGluYXRvci9IZWFkc1VwQ29vcmRpbmF0b3JUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vY29sbGVjdGlvbi9jb29yZGluYXRvci9IZWFkc1VwQ29vcmRpbmF0b3JUZXN0Lmt0CmluZGV4IGNiNGYxMTkuLjRiYjE0YTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2NvbGxlY3Rpb24vY29vcmRpbmF0b3IvSGVhZHNVcENvb3JkaW5hdG9yVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9jb2xsZWN0aW9uL2Nvb3JkaW5hdG9yL0hlYWRzVXBDb29yZGluYXRvclRlc3Qua3QKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmR1bXAubG9nY2F0TG9nQnVmZmVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuZmxhZ3MuRmxhZ3MKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTm90aWZpY2F0aW9uUmVtb3RlSW5wdXRNYW5hZ2VyCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5Ob3RpZlBpcGVsaW5lRmxhZ3MKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLmNvbGxlY3Rpb24uR3JvdXBFbnRyeUJ1aWxkZXIKQEAgLTU4LDYgKzU5LDcgQEAKIGltcG9ydCBvcmcuanVuaXQuVGVzdAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAogaW1wb3J0IG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55U3RyaW5nCitpbXBvcnQgb3JnLm1vY2tpdG8uQkRETW9ja2l0by5jbGVhckludm9jYXRpb25zCiBpbXBvcnQgb3JnLm1vY2tpdG8uQkRETW9ja2l0by5naXZlbgogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG8ubmV2ZXIKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzCkBAIC0xNjYsNiArMTY4LDEyIEBACiAgICAgICAgIG1Hcm91cENoaWxkMSA9IG1IZWxwZXIuY3JlYXRlQ2hpbGROb3RpZmljYXRpb24oR1JPVVBfQUxFUlRfQUxMLCAxLCAiY2hpbGQiLCAzNTApCiAgICAgICAgIG1Hcm91cENoaWxkMiA9IG1IZWxwZXIuY3JlYXRlQ2hpbGROb3RpZmljYXRpb24oR1JPVVBfQUxFUlRfQUxMLCAyLCAiY2hpbGQiLCAyNTApCiAgICAgICAgIG1Hcm91cENoaWxkMyA9IG1IZWxwZXIuY3JlYXRlQ2hpbGROb3RpZmljYXRpb24oR1JPVVBfQUxFUlRfQUxMLCAzLCAiY2hpbGQiLCAxNTApCisKKyAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IEZTSSBkZWNpc2lvbgorICAgICAgICBzZXRTaG91bGRGdWxsU2NyZWVuKGFueSgpLCBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlVMTF9TQ1JFRU5fSU5URU5UKQorCisgICAgICAgIC8vIFJ1biB0ZXN0cyB3aXRoIGRlZmF1bHQgZmVhdHVyZSBmbGFnIHN0YXRlCisgICAgICAgIHdoZW5ldmVyKG1GbGFncy5mc2lPbkRORFVwZGF0ZSgpKS50aGVuUmV0dXJuKEZsYWdzLkZTSV9PTl9ETkRfVVBEQVRFLmRlZmF1bHQpCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTgxMCw2ICs4MTgsMzkgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIGZ1biBvbkVudHJ5QWRkZWRfd2hlbkxhdW5jaGluZ0ZTSV9kb2VzTG9nRGVjaXNpb24oKSB7CisgICAgICAgIC8vIEdJVkVOIEEgbmV3IG5vdGlmaWNhdGlvbiBjYW4gRlNJCisgICAgICAgIHNldFNob3VsZEZ1bGxTY3JlZW4obUVudHJ5LCBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uRlNJX0RFVklDRV9OT1RfSU5URVJBQ1RJVkUpCisgICAgICAgIG1Db2xsZWN0aW9uTGlzdGVuZXIub25FbnRyeUFkZGVkKG1FbnRyeSkKKworICAgICAgICB2ZXJpZnkobUxhdW5jaEZ1bGxTY3JlZW5JbnRlbnRQcm92aWRlcikubGF1bmNoRnVsbFNjcmVlbkludGVudChtRW50cnkpCisgICAgICAgIHZlcmlmeShtTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlcikubG9nRnVsbFNjcmVlbkludGVudERlY2lzaW9uKAorICAgICAgICAgICAgICAgIG1FbnRyeSwgRnVsbFNjcmVlbkludGVudERlY2lzaW9uLkZTSV9ERVZJQ0VfTk9UX0lOVEVSQUNUSVZFKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIG9uRW50cnlBZGRlZF93aGVuTm90TGF1bmNoaW5nRlNJX2RvZXNMb2dEZWNpc2lvbigpIHsKKyAgICAgICAgLy8gR0lWRU4gQSBuZXcgbm90aWZpY2F0aW9uIGNhbid0IEZTSQorICAgICAgICBzZXRTaG91bGRGdWxsU2NyZWVuKG1FbnRyeSwgRnVsbFNjcmVlbkludGVudERlY2lzaW9uLk5PX0ZVTExfU0NSRUVOX0lOVEVOVCkKKyAgICAgICAgbUNvbGxlY3Rpb25MaXN0ZW5lci5vbkVudHJ5QWRkZWQobUVudHJ5KQorCisgICAgICAgIHZlcmlmeShtTGF1bmNoRnVsbFNjcmVlbkludGVudFByb3ZpZGVyLCBuZXZlcigpKS5sYXVuY2hGdWxsU2NyZWVuSW50ZW50KGFueSgpKQorICAgICAgICB2ZXJpZnkobU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXIpLmxvZ0Z1bGxTY3JlZW5JbnRlbnREZWNpc2lvbigKKyAgICAgICAgICAgICAgICBtRW50cnksIEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5OT19GVUxMX1NDUkVFTl9JTlRFTlQpCisgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gb25FbnRyeUFkZGVkX3doZW5Ob3RMYXVuY2hpbmdGU0lCZWNhdXNlT2ZEbmRfZG9lc0xvZ0RlY2lzaW9uKCkgeworICAgICAgICAvLyBHSVZFTiBBIG5ldyBub3RpZmljYXRpb24gY2FuJ3QgRlNJIGJlY2F1c2Ugb2YgRE5ECisgICAgICAgIHNldFNob3VsZEZ1bGxTY3JlZW4obUVudHJ5LCBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlNJX1NVUFBSRVNTRURfT05MWV9CWV9ETkQpCisgICAgICAgIG1Db2xsZWN0aW9uTGlzdGVuZXIub25FbnRyeUFkZGVkKG1FbnRyeSkKKworICAgICAgICB2ZXJpZnkobUxhdW5jaEZ1bGxTY3JlZW5JbnRlbnRQcm92aWRlciwgbmV2ZXIoKSkubGF1bmNoRnVsbFNjcmVlbkludGVudChhbnkoKSkKKyAgICAgICAgdmVyaWZ5KG1Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVyKS5sb2dGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oCisgICAgICAgICAgICAgICAgbUVudHJ5LCBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlNJX1NVUFBSRVNTRURfT05MWV9CWV9ETkQpCisgICAgfQorCisgICAgQFRlc3QKICAgICBmdW4gdGVzdE9uUmFua2luZ0FwcGxpZWRfbm9GU0lPblVwZGF0ZVdoZW5GbGFnT2ZmKCkgewogICAgICAgICAvLyBFbnN1cmUgdGhlIGZlYXR1cmUgZmxhZyBpcyBvZmYKICAgICAgICAgd2hlbmV2ZXIobUZsYWdzLmZzaU9uRE5EVXBkYXRlKCkpLnRoZW5SZXR1cm4oZmFsc2UpCkBAIC04MTgsMTMgKzg1OSwyMiBAQAogICAgICAgICBzZXRTaG91bGRGdWxsU2NyZWVuKG1FbnRyeSwgRnVsbFNjcmVlbkludGVudERlY2lzaW9uLk5PX0ZTSV9TVVBQUkVTU0VEX09OTFlfQllfRE5EKQogICAgICAgICBtQ29sbGVjdGlvbkxpc3RlbmVyLm9uRW50cnlBZGRlZChtRW50cnkpCiAKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhpcyBjYXVzZXMgYSBsb2cKKyAgICAgICAgdmVyaWZ5KG1Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVyKS5sb2dGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oCisgICAgICAgICAgICAgICAgbUVudHJ5LCBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlNJX1NVUFBSRVNTRURfT05MWV9CWV9ETkQpCisgICAgICAgIGNsZWFySW52b2NhdGlvbnMobU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXIpCisKICAgICAgICAgLy8gYW5kIGl0IGlzIHRoZW4gdXBkYXRlZCB0byBhbGxvdyBmdWxsIHNjcmVlbgogICAgICAgICBzZXRTaG91bGRGdWxsU2NyZWVuKG1FbnRyeSwgRnVsbFNjcmVlbkludGVudERlY2lzaW9uLkZTSV9ERVZJQ0VfTk9UX0lOVEVSQUNUSVZFKQogICAgICAgICB3aGVuZXZlcihtTm90aWZQaXBlbGluZS5hbGxOb3RpZnMpLnRoZW5SZXR1cm4obGlzdE9mKG1FbnRyeSkpCiAgICAgICAgIG1Db2xsZWN0aW9uTGlzdGVuZXIub25SYW5raW5nQXBwbGllZCgpCiAKICAgICAgICAgLy8gVEhFTiBpdCBzaG91bGQgbm90IGZ1bGwgc2NyZWVuIGJlY2F1c2UgdGhlIGZlYXR1cmUgaXMgb2ZmCi0gICAgICAgIHZlcmlmeShtTGF1bmNoRnVsbFNjcmVlbkludGVudFByb3ZpZGVyLCBuZXZlcigpKS5sYXVuY2hGdWxsU2NyZWVuSW50ZW50KG1FbnRyeSkKKyAgICAgICAgdmVyaWZ5KG1MYXVuY2hGdWxsU2NyZWVuSW50ZW50UHJvdmlkZXIsIG5ldmVyKCkpLmxhdW5jaEZ1bGxTY3JlZW5JbnRlbnQoYW55KCkpCisKKyAgICAgICAgLy8gVkVSSUZZIHRoYXQgbm8gYWRkaXRpb25hbCBsb2dnaW5nIGhhcHBlbnMgZWl0aGVyCisgICAgICAgIHZlcmlmeShtTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlciwgbmV2ZXIoKSkKKyAgICAgICAgICAgICAgICAubG9nRnVsbFNjcmVlbkludGVudERlY2lzaW9uKGFueSgpLCBhbnkoKSkKICAgICB9CiAKICAgICBAVGVzdApAQCAtODM2LDggKzg4NiwxMSBAQAogICAgICAgICBzZXRTaG91bGRGdWxsU2NyZWVuKG1FbnRyeSwgRnVsbFNjcmVlbkludGVudERlY2lzaW9uLk5PX0ZTSV9TVVBQUkVTU0VEX09OTFlfQllfRE5EKQogICAgICAgICBtQ29sbGVjdGlvbkxpc3RlbmVyLm9uRW50cnlBZGRlZChtRW50cnkpCiAKLSAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgaXQgc2hvdWxkIG5vdCBoYXZlIGZ1bGwgc2NyZWVuZWQKLSAgICAgICAgdmVyaWZ5KG1MYXVuY2hGdWxsU2NyZWVuSW50ZW50UHJvdmlkZXIsIG5ldmVyKCkpLmxhdW5jaEZ1bGxTY3JlZW5JbnRlbnQobUVudHJ5KQorICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCBpdCBzaG91bGQgbm90IGhhdmUgZnVsbCBzY3JlZW5lZCwgYnV0IHNob3VsZCBoYXZlIGxvZ2dlZAorICAgICAgICB2ZXJpZnkobUxhdW5jaEZ1bGxTY3JlZW5JbnRlbnRQcm92aWRlciwgbmV2ZXIoKSkubGF1bmNoRnVsbFNjcmVlbkludGVudChhbnkoKSkKKyAgICAgICAgdmVyaWZ5KG1Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVyKS5sb2dGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24obUVudHJ5LAorICAgICAgICAgICAgICAgIEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5OT19GU0lfU1VQUFJFU1NFRF9PTkxZX0JZX0RORCkKKyAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlcikKIAogICAgICAgICAvLyBhbmQgaXQgaXMgdGhlbiB1cGRhdGVkIHRvIGFsbG93IGZ1bGwgc2NyZWVuIEFORCBIVU4KICAgICAgICAgc2V0U2hvdWxkRnVsbFNjcmVlbihtRW50cnksIEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5GU0lfREVWSUNFX05PVF9JTlRFUkFDVElWRSkKQEAgLTg0NywxMCArOTAwLDExMCBAQAogICAgICAgICBtQmVmb3JlVHJhbnNmb3JtR3JvdXBzTGlzdGVuZXIub25CZWZvcmVUcmFuc2Zvcm1Hcm91cHMobGlzdE9mKG1FbnRyeSkpCiAgICAgICAgIG1CZWZvcmVGaW5hbGl6ZUZpbHRlckxpc3RlbmVyLm9uQmVmb3JlRmluYWxpemVGaWx0ZXIobGlzdE9mKG1FbnRyeSkpCiAKLSAgICAgICAgLy8gVEhFTiBpdCBzaG91bGQgZnVsbCBzY3JlZW4gYnV0IGl0IHNob3VsZCBOT1QgSFVOCisgICAgICAgIC8vIFRIRU4gaXQgc2hvdWxkIGZ1bGwgc2NyZWVuIGFuZCBsb2cgYnV0IGl0IHNob3VsZCBOT1QgSFVOCiAgICAgICAgIHZlcmlmeShtTGF1bmNoRnVsbFNjcmVlbkludGVudFByb3ZpZGVyKS5sYXVuY2hGdWxsU2NyZWVuSW50ZW50KG1FbnRyeSkKICAgICAgICAgdmVyaWZ5KG1IZWFkc1VwVmlld0JpbmRlciwgbmV2ZXIoKSkuYmluZEhlYWRzVXBWaWV3KGFueSgpLCBhbnkoKSkKICAgICAgICAgdmVyaWZ5KG1IZWFkc1VwTWFuYWdlciwgbmV2ZXIoKSkuc2hvd05vdGlmaWNhdGlvbihhbnkoKSkKKyAgICAgICAgdmVyaWZ5KG1Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVyKS5sb2dGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24obUVudHJ5LAorICAgICAgICAgICAgICAgIEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5GU0lfREVWSUNFX05PVF9JTlRFUkFDVElWRSkKKyAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlcikKKworICAgICAgICAvLyBXSEVOIHJhbmtpbmcgdXBkYXRlcyBhZ2FpbiBhbmQgdGhlIHBpcGVsaW5lIHJlcnVucworICAgICAgICBjbGVhckludm9jYXRpb25zKG1MYXVuY2hGdWxsU2NyZWVuSW50ZW50UHJvdmlkZXIpCisgICAgICAgIG1Db2xsZWN0aW9uTGlzdGVuZXIub25SYW5raW5nQXBwbGllZCgpCisgICAgICAgIG1CZWZvcmVUcmFuc2Zvcm1Hcm91cHNMaXN0ZW5lci5vbkJlZm9yZVRyYW5zZm9ybUdyb3VwcyhsaXN0T2YobUVudHJ5KSkKKyAgICAgICAgbUJlZm9yZUZpbmFsaXplRmlsdGVyTGlzdGVuZXIub25CZWZvcmVGaW5hbGl6ZUZpbHRlcihsaXN0T2YobUVudHJ5KSkKKworICAgICAgICAvLyBWRVJJRlkgdGhhdCB0aGUgRlNJIGRvZXMgbm90IGxhdW5jaCBhZ2FpbiBvciBsb2cKKyAgICAgICAgdmVyaWZ5KG1MYXVuY2hGdWxsU2NyZWVuSW50ZW50UHJvdmlkZXIsIG5ldmVyKCkpLmxhdW5jaEZ1bGxTY3JlZW5JbnRlbnQoYW55KCkpCisgICAgICAgIHZlcmlmeShtTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlciwgbmV2ZXIoKSkKKyAgICAgICAgICAgICAgICAubG9nRnVsbFNjcmVlbkludGVudERlY2lzaW9uKGFueSgpLCBhbnkoKSkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biB0ZXN0T25SYW5raW5nQXBwbGllZF93aXRoT25seURuZFN1cHByZXNzaW9uQWxsb3dzRnNpTGF0ZXIoKSB7CisgICAgICAgIC8vIFR1cm4gb24gdGhlIGZlYXR1cmUKKyAgICAgICAgd2hlbmV2ZXIobUZsYWdzLmZzaU9uRE5EVXBkYXRlKCkpLnRoZW5SZXR1cm4odHJ1ZSkKKworICAgICAgICAvLyBHSVZFTiB0aGF0IG1FbnRyeSB3YXMgcHJldmlvdXNseSBzdXBwcmVzc2VkIGZyb20gZnVsbC1zY3JlZW4gb25seSBieSBETkQKKyAgICAgICAgc2V0U2hvdWxkRnVsbFNjcmVlbihtRW50cnksIEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5OT19GU0lfU1VQUFJFU1NFRF9PTkxZX0JZX0RORCkKKyAgICAgICAgbUNvbGxlY3Rpb25MaXN0ZW5lci5vbkVudHJ5QWRkZWQobUVudHJ5KQorCisgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIGl0IHNob3VsZCBub3QgaGF2ZSBmdWxsIHNjcmVlbmVkLCBidXQgc2hvdWxkIGhhdmUgbG9nZ2VkCisgICAgICAgIHZlcmlmeShtTGF1bmNoRnVsbFNjcmVlbkludGVudFByb3ZpZGVyLCBuZXZlcigpKS5sYXVuY2hGdWxsU2NyZWVuSW50ZW50KGFueSgpKQorICAgICAgICB2ZXJpZnkobU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXIpLmxvZ0Z1bGxTY3JlZW5JbnRlbnREZWNpc2lvbihtRW50cnksCisgICAgICAgICAgICAgICAgRnVsbFNjcmVlbkludGVudERlY2lzaW9uLk5PX0ZTSV9TVVBQUkVTU0VEX09OTFlfQllfRE5EKQorICAgICAgICBjbGVhckludm9jYXRpb25zKG1Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVyKQorCisgICAgICAgIC8vIHJhbmtpbmcgaXMgYXBwbGllZCB3aXRoIG9ubHkgRE5EIGJsb2NraW5nIEZTSQorICAgICAgICBzZXRTaG91bGRGdWxsU2NyZWVuKG1FbnRyeSwgRnVsbFNjcmVlbkludGVudERlY2lzaW9uLk5PX0ZTSV9TVVBQUkVTU0VEX09OTFlfQllfRE5EKQorICAgICAgICBtQ29sbGVjdGlvbkxpc3RlbmVyLm9uUmFua2luZ0FwcGxpZWQoKQorICAgICAgICBtQmVmb3JlVHJhbnNmb3JtR3JvdXBzTGlzdGVuZXIub25CZWZvcmVUcmFuc2Zvcm1Hcm91cHMobGlzdE9mKG1FbnRyeSkpCisgICAgICAgIG1CZWZvcmVGaW5hbGl6ZUZpbHRlckxpc3RlbmVyLm9uQmVmb3JlRmluYWxpemVGaWx0ZXIobGlzdE9mKG1FbnRyeSkpCisKKyAgICAgICAgLy8gVEhFTiBpdCBzaG91bGQgc3RpbGwgbm90IHlldCBmdWxsIHNjcmVlbiBvciBIVU4KKyAgICAgICAgdmVyaWZ5KG1MYXVuY2hGdWxsU2NyZWVuSW50ZW50UHJvdmlkZXIsIG5ldmVyKCkpLmxhdW5jaEZ1bGxTY3JlZW5JbnRlbnQoYW55KCkpCisgICAgICAgIHZlcmlmeShtSGVhZHNVcFZpZXdCaW5kZXIsIG5ldmVyKCkpLmJpbmRIZWFkc1VwVmlldyhhbnkoKSwgYW55KCkpCisgICAgICAgIHZlcmlmeShtSGVhZHNVcE1hbmFnZXIsIG5ldmVyKCkpLnNob3dOb3RpZmljYXRpb24oYW55KCkpCisKKyAgICAgICAgLy8gU2FtZSBkZWNpc2lvbiBhcyBiZWZvcmU7IGlzIG5vdCBsb2dnZWQKKyAgICAgICAgdmVyaWZ5KG1Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVyLCBuZXZlcigpKQorICAgICAgICAgICAgICAgIC5sb2dGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oYW55KCksIGFueSgpKQorICAgICAgICBjbGVhckludm9jYXRpb25zKG1Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVyKQorCisgICAgICAgIC8vIGFuZCBpdCBpcyB0aGVuIHVwZGF0ZWQgdG8gYWxsb3cgZnVsbCBzY3JlZW4gQU5EIEhVTgorICAgICAgICBzZXRTaG91bGRGdWxsU2NyZWVuKG1FbnRyeSwgRnVsbFNjcmVlbkludGVudERlY2lzaW9uLkZTSV9ERVZJQ0VfTk9UX0lOVEVSQUNUSVZFKQorICAgICAgICBzZXRTaG91bGRIZWFkc1VwKG1FbnRyeSkKKyAgICAgICAgd2hlbmV2ZXIobU5vdGlmUGlwZWxpbmUuYWxsTm90aWZzKS50aGVuUmV0dXJuKGxpc3RPZihtRW50cnkpKQorICAgICAgICBtQ29sbGVjdGlvbkxpc3RlbmVyLm9uUmFua2luZ0FwcGxpZWQoKQorICAgICAgICBtQmVmb3JlVHJhbnNmb3JtR3JvdXBzTGlzdGVuZXIub25CZWZvcmVUcmFuc2Zvcm1Hcm91cHMobGlzdE9mKG1FbnRyeSkpCisgICAgICAgIG1CZWZvcmVGaW5hbGl6ZUZpbHRlckxpc3RlbmVyLm9uQmVmb3JlRmluYWxpemVGaWx0ZXIobGlzdE9mKG1FbnRyeSkpCisKKyAgICAgICAgLy8gVEhFTiBpdCBzaG91bGQgZnVsbCBzY3JlZW4gYW5kIGxvZyBidXQgaXQgc2hvdWxkIE5PVCBIVU4KKyAgICAgICAgdmVyaWZ5KG1MYXVuY2hGdWxsU2NyZWVuSW50ZW50UHJvdmlkZXIpLmxhdW5jaEZ1bGxTY3JlZW5JbnRlbnQobUVudHJ5KQorICAgICAgICB2ZXJpZnkobUhlYWRzVXBWaWV3QmluZGVyLCBuZXZlcigpKS5iaW5kSGVhZHNVcFZpZXcoYW55KCksIGFueSgpKQorICAgICAgICB2ZXJpZnkobUhlYWRzVXBNYW5hZ2VyLCBuZXZlcigpKS5zaG93Tm90aWZpY2F0aW9uKGFueSgpKQorICAgICAgICB2ZXJpZnkobU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXIpLmxvZ0Z1bGxTY3JlZW5JbnRlbnREZWNpc2lvbihtRW50cnksCisgICAgICAgICAgICAgICAgRnVsbFNjcmVlbkludGVudERlY2lzaW9uLkZTSV9ERVZJQ0VfTk9UX0lOVEVSQUNUSVZFKQorICAgICAgICBjbGVhckludm9jYXRpb25zKG1Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVyKQorICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHRlc3RPblJhbmtpbmdBcHBsaWVkX25ld05vbkZ1bGxTY3JlZW5BbnN3ZXJJbnZhbGlkYXRlc0NhbmRpZGF0ZSgpIHsKKyAgICAgICAgLy8gVHVybiBvbiB0aGUgZmVhdHVyZQorICAgICAgICB3aGVuZXZlcihtRmxhZ3MuZnNpT25ETkRVcGRhdGUoKSkudGhlblJldHVybih0cnVlKQorCisgICAgICAgIC8vIEdJVkVOIHRoYXQgbUVudHJ5IHdhcyBwcmV2aW91c2x5IHN1cHByZXNzZWQgZnJvbSBmdWxsLXNjcmVlbiBvbmx5IGJ5IERORAorICAgICAgICB3aGVuZXZlcihtTm90aWZQaXBlbGluZS5hbGxOb3RpZnMpLnRoZW5SZXR1cm4obGlzdE9mKG1FbnRyeSkpCisgICAgICAgIHNldFNob3VsZEZ1bGxTY3JlZW4obUVudHJ5LCBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlNJX1NVUFBSRVNTRURfT05MWV9CWV9ETkQpCisgICAgICAgIG1Db2xsZWN0aW9uTGlzdGVuZXIub25FbnRyeUFkZGVkKG1FbnRyeSkKKworICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCBpdCBzaG91bGQgbm90IGhhdmUgZnVsbCBzY3JlZW5lZAorICAgICAgICB2ZXJpZnkobUxhdW5jaEZ1bGxTY3JlZW5JbnRlbnRQcm92aWRlciwgbmV2ZXIoKSkubGF1bmNoRnVsbFNjcmVlbkludGVudChtRW50cnkpCisKKyAgICAgICAgLy8gbm93IHNvbWUgb3RoZXIgY29uZGl0aW9uIGJsb2NrcyBGU0kgaW4gYWRkaXRpb24gdG8gRE5ECisgICAgICAgIHNldFNob3VsZEZ1bGxTY3JlZW4obUVudHJ5LCBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlNJX1NVUFBSRVNTRURfQllfRE5EKQorICAgICAgICBtQ29sbGVjdGlvbkxpc3RlbmVyLm9uUmFua2luZ0FwcGxpZWQoKQorICAgICAgICBtQmVmb3JlVHJhbnNmb3JtR3JvdXBzTGlzdGVuZXIub25CZWZvcmVUcmFuc2Zvcm1Hcm91cHMobGlzdE9mKG1FbnRyeSkpCisgICAgICAgIG1CZWZvcmVGaW5hbGl6ZUZpbHRlckxpc3RlbmVyLm9uQmVmb3JlRmluYWxpemVGaWx0ZXIobGlzdE9mKG1FbnRyeSkpCisKKyAgICAgICAgLy8gVEhFTiBpdCBzaG91bGQgTk9UIGZ1bGwgc2NyZWVuIG9yIEhVTgorICAgICAgICB2ZXJpZnkobUxhdW5jaEZ1bGxTY3JlZW5JbnRlbnRQcm92aWRlciwgbmV2ZXIoKSkubGF1bmNoRnVsbFNjcmVlbkludGVudChhbnkoKSkKKyAgICAgICAgdmVyaWZ5KG1IZWFkc1VwVmlld0JpbmRlciwgbmV2ZXIoKSkuYmluZEhlYWRzVXBWaWV3KGFueSgpLCBhbnkoKSkKKyAgICAgICAgdmVyaWZ5KG1IZWFkc1VwTWFuYWdlciwgbmV2ZXIoKSkuc2hvd05vdGlmaWNhdGlvbihhbnkoKSkKKworICAgICAgICAvLyBOT1cgdGhlIERORCBsb2dpYyBjaGFuZ2VzIGFuZCBGU0kgYW5kIEhVTiBhcmUgYXZhaWxhYmxlCisgICAgICAgIGNsZWFySW52b2NhdGlvbnMobUxhdW5jaEZ1bGxTY3JlZW5JbnRlbnRQcm92aWRlcikKKyAgICAgICAgc2V0U2hvdWxkRnVsbFNjcmVlbihtRW50cnksIEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5GU0lfREVWSUNFX05PVF9JTlRFUkFDVElWRSkKKyAgICAgICAgc2V0U2hvdWxkSGVhZHNVcChtRW50cnkpCisgICAgICAgIG1Db2xsZWN0aW9uTGlzdGVuZXIub25SYW5raW5nQXBwbGllZCgpCisgICAgICAgIG1CZWZvcmVUcmFuc2Zvcm1Hcm91cHNMaXN0ZW5lci5vbkJlZm9yZVRyYW5zZm9ybUdyb3VwcyhsaXN0T2YobUVudHJ5KSkKKyAgICAgICAgbUJlZm9yZUZpbmFsaXplRmlsdGVyTGlzdGVuZXIub25CZWZvcmVGaW5hbGl6ZUZpbHRlcihsaXN0T2YobUVudHJ5KSkKKworICAgICAgICAvLyBWRVJJRlkgdGhhdCB0aGUgRlNJIGRpZG4ndCBoYXBwZW4sIGJ1dCB0aGF0IHdlIGRvIEhVTgorICAgICAgICB2ZXJpZnkobUxhdW5jaEZ1bGxTY3JlZW5JbnRlbnRQcm92aWRlciwgbmV2ZXIoKSkubGF1bmNoRnVsbFNjcmVlbkludGVudChhbnkoKSkKKyAgICAgICAgZmluaXNoQmluZChtRW50cnkpCisgICAgICAgIHZlcmlmeShtSGVhZHNVcE1hbmFnZXIpLnNob3dOb3RpZmljYXRpb24obUVudHJ5KQogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9pbnRlcnJ1cHRpb24vTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGxUZXN0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9pbnRlcnJ1cHRpb24vTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGxUZXN0LmphdmEKaW5kZXggMDdkMGRiZC4uNjUzYjBjNyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vaW50ZXJydXB0aW9uL05vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL2ludGVycnVwdGlvbi9Ob3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbFRlc3QuamF2YQpAQCAtMzYsOSArMzYsMTIgQEAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55SW50OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUxvbmc7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuY29udGFpbnM7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuZXE7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uY2xlYXJJbnZvY2F0aW9uczsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5uZXZlcjsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CkBAIC01MSw3ICs1NCw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuc2VydmljZS5kcmVhbXMuSURyZWFtTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlc3RpbmcuQW5kcm9pZFRlc3RpbmdSdW5uZXI7CiAKIGltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwpAQCAtNzYsNiArNzgsMTAgQEAKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NrOwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKwogLyoqCiAgKiBUZXN0cyBmb3IgdGhlIGludGVycnVwdGlvbiBzdGF0ZSBwcm92aWRlciB3aGljaCB1bmRlcnN0YW5kcyB3aGV0aGVyIHRoZSBzeXN0ZW0gJiBub3RpZmljYXRpb24KICAqIGlzIGluIGEgc3RhdGUgYWxsb3dpbmcgYSBwYXJ0aWN1bGFyIG5vdGlmaWNhdGlvbiB0byBodW4sIHB1bHNlLCBvciBidWJibGUuCkBAIC04Nyw4ICs5Myw2IEBACiAgICAgQE1vY2sKICAgICBQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKICAgICBATW9jawotICAgIElEcmVhbU1hbmFnZXIgbURyZWFtTWFuYWdlcjsKLSAgICBATW9jawogICAgIEFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiBtQW1iaWVudERpc3BsYXlDb25maWd1cmF0aW9uOwogICAgIEBNb2NrCiAgICAgU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyIG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXI7CkBAIC0xMjYsNyArMTMwLDYgQEAKICAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGwoCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtRHJlYW1NYW5hZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgbUFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5Q29udHJvbGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIsCkBAIC0xNTAsNyArMTUzLDcgQEAKICAgICAgICAgd2hlbihtSGVhZHNVcE1hbmFnZXIuaXNTbm9vemVkKGFueSgpKSkudGhlblJldHVybihmYWxzZSk7CiAKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRG96aW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgfQogCkBAIC0zNTIsNyArMzU1LDcgQEAKIAogICAgICAgICAvLyBBbHNvIG5vdCBpbiB1c2UgaWYgc2NyZWVuIGlzIG9uIGJ1dCB3ZSdyZSBzaG93aW5nIHNjcmVlbiBzYXZlciAvICJkcmVhbWluZyIKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzRGV2aWNlSWRsZU1vZGUoKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybih0cnVlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgYXNzZXJ0VGhhdChtTm90aWZJbnRlcnJ1cHRpb25TdGF0ZVByb3ZpZGVyLnNob3VsZEhlYWRzVXAoZW50cnkpKS5pc0ZhbHNlKCk7CiAgICAgfQogCkBAIC01MzIsNyArNTM1LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkTm90RnVsbFNjcmVlbl9ub3RQZW5kaW5nSW50ZW50KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc0ludGVyYWN0aXZlKCkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogCiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5nZXRGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oZW50cnkpKQpAQCAtNTUxLDcgKzU1NCw3IEBACiAgICAgICAgICAgICAgICAgLnNldFN1cHByZXNzZWRWaXN1YWxFZmZlY3RzKFNVUFBSRVNTRURfRUZGRUNUX0ZVTExfU0NSRUVOX0lOVEVOVCkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzSW50ZXJhY3RpdmUoKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogCiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5nZXRGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oZW50cnkpKQpAQCAtNTYwLDcgKzU2Myw3IEBACiAgICAgICAgICAgICAgICAgLmlzRmFsc2UoKTsKICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIsIG5ldmVyKCkpLmxvZ0Z1bGxzY3JlZW4oYW55KCksIGFueSgpKTsKICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIsIG5ldmVyKCkpLmxvZ05vRnVsbHNjcmVlbldhcm5pbmcoYW55KCksIGFueSgpKTsKLSAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ05vRnVsbHNjcmVlbihlbnRyeSwgIlN1cHByZXNzZWQgYnkgRE5EIik7CisgICAgICAgIHZlcmlmeShtTG9nZ2VyKS5sb2dOb0Z1bGxzY3JlZW4oZW50cnksICJOT19GU0lfU1VQUFJFU1NFRF9PTkxZX0JZX0RORCIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC01NzAsNyArNTczLDcgQEAKICAgICAgICAgICAgICAgICAuc2V0U3VwcHJlc3NlZFZpc3VhbEVmZmVjdHMoU1VQUFJFU1NFRF9FRkZFQ1RfRlVMTF9TQ1JFRU5fSU5URU5UKQogICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUoKSkudGhlblJldHVybihTSEFERSk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChtTm90aWZJbnRlcnJ1cHRpb25TdGF0ZVByb3ZpZGVyLmdldEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbihlbnRyeSkpCkBAIC01NzksNyArNTgyLDcgQEAKICAgICAgICAgICAgICAgICAuaXNGYWxzZSgpOwogICAgICAgICB2ZXJpZnkobUxvZ2dlciwgbmV2ZXIoKSkubG9nRnVsbHNjcmVlbihhbnkoKSwgYW55KCkpOwogICAgICAgICB2ZXJpZnkobUxvZ2dlciwgbmV2ZXIoKSkubG9nTm9GdWxsc2NyZWVuV2FybmluZyhhbnkoKSwgYW55KCkpOwotICAgICAgICB2ZXJpZnkobUxvZ2dlcikubG9nTm9GdWxsc2NyZWVuKGVudHJ5LCAiU3VwcHJlc3NlZCBieSBETkQiKTsKKyAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ05vRnVsbHNjcmVlbihlbnRyeSwgIk5PX0ZTSV9TVVBQUkVTU0VEX0JZX0RORCIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC01OTIsMTQgKzU5NSwxNCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGROb3RGdWxsU2NyZWVuX25vdEhpZ2hJbXBvcnRhbmNlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfREVGQVVMVCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSgpKS50aGVuUmV0dXJuKFNIQURFKTsKIAogICAgICAgICBhc3NlcnRUaGF0KG1Ob3RpZkludGVycnVwdGlvblN0YXRlUHJvdmlkZXIuZ2V0RnVsbFNjcmVlbkludGVudERlY2lzaW9uKGVudHJ5KSkKICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5OT19GU0lfTk9UX0lNUE9SVEFOVF9FTk9VR0gpOwogICAgICAgICBhc3NlcnRUaGF0KG1Ob3RpZkludGVycnVwdGlvblN0YXRlUHJvdmlkZXIuc2hvdWxkTGF1bmNoRnVsbFNjcmVlbkludGVudFdoZW5BZGRlZChlbnRyeSkpCiAgICAgICAgICAgICAgICAgLmlzRmFsc2UoKTsKLSAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ05vRnVsbHNjcmVlbihlbnRyeSwgIk5vdCBpbXBvcnRhbnQgZW5vdWdoIik7CisgICAgICAgIHZlcmlmeShtTG9nZ2VyKS5sb2dOb0Z1bGxzY3JlZW4oZW50cnksICJOT19GU0lfTk9UX0lNUE9SVEFOVF9FTk9VR0giKTsKICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIsIG5ldmVyKCkpLmxvZ05vRnVsbHNjcmVlbldhcm5pbmcoYW55KCksIGFueSgpKTsKICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIsIG5ldmVyKCkpLmxvZ0Z1bGxzY3JlZW4oYW55KCksIGFueSgpKTsKICAgICB9CkBAIC02MTQsNyArNjE3LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkTm90RnVsbFNjcmVlbl9pc0dyb3VwQWxlcnRTaWxlbmNlZCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBOb3RpZmljYXRpb25FbnRyeSBlbnRyeSA9IGNyZWF0ZUZzaU5vdGlmaWNhdGlvbihJTVBPUlRBTkNFX0hJR0gsIC8qIHNpbGVuY2VkICovIHRydWUpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybih0cnVlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oS0VZR1VBUkQpOwogCiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5nZXRGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oZW50cnkpKQpAQCAtNjIyLDcgKzYyNSw4IEBACiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5zaG91bGRMYXVuY2hGdWxsU2NyZWVuSW50ZW50V2hlbkFkZGVkKGVudHJ5KSkKICAgICAgICAgICAgICAgICAuaXNGYWxzZSgpOwogICAgICAgICB2ZXJpZnkobUxvZ2dlciwgbmV2ZXIoKSkubG9nTm9GdWxsc2NyZWVuKGFueSgpLCBhbnkoKSk7Ci0gICAgICAgIHZlcmlmeShtTG9nZ2VyKS5sb2dOb0Z1bGxzY3JlZW5XYXJuaW5nKGVudHJ5LCAiR3JvdXBBbGVydEJlaGF2aW9yIHdpbGwgcHJldmVudCBIVU4iKTsKKyAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ05vRnVsbHNjcmVlbldhcm5pbmcoZW50cnksCisgICAgICAgICAgICAgICAgIk5PX0ZTSV9TVVBQUkVTU0lWRV9HUk9VUF9BTEVSVF9CRUhBVklPUjogR3JvdXBBbGVydEJlaGF2aW9yIHdpbGwgcHJldmVudCBIVU4iKTsKICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIsIG5ldmVyKCkpLmxvZ0Z1bGxzY3JlZW4oYW55KCksIGFueSgpKTsKIAogICAgICAgICBhc3NlcnRUaGF0KG1VaUV2ZW50TG9nZ2VyRmFrZS5udW1Mb2dzKCkpLmlzRXF1YWxUbygxKTsKQEAgLTY0Myw3ICs2NDcsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRGdWxsU2NyZWVuX25vdEludGVyYWN0aXZlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUoKSkudGhlblJldHVybihTSEFERSk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChtTm90aWZJbnRlcnJ1cHRpb25TdGF0ZVByb3ZpZGVyLmdldEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbihlbnRyeSkpCkBAIC02NTIsNyArNjU2LDcgQEAKICAgICAgICAgICAgICAgICAuaXNUcnVlKCk7CiAgICAgICAgIHZlcmlmeShtTG9nZ2VyLCBuZXZlcigpKS5sb2dOb0Z1bGxzY3JlZW4oYW55KCksIGFueSgpKTsKICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIsIG5ldmVyKCkpLmxvZ05vRnVsbHNjcmVlbldhcm5pbmcoYW55KCksIGFueSgpKTsKLSAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ0Z1bGxzY3JlZW4oZW50cnksICJEZXZpY2UgaXMgbm90IGludGVyYWN0aXZlIik7CisgICAgICAgIHZlcmlmeShtTG9nZ2VyKS5sb2dGdWxsc2NyZWVuKGVudHJ5LCAiRlNJX0RFVklDRV9OT1RfSU5URVJBQ1RJVkUiKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNjY1LDcgKzY2OSw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEZ1bGxTY3JlZW5faXNEcmVhbWluZygpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBOb3RpZmljYXRpb25FbnRyeSBlbnRyeSA9IGNyZWF0ZUZzaU5vdGlmaWNhdGlvbihJTVBPUlRBTkNFX0hJR0gsIC8qIHNpbGVuY2VkICovIGZhbHNlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzSW50ZXJhY3RpdmUoKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybih0cnVlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogCiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5nZXRGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24oZW50cnkpKQpAQCAtNjc0LDcgKzY3OCw3IEBACiAgICAgICAgICAgICAgICAgLmlzVHJ1ZSgpOwogICAgICAgICB2ZXJpZnkobUxvZ2dlciwgbmV2ZXIoKSkubG9nTm9GdWxsc2NyZWVuKGFueSgpLCBhbnkoKSk7CiAgICAgICAgIHZlcmlmeShtTG9nZ2VyLCBuZXZlcigpKS5sb2dOb0Z1bGxzY3JlZW5XYXJuaW5nKGFueSgpLCBhbnkoKSk7Ci0gICAgICAgIHZlcmlmeShtTG9nZ2VyKS5sb2dGdWxsc2NyZWVuKGVudHJ5LCAiRGV2aWNlIGlzIGRyZWFtaW5nIik7CisgICAgICAgIHZlcmlmeShtTG9nZ2VyKS5sb2dGdWxsc2NyZWVuKGVudHJ5LCAiRlNJX0RFVklDRV9JU19EUkVBTUlORyIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC02ODcsNyArNjkxLDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkRnVsbFNjcmVlbl9vbktleWd1YXJkKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSgpKS50aGVuUmV0dXJuKEtFWUdVQVJEKTsKIAogICAgICAgICBhc3NlcnRUaGF0KG1Ob3RpZkludGVycnVwdGlvblN0YXRlUHJvdmlkZXIuZ2V0RnVsbFNjcmVlbkludGVudERlY2lzaW9uKGVudHJ5KSkKQEAgLTY5Niw3ICs3MDAsNyBAQAogICAgICAgICAgICAgICAgIC5pc1RydWUoKTsKICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIsIG5ldmVyKCkpLmxvZ05vRnVsbHNjcmVlbihhbnkoKSwgYW55KCkpOwogICAgICAgICB2ZXJpZnkobUxvZ2dlciwgbmV2ZXIoKSkubG9nTm9GdWxsc2NyZWVuV2FybmluZyhhbnkoKSwgYW55KCkpOwotICAgICAgICB2ZXJpZnkobUxvZ2dlcikubG9nRnVsbHNjcmVlbihlbnRyeSwgIktleWd1YXJkIGlzIHNob3dpbmciKTsKKyAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ0Z1bGxzY3JlZW4oZW50cnksICJGU0lfS0VZR1VBUkRfU0hPV0lORyIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC03MTAsMTQgKzcxNCwxNCBAQAogICAgICAgICBOb3RpZmljYXRpb25FbnRyeSBlbnRyeSA9IGNyZWF0ZUZzaU5vdGlmaWNhdGlvbihJTVBPUlRBTkNFX0hJR0gsIC8qIHNpbGVuY2VkICovIGZhbHNlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzSW50ZXJhY3RpdmUoKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUoKSkudGhlblJldHVybihTSEFERSk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChtTm90aWZJbnRlcnJ1cHRpb25TdGF0ZVByb3ZpZGVyLmdldEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbihlbnRyeSkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlNJX0VYUEVDVEVEX1RPX0hVTik7CiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5zaG91bGRMYXVuY2hGdWxsU2NyZWVuSW50ZW50V2hlbkFkZGVkKGVudHJ5KSkKICAgICAgICAgICAgICAgICAuaXNGYWxzZSgpOwotICAgICAgICB2ZXJpZnkobUxvZ2dlcikubG9nTm9GdWxsc2NyZWVuKGVudHJ5LCAiRXhwZWN0ZWQgdG8gSFVOIik7CisgICAgICAgIHZlcmlmeShtTG9nZ2VyKS5sb2dOb0Z1bGxzY3JlZW4oZW50cnksICJOT19GU0lfRVhQRUNURURfVE9fSFVOIik7CiAgICAgICAgIHZlcmlmeShtTG9nZ2VyLCBuZXZlcigpKS5sb2dOb0Z1bGxzY3JlZW5XYXJuaW5nKGFueSgpLCBhbnkoKSk7CiAgICAgICAgIHZlcmlmeShtTG9nZ2VyLCBuZXZlcigpKS5sb2dGdWxsc2NyZWVuKGFueSgpLCBhbnkoKSk7CiAgICAgfQpAQCAtNzI3LDcgKzczMSw3IEBACiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSgpKS50aGVuUmV0dXJuKFNIQURFKTsKICAgICAgICAgd2hlbihtSGVhZHNVcE1hbmFnZXIuaXNTbm9vemVkKCJhIikpLnRoZW5SZXR1cm4odHJ1ZSk7CiAKQEAgLTczNyw3ICs3NDEsNyBAQAogICAgICAgICAgICAgICAgIC5pc1RydWUoKTsKICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIsIG5ldmVyKCkpLmxvZ05vRnVsbHNjcmVlbihhbnkoKSwgYW55KCkpOwogICAgICAgICB2ZXJpZnkobUxvZ2dlciwgbmV2ZXIoKSkubG9nTm9GdWxsc2NyZWVuV2FybmluZyhhbnkoKSwgYW55KCkpOwotICAgICAgICB2ZXJpZnkobUxvZ2dlcikubG9nRnVsbHNjcmVlbihlbnRyeSwgIkV4cGVjdGVkIG5vdCB0byBIVU4iKTsKKyAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ0Z1bGxzY3JlZW4oZW50cnksICJGU0lfRVhQRUNURURfTk9UX1RPX0hVTiIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC03NDYsNyArNzUwLDcgQEAKICAgICAgICAgTm90aWZpY2F0aW9uRW50cnkgZW50cnkgPSBjcmVhdGVGc2lOb3RpZmljYXRpb24oSU1QT1JUQU5DRV9ISUdILCAvKiBzaWxlbmNlZCAqLyBmYWxzZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc0ludGVyYWN0aXZlKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogICAgICAgICB3aGVuKG1IZWFkc1VwTWFuYWdlci5pc1Nub296ZWQoImEiKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIuaXNTaG93aW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CkBAIC03NTYsNyArNzYwLDcgQEAKICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5OT19GU0lfRVhQRUNURURfVE9fSFVOKTsKICAgICAgICAgYXNzZXJ0VGhhdChtTm90aWZJbnRlcnJ1cHRpb25TdGF0ZVByb3ZpZGVyLnNob3VsZExhdW5jaEZ1bGxTY3JlZW5JbnRlbnRXaGVuQWRkZWQoZW50cnkpKQogICAgICAgICAgICAgICAgIC5pc0ZhbHNlKCk7Ci0gICAgICAgIHZlcmlmeShtTG9nZ2VyKS5sb2dOb0Z1bGxzY3JlZW4oZW50cnksICJFeHBlY3RlZCB0byBIVU4iKTsKKyAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ05vRnVsbHNjcmVlbihlbnRyeSwgIk5PX0ZTSV9FWFBFQ1RFRF9UT19IVU4iKTsKICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIsIG5ldmVyKCkpLmxvZ05vRnVsbHNjcmVlbldhcm5pbmcoYW55KCksIGFueSgpKTsKICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIsIG5ldmVyKCkpLmxvZ0Z1bGxzY3JlZW4oYW55KCksIGFueSgpKTsKICAgICB9CkBAIC03NjcsNyArNzcxLDcgQEAKICAgICAgICAgTm90aWZpY2F0aW9uRW50cnkgZW50cnkgPSBjcmVhdGVGc2lOb3RpZmljYXRpb24oSU1QT1JUQU5DRV9ISUdILCAvKiBzaWxlbmNlZCAqLyBmYWxzZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc0ludGVyYWN0aXZlKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREUpOwogICAgICAgICB3aGVuKG1IZWFkc1VwTWFuYWdlci5pc1Nub296ZWQoImEiKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIuaXNTaG93aW5nKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CkBAIC03OTIsNyArNzk2LDcgQEAKICAgICAgICAgTm90aWZpY2F0aW9uRW50cnkgZW50cnkgPSBjcmVhdGVGc2lOb3RpZmljYXRpb24oSU1QT1JUQU5DRV9ISUdILCAvKiBzaWxlbmNlZCAqLyBmYWxzZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc0ludGVyYWN0aXZlKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLnRoZW5SZXR1cm4odHJ1ZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmdldFN0YXRlKCkpLnRoZW5SZXR1cm4oU0hBREVfTE9DS0VEKTsKICAgICAgICAgd2hlbihtSGVhZHNVcE1hbmFnZXIuaXNTbm9vemVkKCJhIikpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obUtleWd1YXJkU3RhdGVDb250cm9sbGVyLmlzU2hvd2luZygpKS50aGVuUmV0dXJuKHRydWUpOwpAQCAtODAyLDcgKzgwNiw3IEBACiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlNJX0VYUEVDVEVEX1RPX0hVTik7CiAgICAgICAgIGFzc2VydFRoYXQobU5vdGlmSW50ZXJydXB0aW9uU3RhdGVQcm92aWRlci5zaG91bGRMYXVuY2hGdWxsU2NyZWVuSW50ZW50V2hlbkFkZGVkKGVudHJ5KSkKICAgICAgICAgICAgICAgICAuaXNGYWxzZSgpOwotICAgICAgICB2ZXJpZnkobUxvZ2dlcikubG9nTm9GdWxsc2NyZWVuKGVudHJ5LCAiRXhwZWN0ZWQgdG8gSFVOIik7CisgICAgICAgIHZlcmlmeShtTG9nZ2VyKS5sb2dOb0Z1bGxzY3JlZW4oZW50cnksICJOT19GU0lfRVhQRUNURURfVE9fSFVOIik7CiAgICAgICAgIHZlcmlmeShtTG9nZ2VyLCBuZXZlcigpKS5sb2dOb0Z1bGxzY3JlZW5XYXJuaW5nKGFueSgpLCBhbnkoKSk7CiAgICAgICAgIHZlcmlmeShtTG9nZ2VyLCBuZXZlcigpKS5sb2dGdWxsc2NyZWVuKGFueSgpLCBhbnkoKSk7CiAgICAgfQpAQCAtODEzLDcgKzgxNyw3IEBACiAgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNJbnRlcmFjdGl2ZSgpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS50aGVuUmV0dXJuKHRydWUpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSgpKS50aGVuUmV0dXJuKFNIQURFX0xPQ0tFRCk7CiAgICAgICAgIHdoZW4obUhlYWRzVXBNYW5hZ2VyLmlzU25vb3plZCgiYSIpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1LZXlndWFyZFN0YXRlQ29udHJvbGxlci5pc1Nob3dpbmcoKSkudGhlblJldHVybih0cnVlKTsKQEAgLTgzOCw3ICs4NDIsNyBAQAogICAgICAgICBOb3RpZmljYXRpb25FbnRyeSBlbnRyeSA9IGNyZWF0ZUZzaU5vdGlmaWNhdGlvbihJTVBPUlRBTkNFX0hJR0gsIC8qIHNpbGVuY2VkICovIGZhbHNlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzSW50ZXJhY3RpdmUoKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUoKSkudGhlblJldHVybihTSEFERSk7CiAgICAgICAgIHdoZW4obUhlYWRzVXBNYW5hZ2VyLmlzU25vb3plZCgiYSIpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1LZXlndWFyZFN0YXRlQ29udHJvbGxlci5pc1Nob3dpbmcoKSkudGhlblJldHVybihmYWxzZSk7CkBAIC04NDgsMTggKzg1Miw0MyBAQAogICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oRnVsbFNjcmVlbkludGVudERlY2lzaW9uLk5PX0ZTSV9FWFBFQ1RFRF9UT19IVU4pOwogICAgICAgICBhc3NlcnRUaGF0KG1Ob3RpZkludGVycnVwdGlvblN0YXRlUHJvdmlkZXIuc2hvdWxkTGF1bmNoRnVsbFNjcmVlbkludGVudFdoZW5BZGRlZChlbnRyeSkpCiAgICAgICAgICAgICAgICAgLmlzRmFsc2UoKTsKLSAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ05vRnVsbHNjcmVlbihlbnRyeSwgIkV4cGVjdGVkIHRvIEhVTiIpOworICAgICAgICB2ZXJpZnkobUxvZ2dlcikubG9nTm9GdWxsc2NyZWVuKGVudHJ5LCAiTk9fRlNJX0VYUEVDVEVEX1RPX0hVTiIpOwogICAgICAgICB2ZXJpZnkobUxvZ2dlciwgbmV2ZXIoKSkubG9nTm9GdWxsc2NyZWVuV2FybmluZyhhbnkoKSwgYW55KCkpOwogICAgICAgICB2ZXJpZnkobUxvZ2dlciwgbmV2ZXIoKSkubG9nRnVsbHNjcmVlbihhbnkoKSwgYW55KCkpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbG9nRnVsbFNjcmVlbkludGVudERlY2lzaW9uX3Nob3VsZEFsbW9zdEFsd2F5c0xvZ09uZVRpbWUoKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbkVudHJ5IGVudHJ5ID0gY3JlYXRlRnNpTm90aWZpY2F0aW9uKElNUE9SVEFOQ0VfSElHSCwgLyogc2lsZW5jZWQgKi8gZmFsc2UpOworICAgICAgICBTZXQ8RnVsbFNjcmVlbkludGVudERlY2lzaW9uPiB3YXJuaW5ncyA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBGdWxsU2NyZWVuSW50ZW50RGVjaXNpb24uTk9fRlNJX1NVUFBSRVNTSVZFX0dST1VQX0FMRVJUX0JFSEFWSU9SLAorICAgICAgICAgICAgICAgIEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5OT19GU0lfTk9fSFVOX09SX0tFWUdVQVJECisgICAgICAgICkpOworICAgICAgICBmb3IgKEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbiBkZWNpc2lvbiA6IEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi52YWx1ZXMoKSkgeworICAgICAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtTG9nZ2VyKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZXhwZWN0ZWRUb0xvZyA9IGRlY2lzaW9uICE9IEZ1bGxTY3JlZW5JbnRlbnREZWNpc2lvbi5OT19GVUxMX1NDUkVFTl9JTlRFTlQ7CisgICAgICAgICAgICBib29sZWFuIGlzV2FybmluZyA9IHdhcm5pbmdzLmNvbnRhaW5zKGRlY2lzaW9uKTsKKyAgICAgICAgICAgIG1Ob3RpZkludGVycnVwdGlvblN0YXRlUHJvdmlkZXIubG9nRnVsbFNjcmVlbkludGVudERlY2lzaW9uKGVudHJ5LCBkZWNpc2lvbik7CisgICAgICAgICAgICBpZiAoZGVjaXNpb24uc2hvdWxkTGF1bmNoKSB7CisgICAgICAgICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ0Z1bGxzY3JlZW4oZXEoZW50cnkpLCBjb250YWlucyhkZWNpc2lvbi5uYW1lKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUb0xvZykgeworICAgICAgICAgICAgICAgIGlmIChpc1dhcm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgdmVyaWZ5KG1Mb2dnZXIpLmxvZ05vRnVsbHNjcmVlbldhcm5pbmcoZXEoZW50cnkpLCBjb250YWlucyhkZWNpc2lvbi5uYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2ZXJpZnkobUxvZ2dlcikubG9nTm9GdWxsc2NyZWVuKGVxKGVudHJ5KSwgY29udGFpbnMoZGVjaXNpb24ubmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKG1Mb2dnZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkSGVhZHNVcF9zbm9vemVkX3VubG9ja2VkX3dpdGhTdHJpY3RSdWxlcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3aGVuKG1GbGFncy5mdWxsU2NyZWVuSW50ZW50UmVxdWlyZXNLZXlndWFyZCgpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICBOb3RpZmljYXRpb25FbnRyeSBlbnRyeSA9IGNyZWF0ZUZzaU5vdGlmaWNhdGlvbihJTVBPUlRBTkNFX0hJR0gsIC8qIHNpbGVuY2VkICovIGZhbHNlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzSW50ZXJhY3RpdmUoKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUoKSkudGhlblJldHVybihTSEFERSk7CiAgICAgICAgIHdoZW4obUhlYWRzVXBNYW5hZ2VyLmlzU25vb3plZCgiYSIpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1LZXlndWFyZFN0YXRlQ29udHJvbGxlci5pc1Nob3dpbmcoKSkudGhlblJldHVybihmYWxzZSk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvRXhwYW5kYWJsZU5vdGlmaWNhdGlvblJvd0NvbnRyb2xsZXJUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L0V4cGFuZGFibGVOb3RpZmljYXRpb25Sb3dDb250cm9sbGVyVGVzdC5rdAppbmRleCBmYjNhYmExLi42MGJjM2E0IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvRXhwYW5kYWJsZU5vdGlmaWNhdGlvblJvd0NvbnRyb2xsZXJUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9FeHBhbmRhYmxlTm90aWZpY2F0aW9uUm93Q29udHJvbGxlclRlc3Qua3QKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRlc3RpbmcuVGVzdGFibGVMb29wZXIKIGltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9nZ2luZy5NZXRyaWNzTG9nZ2VyCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuU3lzdWlUZXN0Q2FzZQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNsYXNzaWZpZXIuRmFsc2luZ0NvbGxlY3RvcgogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmZsYWdzLkZlYXR1cmVGbGFncwpAQCAtMjgsNyArMjksNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuRmFsc2luZ01hbmFnZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLlBsdWdpbk1hbmFnZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5wbHVnaW5zLnN0YXR1c2Jhci5TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTm90aWZpY2F0aW9uTWVkaWFNYW5hZ2VyCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlNtYXJ0UmVwbHlDb250cm9sbGVyCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLm5vdGlmaWNhdGlvbi5jb2xsZWN0aW9uLnByb3ZpZGVyLk5vdGlmaWNhdGlvbkRpc21pc3NpYmlsaXR5UHJvdmlkZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIubm90aWZpY2F0aW9uLmNvbGxlY3Rpb24ucmVuZGVyLkZha2VOb2RlQ29udHJvbGxlcgpAQCAtNzMsNyArNzMsNiBAQAogICAgIHByaXZhdGUgdmFsIGxvZ0J1ZmZlckxvZ2dlcjogTm90aWZpY2F0aW9uUm93TG9nZ2VyID0gbW9jaygpCiAgICAgcHJpdmF0ZSB2YWwgbGlzdENvbnRhaW5lcjogTm90aWZpY2F0aW9uTGlzdENvbnRhaW5lciA9IG1vY2soKQogICAgIHByaXZhdGUgdmFsIGNoaWxkcmVuQ29udGFpbmVyOiBOb3RpZmljYXRpb25DaGlsZHJlbkNvbnRhaW5lciA9IG1vY2soKQotICAgIHByaXZhdGUgdmFsIG1lZGlhTWFuYWdlcjogTm90aWZpY2F0aW9uTWVkaWFNYW5hZ2VyID0gbW9jaygpCiAgICAgcHJpdmF0ZSB2YWwgc21hcnRSZXBseUNvbnN0YW50czogU21hcnRSZXBseUNvbnN0YW50cyA9IG1vY2soKQogICAgIHByaXZhdGUgdmFsIHNtYXJ0UmVwbHlDb250cm9sbGVyOiBTbWFydFJlcGx5Q29udHJvbGxlciA9IG1vY2soKQogICAgIHByaXZhdGUgdmFsIHBsdWdpbk1hbmFnZXI6IFBsdWdpbk1hbmFnZXIgPSBtb2NrKCkKQEAgLTk1LDYgKzk0LDggQEAKICAgICBwcml2YXRlIHZhbCBidWJibGVzTWFuYWdlcjogQnViYmxlc01hbmFnZXIgPSBtb2NrKCkKICAgICBwcml2YXRlIHZhbCBkcmFnQ29udHJvbGxlcjogRXhwYW5kYWJsZU5vdGlmaWNhdGlvblJvd0RyYWdDb250cm9sbGVyID0gbW9jaygpCiAgICAgcHJpdmF0ZSB2YWwgZGlzbWlzc2liaWxpdHlQcm92aWRlcjogTm90aWZpY2F0aW9uRGlzbWlzc2liaWxpdHlQcm92aWRlciA9IG1vY2soKQorICAgIHByaXZhdGUgdmFsIHN0YXR1c0JhclNlcnZpY2U6IElTdGF0dXNCYXJTZXJ2aWNlID0gbW9jaygpCisKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciBjb250cm9sbGVyOiBFeHBhbmRhYmxlTm90aWZpY2F0aW9uUm93Q29udHJvbGxlcgogCiAgICAgQEJlZm9yZQpAQCAtMTA4LDcgKzEwOSw2IEBACiAgICAgICAgICAgICAgICAgbWV0cmljc0xvZ2dlciwKICAgICAgICAgICAgICAgICBsb2dCdWZmZXJMb2dnZXIsCiAgICAgICAgICAgICAgICAgbGlzdENvbnRhaW5lciwKLSAgICAgICAgICAgICAgICBtZWRpYU1hbmFnZXIsCiAgICAgICAgICAgICAgICAgc21hcnRSZXBseUNvbnN0YW50cywKICAgICAgICAgICAgICAgICBzbWFydFJlcGx5Q29udHJvbGxlciwKICAgICAgICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLApAQCAtMTMyLDcgKzEzMiw4IEBACiAgICAgICAgICAgICAgICAgcGVvcGxlTm90aWZpY2F0aW9uSWRlbnRpZmllciwKICAgICAgICAgICAgICAgICBPcHRpb25hbC5vZihidWJibGVzTWFuYWdlciksCiAgICAgICAgICAgICAgICAgZHJhZ0NvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgZGlzbWlzc2liaWxpdHlQcm92aWRlcgorICAgICAgICAgICAgICAgIGRpc21pc3NpYmlsaXR5UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgc3RhdHVzQmFyU2VydmljZQogICAgICAgICAgICAgKQogICAgICAgICB3aGVuZXZlcih2aWV3LmNoaWxkcmVuQ29udGFpbmVyKS50aGVuUmV0dXJuKGNoaWxkcmVuQ29udGFpbmVyKQogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9Ob3RpZmljYXRpb25Db250ZW50Vmlld1Rlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvTm90aWZpY2F0aW9uQ29udGVudFZpZXdUZXN0Lmt0CmluZGV4IDdiMjA1MWQuLjBiOTBlYmUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9Ob3RpZmljYXRpb25Db250ZW50Vmlld1Rlc3Qua3QKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L05vdGlmaWNhdGlvbkNvbnRlbnRWaWV3VGVzdC5rdApAQCAtNzQsNyArNzQsNyBAQAogICAgICAgICBkb1JldHVybigxMCkud2hlbmV2ZXIoc3B5Um93KS5pbnRyaW5zaWNIZWlnaHQKIAogICAgICAgICB3aXRoKHZpZXcpIHsKLSAgICAgICAgICAgIGluaXRpYWxpemUobVBlb3BsZU5vdGlmaWNhdGlvbklkZW50aWZpZXIsIG1vY2soKSwgbW9jaygpLCBtb2NrKCkpCisgICAgICAgICAgICBpbml0aWFsaXplKG1QZW9wbGVOb3RpZmljYXRpb25JZGVudGlmaWVyLCBtb2NrKCksIG1vY2soKSwgbW9jaygpLCBtb2NrKCkpCiAgICAgICAgICAgICBzZXRDb250YWluaW5nTm90aWZpY2F0aW9uKHNweVJvdykKICAgICAgICAgICAgIHNldEhlaWdodHMoLyogc21hbGxIZWlnaHQ9ICovIDEwLCAvKiBoZWFkc1VwTWF4SGVpZ2h0PSAqLyAyMCwgLyogbWF4SGVpZ2h0PSAqLyAzMCkKICAgICAgICAgICAgIGNvbnRyYWN0ZWRDaGlsZCA9IGNyZWF0ZVZpZXdXaXRoSGVpZ2h0KDEwKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L05vdGlmaWNhdGlvblRlc3RIZWxwZXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvbm90aWZpY2F0aW9uL3Jvdy9Ob3RpZmljYXRpb25UZXN0SGVscGVyLmphdmEKaW5kZXggYjBhNDZlMS4uODEzYmFlOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9ub3RpZmljYXRpb24vcm93L05vdGlmaWNhdGlvblRlc3RIZWxwZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL25vdGlmaWNhdGlvbi9yb3cvTm90aWZpY2F0aW9uVGVzdEhlbHBlci5qYXZhCkBAIC00OSw2ICs0OSw3IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5sb2dnaW5nLk1ldHJpY3NMb2dnZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlRlc3RhYmxlRGVwZW5kZW5jeTsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5jbGFzc2lmaWVyLkZhbHNpbmdDb2xsZWN0b3JGYWtlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmNsYXNzaWZpZXIuRmFsc2luZ01hbmFnZXJGYWtlOwpAQCAtNTcwLDcgKzU3MSw2IEBACiAgICAgICAgICAgICAgICAgbUhlYWRzVXBNYW5hZ2VyLAogICAgICAgICAgICAgICAgIG1CaW5kU3RhZ2UsCiAgICAgICAgICAgICAgICAgbW9jayhPbkV4cGFuZENsaWNrTGlzdGVuZXIuY2xhc3MpLAotICAgICAgICAgICAgICAgIG1vY2soTm90aWZpY2F0aW9uTWVkaWFNYW5hZ2VyLmNsYXNzKSwKICAgICAgICAgICAgICAgICBtb2NrKEV4cGFuZGFibGVOb3RpZmljYXRpb25Sb3cuQ29vcmRpbmF0ZU9uQ2xpY2tMaXN0ZW5lci5jbGFzcyksCiAgICAgICAgICAgICAgICAgbmV3IEZhbHNpbmdNYW5hZ2VyRmFrZSgpLAogICAgICAgICAgICAgICAgIG5ldyBGYWxzaW5nQ29sbGVjdG9yRmFrZSgpLApAQCAtNTgzLDcgKzU4Myw4IEBACiAgICAgICAgICAgICAgICAgbW9jayhNZXRyaWNzTG9nZ2VyLmNsYXNzKSwKICAgICAgICAgICAgICAgICBtb2NrKFNtYXJ0UmVwbHlDb25zdGFudHMuY2xhc3MpLAogICAgICAgICAgICAgICAgIG1vY2soU21hcnRSZXBseUNvbnRyb2xsZXIuY2xhc3MpLAotICAgICAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3MpOworICAgICAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3MsCisgICAgICAgICAgICAgICAgbW9jayhJU3RhdHVzQmFyU2VydmljZS5jbGFzcykpOwogCiAgICAgICAgIHJvdy5zZXRBYm92ZVNoZWxmQ2hhbmdlZExpc3RlbmVyKGFib3ZlU2hlbGYgLT4geyB9KTsKICAgICAgICAgbUJpbmRTdGFnZS5nZXRTdGFnZVBhcmFtcyhlbnRyeSkucmVxdWlyZUNvbnRlbnRWaWV3cyhleHRyYUluZmxhdGlvbkZsYWdzKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvQ2VudHJhbFN1cmZhY2VzSW1wbFRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvQ2VudHJhbFN1cmZhY2VzSW1wbFRlc3QuamF2YQppbmRleCAwMzFjMTdmLi43ZGIyMTk3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL0NlbnRyYWxTdXJmYWNlc0ltcGxUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9DZW50cmFsU3VyZmFjZXNJbXBsVGVzdC5qYXZhCkBAIC0zNDcsNyArMzQ3LDYgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXIgPQogICAgICAgICAgICAgICAgIG5ldyBUZXN0YWJsZU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EcmVhbU1hbmFnZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtQW1iaWVudERpc3BsYXlDb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclN0YXRlQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlndWFyZFN0YXRlQ29udHJvbGxlciwKQEAgLTczMCw3ICs3MjksNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRIZWFkc1VwX25vblN1cHByZXNzZWRHcm91cFN1bW1hcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgd2hlbihtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtSGVhZHNVcE1hbmFnZXIuaXNTbm9vemVkKGFueVN0cmluZygpKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obURyZWFtTWFuYWdlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1TdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKIAogICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihnZXRDb250ZXh0KCksICJhIikKICAgICAgICAgICAgICAgICAuc2V0R3JvdXAoImEiKQpAQCAtNzUzLDcgKzc1Miw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEhlYWRzVXBfc3VwcHJlc3NlZEdyb3VwU3VtbWFyeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1IZWFkc1VwTWFuYWdlci5pc1Nub296ZWQoYW55U3RyaW5nKCkpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogCiAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKGdldENvbnRleHQoKSwgImEiKQogICAgICAgICAgICAgICAgIC5zZXRHcm91cCgiYSIpCkBAIC03NzYsNyArNzc1LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkSGVhZHNVcF9zdXBwcmVzc2VkSGVhZHNVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB3aGVuKG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS50aGVuUmV0dXJuKHRydWUpOwogICAgICAgICB3aGVuKG1IZWFkc1VwTWFuYWdlci5pc1Nub296ZWQoYW55U3RyaW5nKCkpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtRHJlYW1NYW5hZ2VyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CisgICAgICAgIHdoZW4obVN0YXR1c0JhclN0YXRlQ29udHJvbGxlci5pc0RyZWFtaW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOwogCiAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKGdldENvbnRleHQoKSwgImEiKS5idWlsZCgpOwogCkBAIC03OTcsNyArNzk2LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkSGVhZHNVcF9ub1N1cHByZXNzZWRIZWFkc1VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHdoZW4obVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIHdoZW4obUhlYWRzVXBNYW5hZ2VyLmlzU25vb3plZChhbnlTdHJpbmcoKSkpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICB3aGVuKG1EcmVhbU1hbmFnZXIuaXNEcmVhbWluZygpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgd2hlbihtU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLmlzRHJlYW1pbmcoKSkudGhlblJldHVybihmYWxzZSk7CiAKICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uLkJ1aWxkZXIoZ2V0Q29udGV4dCgpLCAiYSIpLmJ1aWxkKCk7CiAKQEAgLTE0MDAsNyArMTM5OSw2IEBACiAgICAgICAgIFRlc3RhYmxlTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGwoCiAgICAgICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciwKICAgICAgICAgICAgICAgICBQb3dlck1hbmFnZXIgcG93ZXJNYW5hZ2VyLAotICAgICAgICAgICAgICAgIElEcmVhbU1hbmFnZXIgZHJlYW1NYW5hZ2VyLAogICAgICAgICAgICAgICAgIEFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiBhbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb24sCiAgICAgICAgICAgICAgICAgU3RhdHVzQmFyU3RhdGVDb250cm9sbGVyIGNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIga2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIsCkBAIC0xNDE1LDcgKzE0MTMsNiBAQAogICAgICAgICAgICAgc3VwZXIoCiAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKICAgICAgICAgICAgICAgICAgICAgcG93ZXJNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICBkcmVhbU1hbmFnZXIsCiAgICAgICAgICAgICAgICAgICAgIGFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgYmF0dGVyeUNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL1NjcmltQ29udHJvbGxlclRlc3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvU2NyaW1Db250cm9sbGVyVGVzdC5qYXZhCmluZGV4IDdhMTI3MGYuLmE5ZWQxNzUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvU2NyaW1Db250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvU2NyaW1Db250cm9sbGVyVGVzdC5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUZsb2F0OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUludDsKQEAgLTExNjMsOCArMTE2NCw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyaW1Gb2N1cygpIHsKICAgICAgICAgbVNjcmltQ29udHJvbGxlci50cmFuc2l0aW9uVG8oU2NyaW1TdGF0ZS5BT0QpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIlNob3VsZCBub3QgYmUgZm9jdXNhYmxlIG9uIEFPRCIsIG1TY3JpbUJlaGluZC5pc0ZvY3VzYWJsZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJTaG91bGQgbm90IGJlIGZvY3VzYWJsZSBvbiBBT0QiLCBtU2NyaW1JbkZyb250LmlzRm9jdXNhYmxlKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiU2hvdWxkIG5vdCBiZSBmb2N1c2FibGUgb24gQU9EIiwgbVNjcmltQmVoaW5kLmlzRm9jdXNhYmxlKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiU2hvdWxkIG5vdCBiZSBmb2N1c2FibGUgb24gQU9EIiwgbVNjcmltSW5Gcm9udC5pc0ZvY3VzYWJsZSgpKTsKIAogICAgICAgICBtU2NyaW1Db250cm9sbGVyLnRyYW5zaXRpb25UbyhTY3JpbVN0YXRlLktFWUdVQVJEKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlNob3VsZCBiZSBmb2N1c2FibGUgb24ga2V5Z3VhcmQiLCBtU2NyaW1CZWhpbmQuaXNGb2N1c2FibGUoKSk7CkBAIC0xMjI0LDcgKzEyMjUsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbmltYXRlc1RyYW5zaXRpb25Ub0FvZCgpIHsKICAgICAgICAgd2hlbihtRG96ZVBhcmFtZXRlcnMuc2hvdWxkQ29udHJvbFNjcmVlbk9mZigpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgU2NyaW1TdGF0ZS5BT0QucHJlcGFyZShTY3JpbVN0YXRlLktFWUdVQVJEKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJObyBhbmltYXRpb24gd2hlbiBDb2xvckZhZGUga2lja3MgaW4iLAorICAgICAgICBhc3NlcnRGYWxzZSgiTm8gYW5pbWF0aW9uIHdoZW4gQ29sb3JGYWRlIGtpY2tzIGluIiwKICAgICAgICAgICAgICAgICBTY3JpbVN0YXRlLkFPRC5nZXRBbmltYXRlQ2hhbmdlKCkpOwogCiAgICAgICAgIHJlc2V0KG1Eb3plUGFyYW1ldGVycyk7CkBAIC0xMjM2LDkgKzEyMzcsOSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld3NEb250SGF2ZUZvY3VzSGlnaGxpZ2h0KCkgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIlNjcmltIHNob3VsZG4ndCBoYXZlIGZvY3VzIGhpZ2hsaWdodCIsCisgICAgICAgIGFzc2VydEZhbHNlKCJTY3JpbSBzaG91bGRuJ3QgaGF2ZSBmb2N1cyBoaWdobGlnaHQiLAogICAgICAgICAgICAgICAgIG1TY3JpbUluRnJvbnQuZ2V0RGVmYXVsdEZvY3VzSGlnaGxpZ2h0RW5hYmxlZCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJTY3JpbSBzaG91bGRuJ3QgaGF2ZSBmb2N1cyBoaWdobGlnaHQiLAorICAgICAgICBhc3NlcnRGYWxzZSgiU2NyaW0gc2hvdWxkbid0IGhhdmUgZm9jdXMgaGlnaGxpZ2h0IiwKICAgICAgICAgICAgICAgICBtU2NyaW1CZWhpbmQuZ2V0RGVmYXVsdEZvY3VzSGlnaGxpZ2h0RW5hYmxlZCgpKTsKICAgICB9CiAKQEAgLTE3MzgsNyArMTczOSw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBhb2RTdGF0ZVNldHNGcm9udFNjcmltVG9Ob3RCbGVuZCgpIHsKICAgICAgICAgbVNjcmltQ29udHJvbGxlci50cmFuc2l0aW9uVG8oU2NyaW1TdGF0ZS5BT0QpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkZyb250IHNjcmltIHNob3VsZCBub3QgYmxlbmQgd2l0aCBtYWluIGNvbG9yIiwKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkZyb250IHNjcmltIHNob3VsZCBub3QgYmxlbmQgd2l0aCBtYWluIGNvbG9yIiwKICAgICAgICAgICAgICAgICBtU2NyaW1JbkZyb250LnNob3VsZEJsZW5kV2l0aE1haW5Db2xvcigpKTsKICAgICB9CiAKQEAgLTE3NzMsNiArMTc3NCwxNCBAQAogICAgICAgICB2ZXJpZnkobVN0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXIpLm9uS2V5Z3VhcmRGYWRlZEF3YXkoKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb05vdEFuaW1hdGVDaGFuZ2VJZk9jY2x1ZGVBbmltYXRpb25QbGF5aW5nKCkgeworICAgICAgICBtU2NyaW1Db250cm9sbGVyLnNldE9jY2x1ZGVBbmltYXRpb25QbGF5aW5nKHRydWUpOworICAgICAgICBtU2NyaW1Db250cm9sbGVyLnRyYW5zaXRpb25UbyhTY3JpbVN0YXRlLlVOTE9DS0VEKTsKKworICAgICAgICBhc3NlcnRGYWxzZShTY3JpbVN0YXRlLlVOTE9DS0VELm1BbmltYXRlQ2hhbmdlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QWxwaGFBZnRlckV4cGFuc2lvbihTY3JpbVZpZXcgc2NyaW0sIGZsb2F0IGV4cGVjdGVkQWxwaGEsIGZsb2F0IGV4cGFuc2lvbikgewogICAgICAgICBtU2NyaW1Db250cm9sbGVyLnNldFJhd1BhbmVsRXhwYW5zaW9uRnJhY3Rpb24oZXhwYW5zaW9uKTsKICAgICAgICAgZmluaXNoQW5pbWF0aW9uc0ltbWVkaWF0ZWx5KCk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL1N0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXJUZXN0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL1N0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXJUZXN0LmphdmEKaW5kZXggZTIwMTliMi4uMzE0NjI2MiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9TdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvU3RhdHVzQmFyS2V5Z3VhcmRWaWV3TWFuYWdlclRlc3QuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQuY29uc3RhbnRzLktleWd1YXJkQm91bmNlckNvbnN0YW50cy5FWFBBTlNJT05fSElEREVOOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQuY29uc3RhbnRzLktleWd1YXJkQm91bmNlckNvbnN0YW50cy5FWFBBTlNJT05fVklTSUJMRTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUJvb2xlYW47CkBAIC0zNSw2ICszNiw3IEBACiAKIGltcG9ydCBhbmRyb2lkLnRlc3RpbmcuQW5kcm9pZFRlc3RpbmdSdW5uZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXN0aW5nLlRlc3RhYmxlTG9vcGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Um9vdEltcGw7CkBAIC03MDksNCArNzExLDQ4IEBACiAgICAgICAgIC8vIFRIRU4gYWx0ZXJuYXRlIGJvdW5jZXIgaXMgTk9UIGhpZGRlbgogICAgICAgICB2ZXJpZnkobUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLCBuZXZlcigpKS5oaWRlKCk7CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWx0ZXJuYXRlQm91bmNlclRvU2hvd1ByaW1hcnlCb3VuY2VyX3VwZGF0ZXNTY3JpbUNvbnRyb2xsZXJPbmNlKCkgeworICAgICAgICAvLyBHSVZFTiB0aGUgYWx0ZXJuYXRlIGJvdW5jZXIgaGFzIHNob3duIGFuZCBjYWxscyB0byBoaWRlKCkgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWxseQorICAgICAgICAvLyBoaWRpbmcgaXQKKyAgICAgICAgd2hlbihtQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IuaGlkZSgpKS50aGVuUmV0dXJuKHRydWUpOworICAgICAgICB3aGVuKG1LZXlndWFyZFN0YXRlQ29udHJvbGxlci5pc1Nob3dpbmcoKSkudGhlblJldHVybih0cnVlKTsKKyAgICAgICAgd2hlbihtUHJpbWFyeUJvdW5jZXJJbnRlcmFjdG9yLmlzRnVsbHlTaG93aW5nKCkpLnRoZW5SZXR1cm4oZmFsc2UpOworICAgICAgICB3aGVuKG1BbHRlcm5hdGVCb3VuY2VySW50ZXJhY3Rvci5pc1Zpc2libGVTdGF0ZSgpKS50aGVuUmV0dXJuKGZhbHNlKTsKKworICAgICAgICAvLyBXSEVOIHJlcXVlc3QgdG8gc2hvdyBwcmltYXJ5IGJvdW5jZXIKKyAgICAgICAgbVN0YXR1c0JhcktleWd1YXJkVmlld01hbmFnZXIuc2hvd1ByaW1hcnlCb3VuY2VyKHRydWUpOworCisgICAgICAgIC8vIFRIRU4gdGhlIHNjcmltIGlzbid0IHVwZGF0ZWQgZnJvbSBTdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyCisgICAgICAgIHZlcmlmeShtQ2VudHJhbFN1cmZhY2VzLCBuZXZlcigpKS51cGRhdGVTY3JpbUNvbnRyb2xsZXIoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbHRlcm5hdGVCb3VuY2VyT25Ub3VjaF9hY3Rpb25Eb3duX2RvZXNOb3RIYW5kbGVUb3VjaCgpIHsKKyAgICAgICAgLy8gR0lWRU4gdGhlIGFsdGVybmF0ZSBib3VuY2VyIGhhcyBzaG93biBmb3IgYSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lCisgICAgICAgIHdoZW4obUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLmhhc0FsdGVybmF0ZUJvdW5jZXJTaG93bldpdGhNaW5UaW1lKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisgICAgICAgIHdoZW4obUFsdGVybmF0ZUJvdW5jZXJJbnRlcmFjdG9yLmlzVmlzaWJsZVN0YXRlKCkpLnRoZW5SZXR1cm4odHJ1ZSk7CisKKyAgICAgICAgLy8gV0hFTiBBQ1RJT05fRE9XTiB0b3VjaCBldmVudCBjb21lcworICAgICAgICBib29sZWFuIHRvdWNoSGFuZGxlZCA9IG1TdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyLm9uVG91Y2goCisgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQub2J0YWluKDBMLCAwTCwgTW90aW9uRXZlbnQuQUNUSU9OX0RPV04sIDBmLCAwZiwgMCkpOworCisgICAgICAgIC8vIFRIRU4gdGhlIHRvdWNoIGlzIG5vdCBoYW5kbGVkCisgICAgICAgIGFzc2VydEZhbHNlKHRvdWNoSGFuZGxlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWx0ZXJuYXRlQm91bmNlck9uVG91Y2hfYWN0aW9uVXBfaGFuZGxlc1RvdWNoKCkgeworICAgICAgICAvLyBHSVZFTiB0aGUgYWx0ZXJuYXRlIGJvdW5jZXIgaGFzIHNob3duIGZvciBhIG1pbmltdW0gYW1vdW50IG9mIHRpbWUKKyAgICAgICAgd2hlbihtQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IuaGFzQWx0ZXJuYXRlQm91bmNlclNob3duV2l0aE1pblRpbWUoKSkudGhlblJldHVybih0cnVlKTsKKyAgICAgICAgd2hlbihtQWx0ZXJuYXRlQm91bmNlckludGVyYWN0b3IuaXNWaXNpYmxlU3RhdGUoKSkudGhlblJldHVybih0cnVlKTsKKworICAgICAgICAvLyBXSEVOIEFDVElPTl9VUCB0b3VjaCBldmVudCBjb21lcworICAgICAgICBib29sZWFuIHRvdWNoSGFuZGxlZCA9IG1TdGF0dXNCYXJLZXlndWFyZFZpZXdNYW5hZ2VyLm9uVG91Y2goCisgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQub2J0YWluKDBMLCAwTCwgTW90aW9uRXZlbnQuQUNUSU9OX1VQLCAwZiwgMGYsIDApKTsKKworICAgICAgICAvLyBUSEVOIHRoZSB0b3VjaCBpcyBoYW5kbGVkCisgICAgICAgIGFzc2VydFRydWUodG91Y2hIYW5kbGVkKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BpcGVsaW5lL21vYmlsZS9kYXRhL3JlcG9zaXRvcnkvcHJvZC9Nb2JpbGVDb25uZWN0aW9uUmVwb3NpdG9yeVRlc3Qua3QgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BpcGVsaW5lL21vYmlsZS9kYXRhL3JlcG9zaXRvcnkvcHJvZC9Nb2JpbGVDb25uZWN0aW9uUmVwb3NpdG9yeVRlc3Qua3QKaW5kZXggZjZlNTk1OS4uNTQyYjY4OCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waXBlbGluZS9tb2JpbGUvZGF0YS9yZXBvc2l0b3J5L3Byb2QvTW9iaWxlQ29ubmVjdGlvblJlcG9zaXRvcnlUZXN0Lmt0CisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGlwZWxpbmUvbW9iaWxlL2RhdGEvcmVwb3NpdG9yeS9wcm9kL01vYmlsZUNvbm5lY3Rpb25SZXBvc2l0b3J5VGVzdC5rdApAQCAtMTgsMTcgKzE4LDE2IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2FycmllckNvbmZpZ01hbmFnZXIuS0VZX0lORkxBVEVfU0lHTkFMX1NUUkVOR1RIX0JPT0wKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsU2lnbmFsU3RyZW5ndGhDZG1hCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuTmV0d29ya1JlZ2lzdHJhdGlvbkluZm8KIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGUKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRQogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZS5TVEFURV9PVVRfT0ZfU0VSVklDRQotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNpZ25hbFN0cmVuZ3RoCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255Q2FsbGJhY2sKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlDYWxsYmFjay5EYXRhQWN0aXZpdHlMaXN0ZW5lcgogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueUNhbGxiYWNrLlNlcnZpY2VTdGF0ZUxpc3RlbmVyCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255RGlzcGxheUluZm8KIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlEaXNwbGF5SW5mby5PVkVSUklERV9ORVRXT1JLX1RZUEVfTFRFX0NBCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255RGlzcGxheUluZm8uT1ZFUlJJREVfTkVUV09SS19UWVBFX05PTkUKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlci5EQVRBX0FDVElWSVRZX0RPUk1BTlQKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyLkRBVEFfQUNUSVZJVFlfSU4KQEAgLTY4LDYgKzY3LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGlwZWxpbmUubW9iaWxlLmRhdGEubW9kZWwudG9OZXR3b3JrTmFtZU1vZGVsCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBpcGVsaW5lLm1vYmlsZS5kYXRhLnJlcG9zaXRvcnkuRmFrZU1vYmlsZUNvbm5lY3Rpb25zUmVwb3NpdG9yeQogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waXBlbGluZS5tb2JpbGUuZGF0YS5yZXBvc2l0b3J5Lk1vYmlsZUNvbm5lY3Rpb25SZXBvc2l0b3J5LkNvbXBhbmlvbi5ERUZBVUxUX05VTV9MRVZFTFMKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGlwZWxpbmUubW9iaWxlLmRhdGEucmVwb3NpdG9yeS5wcm9kLk1vYmlsZVRlbGVwaG9ueUhlbHBlcnMuc2lnbmFsU3RyZW5ndGgKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGlwZWxpbmUubW9iaWxlLnV0aWwuRmFrZU1vYmlsZU1hcHBpbmdzUHJveHkKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGlwZWxpbmUuc2hhcmVkLmRhdGEubW9kZWwuRGF0YUFjdGl2aXR5TW9kZWwKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGlwZWxpbmUuc2hhcmVkLmRhdGEubW9kZWwudG9Nb2JpbGVEYXRhQWN0aXZpdHlNb2RlbApAQCAtNzUsMTQgKzc1LDEyIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLm1vY2sKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8ud2hlbmV2ZXIKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0Ci1pbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkNvcm91dGluZVNjb3BlCi1pbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkRpc3BhdGNoZXJzCiBpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLkV4cGVyaW1lbnRhbENvcm91dGluZXNBcGkKLWltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuY2FuY2VsCiBpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cubGF1bmNoSW4KIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5vbkVhY2gKLWltcG9ydCBrb3RsaW54LmNvcm91dGluZXMucnVuQmxvY2tpbmcKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXIKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5UZXN0U2NvcGUKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5VbmNvbmZpbmVkVGVzdERpc3BhdGNoZXIKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMudGVzdC5ydW5UZXN0CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZQogaW1wb3J0IG9yZy5qdW5pdC5UZXN0CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9jawpAQCAtOTksNyArOTcsNiBAQAogICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIGxvZ2dlcjogTW9iaWxlSW5wdXRMb2dnZXIKICAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciB0YWJsZUxvZ2dlcjogVGFibGVMb2dCdWZmZXIKIAotICAgIHByaXZhdGUgdmFsIHNjb3BlID0gQ29yb3V0aW5lU2NvcGUoSU1NRURJQVRFKQogICAgIHByaXZhdGUgdmFsIG1vYmlsZU1hcHBpbmdzID0gRmFrZU1vYmlsZU1hcHBpbmdzUHJveHkoKQogICAgIHByaXZhdGUgdmFsIHN5c3RlbVVpQ2FycmllckNvbmZpZyA9CiAgICAgICAgIFN5c3RlbVVpQ2FycmllckNvbmZpZygKQEAgLTEwNyw2ICsxMDQsOSBAQAogICAgICAgICAgICAgY3JlYXRlVGVzdENvbmZpZygpLAogICAgICAgICApCiAKKyAgICBwcml2YXRlIHZhbCB0ZXN0RGlzcGF0Y2hlciA9IFVuY29uZmluZWRUZXN0RGlzcGF0Y2hlcigpCisgICAgcHJpdmF0ZSB2YWwgdGVzdFNjb3BlID0gVGVzdFNjb3BlKHRlc3REaXNwYXRjaGVyKQorCiAgICAgQEJlZm9yZQogICAgIGZ1biBzZXRVcCgpIHsKICAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKQpAQCAtMTI0LDIxICsxMjQsMTYgQEAKICAgICAgICAgICAgICAgICBzeXN0ZW1VaUNhcnJpZXJDb25maWcsCiAgICAgICAgICAgICAgICAgZmFrZUJyb2FkY2FzdERpc3BhdGNoZXIsCiAgICAgICAgICAgICAgICAgbW9iaWxlTWFwcGluZ3MsCi0gICAgICAgICAgICAgICAgSU1NRURJQVRFLAorICAgICAgICAgICAgICAgIHRlc3REaXNwYXRjaGVyLAogICAgICAgICAgICAgICAgIGxvZ2dlciwKICAgICAgICAgICAgICAgICB0YWJsZUxvZ2dlciwKLSAgICAgICAgICAgICAgICBzY29wZSwKKyAgICAgICAgICAgICAgICB0ZXN0U2NvcGUuYmFja2dyb3VuZFNjb3BlLAogICAgICAgICAgICAgKQogICAgIH0KIAotICAgIEBBZnRlcgotICAgIGZ1biB0ZWFyRG93bigpIHsKLSAgICAgICAgc2NvcGUuY2FuY2VsKCkKLSAgICB9Ci0KICAgICBAVGVzdAogICAgIGZ1biBlbWVyZ2VuY3lPbmx5KCkgPQotICAgICAgICBydW5CbG9ja2luZyhJTU1FRElBVEUpIHsKKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogQm9vbGVhbj8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LmlzRW1lcmdlbmN5T25seS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCiAKQEAgLTE1NCwxOCArMTQ5LDE1IEBACiAKICAgICBAVGVzdAogICAgIGZ1biBlbWVyZ2VuY3lPbmx5X3RvZ2dsZXMoKSA9Ci0gICAgICAgIHJ1bkJsb2NraW5nKElNTUVESUFURSkgeworICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CiAgICAgICAgICAgICB2YXIgbGF0ZXN0OiBCb29sZWFuPyA9IG51bGwKICAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QuaXNFbWVyZ2VuY3lPbmx5Lm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIAogICAgICAgICAgICAgdmFsIGNhbGxiYWNrID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPFNlcnZpY2VTdGF0ZUxpc3RlbmVyPigpCi0gICAgICAgICAgICB2YWwgc2VydmljZVN0YXRlID0gU2VydmljZVN0YXRlKCkKLSAgICAgICAgICAgIHNlcnZpY2VTdGF0ZS5pc0VtZXJnZW5jeU9ubHkgPSB0cnVlCi0gICAgICAgICAgICBjYWxsYmFjay5vblNlcnZpY2VTdGF0ZUNoYW5nZWQoc2VydmljZVN0YXRlKQorICAgICAgICAgICAgY2FsbGJhY2sub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSgpLmFsc28geyBpdC5pc0VtZXJnZW5jeU9ubHkgPSB0cnVlIH0pCiAgICAgICAgICAgICBhc3NlcnRUaGF0KGxhdGVzdCkuaXNUcnVlKCkKIAotICAgICAgICAgICAgc2VydmljZVN0YXRlLmlzRW1lcmdlbmN5T25seSA9IGZhbHNlCi0gICAgICAgICAgICBjYWxsYmFjay5vblNlcnZpY2VTdGF0ZUNoYW5nZWQoc2VydmljZVN0YXRlKQorICAgICAgICAgICAgY2FsbGJhY2sub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSgpLmFsc28geyBpdC5pc0VtZXJnZW5jeU9ubHkgPSBmYWxzZSB9KQogCiAgICAgICAgICAgICBhc3NlcnRUaGF0KGxhdGVzdCkuaXNGYWxzZSgpCiAKQEAgLTE3NCw3ICsxNjYsNyBAQAogCiAgICAgQFRlc3QKICAgICBmdW4gY2RtYUxldmVsVXBkYXRlcygpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IEludD8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LmNkbWFMZXZlbC5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCiAKQEAgLTE5NCw3ICsxODYsNyBAQAogCiAgICAgQFRlc3QKICAgICBmdW4gZ3NtTGV2ZWxVcGRhdGVzKCkgPQotICAgICAgICBydW5CbG9ja2luZyhJTU1FRElBVEUpIHsKKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogSW50PyA9IG51bGwKICAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QucHJpbWFyeUxldmVsLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtMjE0LDcgKzIwNiw3IEBACiAKICAgICBAVGVzdAogICAgIGZ1biBpc0dzbSgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IEJvb2xlYW4/ID0gbnVsbAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5pc0dzbS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCiAKQEAgLTIzNCw3ICsyMjYsNyBAQAogCiAgICAgQFRlc3QKICAgICBmdW4gZGF0YUNvbm5lY3Rpb25TdGF0ZV9jb25uZWN0ZWQoKSA9Ci0gICAgICAgIHJ1bkJsb2NraW5nKElNTUVESUFURSkgeworICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CiAgICAgICAgICAgICB2YXIgbGF0ZXN0OiBEYXRhQ29ubmVjdGlvblN0YXRlPyA9IG51bGwKICAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QuZGF0YUNvbm5lY3Rpb25TdGF0ZS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCiAKQEAgLTI0OSw3ICsyNDEsNyBAQAogCiAgICAgQFRlc3QKICAgICBmdW4gZGF0YUNvbm5lY3Rpb25TdGF0ZV9jb25uZWN0aW5nKCkgPQotICAgICAgICBydW5CbG9ja2luZyhJTU1FRElBVEUpIHsKKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogRGF0YUNvbm5lY3Rpb25TdGF0ZT8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LmRhdGFDb25uZWN0aW9uU3RhdGUub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQogCkBAIC0yNjQsNyArMjU2LDcgQEAKIAogICAgIEBUZXN0CiAgICAgZnVuIGRhdGFDb25uZWN0aW9uU3RhdGVfZGlzY29ubmVjdGVkKCkgPQotICAgICAgICBydW5CbG9ja2luZyhJTU1FRElBVEUpIHsKKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogRGF0YUNvbm5lY3Rpb25TdGF0ZT8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LmRhdGFDb25uZWN0aW9uU3RhdGUub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQogCkBAIC0yNzksNyArMjcxLDcgQEAKIAogICAgIEBUZXN0CiAgICAgZnVuIGRhdGFDb25uZWN0aW9uU3RhdGVfZGlzY29ubmVjdGluZygpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IERhdGFDb25uZWN0aW9uU3RhdGU/ID0gbnVsbAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5kYXRhQ29ubmVjdGlvblN0YXRlLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtMjk0LDcgKzI4Niw3IEBACiAKICAgICBAVGVzdAogICAgIGZ1biBkYXRhQ29ubmVjdGlvblN0YXRlX3N1c3BlbmRlZCgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IERhdGFDb25uZWN0aW9uU3RhdGU/ID0gbnVsbAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5kYXRhQ29ubmVjdGlvblN0YXRlLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtMzA5LDcgKzMwMSw3IEBACiAKICAgICBAVGVzdAogICAgIGZ1biBkYXRhQ29ubmVjdGlvblN0YXRlX2hhbmRvdmVySW5Qcm9ncmVzcygpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IERhdGFDb25uZWN0aW9uU3RhdGU/ID0gbnVsbAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5kYXRhQ29ubmVjdGlvblN0YXRlLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtMzI0LDcgKzMxNiw3IEBACiAKICAgICBAVGVzdAogICAgIGZ1biBkYXRhQ29ubmVjdGlvblN0YXRlX3Vua25vd24oKSA9Ci0gICAgICAgIHJ1bkJsb2NraW5nKElNTUVESUFURSkgeworICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CiAgICAgICAgICAgICB2YXIgbGF0ZXN0OiBEYXRhQ29ubmVjdGlvblN0YXRlPyA9IG51bGwKICAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QuZGF0YUNvbm5lY3Rpb25TdGF0ZS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCiAKQEAgLTMzOSw3ICszMzEsNyBAQAogCiAgICAgQFRlc3QKICAgICBmdW4gZGF0YUNvbm5lY3Rpb25TdGF0ZV9pbnZhbGlkKCkgPQotICAgICAgICBydW5CbG9ja2luZyhJTU1FRElBVEUpIHsKKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogRGF0YUNvbm5lY3Rpb25TdGF0ZT8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LmRhdGFDb25uZWN0aW9uU3RhdGUub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQogCkBAIC0zNTQsNyArMzQ2LDcgQEAKIAogICAgIEBUZXN0CiAgICAgZnVuIGRhdGFBY3Rpdml0eSgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IERhdGFBY3Rpdml0eU1vZGVsPyA9IG51bGwKICAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QuZGF0YUFjdGl2aXR5RGlyZWN0aW9uLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtMzY4LDcgKzM2MCw3IEBACiAKICAgICBAVGVzdAogICAgIGZ1biBjYXJyaWVyTmV0d29ya0NoYW5nZSgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IEJvb2xlYW4/ID0gbnVsbAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5jYXJyaWVyTmV0d29ya0NoYW5nZUFjdGl2ZS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCiAKQEAgLTM4Miw3ICszNzQsNyBAQAogCiAgICAgQFRlc3QKICAgICBmdW4gbmV0d29ya1R5cGVfZGVmYXVsdCgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IFJlc29sdmVkTmV0d29ya1R5cGU/ID0gbnVsbAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5yZXNvbHZlZE5ldHdvcmtUeXBlLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtMzk1LDcgKzM4Nyw3IEBACiAKICAgICBAVGVzdAogICAgIGZ1biBuZXR3b3JrVHlwZV91bmtub3duX2hhc0NvcnJlY3RLZXkoKSA9Ci0gICAgICAgIHJ1bkJsb2NraW5nKElNTUVESUFURSkgeworICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CiAgICAgICAgICAgICB2YXIgbGF0ZXN0OiBSZXNvbHZlZE5ldHdvcmtUeXBlPyA9IG51bGwKICAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QucmVzb2x2ZWROZXR3b3JrVHlwZS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCiAKQEAgLTQxMywxNCArNDA1LDE5IEBACiAKICAgICBAVGVzdAogICAgIGZ1biBuZXR3b3JrVHlwZV91cGRhdGVzVXNpbmdEZWZhdWx0KCkgPQotICAgICAgICBydW5CbG9ja2luZyhJTU1FRElBVEUpIHsKKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogUmVzb2x2ZWROZXR3b3JrVHlwZT8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LnJlc29sdmVkTmV0d29ya1R5cGUub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQogCiAgICAgICAgICAgICB2YWwgY2FsbGJhY2sgPSBnZXRUZWxlcGhvbnlDYWxsYmFja0ZvclR5cGU8VGVsZXBob255Q2FsbGJhY2suRGlzcGxheUluZm9MaXN0ZW5lcj4oKQorICAgICAgICAgICAgdmFsIG92ZXJyaWRlVHlwZSA9IE9WRVJSSURFX05FVFdPUktfVFlQRV9OT05FCiAgICAgICAgICAgICB2YWwgdHlwZSA9IE5FVFdPUktfVFlQRV9MVEUKICAgICAgICAgICAgIHZhbCBleHBlY3RlZCA9IERlZmF1bHROZXR3b3JrVHlwZShtb2JpbGVNYXBwaW5ncy50b0ljb25LZXkodHlwZSkpCi0gICAgICAgICAgICB2YWwgdGkgPSBtb2NrPFRlbGVwaG9ueURpc3BsYXlJbmZvPigpLmFsc28geyB3aGVuZXZlcihpdC5uZXR3b3JrVHlwZSkudGhlblJldHVybih0eXBlKSB9CisgICAgICAgICAgICB2YWwgdGkgPQorICAgICAgICAgICAgICAgIG1vY2s8VGVsZXBob255RGlzcGxheUluZm8+KCkuYWxzbyB7CisgICAgICAgICAgICAgICAgICAgIHdoZW5ldmVyKGl0Lm92ZXJyaWRlTmV0d29ya1R5cGUpLnRoZW5SZXR1cm4ob3ZlcnJpZGVUeXBlKQorICAgICAgICAgICAgICAgICAgICB3aGVuZXZlcihpdC5uZXR3b3JrVHlwZSkudGhlblJldHVybih0eXBlKQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhbGxiYWNrLm9uRGlzcGxheUluZm9DaGFuZ2VkKHRpKQogCiAgICAgICAgICAgICBhc3NlcnRUaGF0KGxhdGVzdCkuaXNFcXVhbFRvKGV4cGVjdGVkKQpAQCAtNDMwLDcgKzQyNyw3IEBACiAKICAgICBAVGVzdAogICAgIGZ1biBuZXR3b3JrVHlwZV91cGRhdGVzVXNpbmdPdmVycmlkZSgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IFJlc29sdmVkTmV0d29ya1R5cGU/ID0gbnVsbAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5yZXNvbHZlZE5ldHdvcmtUeXBlLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtNDUwLDE2ICs0NDcsMzggQEAKICAgICAgICAgfQogCiAgICAgQFRlc3QKKyAgICBmdW4gbmV0d29ya1R5cGVfdW5rbm93bk5ldHdvcmtXaXRoT3ZlcnJpZGVfdXNlc092ZXJyaWRlS2V5KCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB2YXIgbGF0ZXN0OiBSZXNvbHZlZE5ldHdvcmtUeXBlPyA9IG51bGwKKyAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QucmVzb2x2ZWROZXR3b3JrVHlwZS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCisKKyAgICAgICAgICAgIHZhbCBjYWxsYmFjayA9IGdldFRlbGVwaG9ueUNhbGxiYWNrRm9yVHlwZTxUZWxlcGhvbnlDYWxsYmFjay5EaXNwbGF5SW5mb0xpc3RlbmVyPigpCisgICAgICAgICAgICB2YWwgdW5rbm93biA9IE5FVFdPUktfVFlQRV9VTktOT1dOCisgICAgICAgICAgICB2YWwgdHlwZSA9IE9WRVJSSURFX05FVFdPUktfVFlQRV9MVEVfQ0EKKyAgICAgICAgICAgIHZhbCBleHBlY3RlZCA9IE92ZXJyaWRlTmV0d29ya1R5cGUobW9iaWxlTWFwcGluZ3MudG9JY29uS2V5T3ZlcnJpZGUodHlwZSkpCisgICAgICAgICAgICB2YWwgdGkgPQorICAgICAgICAgICAgICAgIG1vY2s8VGVsZXBob255RGlzcGxheUluZm8+KCkuYWxzbyB7CisgICAgICAgICAgICAgICAgICAgIHdoZW5ldmVyKGl0Lm5ldHdvcmtUeXBlKS50aGVuUmV0dXJuKHVua25vd24pCisgICAgICAgICAgICAgICAgICAgIHdoZW5ldmVyKGl0Lm92ZXJyaWRlTmV0d29ya1R5cGUpLnRoZW5SZXR1cm4odHlwZSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWxsYmFjay5vbkRpc3BsYXlJbmZvQ2hhbmdlZCh0aSkKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChsYXRlc3QpLmlzRXF1YWxUbyhleHBlY3RlZCkKKworICAgICAgICAgICAgam9iLmNhbmNlbCgpCisgICAgICAgIH0KKworICAgIEBUZXN0CiAgICAgZnVuIGRhdGFFbmFibGVkX2luaXRpYWxfZmFsc2UoKSA9Ci0gICAgICAgIHJ1bkJsb2NraW5nKElNTUVESUFURSkgeworICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CiAgICAgICAgICAgICB3aGVuZXZlcih0ZWxlcGhvbnlNYW5hZ2VyLmlzRGF0YUNvbm5lY3Rpb25BbGxvd2VkKS50aGVuUmV0dXJuKGZhbHNlKQogCiAgICAgICAgICAgICBhc3NlcnRUaGF0KHVuZGVyVGVzdC5kYXRhRW5hYmxlZC52YWx1ZSkuaXNGYWxzZSgpCiAgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGBpcyBkYXRhIGVuYWJsZWQgLSB0cmFja3MgdGVsZXBob255IGNhbGxiYWNrYCgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgZnVuIGlzRGF0YUVuYWJsZWRfdHJhY2tzVGVsZXBob255Q2FsbGJhY2soKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IEJvb2xlYW4/ID0gbnVsbAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5kYXRhRW5hYmxlZC5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCiAKQEAgLTQ3OSw3ICs0OTgsNyBAQAogCiAgICAgQFRlc3QKICAgICBmdW4gbnVtYmVyT2ZMZXZlbHNfaXNEZWZhdWx0KCkgPQotICAgICAgICBydW5CbG9ja2luZyhJTU1FRElBVEUpIHsKKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogSW50PyA9IG51bGwKICAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QubnVtYmVyT2ZMZXZlbHMub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQogCkBAIC00ODksNTEgKzUwOCw2OCBAQAogICAgICAgICB9CiAKICAgICBAVGVzdAotICAgIGZ1biBgcm9hbWluZyAtIGNkbWEgLSBxdWVyaWVzIHRlbGVwaG9ueSBtYW5hZ2VyYCgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgZnVuIHJvYW1pbmdfY2RtYV9xdWVyaWVzVGVsZXBob255TWFuYWdlcigpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogQm9vbGVhbj8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LmNkbWFSb2FtaW5nLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIAogICAgICAgICAgICAgdmFsIGNiID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPFNlcnZpY2VTdGF0ZUxpc3RlbmVyPigpCiAKLSAgICAgICAgICAgIHZhbCBzZXJ2aWNlU3RhdGUgPSBTZXJ2aWNlU3RhdGUoKQotICAgICAgICAgICAgc2VydmljZVN0YXRlLnJvYW1pbmcgPSBmYWxzZQotCi0gICAgICAgICAgICAvLyBDRE1BIHJvYW1pbmcgaXMgb2ZmLCBHU00gcm9hbWluZyBpcyBvZmYKKyAgICAgICAgICAgIC8vIENETUEgcm9hbWluZyBpcyBvZmYsIEdTTSByb2FtaW5nIGlzIG9uCiAgICAgICAgICAgICB3aGVuZXZlcih0ZWxlcGhvbnlNYW5hZ2VyLmNkbWFFbmhhbmNlZFJvYW1pbmdJbmRpY2F0b3JEaXNwbGF5TnVtYmVyKS50aGVuUmV0dXJuKEVSSV9PRkYpCi0gICAgICAgICAgICBjYi5vblNlcnZpY2VTdGF0ZUNoYW5nZWQoc2VydmljZVN0YXRlKQorICAgICAgICAgICAgY2Iub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSgpLmFsc28geyBpdC5yb2FtaW5nID0gdHJ1ZSB9KQogCiAgICAgICAgICAgICBhc3NlcnRUaGF0KGxhdGVzdCkuaXNGYWxzZSgpCiAKLSAgICAgICAgICAgIC8vIENETUEgcm9hbWluZyBpcyBvZmYsIEdTTSByb2FtaW5nIGlzIG9uCisgICAgICAgICAgICAvLyBDRE1BIHJvYW1pbmcgaXMgb24sIEdTTSByb2FtaW5nIGlzIG9mZgogICAgICAgICAgICAgd2hlbmV2ZXIodGVsZXBob255TWFuYWdlci5jZG1hRW5oYW5jZWRSb2FtaW5nSW5kaWNhdG9yRGlzcGxheU51bWJlcikudGhlblJldHVybihFUklfT04pCi0gICAgICAgICAgICBjYi5vblNlcnZpY2VTdGF0ZUNoYW5nZWQoc2VydmljZVN0YXRlKQorICAgICAgICAgICAgY2Iub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSgpLmFsc28geyBpdC5yb2FtaW5nID0gZmFsc2UgfSkKIAogICAgICAgICAgICAgYXNzZXJ0VGhhdChsYXRlc3QpLmlzVHJ1ZSgpCiAKICAgICAgICAgICAgIGpvYi5jYW5jZWwoKQogICAgICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBbVGVsZXBob255TWFuYWdlci5nZXRDZG1hRW5oYW5jZWRSb2FtaW5nSW5kaWNhdG9yRGlzcGxheU51bWJlcl0gcmV0dXJucyAtMSBpZiB0aGUgc2VydmljZSBpcworICAgICAqIG5vdCBydW5uaW5nIG9yIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGNkbWEgRVJJCisgICAgICovCiAgICAgQFRlc3QKLSAgICBmdW4gYHJvYW1pbmcgLSBnc20gLSBxdWVyaWVzIHNlcnZpY2Ugc3RhdGVgKCkgPQotICAgICAgICBydW5CbG9ja2luZyhJTU1FRElBVEUpIHsKKyAgICBmdW4gY2RtYVJvYW1pbmdfaWdub3Jlc05lZ2F0aXZlT25lKCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CiAgICAgICAgICAgICB2YXIgbGF0ZXN0OiBCb29sZWFuPyA9IG51bGwKLSAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QuaXNSb2FtaW5nLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKKyAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QuY2RtYVJvYW1pbmcub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQogCiAgICAgICAgICAgICB2YWwgc2VydmljZVN0YXRlID0gU2VydmljZVN0YXRlKCkKICAgICAgICAgICAgIHNlcnZpY2VTdGF0ZS5yb2FtaW5nID0gZmFsc2UKIAogICAgICAgICAgICAgdmFsIGNiID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPFNlcnZpY2VTdGF0ZUxpc3RlbmVyPigpCiAKLSAgICAgICAgICAgIC8vIENETUEgcm9hbWluZyBpcyBvZmYsIEdTTSByb2FtaW5nIGlzIG9mZgotICAgICAgICAgICAgd2hlbmV2ZXIodGVsZXBob255TWFuYWdlci5jZG1hRW5oYW5jZWRSb2FtaW5nSW5kaWNhdG9yRGlzcGxheU51bWJlcikudGhlblJldHVybihFUklfT0ZGKQorICAgICAgICAgICAgLy8gQ0RNQSByb2FtaW5nIGlzIHVuYXZhaWxhYmxlICgtMSksIEdTTSByb2FtaW5nIGlzIG9mZgorICAgICAgICAgICAgd2hlbmV2ZXIodGVsZXBob255TWFuYWdlci5jZG1hRW5oYW5jZWRSb2FtaW5nSW5kaWNhdG9yRGlzcGxheU51bWJlcikudGhlblJldHVybigtMSkKICAgICAgICAgICAgIGNiLm9uU2VydmljZVN0YXRlQ2hhbmdlZChzZXJ2aWNlU3RhdGUpCiAKICAgICAgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KS5pc0ZhbHNlKCkKIAorICAgICAgICAgICAgam9iLmNhbmNlbCgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHJvYW1pbmdfZ3NtX3F1ZXJpZXNTZXJ2aWNlU3RhdGUoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhciBsYXRlc3Q6IEJvb2xlYW4/ID0gbnVsbAorICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5pc1JvYW1pbmcub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQorCisgICAgICAgICAgICB2YWwgY2IgPSBnZXRUZWxlcGhvbnlDYWxsYmFja0ZvclR5cGU8U2VydmljZVN0YXRlTGlzdGVuZXI+KCkKKworICAgICAgICAgICAgLy8gQ0RNQSByb2FtaW5nIGlzIG9mZiwgR1NNIHJvYW1pbmcgaXMgb2ZmCisgICAgICAgICAgICB3aGVuZXZlcih0ZWxlcGhvbnlNYW5hZ2VyLmNkbWFFbmhhbmNlZFJvYW1pbmdJbmRpY2F0b3JEaXNwbGF5TnVtYmVyKS50aGVuUmV0dXJuKEVSSV9PRkYpCisgICAgICAgICAgICBjYi5vblNlcnZpY2VTdGF0ZUNoYW5nZWQoU2VydmljZVN0YXRlKCkuYWxzbyB7IGl0LnJvYW1pbmcgPSBmYWxzZSB9KQorCisgICAgICAgICAgICBhc3NlcnRUaGF0KGxhdGVzdCkuaXNGYWxzZSgpCisKICAgICAgICAgICAgIC8vIENETUEgcm9hbWluZyBpcyBvZmYsIEdTTSByb2FtaW5nIGlzIG9uCi0gICAgICAgICAgICBzZXJ2aWNlU3RhdGUucm9hbWluZyA9IHRydWUKLSAgICAgICAgICAgIGNiLm9uU2VydmljZVN0YXRlQ2hhbmdlZChzZXJ2aWNlU3RhdGUpCisgICAgICAgICAgICBjYi5vblNlcnZpY2VTdGF0ZUNoYW5nZWQoU2VydmljZVN0YXRlKCkuYWxzbyB7IGl0LnJvYW1pbmcgPSB0cnVlIH0pCiAKICAgICAgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KS5pc1RydWUoKQogCkBAIC01NDEsOCArNTc3LDggQEAKICAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gYGFjdGl2aXR5IC0gdXBkYXRlcyBmcm9tIGNhbGxiYWNrYCgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgZnVuIGFjdGl2aXR5X3VwZGF0ZXNGcm9tQ2FsbGJhY2soKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IERhdGFBY3Rpdml0eU1vZGVsPyA9IG51bGwKICAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QuZGF0YUFjdGl2aXR5RGlyZWN0aW9uLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtNTc4LDggKzYxNCw4IEBACiAgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGBuZXR3b3JrIG5hbWUgLSBkZWZhdWx0YCgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgZnVuIG5ldHdvcmtOYW1lX2RlZmF1bHQoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IE5ldHdvcmtOYW1lTW9kZWw/ID0gbnVsbAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5uZXR3b3JrTmFtZS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCiAKQEAgLTU4OSw4ICs2MjUsOCBAQAogICAgICAgICB9CiAKICAgICBAVGVzdAotICAgIGZ1biBgbmV0d29yayBuYW1lIC0gdXNlcyBicm9hZGNhc3QgaW5mbyAtIHJldHVybnMgZGVyaXZlZGAoKSA9Ci0gICAgICAgIHJ1bkJsb2NraW5nKElNTUVESUFURSkgeworICAgIGZ1biBuZXR3b3JrTmFtZV91c2VzQnJvYWRjYXN0SW5mb19yZXR1cm5zRGVyaXZlZCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogTmV0d29ya05hbWVNb2RlbD8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0Lm5ldHdvcmtOYW1lLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtNjA2LDggKzY0Miw4IEBACiAgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGBuZXR3b3JrIG5hbWUgLSBicm9hZGNhc3Qgbm90IGZvciB0aGlzIHN1YiBpZCAtIGtlZXBzIG9sZCB2YWx1ZWAoKSA9Ci0gICAgICAgIHJ1bkJsb2NraW5nKElNTUVESUFURSkgeworICAgIGZ1biBuZXR3b3JrTmFtZV9icm9hZGNhc3ROb3RGb3JUaGlzU3ViSWRfa2VlcHNPbGRWYWx1ZSgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogTmV0d29ya05hbWVNb2RlbD8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0Lm5ldHdvcmtOYW1lLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtNjMxLDggKzY2Nyw4IEBACiAgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGBuZXR3b3JrIG5hbWUgLSBicm9hZGNhc3QgaGFzIG5vIGRhdGEgLSB1cGRhdGVzIHRvIGRlZmF1bHRgKCkgPQotICAgICAgICBydW5CbG9ja2luZyhJTU1FRElBVEUpIHsKKyAgICBmdW4gbmV0d29ya05hbWVfYnJvYWRjYXN0SGFzTm9EYXRhX3VwZGF0ZXNUb0RlZmF1bHQoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKICAgICAgICAgICAgIHZhciBsYXRlc3Q6IE5ldHdvcmtOYW1lTW9kZWw/ID0gbnVsbAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5uZXR3b3JrTmFtZS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCiAKQEAgLTY1OCw4ICs2OTQsOCBAQAogICAgICAgICB9CiAKICAgICBAVGVzdAotICAgIGZ1biBgb3BlcmF0b3JBbHBoYVNob3J0IC0gdHJhY2tlZGAoKSA9Ci0gICAgICAgIHJ1bkJsb2NraW5nKElNTUVESUFURSkgeworICAgIGZ1biBvcGVyYXRvckFscGhhU2hvcnRfdHJhY2tlZCgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogU3RyaW5nPyA9IG51bGwKIAogICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5vcGVyYXRvckFscGhhU2hvcnQub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQpAQCAtNjgwLDMzICs3MTYsNDUgQEAKICAgICAgICAgfQogCiAgICAgQFRlc3QKLSAgICBmdW4gYGNvbm5lY3Rpb24gbW9kZWwgLSBpc0luU2VydmljZSAtIG5vdCBpd2xhbmAoKSA9Ci0gICAgICAgIHJ1bkJsb2NraW5nKElNTUVESUFURSkgeworICAgIGZ1biBpc0luU2VydmljZV9ub3RJd2xhbigpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogQm9vbGVhbj8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LmlzSW5TZXJ2aWNlLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIAotICAgICAgICAgICAgdmFsIHNlcnZpY2VTdGF0ZSA9IFNlcnZpY2VTdGF0ZSgpCi0gICAgICAgICAgICBzZXJ2aWNlU3RhdGUudm9pY2VSZWdTdGF0ZSA9IFNUQVRFX0lOX1NFUlZJQ0UKLSAgICAgICAgICAgIHNlcnZpY2VTdGF0ZS5kYXRhUmVnU3RhdGUgPSBTVEFURV9JTl9TRVJWSUNFCi0KLSAgICAgICAgICAgIGdldFRlbGVwaG9ueUNhbGxiYWNrRm9yVHlwZTxTZXJ2aWNlU3RhdGVMaXN0ZW5lcj4oKS5vblNlcnZpY2VTdGF0ZUNoYW5nZWQoc2VydmljZVN0YXRlKQorICAgICAgICAgICAgZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPFNlcnZpY2VTdGF0ZUxpc3RlbmVyPigpCisgICAgICAgICAgICAgICAgLm9uU2VydmljZVN0YXRlQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZVN0YXRlKCkuYWxzbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdC52b2ljZVJlZ1N0YXRlID0gU1RBVEVfSU5fU0VSVklDRQorICAgICAgICAgICAgICAgICAgICAgICAgaXQuZGF0YVJlZ1N0YXRlID0gU1RBVEVfSU5fU0VSVklDRQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKQogCiAgICAgICAgICAgICBhc3NlcnRUaGF0KGxhdGVzdCkuaXNUcnVlKCkKIAotICAgICAgICAgICAgc2VydmljZVN0YXRlLnZvaWNlUmVnU3RhdGUgPSBTVEFURV9PVVRfT0ZfU0VSVklDRQotICAgICAgICAgICAgZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPFNlcnZpY2VTdGF0ZUxpc3RlbmVyPigpLm9uU2VydmljZVN0YXRlQ2hhbmdlZChzZXJ2aWNlU3RhdGUpCisgICAgICAgICAgICBnZXRUZWxlcGhvbnlDYWxsYmFja0ZvclR5cGU8U2VydmljZVN0YXRlTGlzdGVuZXI+KCkKKyAgICAgICAgICAgICAgICAub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlU3RhdGUoKS5hbHNvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0LmRhdGFSZWdTdGF0ZSA9IFNUQVRFX0lOX1NFUlZJQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0LnZvaWNlUmVnU3RhdGUgPSBTVEFURV9PVVRfT0ZfU0VSVklDRQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgYXNzZXJ0VGhhdChsYXRlc3QpLmlzVHJ1ZSgpCiAKLSAgICAgICAgICAgIHNlcnZpY2VTdGF0ZS5kYXRhUmVnU3RhdGUgPSBTVEFURV9PVVRfT0ZfU0VSVklDRQotICAgICAgICAgICAgZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPFNlcnZpY2VTdGF0ZUxpc3RlbmVyPigpLm9uU2VydmljZVN0YXRlQ2hhbmdlZChzZXJ2aWNlU3RhdGUpCisgICAgICAgICAgICBnZXRUZWxlcGhvbnlDYWxsYmFja0ZvclR5cGU8U2VydmljZVN0YXRlTGlzdGVuZXI+KCkKKyAgICAgICAgICAgICAgICAub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlU3RhdGUoKS5hbHNvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0LnZvaWNlUmVnU3RhdGUgPSBTVEFURV9PVVRfT0ZfU0VSVklDRQorICAgICAgICAgICAgICAgICAgICAgICAgaXQuZGF0YVJlZ1N0YXRlID0gU1RBVEVfT1VUX09GX1NFUlZJQ0UKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KS5pc0ZhbHNlKCkKIAogICAgICAgICAgICAgam9iLmNhbmNlbCgpCiAgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGBjb25uZWN0aW9uIG1vZGVsIC0gaXNJblNlcnZpY2UgLSBpcyBpd2xhbiAtIHZvaWNlIG91dCBvZiBzZXJ2aWNlIC0gZGF0YSBpbiBzZXJ2aWNlYCgpID0KLSAgICAgICAgcnVuQmxvY2tpbmcoSU1NRURJQVRFKSB7CisgICAgZnVuIGlzSW5TZXJ2aWNlX2lzSXdsYW5fdm9pY2VPdXRPZlNlcnZpY2VfZGF0YUluU2VydmljZSgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogQm9vbGVhbj8gPSBudWxsCiAgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LmlzSW5TZXJ2aWNlLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKIApAQCAtNzMwLDggKzc3OCw4IEBACiAgICAgICAgIH0KIAogICAgIEBUZXN0Ci0gICAgZnVuIGBudW1iZXIgb2YgbGV2ZWxzIC0gdXNlcyBjYXJyaWVyIGNvbmZpZ2AoKSA9Ci0gICAgICAgIHJ1bkJsb2NraW5nKElNTUVESUFURSkgeworICAgIGZ1biBudW1iZXJPZkxldmVsc191c2VzQ2FycmllckNvbmZpZygpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgewogICAgICAgICAgICAgdmFyIGxhdGVzdDogSW50PyA9IG51bGwKICAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QubnVtYmVyT2ZMZXZlbHMub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQogCkBAIC03NTYsMTkgKzgwNCw2IEBACiAgICAgICAgIHJldHVybiBNb2JpbGVUZWxlcGhvbnlIZWxwZXJzLmdldFRlbGVwaG9ueUNhbGxiYWNrRm9yVHlwZSh0ZWxlcGhvbnlNYW5hZ2VyKQogICAgIH0KIAotICAgIC8qKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3RvciBmb3IgU2lnbmFsU3RyZW5ndGggKi8KLSAgICBwcml2YXRlIGZ1biBzaWduYWxTdHJlbmd0aChnc21MZXZlbDogSW50LCBjZG1hTGV2ZWw6IEludCwgaXNHc206IEJvb2xlYW4pOiBTaWduYWxTdHJlbmd0aCB7Ci0gICAgICAgIHZhbCBzaWduYWxTdHJlbmd0aCA9IG1vY2s8U2lnbmFsU3RyZW5ndGg+KCkKLSAgICAgICAgd2hlbmV2ZXIoc2lnbmFsU3RyZW5ndGguaXNHc20pLnRoZW5SZXR1cm4oaXNHc20pCi0gICAgICAgIHdoZW5ldmVyKHNpZ25hbFN0cmVuZ3RoLmxldmVsKS50aGVuUmV0dXJuKGdzbUxldmVsKQotICAgICAgICB2YWwgY2RtYVN0cmVuZ3RoID0KLSAgICAgICAgICAgIG1vY2s8Q2VsbFNpZ25hbFN0cmVuZ3RoQ2RtYT4oKS5hbHNvIHsgd2hlbmV2ZXIoaXQubGV2ZWwpLnRoZW5SZXR1cm4oY2RtYUxldmVsKSB9Ci0gICAgICAgIHdoZW5ldmVyKHNpZ25hbFN0cmVuZ3RoLmdldENlbGxTaWduYWxTdHJlbmd0aHMoQ2VsbFNpZ25hbFN0cmVuZ3RoQ2RtYTo6Y2xhc3MuamF2YSkpCi0gICAgICAgICAgICAudGhlblJldHVybihsaXN0T2YoY2RtYVN0cmVuZ3RoKSkKLQotICAgICAgICByZXR1cm4gc2lnbmFsU3RyZW5ndGgKLSAgICB9Ci0KICAgICBwcml2YXRlIGZ1biBzcG5JbnRlbnQoCiAgICAgICAgIHN1YklkOiBJbnQgPSBTVUJfMV9JRCwKICAgICAgICAgc2hvd1NwbjogQm9vbGVhbiA9IHRydWUsCkBAIC03ODUsNyArODIwLDYgQEAKICAgICAgICAgfQogCiAgICAgY29tcGFuaW9uIG9iamVjdCB7Ci0gICAgICAgIHByaXZhdGUgdmFsIElNTUVESUFURSA9IERpc3BhdGNoZXJzLk1haW4uaW1tZWRpYXRlCiAgICAgICAgIHByaXZhdGUgY29uc3QgdmFsIFNVQl8xX0lEID0gMQogCiAgICAgICAgIHByaXZhdGUgdmFsIERFRkFVTFRfTkFNRSA9IE5ldHdvcmtOYW1lTW9kZWwuRGVmYXVsdCgiZGVmYXVsdCBuYW1lIikKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGlwZWxpbmUvbW9iaWxlL2RhdGEvcmVwb3NpdG9yeS9wcm9kL01vYmlsZUNvbm5lY3Rpb25UZWxlcGhvbnlTbW9rZVRlc3RzLmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waXBlbGluZS9tb2JpbGUvZGF0YS9yZXBvc2l0b3J5L3Byb2QvTW9iaWxlQ29ubmVjdGlvblRlbGVwaG9ueVNtb2tlVGVzdHMua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmMDRlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BpcGVsaW5lL21vYmlsZS9kYXRhL3JlcG9zaXRvcnkvcHJvZC9Nb2JpbGVDb25uZWN0aW9uVGVsZXBob255U21va2VUZXN0cy5rdApAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBpcGVsaW5lLm1vYmlsZS5kYXRhLnJlcG9zaXRvcnkucHJvZAorCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255Q2FsbGJhY2sKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlDYWxsYmFjay5DYXJyaWVyTmV0d29ya0xpc3RlbmVyCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255Q2FsbGJhY2suRGF0YUFjdGl2aXR5TGlzdGVuZXIKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlDYWxsYmFjay5EYXRhQ29ubmVjdGlvblN0YXRlTGlzdGVuZXIKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlDYWxsYmFjay5EYXRhRW5hYmxlZExpc3RlbmVyCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255Q2FsbGJhY2suRGlzcGxheUluZm9MaXN0ZW5lcgoraW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueUNhbGxiYWNrLlNlcnZpY2VTdGF0ZUxpc3RlbmVyCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255RGlzcGxheUluZm8KK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlci5EQVRBX0FDVElWSVRZX0lOT1VUCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlci5ORVRXT1JLX1RZUEVfTFRFCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlci5ORVRXT1JLX1RZUEVfVU5LTk9XTgoraW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5TbWFsbFRlc3QKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5TeXN1aVRlc3RDYXNlCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkubG9nLnRhYmxlLlRhYmxlTG9nQnVmZmVyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBpcGVsaW5lLm1vYmlsZS5kYXRhLk1vYmlsZUlucHV0TG9nZ2VyCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBpcGVsaW5lLm1vYmlsZS5kYXRhLm1vZGVsLkRhdGFDb25uZWN0aW9uU3RhdGUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGlwZWxpbmUubW9iaWxlLmRhdGEubW9kZWwuTmV0d29ya05hbWVNb2RlbAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waXBlbGluZS5tb2JpbGUuZGF0YS5tb2RlbC5SZXNvbHZlZE5ldHdvcmtUeXBlCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBpcGVsaW5lLm1vYmlsZS5kYXRhLm1vZGVsLlN5c3RlbVVpQ2FycmllckNvbmZpZworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waXBlbGluZS5tb2JpbGUuZGF0YS5tb2RlbC5TeXN0ZW1VaUNhcnJpZXJDb25maWdUZXN0CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBpcGVsaW5lLm1vYmlsZS5kYXRhLnJlcG9zaXRvcnkuRmFrZU1vYmlsZUNvbm5lY3Rpb25zUmVwb3NpdG9yeQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5waXBlbGluZS5tb2JpbGUuZGF0YS5yZXBvc2l0b3J5LnByb2QuTW9iaWxlVGVsZXBob255SGVscGVycy5nZXRUZWxlcGhvbnlDYWxsYmFja0ZvclR5cGUKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGlwZWxpbmUubW9iaWxlLmRhdGEucmVwb3NpdG9yeS5wcm9kLk1vYmlsZVRlbGVwaG9ueUhlbHBlcnMuc2lnbmFsU3RyZW5ndGgKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGlwZWxpbmUubW9iaWxlLnV0aWwuRmFrZU1vYmlsZU1hcHBpbmdzUHJveHkKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGlwZWxpbmUuc2hhcmVkLmRhdGEubW9kZWwuRGF0YUFjdGl2aXR5TW9kZWwKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8ubW9jaworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnV0aWwubW9ja2l0by53aGVuZXZlcgoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoLmFzc2VydFRoYXQKK2ltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuRXhwZXJpbWVudGFsQ29yb3V0aW5lc0FwaQoraW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LmxhdW5jaEluCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cub25FYWNoCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QuVGVzdFNjb3BlCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QuVW5jb25maW5lZFRlc3REaXNwYXRjaGVyCitpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLnRlc3QucnVuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5CZWZvcmUKK2ltcG9ydCBvcmcuanVuaXQuVGVzdAoraW1wb3J0IG9yZy5tb2NraXRvLk1vY2sKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnMKKworLyoqCisgKiBUZXN0IGNsYXNzIHRvIHN0cmVzcyB0ZXN0IHRoZSBUZWxlcGhvbnlDYWxsYmFja3MgdGhhdCB3ZSBsaXN0ZW4gdG8uIEluIHBhcnRpY3VsYXIsIHRoZSBjYWxsYmFja3MKKyAqIGFsbCBjb21lIGJhY2sgaW4gb24gYSBzaW5nbGUgbGlzdGVuZXIgKGZvciByZWFzb25zIGRlZmluZWQgaW4gdGhlIHN5c3RlbSkuIFRoaXMgdGVzdCBpcyBidWlsdCB0bworICogZW5zdXJlIHRoYXQgd2UgZG9uJ3QgbWlzcyBhbnkgaW1wb3J0YW50IGNhbGxiYWNrcy4KKyAqCisgKiBLaW5kIG9mIGxpa2UgYW4gaW50ZXJhY3Rpb24gdGVzdCBjYXNlIGJ1aWxkIGp1c3QgZm9yIFtUZWxlcGhvbnlDYWxsYmFja10KKyAqCisgKiBUaGUgbGlzdCBvZiB0ZWxlcGhvbnkgY2FsbGJhY2tzIHdlIHVzZSBpczogW1RlbGVwaG9ueUNhbGxiYWNrLkNhcnJpZXJOZXR3b3JrTGlzdGVuZXJdCisgKiBbVGVsZXBob255Q2FsbGJhY2suRGF0YUFjdGl2aXR5TGlzdGVuZXJdIFtUZWxlcGhvbnlDYWxsYmFjay5EYXRhQ29ubmVjdGlvblN0YXRlTGlzdGVuZXJdCisgKiBbVGVsZXBob255Q2FsbGJhY2suRGF0YUVuYWJsZWRMaXN0ZW5lcl0gW1RlbGVwaG9ueUNhbGxiYWNrLkRpc3BsYXlJbmZvTGlzdGVuZXJdCisgKiBbVGVsZXBob255Q2FsbGJhY2suU2VydmljZVN0YXRlTGlzdGVuZXJdIFtUZWxlcGhvbnlDYWxsYmFjay5TaWduYWxTdHJlbmd0aHNMaXN0ZW5lcl0KKyAqCisgKiBCZWNhdXNlIGVhY2ggb2YgdGhlc2UgY2FsbGJhY2tzIGNvbWVzIGluIG9uIHRoZSBzYW1lIGNhbGxiYWNrRmxvdywgY29sbGVjdGluZyBvbiBhIGZpZWxkIGJhY2tlZAorICogYnkgb25seSBhIHNpbmdsZSBjYWxsYmFjayBjYW4gaW1tZWRpYXRlbHkgY3JlYXRlIGJhY2twcmVzc3VyZSBvbiB0aGUgb3RoZXIgZmllbGRzIHJlbGF0ZWQgdG8gYQorICogbW9iaWxlIGNvbm5lY3Rpb24uCisgKgorICogVGhpcyB0ZXN0IHNob3VsZCBiZSBkZXNpZ25lZCB0byB0ZXN0IF9hdCBsZWFzdF8gZWFjaCBpbmRpdmlkdWFsIGNhbGxiYWNrIGluIGEgc21va2UtdGVzdCBmYXNoaW9uLgorICogVGhlIHdheSB3ZSB3aWxsIGFjaGlldmUgdGhpcyBpcyBhcyBmb2xsb3dzOgorICogMS4gU3RhcnQgdXAgYSBsaXN0ZW5lciAoQSkgY29sbGVjdGluZyBvbiBhIGZpZWxkIHdoaWNoIGlzIF9ub3QgdW5kZXIgdGVzdF8KKyAqIDIuIFNlbmQgYSBzaW5nbGUgZXZlbnQgdG8gYSB0ZWxlcGhvbnkgY2FsbGJhY2sgd2hpY2ggc3VwcG9ydHMgdGhlIGZpZWxkIHVuZGVyIHRlc3QgKEIpCisgKiAzLiBTZW5kIG1hbnkgKG1heSBiZSBhcyBmZXcgYXMgMikgZXZlbnRzIHRvIHRoZSBjYWxsYmFjayBiYWNraW5nIEEgdG8gZW5zdXJlIHdlIHN0YXJ0IHNlZWluZworICogICAgYmFja3ByZXNzdXJlIG9uIG90aGVyIGZpZWxkcyBOT1RFOiBwb29yIGhhbmRsaW5nIG9mIGJhY2twcmVzc3VyZSBoZXJlIHdvdWxkIG5vcm1hbGx5IGNhdXNlIEIKKyAqICAgIHRvIGdldCBkcm9wcGVkCisgKiA0LiBTdGFydCB1cCBhIG5ldyBjb2xsZWN0b3IgZm9yIEIKKyAqIDUuIEFzc2VydCB0aGF0IEIgaGFzIHRoZSBzdGF0ZSBzZW50IGluIHN0ZXAgIzIKKyAqLworQFN1cHByZXNzKCJFWFBFUklNRU5UQUxfSVNfTk9UX0VOQUJMRUQiKQorQE9wdEluKEV4cGVyaW1lbnRhbENvcm91dGluZXNBcGk6OmNsYXNzKQorQFNtYWxsVGVzdAorY2xhc3MgTW9iaWxlQ29ubmVjdGlvblRlbGVwaG9ueVNtb2tlVGVzdHMgOiBTeXN1aVRlc3RDYXNlKCkgeworICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHVuZGVyVGVzdDogTW9iaWxlQ29ubmVjdGlvblJlcG9zaXRvcnlJbXBsCisgICAgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgY29ubmVjdGlvbnNSZXBvOiBGYWtlTW9iaWxlQ29ubmVjdGlvbnNSZXBvc2l0b3J5CisKKyAgICBATW9jayBwcml2YXRlIGxhdGVpbml0IHZhciB0ZWxlcGhvbnlNYW5hZ2VyOiBUZWxlcGhvbnlNYW5hZ2VyCisgICAgQE1vY2sgcHJpdmF0ZSBsYXRlaW5pdCB2YXIgbG9nZ2VyOiBNb2JpbGVJbnB1dExvZ2dlcgorICAgIEBNb2NrIHByaXZhdGUgbGF0ZWluaXQgdmFyIHRhYmxlTG9nZ2VyOiBUYWJsZUxvZ0J1ZmZlcgorCisgICAgcHJpdmF0ZSB2YWwgbW9iaWxlTWFwcGluZ3MgPSBGYWtlTW9iaWxlTWFwcGluZ3NQcm94eSgpCisgICAgcHJpdmF0ZSB2YWwgc3lzdGVtVWlDYXJyaWVyQ29uZmlnID0KKyAgICAgICAgU3lzdGVtVWlDYXJyaWVyQ29uZmlnKAorICAgICAgICAgICAgU1VCXzFfSUQsCisgICAgICAgICAgICBTeXN0ZW1VaUNhcnJpZXJDb25maWdUZXN0LmNyZWF0ZVRlc3RDb25maWcoKSwKKyAgICAgICAgKQorCisgICAgcHJpdmF0ZSB2YWwgdGVzdERpc3BhdGNoZXIgPSBVbmNvbmZpbmVkVGVzdERpc3BhdGNoZXIoKQorICAgIHByaXZhdGUgdmFsIHRlc3RTY29wZSA9IFRlc3RTY29wZSh0ZXN0RGlzcGF0Y2hlcikKKworICAgIEBCZWZvcmUKKyAgICBmdW4gc2V0VXAoKSB7CisgICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcykKKyAgICAgICAgd2hlbmV2ZXIodGVsZXBob255TWFuYWdlci5zdWJzY3JpcHRpb25JZCkudGhlblJldHVybihTVUJfMV9JRCkKKworICAgICAgICBjb25uZWN0aW9uc1JlcG8gPSBGYWtlTW9iaWxlQ29ubmVjdGlvbnNSZXBvc2l0b3J5KG1vYmlsZU1hcHBpbmdzLCB0YWJsZUxvZ2dlcikKKworICAgICAgICB1bmRlclRlc3QgPQorICAgICAgICAgICAgTW9iaWxlQ29ubmVjdGlvblJlcG9zaXRvcnlJbXBsKAorICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgU1VCXzFfSUQsCisgICAgICAgICAgICAgICAgREVGQVVMVF9OQU1FLAorICAgICAgICAgICAgICAgIFNFUCwKKyAgICAgICAgICAgICAgICB0ZWxlcGhvbnlNYW5hZ2VyLAorICAgICAgICAgICAgICAgIHN5c3RlbVVpQ2FycmllckNvbmZpZywKKyAgICAgICAgICAgICAgICBmYWtlQnJvYWRjYXN0RGlzcGF0Y2hlciwKKyAgICAgICAgICAgICAgICBtb2JpbGVNYXBwaW5ncywKKyAgICAgICAgICAgICAgICB0ZXN0RGlzcGF0Y2hlciwKKyAgICAgICAgICAgICAgICBsb2dnZXIsCisgICAgICAgICAgICAgICAgdGFibGVMb2dnZXIsCisgICAgICAgICAgICAgICAgdGVzdFNjb3BlLmJhY2tncm91bmRTY29wZSwKKyAgICAgICAgICAgICkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBjYXJyaWVyTmV0d29ya0NoYW5nZUxpc3RlbmVyX25vaXN5QWN0aXZpdHkoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhciBsYXRlc3Q6IEJvb2xlYW4/ID0gbnVsbAorCisgICAgICAgICAgICAvLyBTdGFydCBjb2xsZWN0aW5nIGRhdGEgYWN0aXZpdHk7IGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdAorICAgICAgICAgICAgdmFsIGFjdGl2aXR5Sm9iID0gdW5kZXJUZXN0LmRhdGFBY3Rpdml0eURpcmVjdGlvbi5sYXVuY2hJbih0aGlzKQorICAgICAgICAgICAgdmFsIGFjdGl2aXR5Q2FsbGJhY2sgPSBnZXRUZWxlcGhvbnlDYWxsYmFja0ZvclR5cGU8RGF0YUFjdGl2aXR5TGlzdGVuZXI+KCkKKworICAgICAgICAgICAgdmFsIGNhbGxiYWNrID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPENhcnJpZXJOZXR3b3JrTGlzdGVuZXI+KCkKKyAgICAgICAgICAgIGNhbGxiYWNrLm9uQ2Fycmllck5ldHdvcmtDaGFuZ2UodHJ1ZSkKKworICAgICAgICAgICAgZmxpcEFjdGl2aXR5KDEwMCwgYWN0aXZpdHlDYWxsYmFjaykKKworICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5jYXJyaWVyTmV0d29ya0NoYW5nZUFjdGl2ZS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCisKKyAgICAgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KS5pc1RydWUoKQorCisgICAgICAgICAgICBhY3Rpdml0eUpvYi5jYW5jZWwoKQorICAgICAgICAgICAgam9iLmNhbmNlbCgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIGRhdGFBY3Rpdml0eUxhdGVfbm9pc3lEaXNwbGF5SW5mbygpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFyIGxhdGVzdDogRGF0YUFjdGl2aXR5TW9kZWw/ID0gbnVsbAorCisgICAgICAgICAgICAvLyBzdGFydCBjb2xsZWN0aW5nIGRpc3BsYXlJbmZvOyBkb24ndCBjYXJlIGFib3V0IHRoZSByZXN1bHQKKyAgICAgICAgICAgIHZhbCBkaXNwbGF5SW5mb0pvYiA9IHVuZGVyVGVzdC5yZXNvbHZlZE5ldHdvcmtUeXBlLmxhdW5jaEluKHRoaXMpCisKKyAgICAgICAgICAgIHZhbCBhY3Rpdml0eUNhbGxiYWNrID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPERhdGFBY3Rpdml0eUxpc3RlbmVyPigpCisgICAgICAgICAgICBhY3Rpdml0eUNhbGxiYWNrLm9uRGF0YUFjdGl2aXR5KERBVEFfQUNUSVZJVFlfSU5PVVQpCisKKyAgICAgICAgICAgIHZhbCBkaXNwbGF5SW5mb0NhbGxiYWNrID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPERpc3BsYXlJbmZvTGlzdGVuZXI+KCkKKyAgICAgICAgICAgIHZhbCB0eXBlMSA9IE5FVFdPUktfVFlQRV9VTktOT1dOCisgICAgICAgICAgICB2YWwgdHlwZTIgPSBORVRXT1JLX1RZUEVfTFRFCisgICAgICAgICAgICB2YWwgdDEgPQorICAgICAgICAgICAgICAgIG1vY2s8VGVsZXBob255RGlzcGxheUluZm8+KCkuYWxzbyB7IHdoZW5ldmVyKGl0Lm5ldHdvcmtUeXBlKS50aGVuUmV0dXJuKHR5cGUxKSB9CisgICAgICAgICAgICB2YWwgdDIgPQorICAgICAgICAgICAgICAgIG1vY2s8VGVsZXBob255RGlzcGxheUluZm8+KCkuYWxzbyB7IHdoZW5ldmVyKGl0Lm5ldHdvcmtUeXBlKS50aGVuUmV0dXJuKHR5cGUyKSB9CisKKyAgICAgICAgICAgIGZsaXBEaXNwbGF5SW5mbygxMDAsIGxpc3RPZih0MSwgdDIpLCBkaXNwbGF5SW5mb0NhbGxiYWNrKQorCisgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LmRhdGFBY3Rpdml0eURpcmVjdGlvbi5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCisKKyAgICAgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgIERhdGFBY3Rpdml0eU1vZGVsKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFzQWN0aXZpdHlJbiA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBoYXNBY3Rpdml0eU91dCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgIGRpc3BsYXlJbmZvSm9iLmNhbmNlbCgpCisgICAgICAgICAgICBqb2IuY2FuY2VsKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gZGF0YUNvbm5lY3Rpb25TdGF0ZUxpc3RlbmVyX25vaXN5QWN0aXZpdHkoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhciBsYXRlc3Q6IERhdGFDb25uZWN0aW9uU3RhdGU/ID0gbnVsbAorCisgICAgICAgICAgICAvLyBTdGFydCBjb2xsZWN0aW5nIGRhdGEgYWN0aXZpdHk7IGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdAorICAgICAgICAgICAgdmFsIGFjdGl2aXR5Sm9iID0gdW5kZXJUZXN0LmRhdGFBY3Rpdml0eURpcmVjdGlvbi5sYXVuY2hJbih0aGlzKQorCisgICAgICAgICAgICB2YWwgY29ubmVjdGlvbkNhbGxiYWNrID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPERhdGFDb25uZWN0aW9uU3RhdGVMaXN0ZW5lcj4oKQorICAgICAgICAgICAgdmFsIGFjdGl2aXR5Q2FsbGJhY2sgPSBnZXRUZWxlcGhvbnlDYWxsYmFja0ZvclR5cGU8RGF0YUFjdGl2aXR5TGlzdGVuZXI+KCkKKworICAgICAgICAgICAgY29ubmVjdGlvbkNhbGxiYWNrLm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoCisgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5EQVRBX0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICAyMDAgLyogdW51c2VkICovCisgICAgICAgICAgICApCisKKyAgICAgICAgICAgIC8vIFNlbmQgYSBidW5jaCBvZiBldmVudHMgdGhhdCB3ZSBkb24ndCBjYXJlIGFib3V0LCB0byBvdmVycnVuIHRoZSByZXBsYXkgYnVmZmVyCisgICAgICAgICAgICBmbGlwQWN0aXZpdHkoMTAwLCBhY3Rpdml0eUNhbGxiYWNrKQorCisgICAgICAgICAgICB2YWwgY29ubmVjdGlvbkpvYiA9IHVuZGVyVGVzdC5kYXRhQ29ubmVjdGlvblN0YXRlLm9uRWFjaCB7IGxhdGVzdCA9IGl0IH0ubGF1bmNoSW4odGhpcykKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChsYXRlc3QpLmlzRXF1YWxUbyhEYXRhQ29ubmVjdGlvblN0YXRlLkNvbm5lY3RlZCkKKworICAgICAgICAgICAgYWN0aXZpdHlKb2IuY2FuY2VsKCkKKyAgICAgICAgICAgIGNvbm5lY3Rpb25Kb2IuY2FuY2VsKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gZGF0YUVuYWJsZWRMYXRlX25vaXN5QWN0aXZpdHkoKSA9CisgICAgICAgIHRlc3RTY29wZS5ydW5UZXN0IHsKKyAgICAgICAgICAgIHZhciBsYXRlc3Q6IEJvb2xlYW4/ID0gbnVsbAorCisgICAgICAgICAgICAvLyBTdGFydCBjb2xsZWN0aW5nIGRhdGEgYWN0aXZpdHk7IGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdAorICAgICAgICAgICAgdmFsIGFjdGl2aXR5Sm9iID0gdW5kZXJUZXN0LmRhdGFBY3Rpdml0eURpcmVjdGlvbi5sYXVuY2hJbih0aGlzKQorCisgICAgICAgICAgICB2YWwgZW5hYmxlZENhbGxiYWNrID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPERhdGFFbmFibGVkTGlzdGVuZXI+KCkKKyAgICAgICAgICAgIHZhbCBhY3Rpdml0eUNhbGxiYWNrID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPERhdGFBY3Rpdml0eUxpc3RlbmVyPigpCisKKyAgICAgICAgICAgIGVuYWJsZWRDYWxsYmFjay5vbkRhdGFFbmFibGVkQ2hhbmdlZCh0cnVlLCAxIC8qIHVudXNlZCAqLykKKworICAgICAgICAgICAgLy8gU2VuZCBhIGJ1bmNoIG9mIGV2ZW50cyB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQsIHRvIG92ZXJydW4gdGhlIHJlcGxheSBidWZmZXIKKyAgICAgICAgICAgIGZsaXBBY3Rpdml0eSgxMDAsIGFjdGl2aXR5Q2FsbGJhY2spCisKKyAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QuZGF0YUVuYWJsZWQub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQorCisgICAgICAgICAgICBhc3NlcnRUaGF0KGxhdGVzdCkuaXNUcnVlKCkKKworICAgICAgICAgICAgYWN0aXZpdHlKb2IuY2FuY2VsKCkKKyAgICAgICAgICAgIGpvYi5jYW5jZWwoKQorICAgICAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBkaXNwbGF5SW5mb0xhdGVfbm9pc3lBY3Rpdml0eSgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFyIGxhdGVzdDogUmVzb2x2ZWROZXR3b3JrVHlwZT8gPSBudWxsCisKKyAgICAgICAgICAgIC8vIFN0YXJ0IGNvbGxlY3RpbmcgZGF0YSBhY3Rpdml0eTsgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVzdWx0CisgICAgICAgICAgICB2YWwgYWN0aXZpdHlKb2IgPSB1bmRlclRlc3QuZGF0YUFjdGl2aXR5RGlyZWN0aW9uLmxhdW5jaEluKHRoaXMpCisKKyAgICAgICAgICAgIHZhbCBkaXNwbGF5SW5mb0NhbGxiYWNrID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPERpc3BsYXlJbmZvTGlzdGVuZXI+KCkKKyAgICAgICAgICAgIHZhbCBhY3Rpdml0eUNhbGxiYWNrID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPERhdGFBY3Rpdml0eUxpc3RlbmVyPigpCisKKyAgICAgICAgICAgIHZhbCB0eXBlID0gTkVUV09SS19UWVBFX0xURQorICAgICAgICAgICAgdmFsIGV4cGVjdGVkID0gUmVzb2x2ZWROZXR3b3JrVHlwZS5EZWZhdWx0TmV0d29ya1R5cGUobW9iaWxlTWFwcGluZ3MudG9JY29uS2V5KHR5cGUpKQorICAgICAgICAgICAgdmFsIHRpID0gbW9jazxUZWxlcGhvbnlEaXNwbGF5SW5mbz4oKS5hbHNvIHsgd2hlbmV2ZXIoaXQubmV0d29ya1R5cGUpLnRoZW5SZXR1cm4odHlwZSkgfQorICAgICAgICAgICAgZGlzcGxheUluZm9DYWxsYmFjay5vbkRpc3BsYXlJbmZvQ2hhbmdlZCh0aSkKKworICAgICAgICAgICAgLy8gU2VuZCBhIGJ1bmNoIG9mIGV2ZW50cyB0aGF0IHdlIGRvbid0IGNhcmUgYWJvdXQsIHRvIG92ZXJydW4gdGhlIHJlcGxheSBidWZmZXIKKyAgICAgICAgICAgIGZsaXBBY3Rpdml0eSgxMDAsIGFjdGl2aXR5Q2FsbGJhY2spCisKKyAgICAgICAgICAgIHZhbCBqb2IgPSB1bmRlclRlc3QucmVzb2x2ZWROZXR3b3JrVHlwZS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCisKKyAgICAgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KS5pc0VxdWFsVG8oZXhwZWN0ZWQpCisKKyAgICAgICAgICAgIGFjdGl2aXR5Sm9iLmNhbmNlbCgpCisgICAgICAgICAgICBqb2IuY2FuY2VsKCkKKyAgICAgICAgfQorCisgICAgQFRlc3QKKyAgICBmdW4gc2VydmljZVN0YXRlTGlzdGVuZXJfbm9pc3lBY3Rpdml0eSgpID0KKyAgICAgICAgdGVzdFNjb3BlLnJ1blRlc3QgeworICAgICAgICAgICAgdmFyIGxhdGVzdDogQm9vbGVhbj8gPSBudWxsCisKKyAgICAgICAgICAgIC8vIFN0YXJ0IGNvbGxlY3RpbmcgZGF0YSBhY3Rpdml0eTsgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVzdWx0CisgICAgICAgICAgICB2YWwgYWN0aXZpdHlKb2IgPSB1bmRlclRlc3QuZGF0YUFjdGl2aXR5RGlyZWN0aW9uLmxhdW5jaEluKHRoaXMpCisKKyAgICAgICAgICAgIHZhbCBzZXJ2aWNlU3RhdGVDYWxsYmFjayA9IGdldFRlbGVwaG9ueUNhbGxiYWNrRm9yVHlwZTxTZXJ2aWNlU3RhdGVMaXN0ZW5lcj4oKQorICAgICAgICAgICAgdmFsIGFjdGl2aXR5Q2FsbGJhY2sgPSBnZXRUZWxlcGhvbnlDYWxsYmFja0ZvclR5cGU8RGF0YUFjdGl2aXR5TGlzdGVuZXI+KCkKKworICAgICAgICAgICAgLy8gaXNFbWVyZ2VuY3lPbmx5IGNvbWVzIGluCisgICAgICAgICAgICB2YWwgc2VydmljZVN0YXRlID0gU2VydmljZVN0YXRlKCkKKyAgICAgICAgICAgIHNlcnZpY2VTdGF0ZS5pc0VtZXJnZW5jeU9ubHkgPSB0cnVlCisgICAgICAgICAgICBzZXJ2aWNlU3RhdGVDYWxsYmFjay5vblNlcnZpY2VTdGF0ZUNoYW5nZWQoc2VydmljZVN0YXRlKQorCisgICAgICAgICAgICBmbGlwQWN0aXZpdHkoMTAwLCBhY3Rpdml0eUNhbGxiYWNrKQorCisgICAgICAgICAgICB2YWwgam9iID0gdW5kZXJUZXN0LmlzRW1lcmdlbmN5T25seS5vbkVhY2ggeyBsYXRlc3QgPSBpdCB9LmxhdW5jaEluKHRoaXMpCisKKyAgICAgICAgICAgIGFzc2VydFRoYXQobGF0ZXN0KS5pc1RydWUoKQorCisgICAgICAgICAgICBhY3Rpdml0eUpvYi5jYW5jZWwoKQorICAgICAgICAgICAgam9iLmNhbmNlbCgpCisgICAgICAgIH0KKworICAgIEBUZXN0CisgICAgZnVuIHNpZ25hbFN0cmVuZ3Roc0xpc3RlbmVyTGF0ZV9ub2lzeUFjdGl2aXR5KCkgPQorICAgICAgICB0ZXN0U2NvcGUucnVuVGVzdCB7CisgICAgICAgICAgICB2YXIgbGF0ZXN0OiBJbnQ/ID0gbnVsbAorCisgICAgICAgICAgICAvLyBTdGFydCBjb2xsZWN0aW5nIGRhdGEgYWN0aXZpdHk7IGRvbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdAorICAgICAgICAgICAgdmFsIGFjdGl2aXR5Sm9iID0gdW5kZXJUZXN0LmRhdGFBY3Rpdml0eURpcmVjdGlvbi5sYXVuY2hJbih0aGlzKQorICAgICAgICAgICAgdmFsIGFjdGl2aXR5Q2FsbGJhY2sgPSBnZXRUZWxlcGhvbnlDYWxsYmFja0ZvclR5cGU8RGF0YUFjdGl2aXR5TGlzdGVuZXI+KCkKKworICAgICAgICAgICAgdmFsIGNhbGxiYWNrID0gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlPFRlbGVwaG9ueUNhbGxiYWNrLlNpZ25hbFN0cmVuZ3Roc0xpc3RlbmVyPigpCisgICAgICAgICAgICB2YWwgc3RyZW5ndGggPSBzaWduYWxTdHJlbmd0aChnc21MZXZlbCA9IDEsIGNkbWFMZXZlbCA9IDIsIGlzR3NtID0gdHJ1ZSkKKyAgICAgICAgICAgIGNhbGxiYWNrLm9uU2lnbmFsU3RyZW5ndGhzQ2hhbmdlZChzdHJlbmd0aCkKKworICAgICAgICAgICAgZmxpcEFjdGl2aXR5KDEwMCwgYWN0aXZpdHlDYWxsYmFjaykKKworICAgICAgICAgICAgdmFsIGpvYiA9IHVuZGVyVGVzdC5jZG1hTGV2ZWwub25FYWNoIHsgbGF0ZXN0ID0gaXQgfS5sYXVuY2hJbih0aGlzKQorCisgICAgICAgICAgICBhc3NlcnRUaGF0KGxhdGVzdCkuaXNFcXVhbFRvKDIpCisKKyAgICAgICAgICAgIGFjdGl2aXR5Sm9iLmNhbmNlbCgpCisgICAgICAgICAgICBqb2IuY2FuY2VsKCkKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZSBmdW4gZmxpcEFjdGl2aXR5KAorICAgICAgICB0aW1lczogSW50LAorICAgICAgICBjYWxsYmFjazogRGF0YUFjdGl2aXR5TGlzdGVuZXIsCisgICAgKSB7CisgICAgICAgIHJlcGVhdCh0aW1lcykgeyBpbmRleCAtPiBjYWxsYmFjay5vbkRhdGFBY3Rpdml0eShpbmRleCAlIDQpIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1biBmbGlwRGlzcGxheUluZm8oCisgICAgICAgIHRpbWVzOiBJbnQsCisgICAgICAgIGluZm9zOiBMaXN0PFRlbGVwaG9ueURpc3BsYXlJbmZvPiwKKyAgICAgICAgY2FsbGJhY2s6IERpc3BsYXlJbmZvTGlzdGVuZXIsCisgICAgKSB7CisgICAgICAgIHZhbCBsZW4gPSBpbmZvcy5zaXplCisgICAgICAgIHJlcGVhdCh0aW1lcykgeyBpbmRleCAtPiBjYWxsYmFjay5vbkRpc3BsYXlJbmZvQ2hhbmdlZChpbmZvc1tpbmRleCAlIGxlbl0pIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGlubGluZSBmdW4gPHJlaWZpZWQgVD4gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlKCk6IFQgeworICAgICAgICByZXR1cm4gZ2V0VGVsZXBob255Q2FsbGJhY2tGb3JUeXBlKHRlbGVwaG9ueU1hbmFnZXIpCisgICAgfQorCisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIHByaXZhdGUgY29uc3QgdmFsIFNVQl8xX0lEID0gMQorCisgICAgICAgIHByaXZhdGUgdmFsIERFRkFVTFRfTkFNRSA9IE5ldHdvcmtOYW1lTW9kZWwuRGVmYXVsdCgiZGVmYXVsdCBuYW1lIikKKyAgICAgICAgcHJpdmF0ZSBjb25zdCB2YWwgU0VQID0gIi0iCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waXBlbGluZS9tb2JpbGUvZGF0YS9yZXBvc2l0b3J5L3Byb2QvTW9iaWxlVGVsZXBob255SGVscGVycy5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGlwZWxpbmUvbW9iaWxlL2RhdGEvcmVwb3NpdG9yeS9wcm9kL01vYmlsZVRlbGVwaG9ueUhlbHBlcnMua3QKaW5kZXggNjIxZjc5My4uZDA3Yjk2ZiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waXBlbGluZS9tb2JpbGUvZGF0YS9yZXBvc2l0b3J5L3Byb2QvTW9iaWxlVGVsZXBob255SGVscGVycy5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BpcGVsaW5lL21vYmlsZS9kYXRhL3JlcG9zaXRvcnkvcHJvZC9Nb2JpbGVUZWxlcGhvbnlIZWxwZXJzLmt0CkBAIC0xNiwxMCArMTYsMTQgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGlwZWxpbmUubW9iaWxlLmRhdGEucmVwb3NpdG9yeS5wcm9kCiAKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsU2lnbmFsU3RyZW5ndGhDZG1hCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2lnbmFsU3RyZW5ndGgKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlDYWxsYmFjawogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXIKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8uYW55CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLmFyZ3VtZW50Q2FwdG9yCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkudXRpbC5tb2NraXRvLm1vY2sKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS51dGlsLm1vY2tpdG8ud2hlbmV2ZXIKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnkKIApAQCAtMzEsNiArMzUsMTkgQEAKICAgICAgICAgcmV0dXJuIGNhbGxiYWNrQ2FwdG9yLmFsbFZhbHVlcwogICAgIH0KIAorICAgIC8qKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3RvciBmb3IgU2lnbmFsU3RyZW5ndGggKi8KKyAgICBmdW4gc2lnbmFsU3RyZW5ndGgoZ3NtTGV2ZWw6IEludCwgY2RtYUxldmVsOiBJbnQsIGlzR3NtOiBCb29sZWFuKTogU2lnbmFsU3RyZW5ndGggeworICAgICAgICB2YWwgc2lnbmFsU3RyZW5ndGggPSBtb2NrPFNpZ25hbFN0cmVuZ3RoPigpCisgICAgICAgIHdoZW5ldmVyKHNpZ25hbFN0cmVuZ3RoLmlzR3NtKS50aGVuUmV0dXJuKGlzR3NtKQorICAgICAgICB3aGVuZXZlcihzaWduYWxTdHJlbmd0aC5sZXZlbCkudGhlblJldHVybihnc21MZXZlbCkKKyAgICAgICAgdmFsIGNkbWFTdHJlbmd0aCA9CisgICAgICAgICAgICBtb2NrPENlbGxTaWduYWxTdHJlbmd0aENkbWE+KCkuYWxzbyB7IHdoZW5ldmVyKGl0LmxldmVsKS50aGVuUmV0dXJuKGNkbWFMZXZlbCkgfQorICAgICAgICB3aGVuZXZlcihzaWduYWxTdHJlbmd0aC5nZXRDZWxsU2lnbmFsU3RyZW5ndGhzKENlbGxTaWduYWxTdHJlbmd0aENkbWE6OmNsYXNzLmphdmEpKQorICAgICAgICAgICAgLnRoZW5SZXR1cm4obGlzdE9mKGNkbWFTdHJlbmd0aCkpCisKKyAgICAgICAgcmV0dXJuIHNpZ25hbFN0cmVuZ3RoCisgICAgfQorCiAgICAgaW5saW5lIGZ1biA8cmVpZmllZCBUPiBnZXRUZWxlcGhvbnlDYWxsYmFja0ZvclR5cGUobW9ja1RlbGVwaG9ueU1hbmFnZXI6IFRlbGVwaG9ueU1hbmFnZXIpOiBUIHsKICAgICAgICAgdmFsIGNicyA9IGdldFRlbGVwaG9ueUNhbGxiYWNrcyhtb2NrVGVsZXBob255TWFuYWdlcikuZmlsdGVySXNJbnN0YW5jZTxUPigpCiAgICAgICAgIGFzc2VydFRoYXQoY2JzLnNpemUpLmlzRXF1YWxUbygxKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waXBlbGluZS93aWZpL3VpL3ZpZXdtb2RlbC9XaWZpVmlld01vZGVsSWNvblBhcmFtZXRlcml6ZWRUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waXBlbGluZS93aWZpL3VpL3ZpZXdtb2RlbC9XaWZpVmlld01vZGVsSWNvblBhcmFtZXRlcml6ZWRUZXN0Lmt0CmluZGV4IDEyYjE2NjQuLjFjNzFmOGIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGlwZWxpbmUvd2lmaS91aS92aWV3bW9kZWwvV2lmaVZpZXdNb2RlbEljb25QYXJhbWV0ZXJpemVkVGVzdC5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BpcGVsaW5lL3dpZmkvdWkvdmlld21vZGVsL1dpZmlWaWV3TW9kZWxJY29uUGFyYW1ldGVyaXplZFRlc3Qua3QKQEAgLTM2OCw0MCArMzY4LDM3IEBACiAKICAgICAgICAgICAgICAgICAvLyBuZXR3b3JrID0gQ2Fycmllck1lcmdlZCA9PiBub3Qgc2hvd24KICAgICAgICAgICAgICAgICBUZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgIGlzRGVmYXVsdCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgIGZvcmNlSGlkZGVuID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgPQogICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5ldHdvcmtNb2RlbC5DYXJyaWVyTWVyZ2VkKE5FVFdPUktfSUQsIHN1YnNjcmlwdGlvbklkID0gMSwgbGV2ZWwgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBudWxsLAogICAgICAgICAgICAgICAgICksCiAKLSAgICAgICAgICAgICAgICAvLyBuZXR3b3JrID0gSW5hY3RpdmUgPT4gbm90IHNob3duCisgICAgICAgICAgICAgICAgLy8gaXNEZWZhdWx0ID0gZmFsc2UgPT4gbm8gbmV0d29ya3Mgc2hvd24KICAgICAgICAgICAgICAgICBUZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgPSBXaWZpTmV0d29ya01vZGVsLkluYWN0aXZlLAogICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IG51bGwsCiAgICAgICAgICAgICAgICAgKSwKLQotICAgICAgICAgICAgICAgIC8vIG5ldHdvcmsgPSBVbmF2YWlsYWJsZSA9PiBub3Qgc2hvd24KICAgICAgICAgICAgICAgICBUZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgPSBXaWZpTmV0d29ya01vZGVsLlVuYXZhaWxhYmxlLAogICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IG51bGwsCiAgICAgICAgICAgICAgICAgKSwKLQotICAgICAgICAgICAgICAgIC8vIG5ldHdvcmsgPSBBY3RpdmUgJiB2YWxpZGF0ZWQgPSBmYWxzZSA9PiBub3Qgc2hvd24KICAgICAgICAgICAgICAgICBUZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgPSBXaWZpTmV0d29ya01vZGVsLkFjdGl2ZShORVRXT1JLX0lELCBpc1ZhbGlkYXRlZCA9IGZhbHNlLCBsZXZlbCA9IDMpLAogICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IG51bGwsCiAgICAgICAgICAgICAgICAgKSwKIAotICAgICAgICAgICAgICAgIC8vIG5ldHdvcmsgPSBBY3RpdmUgJiB2YWxpZGF0ZWQgPSB0cnVlID0+IHNob3duCisgICAgICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2ggdGhpcyBuZXR3b3JrIGlzIGFjdGl2ZSBhbmQgdmFsaWRhdGVkLCB3ZSBzdGlsbCBkb2Vzbid0IHdhbnQgaXQgc2hvd24KKyAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHdpZmkgaXNuJ3QgdGhlIGRlZmF1bHQgY29ubmVjdGlvbiAoYi8yNzI1MDk5NjUpLgogICAgICAgICAgICAgICAgIFRlc3RDYXNlKAorICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHQgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgbmV0d29yayA9IFdpZmlOZXR3b3JrTW9kZWwuQWN0aXZlKE5FVFdPUktfSUQsIGlzVmFsaWRhdGVkID0gdHJ1ZSwgbGV2ZWwgPSA0KSwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0ZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblJlc291cmNlID0gV0lGSV9GVUxMX0lDT05TWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnREZXNjcmlwdGlvbiA9IHsgY29udGV4dCAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFN0cmluZyhXSUZJX0NPTk5FQ1RJT05fU1RSRU5HVEhbNF0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJGdWxsIGludGVybmV0IGxldmVsIDQgaWNvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IG51bGwsCiAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICkKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BvbGljeS9EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdDb250cm9sbGVyVGVzdC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9wb2xpY3kvRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tTZXR0aW5nQ29udHJvbGxlclRlc3QuamF2YQppbmRleCA0ODFkNDUzLi5jOGYyOGJjIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BvbGljeS9EZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcG9saWN5L0RldmljZVN0YXRlUm90YXRpb25Mb2NrU2V0dGluZ0NvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTU1LDYgKzU1LDkgQEAKIHB1YmxpYyBjbGFzcyBEZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdDb250cm9sbGVyVGVzdCBleHRlbmRzIFN5c3VpVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9TRVRUSU5HUyA9IG5ldyBTdHJpbmdbXXsiMDoxIiwgIjI6MDoxIiwgIjE6MiJ9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIERFRkFVTFRfRk9MREVEX1NUQVRFUyA9IG5ldyBpbnRbXXswfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBERUZBVUxUX0hBTEZfRk9MREVEX1NUQVRFUyA9IG5ldyBpbnRbXXsyfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBERUZBVUxUX1VORk9MREVEX1NUQVRFUyA9IG5ldyBpbnRbXXsxfTsKIAogICAgIEBNb2NrIHByaXZhdGUgRGV2aWNlU3RhdGVNYW5hZ2VyIG1EZXZpY2VTdGF0ZU1hbmFnZXI7CiAgICAgQE1vY2sgcHJpdmF0ZSBEZXZpY2VTdGF0ZVJvdGF0aW9uTG9ja1NldHRpbmdDb250cm9sbGVyTG9nZ2VyIG1Mb2dnZXI7CkBAIC03Myw2ICs3Niw5IEBACiAgICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3MoLyogdGVzdENsYXNzPSAqLyB0aGlzKTsKICAgICAgICAgVGVzdGFibGVSZXNvdXJjZXMgcmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0T3JDcmVhdGVUZXN0YWJsZVJlc291cmNlcygpOwogICAgICAgICByZXNvdXJjZXMuYWRkT3ZlcnJpZGUoUi5hcnJheS5jb25maWdfcGVyRGV2aWNlU3RhdGVSb3RhdGlvbkxvY2tEZWZhdWx0cywgREVGQVVMVF9TRVRUSU5HUyk7CisgICAgICAgIHJlc291cmNlcy5hZGRPdmVycmlkZShSLmFycmF5LmNvbmZpZ19mb2xkZWREZXZpY2VTdGF0ZXMsIERFRkFVTFRfRk9MREVEX1NUQVRFUyk7CisgICAgICAgIHJlc291cmNlcy5hZGRPdmVycmlkZShSLmFycmF5LmNvbmZpZ19oYWxmRm9sZGVkRGV2aWNlU3RhdGVzLCBERUZBVUxUX0hBTEZfRk9MREVEX1NUQVRFUyk7CisgICAgICAgIHJlc291cmNlcy5hZGRPdmVycmlkZShSLmFycmF5LmNvbmZpZ19vcGVuRGV2aWNlU3RhdGVzLCBERUZBVUxUX1VORk9MREVEX1NUQVRFUyk7CiAKICAgICAgICAgQXJndW1lbnRDYXB0b3I8RGV2aWNlU3RhdGVNYW5hZ2VyLkRldmljZVN0YXRlQ2FsbGJhY2s+IGRldmljZVN0YXRlQ2FsbGJhY2tBcmd1bWVudENhcHRvciA9CiAgICAgICAgICAgICAgICAgQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoRGV2aWNlU3RhdGVNYW5hZ2VyLkRldmljZVN0YXRlQ2FsbGJhY2suY2xhc3MpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N1cmZhY2VlZmZlY3RzL3R1cmJ1bGVuY2Vub2lzZS9UdXJidWxlbmNlTm9pc2VTaGFkZXJUZXN0Lmt0IGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N1cmZhY2VlZmZlY3RzL3R1cmJ1bGVuY2Vub2lzZS9UdXJidWxlbmNlTm9pc2VTaGFkZXJUZXN0Lmt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYmQ1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3VyZmFjZWVmZmVjdHMvdHVyYnVsZW5jZW5vaXNlL1R1cmJ1bGVuY2VOb2lzZVNoYWRlclRlc3Qua3QKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN1cmZhY2VlZmZlY3RzLnR1cmJ1bGVuY2Vub2lzZQorCitpbXBvcnQgYW5kcm9pZC50ZXN0aW5nLkFuZHJvaWRUZXN0aW5nUnVubmVyCitpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdAoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlN5c3VpVGVzdENhc2UKK2ltcG9ydCBvcmcuanVuaXQuVGVzdAoraW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAorCitAU21hbGxUZXN0CitAUnVuV2l0aChBbmRyb2lkVGVzdGluZ1J1bm5lcjo6Y2xhc3MpCitjbGFzcyBUdXJidWxlbmNlTm9pc2VTaGFkZXJUZXN0IDogU3lzdWlUZXN0Q2FzZSgpIHsKKworICAgIHByaXZhdGUgbGF0ZWluaXQgdmFyIHR1cmJ1bGVuY2VOb2lzZVNoYWRlcjogVHVyYnVsZW5jZU5vaXNlU2hhZGVyCisKKyAgICBAVGVzdAorICAgIGZ1biBjb21wbGllc1NpbXBsZXhOb2lzZSgpIHsKKyAgICAgICAgdHVyYnVsZW5jZU5vaXNlU2hhZGVyID0gVHVyYnVsZW5jZU5vaXNlU2hhZGVyKCkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIGZ1biBjb21wbGllc0ZyYWN0YWxOb2lzZSgpIHsKKyAgICAgICAgdHVyYnVsZW5jZU5vaXNlU2hhZGVyID0gVHVyYnVsZW5jZU5vaXNlU2hhZGVyKHVzZUZyYWN0YWwgPSB0cnVlKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS93bXNoZWxsL0J1YmJsZXNUZXN0LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvd21zaGVsbC9CdWJibGVzVGVzdC5qYXZhCmluZGV4IGUxODU5MjIuLmVlNGUwMGIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS93bXNoZWxsL0J1YmJsZXNUZXN0LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3dtc2hlbGwvQnViYmxlc1Rlc3QuamF2YQpAQCAtMjkzLDYgKzI5Myw4IEBACiAKICAgICBwcml2YXRlIEZha2VEaXNwbGF5VHJhY2tlciBtRGlzcGxheVRyYWNrZXIgPSBuZXcgRmFrZURpc3BsYXlUcmFja2VyKG1Db250ZXh0KTsKIAorICAgIHByaXZhdGUgVXNlckhhbmRsZSBtVXNlcjA7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKQEAgLTMwMSw2ICszMDMsOCBAQAogICAgICAgICAvLyBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgdGVzdCwganVzdCBydW4gZXZlcnl0aGluZyBzeW5jaHJvbm91c2x5CiAgICAgICAgIFNoZWxsRXhlY3V0b3Igc3luY0V4ZWN1dG9yID0gbmV3IFN5bmNFeGVjdXRvcigpOwogCisgICAgICAgIG1Vc2VyMCA9IGNyZWF0ZVVzZXJIYW5kZSgvKiB1c2VySWQ9ICovIDApOworCiAgICAgICAgIHdoZW4obUNvbG9yRXh0cmFjdG9yLmdldE5ldXRyYWxDb2xvcnMoKSkudGhlblJldHVybihtR3JhZGllbnRDb2xvcnMpOwogICAgICAgICB3aGVuKG1Ob3RpZmljYXRpb25TaGFkZVdpbmRvd1ZpZXcuZ2V0Vmlld1RyZWVPYnNlcnZlcigpKQogICAgICAgICAgICAgICAgIC50aGVuUmV0dXJuKG1vY2soVmlld1RyZWVPYnNlcnZlci5jbGFzcykpOwpAQCAtMzM5LDcgKzM0Myw2IEBACiAgICAgICAgIFRlc3RhYmxlTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGwgaW50ZXJydXB0aW9uU3RhdGVQcm92aWRlciA9CiAgICAgICAgICAgICAgICAgbmV3IFRlc3RhYmxlTm90aWZpY2F0aW9uSW50ZXJydXB0U3RhdGVQcm92aWRlckltcGwobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2NrKFBvd2VyTWFuYWdlci5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2NrKElEcmVhbU1hbmFnZXIuY2xhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgbW9jayhBbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb24uY2xhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgbW9jayhTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIuY2xhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgbW9jayhLZXlndWFyZFN0YXRlQ29udHJvbGxlci5jbGFzcyksCkBAIC0xMjQyLDYgKzEyNDUsMjQgQEAKICAgICAgICAgLy8gU2hvdyB0aGUgbWVudQogICAgICAgICBzdGFja1ZpZXcuc2hvd01hbmFnZU1lbnUodHJ1ZSk7CiAgICAgICAgIGFzc2VydFN5c3VpU3RhdGVzKHRydWUgLyogc3RhY2tFeHBhbmRlZCAqLywgdHJ1ZSAvKiBtYW5nZU1lbnVFeHBhbmRlZCAqLyk7CisgICAgICAgIGFzc2VydFRydWUoc3RhY2tWaWV3LmlzTWFuYWdlTWVudVNldHRpbmdzVmlzaWJsZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93TWFuYWdlTWVudUNoYW5nZXNTeXN1aVN0YXRlX2FwcEJ1YmJsZSgpIHsKKyAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50LCBtVXNlcjApOworICAgICAgICBhc3NlcnRUcnVlKG1CdWJibGVDb250cm9sbGVyLmhhc0J1YmJsZXMoKSk7CisKKyAgICAgICAgLy8gRXhwYW5kIHRoZSBzdGFjaworICAgICAgICBCdWJibGVTdGFja1ZpZXcgc3RhY2tWaWV3ID0gbUJ1YmJsZUNvbnRyb2xsZXIuZ2V0U3RhY2tWaWV3KCk7CisgICAgICAgIG1CdWJibGVEYXRhLnNldEV4cGFuZGVkKHRydWUpOworICAgICAgICBhc3NlcnRTdGFja0V4cGFuZGVkKCk7CisgICAgICAgIGFzc2VydFN5c3VpU3RhdGVzKHRydWUgLyogc3RhY2tFeHBhbmRlZCAqLywgZmFsc2UgLyogbWFuZ2VNZW51RXhwYW5kZWQgKi8pOworCisgICAgICAgIC8vIFNob3cgdGhlIG1lbnUKKyAgICAgICAgc3RhY2tWaWV3LnNob3dNYW5hZ2VNZW51KHRydWUpOworICAgICAgICBhc3NlcnRTeXN1aVN0YXRlcyh0cnVlIC8qIHN0YWNrRXhwYW5kZWQgKi8sIHRydWUgLyogbWFuZ2VNZW51RXhwYW5kZWQgKi8pOworICAgICAgICBhc3NlcnRGYWxzZShzdGFja1ZpZXcuaXNNYW5hZ2VNZW51U2V0dGluZ3NWaXNpYmxlKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNjUwLDcgKzE2NzEsNyBAQAogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVDb250cm9sbGVyLmlzU3RhY2tFeHBhbmRlZCgpKS5pc0ZhbHNlKCk7CiAgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZURhdGEuZ2V0QnViYmxlSW5TdGFja1dpdGhLZXkoS0VZX0FQUF9CVUJCTEUpKS5pc051bGwoKTsKIAotICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQpOworICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQsIG1Vc2VyMCk7CiAKICAgICAgICAgdmVyaWZ5KG1CdWJibGVDb250cm9sbGVyKS5pbmZsYXRlQW5kQWRkKGFueShCdWJibGUuY2xhc3MpLCAvKiBzdXBwcmVzc0ZseW91dD0gKi8gZXEodHJ1ZSksCiAgICAgICAgICAgICAgICAgLyogc2hvd0luU2hhZGU9ICovIGVxKGZhbHNlKSk7CkBAIC0xNjYwLDEzICsxNjgxLDEzIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93T3JIaWRlQXBwQnViYmxlX2V4cGFuZElmQ29sbGFwc2VkKCkgewotICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQpOworICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQsIG1Vc2VyMCk7CiAgICAgICAgIG1CdWJibGVDb250cm9sbGVyLnVwZGF0ZUJ1YmJsZShtQnViYmxlRW50cnkpOwogICAgICAgICBtQnViYmxlQ29udHJvbGxlci5jb2xsYXBzZVN0YWNrKCk7CiAgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZUNvbnRyb2xsZXIuaXNTdGFja0V4cGFuZGVkKCkpLmlzRmFsc2UoKTsKIAogICAgICAgICAvLyBDYWxsaW5nIHRoaXMgd2hpbGUgY29sbGFwc2VkIHdpbGwgZXhwYW5kIHRoZSBhcHAgYnViYmxlCi0gICAgICAgIG1CdWJibGVDb250cm9sbGVyLnNob3dPckhpZGVBcHBCdWJibGUobUFwcEJ1YmJsZUludGVudCk7CisgICAgICAgIG1CdWJibGVDb250cm9sbGVyLnNob3dPckhpZGVBcHBCdWJibGUobUFwcEJ1YmJsZUludGVudCwgbVVzZXIwKTsKIAogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldFNlbGVjdGVkQnViYmxlKCkuZ2V0S2V5KCkpLmlzRXF1YWxUbyhLRVlfQVBQX0JVQkJMRSk7CiAgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZUNvbnRyb2xsZXIuaXNTdGFja0V4cGFuZGVkKCkpLmlzVHJ1ZSgpOwpAQCAtMTY3NSwyNyArMTY5Niw0NiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd09ySGlkZUFwcEJ1YmJsZV9jb2xsYXBzZUlmU2VsZWN0ZWQoKSB7Ci0gICAgICAgIG1CdWJibGVDb250cm9sbGVyLnNob3dPckhpZGVBcHBCdWJibGUobUFwcEJ1YmJsZUludGVudCk7CisgICAgICAgIG1CdWJibGVDb250cm9sbGVyLnNob3dPckhpZGVBcHBCdWJibGUobUFwcEJ1YmJsZUludGVudCwgbVVzZXIwKTsKICAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlRGF0YS5nZXRTZWxlY3RlZEJ1YmJsZSgpLmdldEtleSgpKS5pc0VxdWFsVG8oS0VZX0FQUF9CVUJCTEUpOwogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVDb250cm9sbGVyLmlzU3RhY2tFeHBhbmRlZCgpKS5pc1RydWUoKTsKIAogICAgICAgICAvLyBDYWxsaW5nIHRoaXMgd2hpbGUgdGhlIGFwcCBidWJibGUgaXMgZXhwYW5kZWQgc2hvdWxkIGNvbGxhcHNlIHRoZSBzdGFjawotICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQpOworICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQsIG1Vc2VyMCk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlRGF0YS5nZXRTZWxlY3RlZEJ1YmJsZSgpLmdldEtleSgpKS5pc0VxdWFsVG8oS0VZX0FQUF9CVUJCTEUpOwogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVDb250cm9sbGVyLmlzU3RhY2tFeHBhbmRlZCgpKS5pc0ZhbHNlKCk7CiAgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZURhdGEuZ2V0QnViYmxlcygpLnNpemUoKSkuaXNFcXVhbFRvKDEpOworICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldEJ1YmJsZXMoKS5nZXQoMCkuZ2V0VXNlcigpKS5pc0VxdWFsVG8obVVzZXIwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG93T3JIaWRlQXBwQnViYmxlV2l0aE5vblByaW1hcnlVc2VyX2J1YmJsZUNvbGxhcHNlZFdpdGhFeHBlY3RlZFVzZXIoKSB7CisgICAgICAgIFVzZXJIYW5kbGUgdXNlcjEwID0gY3JlYXRlVXNlckhhbmRlKC8qIHVzZXJJZCA9ICovIDEwKTsKKyAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50LCB1c2VyMTApOworICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldFNlbGVjdGVkQnViYmxlKCkuZ2V0S2V5KCkpLmlzRXF1YWxUbyhLRVlfQVBQX0JVQkJMRSk7CisgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZUNvbnRyb2xsZXIuaXNTdGFja0V4cGFuZGVkKCkpLmlzVHJ1ZSgpOworICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldEJ1YmJsZXMoKS5zaXplKCkpLmlzRXF1YWxUbygxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlRGF0YS5nZXRCdWJibGVzKCkuZ2V0KDApLmdldFVzZXIoKSkuaXNFcXVhbFRvKHVzZXIxMCk7CisKKyAgICAgICAgLy8gQ2FsbGluZyB0aGlzIHdoaWxlIHRoZSBhcHAgYnViYmxlIGlzIGV4cGFuZGVkIHNob3VsZCBjb2xsYXBzZSB0aGUgc3RhY2sKKyAgICAgICAgbUJ1YmJsZUNvbnRyb2xsZXIuc2hvd09ySGlkZUFwcEJ1YmJsZShtQXBwQnViYmxlSW50ZW50LCB1c2VyMTApOworCisgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZURhdGEuZ2V0U2VsZWN0ZWRCdWJibGUoKS5nZXRLZXkoKSkuaXNFcXVhbFRvKEtFWV9BUFBfQlVCQkxFKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlQ29udHJvbGxlci5pc1N0YWNrRXhwYW5kZWQoKSkuaXNGYWxzZSgpOworICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldEJ1YmJsZXMoKS5zaXplKCkpLmlzRXF1YWxUbygxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlRGF0YS5nZXRCdWJibGVzKCkuZ2V0KDApLmdldFVzZXIoKSkuaXNFcXVhbFRvKHVzZXIxMCk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvd09ySGlkZUFwcEJ1YmJsZV9zZWxlY3RJZk5vdFNlbGVjdGVkKCkgewotICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQpOworICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQsIG1Vc2VyMCk7CiAgICAgICAgIG1CdWJibGVDb250cm9sbGVyLnVwZGF0ZUJ1YmJsZShtQnViYmxlRW50cnkpOwogICAgICAgICBtQnViYmxlQ29udHJvbGxlci5leHBhbmRTdGFja0FuZFNlbGVjdEJ1YmJsZShtQnViYmxlRW50cnkpOwogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVEYXRhLmdldFNlbGVjdGVkQnViYmxlKCkuZ2V0S2V5KCkpLmlzRXF1YWxUbyhtQnViYmxlRW50cnkuZ2V0S2V5KCkpOwogICAgICAgICBhc3NlcnRUaGF0KG1CdWJibGVDb250cm9sbGVyLmlzU3RhY2tFeHBhbmRlZCgpKS5pc1RydWUoKTsKIAotICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQpOworICAgICAgICBtQnViYmxlQ29udHJvbGxlci5zaG93T3JIaWRlQXBwQnViYmxlKG1BcHBCdWJibGVJbnRlbnQsIG1Vc2VyMCk7CiAgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZURhdGEuZ2V0U2VsZWN0ZWRCdWJibGUoKS5nZXRLZXkoKSkuaXNFcXVhbFRvKEtFWV9BUFBfQlVCQkxFKTsKICAgICAgICAgYXNzZXJ0VGhhdChtQnViYmxlQ29udHJvbGxlci5pc1N0YWNrRXhwYW5kZWQoKSkuaXNUcnVlKCk7CiAgICAgICAgIGFzc2VydFRoYXQobUJ1YmJsZURhdGEuZ2V0QnViYmxlcygpLnNpemUoKSkuaXNFcXVhbFRvKDIpOwpAQCAtMTgzMCw2ICsxODcwLDEyIEBACiAgICAgICAgIG1CdWJibGVDb250cm9sbGVyLm9uVXNlckNoYW5nZWQodXNlcklkKTsKICAgICB9CiAKKyAgICBwcml2YXRlIFVzZXJIYW5kbGUgY3JlYXRlVXNlckhhbmRlKGludCB1c2VySWQpIHsKKyAgICAgICAgVXNlckhhbmRsZSB1c2VyID0gbW9jayhVc2VySGFuZGxlLmNsYXNzKTsKKyAgICAgICAgd2hlbih1c2VyLmdldElkZW50aWZpZXIoKSkudGhlblJldHVybih1c2VySWQpOworICAgICAgICByZXR1cm4gdXNlcjsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGJ1YmJsZSBzdGFjayBpcyBleHBhbmRlZCBhbmQgYWxzbyB2YWxpZGF0ZXMgdGhlIGNhY2hlZCBzdGF0ZSBpcyB1cGRhdGVkLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3dtc2hlbGwvVGVzdGFibGVOb3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3dtc2hlbGwvVGVzdGFibGVOb3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbC5qYXZhCmluZGV4IGNlZWUwYmMuLjRlMTRiYmY2IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvd21zaGVsbC9UZXN0YWJsZU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3dtc2hlbGwvVGVzdGFibGVOb3RpZmljYXRpb25JbnRlcnJ1cHRTdGF0ZVByb3ZpZGVySW1wbC5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLmRyZWFtcy5JRHJlYW1NYW5hZ2VyOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwubG9nZ2luZy5VaUV2ZW50TG9nZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnBsdWdpbnMuc3RhdHVzYmFyLlN0YXR1c0JhclN0YXRlQ29udHJvbGxlcjsKQEAgLTM5LDcgKzM4LDYgQEAKICAgICBUZXN0YWJsZU5vdGlmaWNhdGlvbkludGVycnVwdFN0YXRlUHJvdmlkZXJJbXBsKAogICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciwKICAgICAgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIsCi0gICAgICAgICAgICBJRHJlYW1NYW5hZ2VyIGRyZWFtTWFuYWdlciwKICAgICAgICAgICAgIEFtYmllbnREaXNwbGF5Q29uZmlndXJhdGlvbiBhbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb24sCiAgICAgICAgICAgICBTdGF0dXNCYXJTdGF0ZUNvbnRyb2xsZXIgc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLAogICAgICAgICAgICAgS2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIga2V5Z3VhcmRTdGF0ZUNvbnRyb2xsZXIsCkBAIC01Myw3ICs1MSw2IEBACiAgICAgICAgICAgICBVc2VyVHJhY2tlciB1c2VyVHJhY2tlcikgewogICAgICAgICBzdXBlcihjb250ZW50UmVzb2x2ZXIsCiAgICAgICAgICAgICAgICAgcG93ZXJNYW5hZ2VyLAotICAgICAgICAgICAgICAgIGRyZWFtTWFuYWdlciwKICAgICAgICAgICAgICAgICBhbWJpZW50RGlzcGxheUNvbmZpZ3VyYXRpb24sCiAgICAgICAgICAgICAgICAgYmF0dGVyeUNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgc3RhdHVzQmFyU3RhdGVDb250cm9sbGVyLApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvdXRpbHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RhdGEvcmVwb3NpdG9yeS9GYWtlS2V5Z3VhcmRCb3VuY2VyUmVwb3NpdG9yeS5rdCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Rlc3RzL3V0aWxzL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9rZXlndWFyZC9kYXRhL3JlcG9zaXRvcnkvRmFrZUtleWd1YXJkQm91bmNlclJlcG9zaXRvcnkua3QKaW5kZXggOWNkY2UyMC4uMWRkYTQ3MiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvdGVzdHMvdXRpbHMvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL2RhdGEvcmVwb3NpdG9yeS9GYWtlS2V5Z3VhcmRCb3VuY2VyUmVwb3NpdG9yeS5rdAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS90ZXN0cy91dGlscy9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvZGF0YS9yZXBvc2l0b3J5L0Zha2VLZXlndWFyZEJvdW5jZXJSZXBvc2l0b3J5Lmt0CkBAIC0xOSwyMSArMTksMTYgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLmtleWd1YXJkLnNoYXJlZC5jb25zdGFudHMuS2V5Z3VhcmRCb3VuY2VyQ29uc3RhbnRzLkVYUEFOU0lPTl9ISURERU4KIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQubW9kZWwuQm91bmNlclNob3dNZXNzYWdlTW9kZWwKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQubW9kZWwuS2V5Z3VhcmRCb3VuY2VyTW9kZWwKIGltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuZmxvdy5NdXRhYmxlU3RhdGVGbG93CiBpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuU3RhdGVGbG93CiBpbXBvcnQga290bGlueC5jb3JvdXRpbmVzLmZsb3cuYXNTdGF0ZUZsb3cKIAogLyoqIEZha2UgaW1wbGVtZW50YXRpb24gb2YgW0tleWd1YXJkUmVwb3NpdG9yeV0gKi8KIGNsYXNzIEZha2VLZXlndWFyZEJvdW5jZXJSZXBvc2l0b3J5IDogS2V5Z3VhcmRCb3VuY2VyUmVwb3NpdG9yeSB7Ci0gICAgcHJpdmF0ZSB2YWwgX3ByaW1hcnlCb3VuY2VyVmlzaWJsZSA9IE11dGFibGVTdGF0ZUZsb3coZmFsc2UpCi0gICAgb3ZlcnJpZGUgdmFsIHByaW1hcnlCb3VuY2VyVmlzaWJsZSA9IF9wcmltYXJ5Qm91bmNlclZpc2libGUuYXNTdGF0ZUZsb3coKQotICAgIHByaXZhdGUgdmFsIF9wcmltYXJ5Qm91bmNlclNob3cgPSBNdXRhYmxlU3RhdGVGbG93PEtleWd1YXJkQm91bmNlck1vZGVsPz4obnVsbCkKKyAgICBwcml2YXRlIHZhbCBfcHJpbWFyeUJvdW5jZXJTaG93ID0gTXV0YWJsZVN0YXRlRmxvdyhmYWxzZSkKICAgICBvdmVycmlkZSB2YWwgcHJpbWFyeUJvdW5jZXJTaG93ID0gX3ByaW1hcnlCb3VuY2VyU2hvdy5hc1N0YXRlRmxvdygpCiAgICAgcHJpdmF0ZSB2YWwgX3ByaW1hcnlCb3VuY2VyU2hvd2luZ1Nvb24gPSBNdXRhYmxlU3RhdGVGbG93KGZhbHNlKQogICAgIG92ZXJyaWRlIHZhbCBwcmltYXJ5Qm91bmNlclNob3dpbmdTb29uID0gX3ByaW1hcnlCb3VuY2VyU2hvd2luZ1Nvb24uYXNTdGF0ZUZsb3coKQotICAgIHByaXZhdGUgdmFsIF9wcmltYXJ5Qm91bmNlckhpZGUgPSBNdXRhYmxlU3RhdGVGbG93KGZhbHNlKQotICAgIG92ZXJyaWRlIHZhbCBwcmltYXJ5Qm91bmNlckhpZGUgPSBfcHJpbWFyeUJvdW5jZXJIaWRlLmFzU3RhdGVGbG93KCkKICAgICBwcml2YXRlIHZhbCBfcHJpbWFyeUJvdW5jZXJTdGFydGluZ1RvSGlkZSA9IE11dGFibGVTdGF0ZUZsb3coZmFsc2UpCiAgICAgb3ZlcnJpZGUgdmFsIHByaW1hcnlCb3VuY2VyU3RhcnRpbmdUb0hpZGUgPSBfcHJpbWFyeUJvdW5jZXJTdGFydGluZ1RvSGlkZS5hc1N0YXRlRmxvdygpCiAgICAgcHJpdmF0ZSB2YWwgX3ByaW1hcnlCb3VuY2VyRGlzYXBwZWFyQW5pbWF0aW9uID0gTXV0YWJsZVN0YXRlRmxvdzxSdW5uYWJsZT8+KG51bGwpCkBAIC02NywxMCArNjIsNiBAQAogICAgICAgICBfcHJpbWFyeUJvdW5jZXJTY3JpbW1lZC52YWx1ZSA9IGlzU2NyaW1tZWQKICAgICB9CiAKLSAgICBvdmVycmlkZSBmdW4gc2V0UHJpbWFyeVZpc2libGUoaXNWaXNpYmxlOiBCb29sZWFuKSB7Ci0gICAgICAgIF9wcmltYXJ5Qm91bmNlclZpc2libGUudmFsdWUgPSBpc1Zpc2libGUKLSAgICB9Ci0KICAgICBvdmVycmlkZSBmdW4gc2V0QWx0ZXJuYXRlVmlzaWJsZShpc1Zpc2libGU6IEJvb2xlYW4pIHsKICAgICAgICAgX2lzQWx0ZXJuYXRlQm91bmNlclZpc2libGUudmFsdWUgPSBpc1Zpc2libGUKICAgICB9CkBAIC03OSwxOCArNzAsMTQgQEAKICAgICAgICAgX2lzQWx0ZXJuYXRlQm91bmNlclVJQXZhaWxhYmxlLnZhbHVlID0gaXNBdmFpbGFibGUKICAgICB9CiAKLSAgICBvdmVycmlkZSBmdW4gc2V0UHJpbWFyeVNob3coa2V5Z3VhcmRCb3VuY2VyTW9kZWw6IEtleWd1YXJkQm91bmNlck1vZGVsPykgewotICAgICAgICBfcHJpbWFyeUJvdW5jZXJTaG93LnZhbHVlID0ga2V5Z3VhcmRCb3VuY2VyTW9kZWwKKyAgICBvdmVycmlkZSBmdW4gc2V0UHJpbWFyeVNob3coaXNTaG93aW5nOiBCb29sZWFuKSB7CisgICAgICAgIF9wcmltYXJ5Qm91bmNlclNob3cudmFsdWUgPSBpc1Nob3dpbmcKICAgICB9CiAKICAgICBvdmVycmlkZSBmdW4gc2V0UHJpbWFyeVNob3dpbmdTb29uKHNob3dpbmdTb29uOiBCb29sZWFuKSB7CiAgICAgICAgIF9wcmltYXJ5Qm91bmNlclNob3dpbmdTb29uLnZhbHVlID0gc2hvd2luZ1Nvb24KICAgICB9CiAKLSAgICBvdmVycmlkZSBmdW4gc2V0UHJpbWFyeUhpZGUoaGlkZTogQm9vbGVhbikgewotICAgICAgICBfcHJpbWFyeUJvdW5jZXJIaWRlLnZhbHVlID0gaGlkZQotICAgIH0KLQogICAgIG92ZXJyaWRlIGZ1biBzZXRQcmltYXJ5U3RhcnRpbmdUb0hpZGUoc3RhcnRpbmdUb0hpZGU6IEJvb2xlYW4pIHsKICAgICAgICAgX3ByaW1hcnlCb3VuY2VyU3RhcnRpbmdUb0hpZGUudmFsdWUgPSBzdGFydGluZ1RvSGlkZQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvbXBhbmlvbi9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb21wYW5pb24vdmlydHVhbC9JbnB1dENvbnRyb2xsZXIuamF2YSBiL3NlcnZpY2VzL2NvbXBhbmlvbi9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb21wYW5pb24vdmlydHVhbC9JbnB1dENvbnRyb2xsZXIuamF2YQppbmRleCA2MDc0MzliLi5iZDY3ODg5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb21wYW5pb24vamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29tcGFuaW9uL3ZpcnR1YWwvSW5wdXRDb250cm9sbGVyLmphdmEKKysrIGIvc2VydmljZXMvY29tcGFuaW9uL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NvbXBhbmlvbi92aXJ0dWFsL0lucHV0Q29udHJvbGxlci5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VySW50ZXJuYWw7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dERldmljZUlkZW50aWZpZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXJHbG9iYWw7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5WaXJ0dWFsS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5WaXJ0dWFsTW91c2VCdXR0b25FdmVudDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LlZpcnR1YWxNb3VzZVJlbGF0aXZlRXZlbnQ7CkBAIC02ODYsNyArNjg3LDcgQEAKICAgICAgICAgICAgIG1MaXN0ZW5lciA9IG5ldyBJbnB1dE1hbmFnZXIuSW5wdXREZXZpY2VMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbklucHV0RGV2aWNlQWRkZWQoaW50IGRldmljZUlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0RGV2aWNlIGRldmljZSA9IElucHV0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldElucHV0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dERldmljZSBkZXZpY2UgPSBJbnB1dE1hbmFnZXJHbG9iYWwuZ2V0SW5zdGFuY2UoKS5nZXRJbnB1dERldmljZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCk7CiAgICAgICAgICAgICAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZGV2aWNlLCAiTmV3bHkgYWRkZWQgaW5wdXQgZGV2aWNlIHdhcyBudWxsLiIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZS5nZXROYW1lKCkuZXF1YWxzKGRldmljZU5hbWUpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0JhdHRlcnlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0JhdHRlcnlTZXJ2aWNlLmphdmEKaW5kZXggZTlhN2YyMC4uZDk0ZjRmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9CYXR0ZXJ5U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQmF0dGVyeVNlcnZpY2UuamF2YQpAQCAtMTk0LDE5ICsxOTQsMTkgQEAKIAogICAgIHByaXZhdGUgQnVuZGxlIG1CYXR0ZXJ5Q2hhbmdlZE9wdGlvbnMgPSBCcm9hZGNhc3RPcHRpb25zLm1ha2VCYXNpYygpCiAgICAgICAgICAgICAuc2V0RGVsaXZlcnlHcm91cFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFTElWRVJZX0dST1VQX1BPTElDWV9NT1NUX1JFQ0VOVCkKLSAgICAgICAgICAgIC5zZXREZWZlclVudGlsQWN0aXZlKHRydWUpCisgICAgICAgICAgICAuc2V0RGVmZXJyYWxQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfVU5USUxfQUNUSVZFKQogICAgICAgICAgICAgLnRvQnVuZGxlKCk7CiAgICAgLyoqIFVzZWQgZm9yIGJvdGggY29ubmVjdGVkL2Rpc2Nvbm5lY3RlZCwgc28gbWF0Y2ggdXNpbmcga2V5ICovCiAgICAgcHJpdmF0ZSBCdW5kbGUgbVBvd2VyT3B0aW9ucyA9IEJyb2FkY2FzdE9wdGlvbnMubWFrZUJhc2ljKCkKICAgICAgICAgICAgIC5zZXREZWxpdmVyeUdyb3VwUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVMSVZFUllfR1JPVVBfUE9MSUNZX01PU1RfUkVDRU5UKQogICAgICAgICAgICAgLnNldERlbGl2ZXJ5R3JvdXBNYXRjaGluZ0tleSgiYW5kcm9pZCIsIEludGVudC5BQ1RJT05fUE9XRVJfQ09OTkVDVEVEKQotICAgICAgICAgICAgLnNldERlZmVyVW50aWxBY3RpdmUodHJ1ZSkKKyAgICAgICAgICAgIC5zZXREZWZlcnJhbFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUpCiAgICAgICAgICAgICAudG9CdW5kbGUoKTsKICAgICAvKiogVXNlZCBmb3IgYm90aCBsb3cvb2theSwgc28gbWF0Y2ggdXNpbmcga2V5ICovCiAgICAgcHJpdmF0ZSBCdW5kbGUgbUJhdHRlcnlPcHRpb25zID0gQnJvYWRjYXN0T3B0aW9ucy5tYWtlQmFzaWMoKQogICAgICAgICAgICAgLnNldERlbGl2ZXJ5R3JvdXBQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUxJVkVSWV9HUk9VUF9QT0xJQ1lfTU9TVF9SRUNFTlQpCiAgICAgICAgICAgICAuc2V0RGVsaXZlcnlHcm91cE1hdGNoaW5nS2V5KCJhbmRyb2lkIiwgSW50ZW50LkFDVElPTl9CQVRURVJZX09LQVkpCi0gICAgICAgICAgICAuc2V0RGVmZXJVbnRpbEFjdGl2ZSh0cnVlKQorICAgICAgICAgICAgLnNldERlZmVycmFsUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVGRVJSQUxfUE9MSUNZX1VOVElMX0FDVElWRSkKICAgICAgICAgICAgIC50b0J1bmRsZSgpOwogCiAgICAgcHJpdmF0ZSBNZXRyaWNzTG9nZ2VyIG1NZXRyaWNzTG9nZ2VyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ecm9wQm94TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRHJvcEJveE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMTllNWNiMS4uYTNkYzIxZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ecm9wQm94TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Ryb3BCb3hNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLnNldERlbGl2ZXJ5R3JvdXBQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUxJVkVSWV9HUk9VUF9QT0xJQ1lfTUVSR0VEKQogICAgICAgICAgICAgICAgICAgICAuc2V0RGVsaXZlcnlHcm91cE1hdGNoaW5nRmlsdGVyKG1hdGNoaW5nRmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAuc2V0RGVsaXZlcnlHcm91cEV4dHJhc01lcmdlcihleHRyYXNNZXJnZXIpCi0gICAgICAgICAgICAgICAgICAgIC5zZXREZWZlclVudGlsQWN0aXZlKHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXREZWZlcnJhbFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUpCiAgICAgICAgICAgICAgICAgICAgIC50b0J1bmRsZSgpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvT1dORVJTIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9PV05FUlMKaW5kZXggYzQ0MTg1OS4uNDA5ZjA1NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9PV05FUlMKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9PV05FUlMKQEAgLTM1LDcgKzM1LDcgQEAKIHBlci1maWxlIE5ldElkTWFuYWdlci5qYXZhID0gZmlsZTovc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9uZXQvT1dORVJTCiBwZXItZmlsZSBQYWNrYWdlV2F0Y2hkb2cuamF2YSwgUmVzY3VlUGFydHkuamF2YSA9IGZpbGU6L3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcm9sbGJhY2svT1dORVJTCiBwZXItZmlsZSBQaW5uZXJTZXJ2aWNlLmphdmEgPSBmaWxlOi9hcGN0LXRlc3RzL3BlcmZ0ZXN0cy9PV05FUlMKLXBlci1maWxlIFJlc2N1ZVBhcnR5LmphdmEgPSBmZHVubGFwQGdvb2dsZS5jb20sIHNodWNAZ29vZ2xlLmNvbQorcGVyLWZpbGUgUmVzY3VlUGFydHkuamF2YSA9IGZkdW5sYXBAZ29vZ2xlLmNvbSwgc2h1Y0Bnb29nbGUuY29tLCBhbmNyQGdvb2dsZS5jb20sIGhhcnNoaXRtYWhhamFuQGdvb2dsZS5jb20KIHBlci1maWxlIFN5c3RlbUNsb2NrVGltZS5qYXZhID0gZmlsZTovc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci90aW1lZGV0ZWN0b3IvT1dORVJTCiBwZXItZmlsZSBTeXN0ZW1UaW1lWm9uZS5qYXZhID0gZmlsZTovc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci90aW1lem9uZWRldGVjdG9yL09XTkVSUwogcGVyLWZpbGUgVGVsZXBob255UmVnaXN0cnkuamF2YSA9IGZpbGU6L3RlbGVwaG9ueS9PV05FUlMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUmVzY3VlUGFydHkuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUmVzY3VlUGFydHkuamF2YQppbmRleCBkMWUwZjE2Li4zZGU2NWY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Jlc2N1ZVBhcnR5LmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9SZXNjdWVQYXJ0eS5qYXZhCkBAIC03OSw2ICs3OSw3IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FUVEVNUFRJTkdfRkFDVE9SWV9SRVNFVCA9ICJzeXMuYXR0ZW1wdGluZ19mYWN0b3J5X3Jlc2V0IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVRURU1QVElOR19SRUJPT1QgPSAic3lzLmF0dGVtcHRpbmdfcmVib290IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTUFYX1JFU0NVRV9MRVZFTF9BVFRFTVBURUQgPSAic3lzLm1heF9yZXNjdWVfbGV2ZWxfYXR0ZW1wdGVkIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTEFTVF9GQUNUT1JZX1JFU0VUX1RJTUVfTVMgPSAicGVyc2lzdC5zeXMubGFzdF9mYWN0b3J5X3Jlc2V0IjsKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBzdGF0aWMgZmluYWwgaW50IExFVkVMX05PTkUgPSAwOwogICAgIEBWaXNpYmxlRm9yVGVzdGluZwpAQCAtMTA1LDEwICsxMDYsMTEgQEAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9UT19QQUNLQUdFX01BUFBJTkdfRkxBRyA9CiAgICAgICAgICAgICAibmFtZXNwYWNlX3RvX3BhY2thZ2VfbWFwcGluZyI7CisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgc3RhdGljIGZpbmFsIGxvbmcgRkFDVE9SWV9SRVNFVF9USFJPVFRMRV9EVVJBVElPTl9NUyA9IFRpbWVVbml0Lk1JTlVURVMudG9NaWxsaXMoMTApOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAicmVzY3VlLXBhcnR5LW9ic2VydmVyIjsKIAotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRElTQUJMRV9SRVNDVUUgPSAicGVyc2lzdC5zeXMuZGlzYWJsZV9yZXNjdWUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZJUlRVQUxfREVWSUNFID0gInJvLmhhcmR3YXJlLnZpcnR1YWxfZGV2aWNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ERVZJQ0VfQ09ORklHX0RJU0FCTEVfRkxBRyA9CkBAIC0zMjcsOCArMzI5LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRNYXhSZXNjdWVMZXZlbChib29sZWFuIG1heVBlcmZvcm1GYWN0b3J5UmVzZXQpIHsKLSAgICAgICAgaWYgKCFtYXlQZXJmb3JtRmFjdG9yeVJlc2V0CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldE1heFJlc2N1ZUxldmVsKGJvb2xlYW4gbWF5UGVyZm9ybVJlYm9vdCkgeworICAgICAgICBpZiAoIW1heVBlcmZvcm1SZWJvb3QKICAgICAgICAgICAgICAgICB8fCBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oUFJPUF9ESVNBQkxFX0ZBQ1RPUllfUkVTRVRfRkxBRywgZmFsc2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gTEVWRUxfUkVTRVRfU0VUVElOR1NfVFJVU1RFRF9ERUZBVUxUUzsKICAgICAgICAgfQpAQCAtMzM5LDExICszNDEsMTEgQEAKICAgICAgKiBHZXQgdGhlIHJlc2N1ZSBsZXZlbCB0byBwZXJmb3JtIGlmIHRoaXMgaXMgdGhlIG4tdGggYXR0ZW1wdCBhdCBtaXRpZ2F0aW5nIGZhaWx1cmUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbWl0aWdhdGlvbkNvdW50OiB0aGUgbWl0aWdhdGlvbiBhdHRlbXB0IG51bWJlciAoMSA9IGZpcnN0IGF0dGVtcHQgZXRjLikKLSAgICAgKiBAcGFyYW0gbWF5UGVyZm9ybUZhY3RvcnlSZXNldDogd2hldGhlciBvciBub3QgYSBmYWN0b3J5IHJlc2V0IG1heSBiZSBwZXJmb3JtZWQgZm9yIHRoZSBnaXZlbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS4KKyAgICAgKiBAcGFyYW0gbWF5UGVyZm9ybVJlYm9vdDogd2hldGhlciBvciBub3QgYSByZWJvb3QgYW5kIGZhY3RvcnkgcmVzZXQgbWF5IGJlIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGdpdmVuIGZhaWx1cmUuCiAgICAgICogQHJldHVybiB0aGUgcmVzY3VlIGxldmVsIGZvciB0aGUgbi10aCBtaXRpZ2F0aW9uIGF0dGVtcHQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFJlc2N1ZUxldmVsKGludCBtaXRpZ2F0aW9uQ291bnQsIGJvb2xlYW4gbWF5UGVyZm9ybUZhY3RvcnlSZXNldCkgeworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRSZXNjdWVMZXZlbChpbnQgbWl0aWdhdGlvbkNvdW50LCBib29sZWFuIG1heVBlcmZvcm1SZWJvb3QpIHsKICAgICAgICAgaWYgKG1pdGlnYXRpb25Db3VudCA9PSAxKSB7CiAgICAgICAgICAgICByZXR1cm4gTEVWRUxfUkVTRVRfU0VUVElOR1NfVU5UUlVTVEVEX0RFRkFVTFRTOwogICAgICAgICB9IGVsc2UgaWYgKG1pdGlnYXRpb25Db3VudCA9PSAyKSB7CkBAIC0zNTEsOSArMzUzLDkgQEAKICAgICAgICAgfSBlbHNlIGlmIChtaXRpZ2F0aW9uQ291bnQgPT0gMykgewogICAgICAgICAgICAgcmV0dXJuIExFVkVMX1JFU0VUX1NFVFRJTkdTX1RSVVNURURfREVGQVVMVFM7CiAgICAgICAgIH0gZWxzZSBpZiAobWl0aWdhdGlvbkNvdW50ID09IDQpIHsKLSAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihnZXRNYXhSZXNjdWVMZXZlbChtYXlQZXJmb3JtRmFjdG9yeVJlc2V0KSwgTEVWRUxfV0FSTV9SRUJPT1QpOworICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKGdldE1heFJlc2N1ZUxldmVsKG1heVBlcmZvcm1SZWJvb3QpLCBMRVZFTF9XQVJNX1JFQk9PVCk7CiAgICAgICAgIH0gZWxzZSBpZiAobWl0aWdhdGlvbkNvdW50ID49IDUpIHsKLSAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihnZXRNYXhSZXNjdWVMZXZlbChtYXlQZXJmb3JtRmFjdG9yeVJlc2V0KSwgTEVWRUxfRkFDVE9SWV9SRVNFVCk7CisgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oZ2V0TWF4UmVzY3VlTGV2ZWwobWF5UGVyZm9ybVJlYm9vdCksIExFVkVMX0ZBQ1RPUllfUkVTRVQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgU2xvZy53KFRBRywgIkV4cGVjdGVkIHBvc2l0aXZlIG1pdGlnYXRpb24gY291bnQsIHdhcyAiICsgbWl0aWdhdGlvbkNvdW50KTsKICAgICAgICAgICAgIHJldHVybiBMRVZFTF9OT05FOwpAQCAtNDUwLDYgKzQ1Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldChQUk9QX0FUVEVNUFRJTkdfRkFDVE9SWV9SRVNFVCwgInRydWUiKTsKKyAgICAgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KFBST1BfTEFTVF9GQUNUT1JZX1JFU0VUX1RJTUVfTVMsIExvbmcudG9TdHJpbmcobm93KSk7CiAgICAgICAgICAgICAgICAgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CkBAIC02MjcsNyArNjMxLDcgQEAKICAgICAgICAgICAgIGlmICghaXNEaXNhYmxlZCgpICYmIChmYWlsdXJlUmVhc29uID09IFBhY2thZ2VXYXRjaGRvZy5GQUlMVVJFX1JFQVNPTl9BUFBfQ1JBU0gKICAgICAgICAgICAgICAgICAgICAgfHwgZmFpbHVyZVJlYXNvbiA9PSBQYWNrYWdlV2F0Y2hkb2cuRkFJTFVSRV9SRUFTT05fQVBQX05PVF9SRVNQT05ESU5HKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBtYXBSZXNjdWVMZXZlbFRvVXNlckltcGFjdChnZXRSZXNjdWVMZXZlbChtaXRpZ2F0aW9uQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXlQZXJmb3JtRmFjdG9yeVJlc2V0KGZhaWxlZFBhY2thZ2UpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXlQZXJmb3JtUmVib290KGZhaWxlZFBhY2thZ2UpKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBQYWNrYWdlSGVhbHRoT2JzZXJ2ZXJJbXBhY3QuVVNFUl9JTVBBQ1RfTk9ORTsKICAgICAgICAgICAgIH0KQEAgLTY0Miw3ICs2NDYsNyBAQAogICAgICAgICAgICAgaWYgKGZhaWx1cmVSZWFzb24gPT0gUGFja2FnZVdhdGNoZG9nLkZBSUxVUkVfUkVBU09OX0FQUF9DUkFTSAogICAgICAgICAgICAgICAgICAgICB8fCBmYWlsdXJlUmVhc29uID09IFBhY2thZ2VXYXRjaGRvZy5GQUlMVVJFX1JFQVNPTl9BUFBfTk9UX1JFU1BPTkRJTkcpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGV2ZWwgPSBnZXRSZXNjdWVMZXZlbChtaXRpZ2F0aW9uQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXlQZXJmb3JtRmFjdG9yeVJlc2V0KGZhaWxlZFBhY2thZ2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heVBlcmZvcm1SZWJvb3QoZmFpbGVkUGFja2FnZSkpOwogICAgICAgICAgICAgICAgIGV4ZWN1dGVSZXNjdWVMZXZlbChtQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZFBhY2thZ2UgPT0gbnVsbCA/IG51bGwgOiBmYWlsZWRQYWNrYWdlLmdldFBhY2thZ2VOYW1lKCksIGxldmVsKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTY4Myw4ICs2ODcsOSBAQAogICAgICAgICAgICAgaWYgKGlzRGlzYWJsZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gbWF5UGVyZm9ybVJlYm9vdCA9ICFzaG91bGRUaHJvdHRsZVJlYm9vdCgpOwogICAgICAgICAgICAgZXhlY3V0ZVJlc2N1ZUxldmVsKG1Db250ZXh0LCAvKmZhaWxlZFBhY2thZ2U9Ki8gbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVzY3VlTGV2ZWwobWl0aWdhdGlvbkNvdW50LCB0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgIGdldFJlc2N1ZUxldmVsKG1pdGlnYXRpb25Db3VudCwgbWF5UGVyZm9ybVJlYm9vdCkpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIApAQCAtNjk4LDE0ICs3MDMsMjcgQEAKICAgICAgICAgICogcHJvbXB0aW5nIGEgZmFjdG9yeSByZXNldCBpcyBhbiBhY2NlcHRhYmxlIG1pdGlnYXRpb24gc3RyYXRlZ3kgZm9yIHRoZSBwYWNrYWdlJ3MKICAgICAgICAgICogZmFpbHVyZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbWF5UGVyZm9ybUZhY3RvcnlSZXNldChATnVsbGFibGUgVmVyc2lvbmVkUGFja2FnZSBmYWlsaW5nUGFja2FnZSkgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbWF5UGVyZm9ybVJlYm9vdChATnVsbGFibGUgVmVyc2lvbmVkUGFja2FnZSBmYWlsaW5nUGFja2FnZSkgewogICAgICAgICAgICAgaWYgKGZhaWxpbmdQYWNrYWdlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hvdWxkVGhyb3R0bGVSZWJvb3QoKSkgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBpc1BlcnNpc3RlbnRTeXN0ZW1BcHAoZmFpbGluZ1BhY2thZ2UuZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgUmVzY3VlIFBhcnR5IGlzIGFsbG93ZWQgdG8gYXR0ZW1wdCBhIHJlYm9vdCBvciBmYWN0b3J5IHJlc2V0LgorICAgICAgICAgKiBXaWxsIHJldHVybiB7QGNvZGUgZmFsc2V9IGlmIGEgZmFjdG9yeSByZXNldCB3YXMgYWxyZWFkeSBvZmZlcmVkIHJlY2VudGx5LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFRocm90dGxlUmVib290KCkgeworICAgICAgICAgICAgTG9uZyBsYXN0UmVzZXRUaW1lID0gU3lzdGVtUHJvcGVydGllcy5nZXRMb25nKFBST1BfTEFTVF9GQUNUT1JZX1JFU0VUX1RJTUVfTVMsIDApOworICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHJldHVybiBub3cgPCBsYXN0UmVzZXRUaW1lICsgRkFDVE9SWV9SRVNFVF9USFJPVFRMRV9EVVJBVElPTl9NUzsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1BlcnNpc3RlbnRTeXN0ZW1BcHAoQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3RpdmVTZXJ2aWNlcy5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3RpdmVTZXJ2aWNlcy5qYXZhCmluZGV4IGM1MDA4ZmEuLjRhMGEyMjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZlU2VydmljZXMuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2ZVNlcnZpY2VzLmphdmEKQEAgLTI1MiwxMiArMjUyLDYgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HX1NFUlZJQ0VfU1RBUlRfU1RPUCA9IERFQlVHX1NFUlZJQ0U7CiAKLSAgICAvLyBIb3cgbG9uZyB3ZSB3YWl0IGZvciBhIHNlcnZpY2UgdG8gZmluaXNoIGV4ZWN1dGluZy4KLSAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVElNRU9VVCA9IDIwICogMTAwMCAqIEJ1aWxkLkhXX1RJTUVPVVRfTVVMVElQTElFUjsKLQotICAgIC8vIEhvdyBsb25nIHdlIHdhaXQgZm9yIGEgc2VydmljZSB0byBmaW5pc2ggZXhlY3V0aW5nLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9CQUNLR1JPVU5EX1RJTUVPVVQgPSBTRVJWSUNFX1RJTUVPVVQgKiAxMDsKLQogICAgIC8vIEZvcmVncm91bmQgc2VydmljZSB0eXBlcyB0aGF0IGFsd2F5cyBnZXQgaW1tZWRpYXRlIG5vdGlmaWNhdGlvbiBkaXNwbGF5LAogICAgIC8vIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSBiaXRtYXNrIGZvcm1hdCB0aGF0IFNlcnZpY2VSZWNvcmQuZm9yZWdyb3VuZFNlcnZpY2VUeXBlCiAgICAgLy8gdXNlcy4KQEAgLTMzNyw2ICszMzEsMTMgQEAKICAgICBmaW5hbCBBcnJheU1hcDxGb3JlZ3JvdW5kU2VydmljZURlbGVnYXRpb24sIFNlcnZpY2VSZWNvcmQ+IG1GZ3NEZWxlZ2F0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7CiAKICAgICAvKioKKyAgICAgKiBBIGdsb2JhbCBjb3VudGVyIGZvciBnZW5lcmF0aW5nIHNlcXVlbmNlIG51bWJlcnMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYmluZFNlcnZpY2UgcmVxdWVzdHMuCisgICAgICogSXQgaXMgcHVyZWx5IGZvciBsb2dnaW5nIHB1cnBvc2VzLgorICAgICAqLworICAgIEBHdWFyZGVkQnkoIm1BbSIpCisgICAgcHJpdmF0ZSBsb25nIG1CaW5kU2VydmljZVNlcUNvdW50ZXIgPSAwOworCisgICAgLyoqCiAgICAgICogV2hldGhlciB0aGVyZSBpcyBhIHJhdGUgbGltaXQgdGhhdCBzdXBwcmVzc2VzIGltbWVkaWF0ZSByZS1kZWZlcnJhbCBvZiBuZXcgRkdTCiAgICAgICogbm90aWZpY2F0aW9ucyBmcm9tIGVhY2ggYXBwLiAgT24gYnkgZGVmYXVsdCwgZGlzYWJsZWQgb25seSBieSBzaGVsbCBjb21tYW5kIGZvcgogICAgICAqIHRlc3Qtc3VpdGUgcHVycG9zZXMuICBUbyBkaXNhYmxlIHRoZSBiZWhhdmlvciBtb3JlIGdlbmVyYWxseSwgdXNlIHRoZSB1c3VhbApAQCAtNDQyOSw4ICs0NDMwLDEyIEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGJ1bXBTZXJ2aWNlRXhlY3V0aW5nTG9ja2VkKHIsIGV4ZWNJbkZnLCAiYmluZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBPb21BZGp1c3Rlci5PT01fQURKX1JFQVNPTl9CSU5EX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIGlmIChUcmFjZS5pc1RhZ0VuYWJsZWQoVHJhY2UuVFJBQ0VfVEFHX0FDVElWSVRZX01BTkFHRVIpKSB7CisgICAgICAgICAgICAgICAgICAgIFRyYWNlLmluc3RhbnQoVHJhY2UuVFJBQ0VfVEFHX0FDVElWSVRZX01BTkFHRVIsICJyZXF1ZXN0U2VydmljZUJpbmRpbmc9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaS5pbnRlbnQuZ2V0SW50ZW50KCkgKyAiLiBiaW5kU2VxPSIgKyBtQmluZFNlcnZpY2VTZXFDb3VudGVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgci5hcHAuZ2V0VGhyZWFkKCkuc2NoZWR1bGVCaW5kU2VydmljZShyLCBpLmludGVudC5nZXRJbnRlbnQoKSwgcmViaW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgci5hcHAubVN0YXRlLmdldFJlcG9ydGVkUHJvY1N0YXRlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgci5hcHAubVN0YXRlLmdldFJlcG9ydGVkUHJvY1N0YXRlKCksIG1CaW5kU2VydmljZVNlcUNvdW50ZXIrKyk7CiAgICAgICAgICAgICAgICAgaWYgKCFyZWJpbmQpIHsKICAgICAgICAgICAgICAgICAgICAgaS5yZXF1ZXN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTY1OTgsMTMgKzY2MDMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmaW5hbCBQcm9jZXNzU2VydmljZVJlY29yZCBwc3IgPSBwcm9jLm1TZXJ2aWNlczsKLSAgICAgICAgICAgICAgICBpZiAocHNyLm51bWJlck9mRXhlY3V0aW5nU2VydmljZXMoKSA9PSAwIHx8IHByb2MuZ2V0VGhyZWFkKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChwc3IubnVtYmVyT2ZFeGVjdXRpbmdTZXJ2aWNlcygpID09IDAgfHwgcHJvYy5nZXRUaHJlYWQoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwcm9jLmlzS2lsbGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgbWF4VGltZSA9ICBub3cKICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHBzci5zaG91bGRFeGVjU2VydmljZXNGZygpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IFNFUlZJQ0VfVElNRU9VVCA6IFNFUlZJQ0VfQkFDS0dST1VORF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbUFtLm1Db25zdGFudHMuU0VSVklDRV9USU1FT1VUCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1BbS5tQ29uc3RhbnRzLlNFUlZJQ0VfQkFDS0dST1VORF9USU1FT1VUKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlUmVjb3JkIHRpbWVvdXQgPSBudWxsOwogICAgICAgICAgICAgICAgIGxvbmcgbmV4dFRpbWUgPSAwOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwc3IubnVtYmVyT2ZFeGVjdXRpbmdTZXJ2aWNlcygpIC0gMTsgaSA+PSAwOyBpLS0pIHsKQEAgLTY2MzUsOCArNjY0Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5TRVJWSUNFX1RJTUVPVVRfTVNHKTsKICAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IHByb2M7CiAgICAgICAgICAgICAgICAgICAgIG1BbS5tSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtc2csIHBzci5zaG91bGRFeGVjU2VydmljZXNGZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAobmV4dFRpbWUgKyBTRVJWSUNFX1RJTUVPVVQpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dFRpbWUgKyBTRVJWSUNFX0JBQ0tHUk9VTkRfVElNRU9VVCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKG5leHRUaW1lICsgbUFtLm1Db25zdGFudHMuU0VSVklDRV9USU1FT1VUKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRUaW1lICsgbUFtLm1Db25zdGFudHMuU0VSVklDRV9CQUNLR1JPVU5EX1RJTUVPVVQpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTY3MzIsNyArNjczOSw3IEBACiAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5TRVJWSUNFX1RJTUVPVVRfTVNHKTsKICAgICAgICAgbXNnLm9iaiA9IHByb2M7CiAgICAgICAgIG1BbS5tSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBwcm9jLm1TZXJ2aWNlcy5zaG91bGRFeGVjU2VydmljZXNGZygpCi0gICAgICAgICAgICAgICAgPyBTRVJWSUNFX1RJTUVPVVQgOiBTRVJWSUNFX0JBQ0tHUk9VTkRfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgPyBtQW0ubUNvbnN0YW50cy5TRVJWSUNFX1RJTUVPVVQgOiBtQW0ubUNvbnN0YW50cy5TRVJWSUNFX0JBQ0tHUk9VTkRfVElNRU9VVCk7CiAgICAgfQogCiAgICAgdm9pZCBzY2hlZHVsZVNlcnZpY2VGb3JlZ3JvdW5kVHJhbnNpdGlvblRpbWVvdXRMb2NrZWQoU2VydmljZVJlY29yZCByKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckNvbnN0YW50cy5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJDb25zdGFudHMuamF2YQppbmRleCA1Njk2MDA0Li40ZmEyOGExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlckNvbnN0YW50cy5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyQ29uc3RhbnRzLmphdmEKQEAgLTI0OCw3ICsyNDgsMTYgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9TRVJWSUNFX0JJTkRfQUxNT1NUX1BFUkNFUFRJQkxFX1RJTUVPVVRfTVMgPSAxNSAqIDEwMDA7CiAKLSAgICAvLyBGbGFnIHN0b3JlZCBpbiB0aGUgRGV2aWNlQ29uZmlnIEFQSS4KKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZhbHVlIHRvIHtAbGluayAjU0VSVklDRV9USU1FT1VUfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfU0VSVklDRV9USU1FT1VUID0gMjAgKiAxMDAwICogQnVpbGQuSFdfVElNRU9VVF9NVUxUSVBMSUVSOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2YWx1ZSB0byB7QGxpbmsgI1NFUlZJQ0VfQkFDS0dST1VORF9USU1FT1VUfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfU0VSVklDRV9CQUNLR1JPVU5EX1RJTUVPVVQgPSBERUZBVUxUX1NFUlZJQ0VfVElNRU9VVCAqIDEwOworCiAgICAgLyoqCiAgICAgICogTWF4aW11bSBudW1iZXIgb2YgY2FjaGVkIHByb2Nlc3Nlcy4KICAgICAgKi8KQEAgLTUwNiw2ICs1MTUsMTIgQEAKICAgICAvLyB0byByZXN0YXJ0IGxlc3MgdGhhbiB0aGlzIGFtb3VudCBvZiB0aW1lIGZyb20gdGhlIGxhc3Qgb25lLgogICAgIHB1YmxpYyBsb25nIFNFUlZJQ0VfTUlOX1JFU1RBUlRfVElNRV9CRVRXRUVOID0gREVGQVVMVF9TRVJWSUNFX01JTl9SRVNUQVJUX1RJTUVfQkVUV0VFTjsKIAorICAgIC8vIEhvdyBsb25nIHdlIHdhaXQgZm9yIGEgc2VydmljZSB0byBmaW5pc2ggZXhlY3V0aW5nLgorICAgIGxvbmcgU0VSVklDRV9USU1FT1VUID0gREVGQVVMVF9TRVJWSUNFX1RJTUVPVVQ7CisKKyAgICAvLyBIb3cgbG9uZyB3ZSB3YWl0IGZvciBhIHNlcnZpY2UgdG8gZmluaXNoIGV4ZWN1dGluZy4KKyAgICBsb25nIFNFUlZJQ0VfQkFDS0dST1VORF9USU1FT1VUID0gREVGQVVMVF9TRVJWSUNFX0JBQ0tHUk9VTkRfVElNRU9VVDsKKwogICAgIC8vIE1heGltdW0gYW1vdW50IG9mIHRpbWUgZm9yIHRoZXJlIHRvIGJlIG5vIGFjdGl2aXR5IG9uIGEgc2VydmljZSBiZWZvcmUKICAgICAvLyB3ZSBjb25zaWRlciBpdCBub24tZXNzZW50aWFsIGFuZCBhbGxvdyBpdHMgcHJvY2VzcyB0byBnbyBvbiB0aGUKICAgICAvLyBMUlUgYmFja2dyb3VuZCBsaXN0LgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBjNzRhYTdmLi5iNGU3NWUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtOTM1MSw3ICs5MzUxLDkgQEAKIAogICAgICAgICAgICAgICAgIFN0cmluZyBsb2djYXRTZXR0aW5nID0gU2V0dGluZ3MuR2xvYmFsLkVSUk9SX0xPR0NBVF9QUkVGSVggKyBkcm9wYm94VGFnOwogICAgICAgICAgICAgICAgIFN0cmluZyBtYXhCeXRlc1NldHRpbmcgPSBTZXR0aW5ncy5HbG9iYWwuTUFYX0VSUk9SX0JZVEVTX1BSRUZJWCArIGRyb3Bib3hUYWc7Ci0gICAgICAgICAgICAgICAgaW50IGxpbmVzID0gU2V0dGluZ3MuR2xvYmFsLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgbG9nY2F0U2V0dGluZywgMCk7CisgICAgICAgICAgICAgICAgaW50IGxpbmVzID0gQnVpbGQuSVNfVVNFUgorICAgICAgICAgICAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICA6IFNldHRpbmdzLkdsb2JhbC5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIGxvZ2NhdFNldHRpbmcsIDApOwogICAgICAgICAgICAgICAgIGludCBkcm9wYm94TWF4U2l6ZSA9IFNldHRpbmdzLkdsb2JhbC5nZXRJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgbWF4Qnl0ZXNTZXR0aW5nLCBEUk9QQk9YX0RFRkFVTFRfTUFYX1NJWkUpOwogICAgICAgICAgICAgICAgIGludCBtYXhEYXRhRmlsZVNpemUgPSBkcm9wYm94TWF4U2l6ZSAtIHNiLmxlbmd0aCgpCkBAIC0xNDUwNywxOCArMTQ1MDksNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gcmVzdWx0VG8gYnJvYWRjYXN0cyBhcmUgYWx3YXlzIGluZmluaXRlbHkgZGVmZXJyYWJsZS4KLSAgICAgICAgaWYgKChyZXN1bHRUbyAhPSBudWxsKSAmJiAhb3JkZXJlZCAmJiBtRW5hYmxlTW9kZXJuUXVldWUpIHsKLSAgICAgICAgICAgIGlmIChick9wdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJyT3B0aW9ucyA9IEJyb2FkY2FzdE9wdGlvbnMubWFrZUJhc2ljKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBick9wdGlvbnMuc2V0RGVmZXJVbnRpbEFjdGl2ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRW5hYmxlTW9kZXJuUXVldWUgJiYgb3JkZXJlZCAmJiBick9wdGlvbnMgIT0gbnVsbCAmJiBick9wdGlvbnMuaXNEZWZlclVudGlsQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9yZGVyZWQgYnJvYWRjYXN0cyBjYW4ndCBiZSBkZWZlcnJlZCB1bnRpbCBhY3RpdmUiKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHByb3RlY3RlZCBicm9hZGNhc3RzIGFyZSBvbmx5IGJlaW5nIHNlbnQgYnkgc3lzdGVtIGNvZGUsCiAgICAgICAgIC8vIGFuZCB0aGF0IHN5c3RlbSBjb2RlIGlzIG9ubHkgc2VuZGluZyBwcm90ZWN0ZWQgYnJvYWRjYXN0cy4KICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1Byb3RlY3RlZEJyb2FkY2FzdDsKQEAgLTE5NzI5LDggKzE5NzE5LDkgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50aXR5ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVySW1wbC5hcHBseShjb2RlLCBuZXcgQXR0cmlidXRpb25Tb3VyY2Uoc2hlbGxVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNoZWxsIiwgYXR0cmlidXRpb25Tb3VyY2UuZ2V0QXR0cmlidXRpb25UYWcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZS5nZXRUb2tlbigpLCBhdHRyaWJ1dGlvblNvdXJjZS5nZXROZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MuSU5WQUxJRF9QSUQsICJjb20uYW5kcm9pZC5zaGVsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UuZ2V0QXR0cmlidXRpb25UYWcoKSwgYXR0cmlidXRpb25Tb3VyY2UuZ2V0VG9rZW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbm91bmNlZFBlcm1pc3Npb25zKi8gbnVsbCwgYXR0cmlidXRpb25Tb3VyY2UuZ2V0TmV4dCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRDb2xsZWN0QXN5bmNOb3RlZE9wLCBtZXNzYWdlLCBzaG91bGRDb2xsZWN0TWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lQcm94eU9wZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKQEAgLTE5NzgxLDggKzE5NzcyLDkgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50aXR5ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVySW1wbC5hcHBseShjbGllbnRJZCwgY29kZSwgbmV3IEF0dHJpYnV0aW9uU291cmNlKHNoZWxsVWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zaGVsbCIsIGF0dHJpYnV0aW9uU291cmNlLmdldEF0dHJpYnV0aW9uVGFnKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UuZ2V0VG9rZW4oKSwgYXR0cmlidXRpb25Tb3VyY2UuZ2V0TmV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzLklOVkFMSURfUElELCAiY29tLmFuZHJvaWQuc2hlbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlLmdldEF0dHJpYnV0aW9uVGFnKCksIGF0dHJpYnV0aW9uU291cmNlLmdldFRva2VuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyZW5vdW5jZWRQZXJtaXNzaW9ucyovIG51bGwsIGF0dHJpYnV0aW9uU291cmNlLmdldE5leHQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJZk1vZGVEZWZhdWx0LCBzaG91bGRDb2xsZWN0QXN5bmNOb3RlZE9wLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZENvbGxlY3RNZXNzYWdlLCBza2lwUHJveHlPcGVyYXRpb24sIHByb3h5QXR0cmlidXRpb25GbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94aWVkQXR0cmlidXRpb25GbGFncywgYXR0cmlidXRpb25DaGFpbklkKTsKQEAgLTE5ODA2LDggKzE5Nzk4LDkgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50aXR5ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgc3VwZXJJbXBsLmFwcGx5KGNsaWVudElkLCBjb2RlLCBuZXcgQXR0cmlidXRpb25Tb3VyY2Uoc2hlbGxVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNoZWxsIiwgYXR0cmlidXRpb25Tb3VyY2UuZ2V0QXR0cmlidXRpb25UYWcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZS5nZXRUb2tlbigpLCBhdHRyaWJ1dGlvblNvdXJjZS5nZXROZXh0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MuSU5WQUxJRF9QSUQsICJjb20uYW5kcm9pZC5zaGVsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UuZ2V0QXR0cmlidXRpb25UYWcoKSwgYXR0cmlidXRpb25Tb3VyY2UuZ2V0VG9rZW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbm91bmNlZFBlcm1pc3Npb25zKi8gbnVsbCwgYXR0cmlidXRpb25Tb3VyY2UuZ2V0TmV4dCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwUHJveHlPcGVyYXRpb24pOwogICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQmF0dGVyeVN0YXRzU2VydmljZS5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9CYXR0ZXJ5U3RhdHNTZXJ2aWNlLmphdmEKaW5kZXggZjIzNmE5Ni4uZDA5Y2E1YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9CYXR0ZXJ5U3RhdHNTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9CYXR0ZXJ5U3RhdHNTZXJ2aWNlLmphdmEKQEAgLTMwLDcgKzMwLDYgQEAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uRW5mb3JjZVBlcm1pc3Npb247CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzTm9QZXJtaXNzaW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5TdGF0c01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAudXNhZ2UuTmV0d29ya1N0YXRzTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBY3Rpdml0eUVuZXJneUluZm87CkBAIC00MTQsMTggKzQxMyw2IEBACiAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ291bGQgbm90IHJlZ2lzdGVyIElOZXR3b3JrTWFuYWdlbWVudCBldmVudCBvYnNlcnZlciAiICsgZSk7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBBbGFybU1hbmFnZXIgYW0gPSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFsYXJtTWFuYWdlci5jbGFzcyk7Ci0gICAgICAgIG1IYW5kbGVyLnBvc3QoKCkgLT4gewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3RhdHMpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHMuc2V0TG9uZ1BsdWdJbkFsYXJtSW50ZXJmYWNlKG5ldyBBbGFybUludGVyZmFjZShhbSwgKCkgLT4gewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0cykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0cy5pc09uQmF0dGVyeSgpKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMubWF5YmVSZXNldFdoaWxlUGx1Z2dlZEluTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCiAgICAgICAgIHN5bmNocm9uaXplZCAobVBvd2VyU3RhdHNMb2NrKSB7CiAgICAgICAgICAgICBtUG93ZXJTdGF0c0ludGVybmFsID0gTG9jYWxTZXJ2aWNlcy5nZXRTZXJ2aWNlKFBvd2VyU3RhdHNJbnRlcm5hbC5jbGFzcyk7CiAgICAgICAgICAgICBpZiAobVBvd2VyU3RhdHNJbnRlcm5hbCAhPSBudWxsKSB7CkBAIC0yNTI5LDMyICsyNTE2LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGZpbmFsIGNsYXNzIEFsYXJtSW50ZXJmYWNlIGltcGxlbWVudHMgQmF0dGVyeVN0YXRzSW1wbC5BbGFybUludGVyZmFjZSwKLSAgICAgICAgICAgIEFsYXJtTWFuYWdlci5PbkFsYXJtTGlzdGVuZXIgewotICAgICAgICBwcml2YXRlIEFsYXJtTWFuYWdlciBtQW07Ci0gICAgICAgIHByaXZhdGUgUnVubmFibGUgbU9uQWxhcm07Ci0KLSAgICAgICAgQWxhcm1JbnRlcmZhY2UoQWxhcm1NYW5hZ2VyIGFtLCBSdW5uYWJsZSBvbkFsYXJtKSB7Ci0gICAgICAgICAgICBtQW0gPSBhbTsKLSAgICAgICAgICAgIG1PbkFsYXJtID0gb25BbGFybTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZShsb25nIHJ0Y1RpbWVNcywgbG9uZyB3aW5kb3dMZW5ndGhNcykgewotICAgICAgICAgICAgbUFtLnNldFdpbmRvdyhBbGFybU1hbmFnZXIuUlRDLCBydGNUaW1lTXMsIHdpbmRvd0xlbmd0aE1zLCBUQUcsIHRoaXMsIG1IYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7Ci0gICAgICAgICAgICBtQW0uY2FuY2VsKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQWxhcm0oKSB7Ci0gICAgICAgICAgICBtT25BbGFybS5ydW4oKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlV2FpdFdha2V1cChCeXRlQnVmZmVyIG91dEJ1ZmZlcik7CiAKICAgICBwcml2YXRlIHZvaWQgZHVtcEhlbHAoUHJpbnRXcml0ZXIgcHcpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQnJvYWRjYXN0Q29uc3RhbnRzLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0Jyb2FkY2FzdENvbnN0YW50cy5qYXZhCmluZGV4IDUzZmNkZGYuLjMzZDQwMDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQnJvYWRjYXN0Q29uc3RhbnRzLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Ccm9hZGNhc3RDb25zdGFudHMuamF2YQpAQCAtMjM2LDYgKzIzNiwxNCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9ISVNUT1JZX1NVTU1BUllfU0laRSA9CiAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXIuaXNMb3dSYW1EZXZpY2VTdGF0aWMoKSA/IDI1NiA6IDEwMjQ7CiAKKyAgICAvKioKKyAgICAgKiBGb3Ige0BsaW5rIEJyb2FkY2FzdFJlY29yZH06IERlZmF1bHQgdG8gdHJlYXRpbmcgYWxsIGJyb2FkY2FzdHMgc2VudCBieQorICAgICAqIHRoZSBzeXN0ZW0gYXMgYmUge0BsaW5rIEJyb2FkY2FzdE9wdGlvbnMjREVGRVJSQUxfUE9MSUNZX1VOVElMX0FDVElWRX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gQ09SRV9ERUZFUl9VTlRJTF9BQ1RJVkUgPSBERUZBVUxUX0NPUkVfREVGRVJfVU5USUxfQUNUSVZFOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09SRV9ERUZFUl9VTlRJTF9BQ1RJVkUgPSAiYmNhc3RfY29yZV9kZWZlcl91bnRpbF9hY3RpdmUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9DT1JFX0RFRkVSX1VOVElMX0FDVElWRSA9IGZhbHNlOworCiAgICAgLy8gU2V0dGluZ3Mgb3ZlcnJpZGUgdHJhY2tpbmcgZm9yIHRoaXMgaW5zdGFuY2UKICAgICBwcml2YXRlIFN0cmluZyBtU2V0dGluZ3NLZXk7CiAgICAgcHJpdmF0ZSBTZXR0aW5nc09ic2VydmVyIG1TZXR0aW5nc09ic2VydmVyOwpAQCAtMzczLDcgKzM4MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01BWF9ISVNUT1JZX0NPTVBMRVRFX1NJWkUpOwogICAgICAgICAgICAgTUFYX0hJU1RPUllfU1VNTUFSWV9TSVpFID0gZ2V0RGV2aWNlQ29uZmlnSW50KEtFWV9NQVhfSElTVE9SWV9TVU1NQVJZX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfTUFYX0hJU1RPUllfU1VNTUFSWV9TSVpFKTsKKyAgICAgICAgICAgIENPUkVfREVGRVJfVU5USUxfQUNUSVZFID0gZ2V0RGV2aWNlQ29uZmlnQm9vbGVhbihLRVlfQ09SRV9ERUZFUl9VTlRJTF9BQ1RJVkUsCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQ09SRV9ERUZFUl9VTlRJTF9BQ1RJVkUpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogbWlncmF0ZSBCcm9hZGNhc3RSZWNvcmQgdG8gYWNjZXB0IGEgQnJvYWRjYXN0Q29uc3RhbnRzCisgICAgICAgIEJyb2FkY2FzdFJlY29yZC5DT1JFX0RFRkVSX1VOVElMX0FDVElWRSA9IENPUkVfREVGRVJfVU5USUxfQUNUSVZFOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDE4LDYgKzQzMSw4IEBACiAgICAgICAgICAgICAgICAgICAgIE1BWF9DT05TRUNVVElWRV9VUkdFTlRfRElTUEFUQ0hFUykucHJpbnRsbigpOwogICAgICAgICAgICAgcHcucHJpbnQoS0VZX01BWF9DT05TRUNVVElWRV9OT1JNQUxfRElTUEFUQ0hFUywKICAgICAgICAgICAgICAgICAgICAgTUFYX0NPTlNFQ1VUSVZFX05PUk1BTF9ESVNQQVRDSEVTKS5wcmludGxuKCk7CisgICAgICAgICAgICBwdy5wcmludChLRVlfQ09SRV9ERUZFUl9VTlRJTF9BQ1RJVkUsCisgICAgICAgICAgICAgICAgICAgIENPUkVfREVGRVJfVU5USUxfQUNUSVZFKS5wcmludGxuKCk7CiAgICAgICAgICAgICBwdy5kZWNyZWFzZUluZGVudCgpOwogICAgICAgICAgICAgcHcucHJpbnRsbigpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0Jyb2FkY2FzdFJlY29yZC5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Ccm9hZGNhc3RSZWNvcmQuamF2YQppbmRleCA1OWYzM2RkLi42YmQzYzc5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0Jyb2FkY2FzdFJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQnJvYWRjYXN0UmVjb3JkLmphdmEKQEAgLTkwLDYgKzkwLDcgQEAKICAgICBmaW5hbCBib29sZWFuIHByaW9yaXRpemVkOyAvLyBjb250YWlucyBtb3JlIHRoYW4gb25lIHByaW9yaXR5IHRyYW5jaGUKICAgICBmaW5hbCBib29sZWFuIGRlZmVyVW50aWxBY3RpdmU7IC8vIGluZmluaXRlbHkgZGVmZXJyYWJsZSBicm9hZGNhc3QKICAgICBmaW5hbCBib29sZWFuIHNoYXJlSWRlbnRpdHk7ICAvLyB3aGV0aGVyIHRoZSBicm9hZGNhc3RlcidzIGlkZW50aXR5IHNob3VsZCBiZSBzaGFyZWQKKyAgICBmaW5hbCBib29sZWFuIHVyZ2VudDsgICAgLy8gaGFzIGJlZW4gY2xhc3NpZmllZCBhcyAidXJnZW50IgogICAgIGZpbmFsIGludCB1c2VySWQ7ICAgICAgIC8vIHVzZXIgaWQgdGhpcyBicm9hZGNhc3Qgd2FzIGZvcgogICAgIGZpbmFsIEBOdWxsYWJsZSBTdHJpbmcgcmVzb2x2ZWRUeXBlOyAvLyB0aGUgcmVzb2x2ZWQgZGF0YSB0eXBlCiAgICAgZmluYWwgQE51bGxhYmxlIFN0cmluZ1tdIHJlcXVpcmVkUGVybWlzc2lvbnM7IC8vIHBlcm1pc3Npb25zIHRoZSBjYWxsZXIgaGFzIHJlcXVpcmVkCkBAIC0xNDYsNiArMTQ3LDEzIEBACiAgICAgcHJpdmF0ZSBATnVsbGFibGUgU3RyaW5nIG1DYWNoZWRUb1N0cmluZzsKICAgICBwcml2YXRlIEBOdWxsYWJsZSBTdHJpbmcgbUNhY2hlZFRvU2hvcnRTdHJpbmc7CiAKKyAgICAvKioKKyAgICAgKiBXaGVuIGVuYWJsZWQsIGFzc3VtZSB0aGF0IHtAbGluayBVc2VySGFuZGxlI2lzQ29yZShpbnQpfSBhcHBzIHNob3VsZAorICAgICAqIHRyZWF0IHtAbGluayBCcm9hZGNhc3RPcHRpb25zI0RFRkVSUkFMX1BPTElDWV9ERUZBVUxUfSBhcworICAgICAqIHtAbGluayBCcm9hZGNhc3RPcHRpb25zI0RFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkV9LgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIENPUkVfREVGRVJfVU5USUxfQUNUSVZFID0gZmFsc2U7CisKICAgICAvKiogRW1wdHkgaW1tdXRhYmxlIGxpc3Qgb2YgcmVjZWl2ZXJzICovCiAgICAgc3RhdGljIGZpbmFsIExpc3Q8T2JqZWN0PiBFTVBUWV9SRUNFSVZFUlMgPSBMaXN0Lm9mKCk7CiAKQEAgLTQwMCw3ICs0MDgsOSBAQAogICAgICAgICByZWNlaXZlcnMgPSAoX3JlY2VpdmVycyAhPSBudWxsKSA/IF9yZWNlaXZlcnMgOiBFTVBUWV9SRUNFSVZFUlM7CiAgICAgICAgIGRlbGl2ZXJ5ID0gbmV3IGludFtfcmVjZWl2ZXJzICE9IG51bGwgPyBfcmVjZWl2ZXJzLnNpemUoKSA6IDBdOwogICAgICAgICBkZWxpdmVyeVJlYXNvbnMgPSBuZXcgU3RyaW5nW2RlbGl2ZXJ5Lmxlbmd0aF07Ci0gICAgICAgIGRlZmVyVW50aWxBY3RpdmUgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmlzRGVmZXJVbnRpbEFjdGl2ZSgpIDogZmFsc2U7CisgICAgICAgIHVyZ2VudCA9IGNhbGN1bGF0ZVVyZ2VudChfaW50ZW50LCBfb3B0aW9ucyk7CisgICAgICAgIGRlZmVyVW50aWxBY3RpdmUgPSBjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKF9jYWxsaW5nVWlkLAorICAgICAgICAgICAgICAgIF9vcHRpb25zLCBfcmVzdWx0VG8sIF9zZXJpYWxpemVkLCB1cmdlbnQpOwogICAgICAgICBkZWZlcnJlZFVudGlsQWN0aXZlID0gbmV3IGJvb2xlYW5bZGVmZXJVbnRpbEFjdGl2ZSA/IGRlbGl2ZXJ5Lmxlbmd0aCA6IDBdOwogICAgICAgICBibG9ja2VkVW50aWxUZXJtaW5hbENvdW50ID0gY2FsY3VsYXRlQmxvY2tlZFVudGlsVGVybWluYWxDb3VudChyZWNlaXZlcnMsIF9zZXJpYWxpemVkKTsKICAgICAgICAgc2NoZWR1bGVkVGltZSA9IG5ldyBsb25nW2RlbGl2ZXJ5Lmxlbmd0aF07CkBAIC00ODgsNiArNDk4LDcgQEAKICAgICAgICAgcHVzaE1lc3NhZ2VPdmVyUXVvdGEgPSBmcm9tLnB1c2hNZXNzYWdlT3ZlclF1b3RhOwogICAgICAgICBpbnRlcmFjdGl2ZSA9IGZyb20uaW50ZXJhY3RpdmU7CiAgICAgICAgIHNoYXJlSWRlbnRpdHkgPSBmcm9tLnNoYXJlSWRlbnRpdHk7CisgICAgICAgIHVyZ2VudCA9IGZyb20udXJnZW50OwogICAgICAgICBmaWx0ZXJFeHRyYXNGb3JSZWNlaXZlciA9IGZyb20uZmlsdGVyRXh0cmFzRm9yUmVjZWl2ZXI7CiAgICAgfQogCkBAIC02ODEsMTUgKzY5Miw4IEBACiAgICAgICAgIHJldHVybiBkZWZlclVudGlsQWN0aXZlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIENvcmUgcG9saWN5IGRldGVybWluYXRpb24gYWJvdXQgdGhpcyBicm9hZGNhc3QncyBkZWxpdmVyeSBwcmlvcml0aXphdGlvbgotICAgICAqLwogICAgIGJvb2xlYW4gaXNVcmdlbnQoKSB7Ci0gICAgICAgIC8vIFRPRE86IGZsYWdzIGZvciBjb250cm9sbGluZyBwb2xpY3kKLSAgICAgICAgLy8gVE9ETzogbWlncmF0ZSBhbGFybS1wcmlvcml0aXphdGlvbiBmbGFnIHRvIEJyb2FkY2FzdENvbnN0YW50cwotICAgICAgICByZXR1cm4gKGlzRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgfHwgaW50ZXJhY3RpdmUKLSAgICAgICAgICAgICAgICB8fCBhbGFybSk7CisgICAgICAgIHJldHVybiB1cmdlbnQ7CiAgICAgfQogCiAgICAgQE5vbk51bGwgU3RyaW5nIGdldEhvc3RpbmdSZWNvcmRUcmlnZ2VyVHlwZSgpIHsKQEAgLTg0OSw2ICs4NTMsNjkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvcmUgcG9saWN5IGRldGVybWluYXRpb24gYWJvdXQgdGhpcyBicm9hZGNhc3QncyBkZWxpdmVyeSBwcmlvcml0aXphdGlvbgorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBib29sZWFuIGNhbGN1bGF0ZVVyZ2VudChATm9uTnVsbCBJbnRlbnQgaW50ZW50LCBATnVsbGFibGUgQnJvYWRjYXN0T3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgIC8vIFRPRE86IGZsYWdzIGZvciBjb250cm9sbGluZyBwb2xpY3kKKyAgICAgICAgLy8gVE9ETzogbWlncmF0ZSBhbGFybS1wcmlvcml0aXphdGlvbiBmbGFnIHRvIEJyb2FkY2FzdENvbnN0YW50cworICAgICAgICBpZiAoKGludGVudC5nZXRGbGFncygpICYgSW50ZW50LkZMQUdfUkVDRUlWRVJfRk9SRUdST1VORCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNJbnRlcmFjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3B0aW9ucy5pc0FsYXJtQnJvYWRjYXN0KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSB0aGUgcmVxdWVzdGVkIHtAbGluayBCcm9hZGNhc3RPcHRpb25zI3NldERlZmVycmFsUG9saWN5KGludCl9CisgICAgICogYWdhaW5zdCB0aGlzIGJyb2FkY2FzdCBzdGF0ZSB0byBkZXRlcm1pbmUgaWYgaXQgc2hvdWxkIGJlIG1hcmtlZCBhcworICAgICAqICJkZWZlciB1bnRpbCBhY3RpdmUiLgorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBib29sZWFuIGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoaW50IGNhbGxpbmdVaWQsIEBOdWxsYWJsZSBCcm9hZGNhc3RPcHRpb25zIG9wdGlvbnMsCisgICAgICAgICAgICBATnVsbGFibGUgSUludGVudFJlY2VpdmVyIHJlc3VsdFRvLCBib29sZWFuIG9yZGVyZWQsIGJvb2xlYW4gdXJnZW50KSB7CisgICAgICAgIC8vIE9yZGVyZWQgYnJvYWRjYXN0cyBjYW4gbmV2ZXIgYmUgZGVmZXJyZWQgdW50aWwgYWN0aXZlCisgICAgICAgIGlmIChvcmRlcmVkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBVbm9yZGVyZWQgcmVzdWx0VG8gYnJvYWRjYXN0cyBhcmUgYWx3YXlzIGRlZmVycmVkIHVudGlsIGFjdGl2ZQorICAgICAgICBpZiAoIW9yZGVyZWQgJiYgcmVzdWx0VG8gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXRlcm1pbmUgaWYgYSBzdHJvbmcgcHJlZmVyZW5jZSBpbiBlaXRoZXIgZGlyZWN0aW9uIHdhcyBleHByZXNzZWQ7CisgICAgICAgIC8vIGEgcHJlZmVyZW5jZSBoZXJlIG92ZXJyaWRlcyBhbGwgcmVtYWluaW5nIHBvbGljaWVzCisgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy5nZXREZWZlcnJhbFBvbGljeSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGNhc2UgQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVXJnZW50IGJyb2FkY2FzdHMgYXJlbid0IGRlZmVycmVkIHVudGlsIGFjdGl2ZQorICAgICAgICBpZiAodXJnZW50KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBPdGhlcndpc2UsIGNob29zZSBhIHJlYXNvbmFibGUgZGVmYXVsdAorICAgICAgICBpZiAoQ09SRV9ERUZFUl9VTlRJTF9BQ1RJVkUgJiYgVXNlckhhbmRsZS5pc0NvcmUoY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIEJyb2FkY2FzdFJlY29yZCBtYXliZVN0cmlwRm9ySGlzdG9yeSgpIHsKICAgICAgICAgaWYgKCFpbnRlbnQuY2FuU3RyaXBGb3JIaXN0b3J5KCkpIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db3JlU2V0dGluZ3NPYnNlcnZlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db3JlU2V0dGluZ3NPYnNlcnZlci5qYXZhCmluZGV4IGRkYzllOTEuLjg0NGYxNzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQ29yZVNldHRpbmdzT2JzZXJ2ZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0NvcmVTZXR0aW5nc09ic2VydmVyLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkRldmljZUNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0RmxhZ3M7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuV2lkZ2V0RmxhZ3M7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwpAQCAtMTYyLDYgKzE2MywxMSBAQAogICAgICAgICAgICAgICAgIERldmljZUNvbmZpZy5OQU1FU1BBQ0VfV0lER0VULCBXaWRnZXRGbGFncy5NQUdOSUZJRVJfQVNQRUNUX1JBVElPLAogICAgICAgICAgICAgICAgIFdpZGdldEZsYWdzLktFWV9NQUdOSUZJRVJfQVNQRUNUX1JBVElPLCBmbG9hdC5jbGFzcywKICAgICAgICAgICAgICAgICBXaWRnZXRGbGFncy5NQUdOSUZJRVJfQVNQRUNUX1JBVElPX0RFRkFVTFQpKTsKKworICAgICAgICBzRGV2aWNlQ29uZmlnRW50cmllcy5hZGQobmV3IERldmljZUNvbmZpZ0VudHJ5PEJvb2xlYW4+KAorICAgICAgICAgICAgICAgIFRleHRGbGFncy5OQU1FU1BBQ0UsIFRleHRGbGFncy5FTkFCTEVfTkVXX0NPTlRFWFRfTUVOVSwKKyAgICAgICAgICAgICAgICBUZXh0RmxhZ3MuS0VZX0VOQUJMRV9ORVdfQ09OVEVYVF9NRU5VLCBib29sZWFuLmNsYXNzLAorICAgICAgICAgICAgICAgIFRleHRGbGFncy5FTkFCTEVfTkVXX0NPTlRFWFRfTUVOVV9ERUZBVUxUKSk7CiAgICAgICAgIC8vIGFkZCBvdGhlciBkZXZpY2UgY29uZmlncyBoZXJlLi4uCiAgICAgfQogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gc0RldmljZUNvbmZpZ0NvbnRleHRFbnRyaWVzTG9hZGVkID0gZmFsc2U7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Byb2Nlc3NTdGF0c1NlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vUHJvY2Vzc1N0YXRzU2VydmljZS5qYXZhCmluZGV4IGJhYzkyNTMuLjhlOTNjMWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vUHJvY2Vzc1N0YXRzU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vUHJvY2Vzc1N0YXRzU2VydmljZS5qYXZhCkBAIC02OSw3ICs2OSw3IEBACiAgICAgLy8gZGVmaW5lIHRoZSBlbmNvZGluZyBvZiB0aGF0IGRhdGEgaW4gYW4gaW50ZWdlci4KIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hJU1RPUklDX1NUQVRFUyA9IDg7ICAgLy8gTWF4aW11bSBudW1iZXIgb2YgaGlzdG9yaWMgc3RhdGVzIHdlIHdpbGwga2VlcC4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0ZJTEVfUFJFRklYID0gInN0YXRlLSI7IC8vIFByZWZpeCB0byB1c2UgZm9yIHN0YXRlIGZpbGVuYW1lcy4KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0ZJTEVfUFJFRklYID0gInN0YXRlLXYyLSI7IC8vIFByZWZpeCB0byB1c2UgZm9yIHN0YXRlIGZpbGVuYW1lcy4KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0ZJTEVfU1VGRklYID0gIi5iaW4iOyAvLyBTdWZmaXggdG8gdXNlIGZvciBzdGF0ZSBmaWxlbmFtZXMuCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9GSUxFX0NIRUNLSU5fU1VGRklYID0gIi5jaSI7IC8vIFN0YXRlIGZpbGVzIHRoYXQgaGF2ZSBjaGVja2VkIGluLgogICAgIHN0YXRpYyBsb25nIFdSSVRFX1BFUklPRCA9IDMwKjYwKjEwMDA7ICAgICAgLy8gV3JpdGUgZmlsZSBldmVyeSAzMCBtaW51dGVzIG9yIHNvLgpAQCAtNDYyLDYgKzQ2MiwxMCBAQAogICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZXNbaV07CiAgICAgICAgICAgICBTdHJpbmcgZmlsZVN0ciA9IGZpbGUuZ2V0UGF0aCgpOwogICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiQ29sbGVjdGluZzogIiArIGZpbGVTdHIpOworICAgICAgICAgICAgaWYgKCFmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKFNUQVRFX0ZJTEVfUFJFRklYKSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIlNraXBwaW5nOiBtaXNtYXRjaGluZyBwcmVmaXgiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghaW5jbENoZWNrZWRJbiAmJiBmaWxlU3RyLmVuZHNXaXRoKFNUQVRFX0ZJTEVfQ0hFQ0tJTl9TVUZGSVgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiU2tpcHBpbmc6IGFscmVhZHkgY2hlY2tlZCBpbiIpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNDc4LDYgKzQ4MiwxNCBAQAogCiAgICAgQEd1YXJkZWRCeSgibUZpbGVMb2NrIikKICAgICBwcml2YXRlIHZvaWQgdHJpbUhpc3RvcmljU3RhdGVzV3JpdGVMRigpIHsKKyAgICAgICAgRmlsZVtdIGZpbGVzID0gbUJhc2VEaXIubGlzdEZpbGVzKCk7CisgICAgICAgIGlmIChmaWxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmaWxlc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aChTVEFURV9GSUxFX1BSRUZJWCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZXNbaV0uZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGZpbGVzQXJyYXkgPSBnZXRDb21taXR0ZWRGaWxlc0xGKE1BWF9ISVNUT1JJQ19TVEFURVMsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgaWYgKGZpbGVzQXJyYXkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9BdWRpb1NlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYXVkaW8vQXVkaW9TZXJ2aWNlLmphdmEKaW5kZXggNDkwYTMzZS4uM2U4NmM0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9BdWRpb1NlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2F1ZGlvL0F1ZGlvU2VydmljZS5qYXZhCkBAIC0xMzcyLDggKzEzNzIsOCBAQAogICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQ09ORklHVVJBVElPTl9DSEFOR0VEKTsKICAgICAgICAgaWYgKG1Nb25pdG9yUm90YXRpb24pIHsKICAgICAgICAgICAgIFJvdGF0aW9uSGVscGVyLmluaXQobUNvbnRleHQsIG1BdWRpb0hhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uUGFyYW0gLT4gb25Sb3RhdGlvblVwZGF0ZShyb3RhdGlvblBhcmFtKSwKLSAgICAgICAgICAgICAgICAgICAgZm9sZFBhcmFtIC0+IG9uRm9sZFVwZGF0ZShmb2xkUGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gLT4gb25Sb3RhdGlvblVwZGF0ZShyb3RhdGlvbiksCisgICAgICAgICAgICAgICAgICAgIGZvbGRTdGF0ZSAtPiBvbkZvbGRTdGF0ZVVwZGF0ZShmb2xkU3RhdGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oQXVkaW9FZmZlY3QuQUNUSU9OX09QRU5fQVVESU9fRUZGRUNUX0NPTlRST0xfU0VTU0lPTik7CkBAIC0xNTE1LDE2ICsxNTE1LDIwIEBACiAKICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gcm90YXRpb24vZm9sZCB1cGRhdGVzIGNvbWluZyBmcm9tIFJvdGF0aW9uSGVscGVyCi0gICAgdm9pZCBvblJvdGF0aW9uVXBkYXRlKFN0cmluZyByb3RhdGlvblBhcmFtZXRlcikgeworICAgIHZvaWQgb25Sb3RhdGlvblVwZGF0ZShJbnRlZ2VyIHJvdGF0aW9uKSB7CisgICAgICAgIG1TcGF0aWFsaXplckhlbHBlci5zZXREaXNwbGF5T3JpZW50YXRpb24oKGZsb2F0KSAocm90YXRpb24gKiBNYXRoLlBJIC8gMTgwLikpOwogICAgICAgICAvLyB1c2UgUkVQTEFDRSBhcyBvbmx5IHRoZSBsYXN0IHJvdGF0aW9uIG1hdHRlcnMKKyAgICAgICAgZmluYWwgU3RyaW5nIHJvdGF0aW9uUGFyYW1ldGVyID0gInJvdGF0aW9uPSIgKyByb3RhdGlvbjsKICAgICAgICAgc2VuZE1zZyhtQXVkaW9IYW5kbGVyLCBNU0dfUk9UQVRJT05fVVBEQVRFLCBTRU5ETVNHX1JFUExBQ0UsIC8qYXJnMSovIDAsIC8qYXJnMiovIDAsCiAgICAgICAgICAgICAgICAgLypvYmoqLyByb3RhdGlvblBhcmFtZXRlciwgLypkZWxheSovIDApOwogICAgIH0KIAotICAgIHZvaWQgb25Gb2xkVXBkYXRlKFN0cmluZyBmb2xkUGFyYW1ldGVyKSB7CisgICAgdm9pZCBvbkZvbGRTdGF0ZVVwZGF0ZShCb29sZWFuIGZvbGRTdGF0ZSkgeworICAgICAgICBtU3BhdGlhbGl6ZXJIZWxwZXIuc2V0Rm9sZFN0YXRlKGZvbGRTdGF0ZSk7CiAgICAgICAgIC8vIHVzZSBSRVBMQUNFIGFzIG9ubHkgdGhlIGxhc3QgZm9sZCBzdGF0ZSBtYXR0ZXJzCisgICAgICAgIGZpbmFsIFN0cmluZyBmb2xkU3RhdGVQYXJhbWV0ZXIgPSAiZGV2aWNlX2ZvbGRlZD0iICsgKGZvbGRTdGF0ZSA/ICJvbiIgOiAib2ZmIik7CiAgICAgICAgIHNlbmRNc2cobUF1ZGlvSGFuZGxlciwgTVNHX0ZPTERfVVBEQVRFLCBTRU5ETVNHX1JFUExBQ0UsIC8qYXJnMSovIDAsIC8qYXJnMiovIDAsCi0gICAgICAgICAgICAgICAgLypvYmoqLyBmb2xkUGFyYW1ldGVyLCAvKmRlbGF5Ki8gMCk7CisgICAgICAgICAgICAgICAgLypvYmoqLyBmb2xkU3RhdGVQYXJhbWV0ZXIsIC8qZGVsYXkqLyAwKTsKICAgICB9CiAKICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNzQwLDYgKzE3NDQsOSBAQAogICAgICAgICBtU3BhdGlhbGl6ZXJIZWxwZXIucmVzZXQoLyogZmVhdHVyZUVuYWJsZWQgKi8gbUhhc1NwYXRpYWxpemVyRWZmZWN0KTsKICAgICAgICAgbVNvdW5kRG9zZUhlbHBlci5yZXNldCgpOwogCisgICAgICAgIC8vIFJlc3RvcmUgcm90YXRpb24gaW5mb3JtYXRpb24uCisgICAgICAgIFJvdGF0aW9uSGVscGVyLmZvcmNlVXBkYXRlKCk7CisKICAgICAgICAgb25JbmRpY2F0ZVN5c3RlbVJlYWR5KCk7CiAgICAgICAgIC8vIGluZGljYXRlIHRoZSBlbmQgb2YgcmVjb25maWd1cmF0aW9uIHBoYXNlIHRvIGF1ZGlvIEhBTAogICAgICAgICBBdWRpb1N5c3RlbS5zZXRQYXJhbWV0ZXJzKCJyZXN0YXJ0aW5nPWZhbHNlIik7CkBAIC04MTcwLDcgKzgxNzcsNyBAQAogICAgICAgICAgICAgdm9sdW1lQ2hhbmdlZE9wdGlvbnMuc2V0RGVsaXZlcnlHcm91cFBvbGljeShERUxJVkVSWV9HUk9VUF9QT0xJQ1lfTU9TVF9SRUNFTlQpOwogICAgICAgICAgICAgdm9sdW1lQ2hhbmdlZE9wdGlvbnMuc2V0RGVsaXZlcnlHcm91cE1hdGNoaW5nS2V5KAogICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuVk9MVU1FX0NIQU5HRURfQUNUSU9OLCBTdHJpbmcudmFsdWVPZihtU3RyZWFtVHlwZSkpOwotICAgICAgICAgICAgdm9sdW1lQ2hhbmdlZE9wdGlvbnMuc2V0RGVmZXJVbnRpbEFjdGl2ZSh0cnVlKTsKKyAgICAgICAgICAgIHZvbHVtZUNoYW5nZWRPcHRpb25zLnNldERlZmVycmFsUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVGRVJSQUxfUE9MSUNZX1VOVElMX0FDVElWRSk7CiAgICAgICAgICAgICBtVm9sdW1lQ2hhbmdlZE9wdGlvbnMgPSB2b2x1bWVDaGFuZ2VkT3B0aW9ucy50b0J1bmRsZSgpOwogCiAgICAgICAgICAgICBtU3RyZWFtRGV2aWNlc0NoYW5nZWQgPSBuZXcgSW50ZW50KEF1ZGlvTWFuYWdlci5TVFJFQU1fREVWSUNFU19DSEFOR0VEX0FDVElPTik7CkBAIC04MTc5LDcgKzgxODYsOCBAQAogICAgICAgICAgICAgc3RyZWFtRGV2aWNlc0NoYW5nZWRPcHRpb25zLnNldERlbGl2ZXJ5R3JvdXBQb2xpY3koREVMSVZFUllfR1JPVVBfUE9MSUNZX01PU1RfUkVDRU5UKTsKICAgICAgICAgICAgIHN0cmVhbURldmljZXNDaGFuZ2VkT3B0aW9ucy5zZXREZWxpdmVyeUdyb3VwTWF0Y2hpbmdLZXkoCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5TVFJFQU1fREVWSUNFU19DSEFOR0VEX0FDVElPTiwgU3RyaW5nLnZhbHVlT2YobVN0cmVhbVR5cGUpKTsKLSAgICAgICAgICAgIHN0cmVhbURldmljZXNDaGFuZ2VkT3B0aW9ucy5zZXREZWZlclVudGlsQWN0aXZlKHRydWUpOworICAgICAgICAgICAgc3RyZWFtRGV2aWNlc0NoYW5nZWRPcHRpb25zLnNldERlZmVycmFsUG9saWN5KAorICAgICAgICAgICAgICAgICAgICBCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUpOwogICAgICAgICAgICAgbVN0cmVhbURldmljZXNDaGFuZ2VkT3B0aW9ucyA9IHN0cmVhbURldmljZXNDaGFuZ2VkT3B0aW9ucy50b0J1bmRsZSgpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYXVkaW8vUm90YXRpb25IZWxwZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYXVkaW8vUm90YXRpb25IZWxwZXIuamF2YQppbmRleCA1Y2RmNThiLi4zOTRlNGFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2F1ZGlvL1JvdGF0aW9uSGVscGVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9Sb3RhdGlvbkhlbHBlci5qYXZhCkBAIC01NSwxNCArNTUsMTQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBBdWRpb0Rpc3BsYXlMaXN0ZW5lciBzRGlzcGxheUxpc3RlbmVyOwogICAgIHByaXZhdGUgc3RhdGljIEZvbGRTdGF0ZUxpc3RlbmVyIHNGb2xkU3RhdGVMaXN0ZW5lcjsKICAgICAvKiogY2FsbGJhY2sgdG8gc2VuZCByb3RhdGlvbiB1cGRhdGVzIHRvIEF1ZGlvU3lzdGVtICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29uc3VtZXI8U3RyaW5nPiBzUm90YXRpb25VcGRhdGVDYjsKKyAgICBwcml2YXRlIHN0YXRpYyBDb25zdW1lcjxJbnRlZ2VyPiBzUm90YXRpb25DYWxsYmFjazsKICAgICAvKiogY2FsbGJhY2sgdG8gc2VuZCBmb2xkZWQgc3RhdGUgdXBkYXRlcyB0byBBdWRpb1N5c3RlbSAqLwotICAgIHByaXZhdGUgc3RhdGljIENvbnN1bWVyPFN0cmluZz4gc0ZvbGRVcGRhdGVDYjsKKyAgICBwcml2YXRlIHN0YXRpYyBDb25zdW1lcjxCb29sZWFuPiBzRm9sZFN0YXRlQ2FsbGJhY2s7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc1JvdGF0aW9uTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc0ZvbGRTdGF0ZUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNEZXZpY2VSb3RhdGlvbiA9IFN1cmZhY2UuUk9UQVRJT05fMDsgLy8gUi9XIHN5bmNocm9uaXplZCBvbiBzUm90YXRpb25Mb2NrCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzRGV2aWNlRm9sZCA9IHRydWU7IC8vIFIvVyBzeW5jaHJvbml6ZWQgb24gc0ZvbGRTdGF0ZUxvY2sKKyAgICBwcml2YXRlIHN0YXRpYyBJbnRlZ2VyIHNSb3RhdGlvbiA9IG51bGw7IC8vIFIvVyBzeW5jaHJvbml6ZWQgb24gc1JvdGF0aW9uTG9jaworICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gc0ZvbGRTdGF0ZSA9IG51bGw7IC8vIFIvVyBzeW5jaHJvbml6ZWQgb24gc0ZvbGRTdGF0ZUxvY2sKIAogICAgIHByaXZhdGUgc3RhdGljIENvbnRleHQgc0NvbnRleHQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgSGFuZGxlciBzSGFuZGxlcjsKQEAgLTczLDE1ICs3MywxNSBAQAogICAgICAqIC0gc0NvbnRleHQgIT0gbnVsbAogICAgICAqLwogICAgIHN0YXRpYyB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIsCi0gICAgICAgICAgICBDb25zdW1lcjxTdHJpbmc+IHJvdGF0aW9uVXBkYXRlQ2IsIENvbnN1bWVyPFN0cmluZz4gZm9sZFVwZGF0ZUNiKSB7CisgICAgICAgICAgICBDb25zdW1lcjxJbnRlZ2VyPiByb3RhdGlvbkNhbGxiYWNrLCBDb25zdW1lcjxCb29sZWFuPiBmb2xkU3RhdGVDYWxsYmFjaykgewogICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG51bGwgY29udGV4dCIpOwogICAgICAgICB9CiAgICAgICAgIHNDb250ZXh0ID0gY29udGV4dDsKICAgICAgICAgc0hhbmRsZXIgPSBoYW5kbGVyOwogICAgICAgICBzRGlzcGxheUxpc3RlbmVyID0gbmV3IEF1ZGlvRGlzcGxheUxpc3RlbmVyKCk7Ci0gICAgICAgIHNSb3RhdGlvblVwZGF0ZUNiID0gcm90YXRpb25VcGRhdGVDYjsKLSAgICAgICAgc0ZvbGRVcGRhdGVDYiA9IGZvbGRVcGRhdGVDYjsKKyAgICAgICAgc1JvdGF0aW9uQ2FsbGJhY2sgPSByb3RhdGlvbkNhbGxiYWNrOworICAgICAgICBzRm9sZFN0YXRlQ2FsbGJhY2sgPSBmb2xkU3RhdGVDYWxsYmFjazsKICAgICAgICAgZW5hYmxlKCk7CiAgICAgfQogCkBAIC0xMTIsOSArMTEyLDkgQEAKICAgICAgICAgaW50IG5ld1JvdGF0aW9uID0gRGlzcGxheU1hbmFnZXJHbG9iYWwuZ2V0SW5zdGFuY2UoKQogICAgICAgICAgICAgICAgIC5nZXREaXNwbGF5SW5mbyhEaXNwbGF5LkRFRkFVTFRfRElTUExBWSkucm90YXRpb247CiAgICAgICAgIHN5bmNocm9uaXplZChzUm90YXRpb25Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobmV3Um90YXRpb24gIT0gc0RldmljZVJvdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgc0RldmljZVJvdGF0aW9uID0gbmV3Um90YXRpb247Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdGF0aW9uKHNEZXZpY2VSb3RhdGlvbik7CisgICAgICAgICAgICBpZiAoc1JvdGF0aW9uID09IG51bGwgfHwgc1JvdGF0aW9uICE9IG5ld1JvdGF0aW9uKSB7CisgICAgICAgICAgICAgICAgc1JvdGF0aW9uID0gbmV3Um90YXRpb247CisgICAgICAgICAgICAgICAgcHVibGlzaFJvdGF0aW9uKHNSb3RhdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjMsNDMgKzEyMyw1MiBAQAogICAgICAgICBpZiAoREVCVUdfUk9UQVRJT04pIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgInB1Ymxpc2hpbmcgZGV2aWNlIHJvdGF0aW9uID0iICsgcm90YXRpb24gKyAiICh4OTBkZWcpIik7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHJvdGF0aW9uUGFyYW07CisgICAgICAgIGludCByb3RhdGlvbkRlZ3JlZXM7CiAgICAgICAgIHN3aXRjaCAocm90YXRpb24pIHsKICAgICAgICAgICAgIGNhc2UgU3VyZmFjZS5ST1RBVElPTl8wOgotICAgICAgICAgICAgICAgIHJvdGF0aW9uUGFyYW0gPSAicm90YXRpb249MCI7CisgICAgICAgICAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU3VyZmFjZS5ST1RBVElPTl85MDoKLSAgICAgICAgICAgICAgICByb3RhdGlvblBhcmFtID0gInJvdGF0aW9uPTkwIjsKKyAgICAgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSA5MDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU3VyZmFjZS5ST1RBVElPTl8xODA6Ci0gICAgICAgICAgICAgICAgcm90YXRpb25QYXJhbSA9ICJyb3RhdGlvbj0xODAiOworICAgICAgICAgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDE4MDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU3VyZmFjZS5ST1RBVElPTl8yNzA6Ci0gICAgICAgICAgICAgICAgcm90YXRpb25QYXJhbSA9ICJyb3RhdGlvbj0yNzAiOworICAgICAgICAgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDI3MDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5rbm93biBkZXZpY2Ugcm90YXRpb24iKTsKLSAgICAgICAgICAgICAgICByb3RhdGlvblBhcmFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAtMTsKICAgICAgICAgfQotICAgICAgICBpZiAocm90YXRpb25QYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzUm90YXRpb25VcGRhdGVDYi5hY2NlcHQocm90YXRpb25QYXJhbSk7CisgICAgICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgIT0gLTEpIHsKKyAgICAgICAgICAgIHNSb3RhdGlvbkNhbGxiYWNrLmFjY2VwdChyb3RhdGlvbkRlZ3JlZXMpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogcHVibGlzaCB0aGUgY2hhbmdlIG9mIGRldmljZSBmb2xkZWQgc3RhdGUgaWYgYW55LgogICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHVwZGF0ZUZvbGRTdGF0ZShib29sZWFuIG5ld0ZvbGRlZCkgeworICAgIHN0YXRpYyB2b2lkIHVwZGF0ZUZvbGRTdGF0ZShib29sZWFuIGZvbGRTdGF0ZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHNGb2xkU3RhdGVMb2NrKSB7Ci0gICAgICAgICAgICBpZiAoc0RldmljZUZvbGQgIT0gbmV3Rm9sZGVkKSB7Ci0gICAgICAgICAgICAgICAgc0RldmljZUZvbGQgPSBuZXdGb2xkZWQ7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvbGRQYXJhbTsKLSAgICAgICAgICAgICAgICBpZiAobmV3Rm9sZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvbGRQYXJhbSA9ICJkZXZpY2VfZm9sZGVkPW9uIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb2xkUGFyYW0gPSAiZGV2aWNlX2ZvbGRlZD1vZmYiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzRm9sZFVwZGF0ZUNiLmFjY2VwdChmb2xkUGFyYW0pOworICAgICAgICAgICAgaWYgKHNGb2xkU3RhdGUgPT0gbnVsbCB8fCBzRm9sZFN0YXRlICE9IGZvbGRTdGF0ZSkgeworICAgICAgICAgICAgICAgIHNGb2xkU3RhdGUgPSBmb2xkU3RhdGU7CisgICAgICAgICAgICAgICAgc0ZvbGRTdGF0ZUNhbGxiYWNrLmFjY2VwdChmb2xkU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogIGZvcmNlVXBkYXRlIGlzIGNhbGxlZCB3aGVuIGF1ZGlvc2VydmVyIHJlc3RhcnRzLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGZvcmNlVXBkYXRlKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNSb3RhdGlvbkxvY2spIHsKKyAgICAgICAgICAgIHNSb3RhdGlvbiA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlT3JpZW50YXRpb24oKTsgLy8gV2Ugd2lsbCBnZXQgYXQgbGVhc3Qgb25lIG9yaWVudGF0aW9uIHVwZGF0ZSBub3cuCisgICAgICAgIHN5bmNocm9uaXplZCAoc0ZvbGRTdGF0ZUxvY2spIHsKKyAgICAgICAgICAgIGlmIChzRm9sZFN0YXRlICAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc0ZvbGRTdGF0ZUNhbGxiYWNrLmFjY2VwdChzRm9sZFN0YXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE4NSw0ICsxOTQsNCBAQAogICAgICAgICAgICAgdXBkYXRlT3JpZW50YXRpb24oKTsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2F1ZGlvL1NvdW5kRG9zZUhlbHBlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9Tb3VuZERvc2VIZWxwZXIuamF2YQppbmRleCA2YTk3MjQzLi5jMjQ4MzY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2F1ZGlvL1NvdW5kRG9zZUhlbHBlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYXVkaW8vU291bmREb3NlSGVscGVyLmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLk1hdGhVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKQEAgLTUyLDcgKzUzLDYgQEAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwpAQCAtMTEyLDYgKzExMiw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEdMT0JBTF9USU1FX09GRlNFVF9VTklOSVRJQUxJWkVEID0gLTE7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0FGRV9NRURJQV9WT0xVTUVfVU5JTklUSUFMSVpFRCA9IC0xOworCiAgICAgcHJpdmF0ZSBmaW5hbCBFdmVudExvZ2dlciBtTG9nZ2VyID0gbmV3IEV2ZW50TG9nZ2VyKEF1ZGlvU2VydmljZS5MT0dfTkJfRVZFTlRTX1NPVU5EX0RPU0UsCiAgICAgICAgICAgICAiQ1NEIHVwZGF0ZXMiKTsKIApAQCAtMTMyLDE1ICsxMzQsNiBAQAogICAgIC8vIEZvciBub3cgdXNpbmcgdGhlIHNhbWUgdmFsdWUgZm9yIENTRCBzdXBwb3J0ZWQgZGV2aWNlcwogICAgIHByaXZhdGUgZmxvYXQgbVNhZmVNZWRpYVZvbHVtZURiZnM7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYWZlRGV2aWNlVm9sdW1lSW5mbyB7Ci0gICAgICAgIGludCBtRGV2aWNlVHlwZTsKLSAgICAgICAgaW50IG1TYWZlVm9sdW1lSW5kZXggPSAtMTsKLQotICAgICAgICBTYWZlRGV2aWNlVm9sdW1lSW5mbyhpbnQgZGV2aWNlVHlwZSkgewotICAgICAgICAgICAgbURldmljZVR5cGUgPSBkZXZpY2VUeXBlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogbVNhZmVNZWRpYVZvbHVtZURldmljZXMgbGlzdHMgdGhlIGRldmljZXMgZm9yIHdoaWNoIHNhZmUgbWVkaWEgdm9sdW1lIGlzIGVuZm9yY2VkLgogICAgICAqIENvbnRhaW5zIGEgc2FmZSB2b2x1bWUgaW5kZXggZm9yIGEgZ2l2ZW4gZGV2aWNlIHR5cGUuCkBAIC0xNTIsMjUgKzE0NSw3IEBACiAgICAgICogVGhpcyBsZXZlbCBjb3JyZXNwb25kcyB0byBhIGxvdWRuZXNzIG9mIDg1IGRCIFNQTCBmb3IgdGhlIHdhcm5pbmcgdG8gYmUgZGlzcGxheWVkIHdoZW4KICAgICAgKiB0aGUgaGVhZHNldCBpcyBjb21wbGlhbnQgdG8gRU4gNjA5NTAgd2l0aCBhIG1heCBsb3VkbmVzcyBvZiAxMDBkQiBTUEwuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEludGVnZXIsIFNhZmVEZXZpY2VWb2x1bWVJbmZvPiBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDw+KCkge3sKLSAgICAgICAgICAgICAgICBwdXQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9XSVJFRF9IRUFEU0VULAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNhZmVEZXZpY2VWb2x1bWVJbmZvKEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfV0lSRURfSEVBRFNFVCkpOwotICAgICAgICAgICAgICAgIHB1dChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYWZlRGV2aWNlVm9sdW1lSW5mbyhBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSkpOwotICAgICAgICAgICAgICAgIHB1dChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX1VTQl9IRUFEU0VULAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNhZmVEZXZpY2VWb2x1bWVJbmZvKEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfVVNCX0hFQURTRVQpKTsKLSAgICAgICAgICAgICAgICBwdXQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTEVfSEVBRFNFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYWZlRGV2aWNlVm9sdW1lSW5mbyhBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUKSk7Ci0gICAgICAgICAgICAgICAgcHV0KEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxFX0JST0FEQ0FTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYWZlRGV2aWNlVm9sdW1lSW5mbyhBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1QpKTsKLSAgICAgICAgICAgICAgICBwdXQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9IRUFSSU5HX0FJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYWZlRGV2aWNlVm9sdW1lSW5mbyhBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSk7Ci0gICAgICAgICAgICAgICAgcHV0KEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYWZlRGV2aWNlVm9sdW1lSW5mbyhBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpKTsKLSAgICAgICAgICAgICAgICBwdXQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYWZlRGV2aWNlVm9sdW1lSW5mbyhBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSk7Ci0gICAgICAgICAgICB9fTsKKyAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUludEFycmF5IG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzID0gbmV3IFNwYXJzZUludEFycmF5KCk7CiAKICAgICAvLyBtTXVzaWNBY3RpdmVNcyBpcyB0aGUgY3VtdWxhdGl2ZSB0aW1lIG9mIG11c2ljIGFjdGl2aXR5IHNpbmNlIHNhZmUgdm9sdW1lIHdhcyBkaXNhYmxlZC4KICAgICAvLyBXaGVuIHRoaXMgdGltZSByZWFjaGVzIFVOU0FGRV9WT0xVTUVfTVVTSUNfQUNUSVZFX01TX01BWCwgdGhlIHNhZmUgbWVkaWEgdm9sdW1lIGlzIHJlLWVuYWJsZWQKQEAgLTI5MSw2ICsyNjYsNyBAQAogCiAgICAgICAgIG1FbmFibGVDc2QgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfYXVkaW9fY3NkX2VuYWJsZWRfZGVmYXVsdCk7CiAgICAgICAgIGluaXRDc2QoKTsKKyAgICAgICAgaW5pdFNhZmVWb2x1bWVzKCk7CiAKICAgICAgICAgbVNhZmVNZWRpYVZvbHVtZVN0YXRlID0gbVNldHRpbmdzLmdldEdsb2JhbEludChhdWRpb1NlcnZpY2UuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLkFVRElPX1NBRkVfVk9MVU1FX1NUQVRFLCBTQUZFX01FRElBX1ZPTFVNRV9OT1RfQ09ORklHVVJFRCk7CkBAIC0zMDUsNiArMjgxLDI1IEBACiAgICAgICAgICAgICAgICAgQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKICAgICB9CiAKKyAgICB2b2lkIGluaXRTYWZlVm9sdW1lcygpIHsKKyAgICAgICAgbVNhZmVNZWRpYVZvbHVtZURldmljZXMuYXBwZW5kKEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfV0lSRURfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBTQUZFX01FRElBX1ZPTFVNRV9VTklOSVRJQUxJWkVEKTsKKyAgICAgICAgbVNhZmVNZWRpYVZvbHVtZURldmljZXMuYXBwZW5kKEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FLAorICAgICAgICAgICAgICAgIFNBRkVfTUVESUFfVk9MVU1FX1VOSU5JVElBTElaRUQpOworICAgICAgICBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5hcHBlbmQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9VU0JfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBTQUZFX01FRElBX1ZPTFVNRV9VTklOSVRJQUxJWkVEKTsKKyAgICAgICAgbVNhZmVNZWRpYVZvbHVtZURldmljZXMuYXBwZW5kKEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxFX0hFQURTRVQsCisgICAgICAgICAgICAgICAgU0FGRV9NRURJQV9WT0xVTUVfVU5JTklUSUFMSVpFRCk7CisgICAgICAgIG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmFwcGVuZChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMRV9CUk9BRENBU1QsCisgICAgICAgICAgICAgICAgU0FGRV9NRURJQV9WT0xVTUVfVU5JTklUSUFMSVpFRCk7CisgICAgICAgIG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmFwcGVuZChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0hFQVJJTkdfQUlELAorICAgICAgICAgICAgICAgIFNBRkVfTUVESUFfVk9MVU1FX1VOSU5JVElBTElaRUQpOworICAgICAgICBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5hcHBlbmQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTLAorICAgICAgICAgICAgICAgIFNBRkVfTUVESUFfVk9MVU1FX1VOSU5JVElBTElaRUQpOworICAgICAgICBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5hcHBlbmQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCwKKyAgICAgICAgICAgICAgICBTQUZFX01FRElBX1ZPTFVNRV9VTklOSVRJQUxJWkVEKTsKKyAgICB9CisKICAgICBmbG9hdCBnZXRSczJWYWx1ZSgpIHsKICAgICAgICAgaWYgKCFtRW5hYmxlQ3NkKSB7CiAgICAgICAgICAgICByZXR1cm4gMC5mOwpAQCAtNDM1LDEyICs0MzAsMTIgQEAKICAgICB9CiAKICAgICAvKnBhY2thZ2UqLyBpbnQgc2FmZU1lZGlhVm9sdW1lSW5kZXgoaW50IGRldmljZSkgewotICAgICAgICBmaW5hbCBTYWZlRGV2aWNlVm9sdW1lSW5mbyB2aSA9IG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmdldChkZXZpY2UpOwotICAgICAgICBpZiAodmkgPT0gbnVsbCkgeworICAgICAgICBmaW5hbCBpbnQgdm9sID0gbVNhZmVNZWRpYVZvbHVtZURldmljZXMuZ2V0KGRldmljZSk7CisgICAgICAgIGlmICh2b2wgPT0gU0FGRV9NRURJQV9WT0xVTUVfVU5JTklUSUFMSVpFRCkgewogICAgICAgICAgICAgcmV0dXJuIE1BWF9TVFJFQU1fVk9MVU1FW0F1ZGlvU3lzdGVtLlNUUkVBTV9NVVNJQ107CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gdmkubVNhZmVWb2x1bWVJbmRleDsKKyAgICAgICAgcmV0dXJuIHZvbDsKICAgICB9CiAKICAgICAvKnBhY2thZ2UqLyB2b2lkIHJlc3RvcmVNdXNpY0FjdGl2ZU1zKCkgewpAQCAtNDY1LDE0ICs0NjAsMTUgQEAKICAgICAgICAgQXVkaW9TZXJ2aWNlLlZvbHVtZVN0cmVhbVN0YXRlIHN0cmVhbVN0YXRlID0gbUF1ZGlvU2VydmljZS5nZXRWc3NWb2x1bWVGb3JTdHJlYW0oCiAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW0uU1RSRUFNX01VU0lDKTsKIAotICAgICAgICBmb3IgKFNhZmVEZXZpY2VWb2x1bWVJbmZvIHZpIDogbVNhZmVNZWRpYVZvbHVtZURldmljZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IHN0cmVhbVN0YXRlLmdldEluZGV4KHZpLm1EZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIGludCBzYWZlSW5kZXggPSBzYWZlTWVkaWFWb2x1bWVJbmRleCh2aS5tRGV2aWNlVHlwZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVNhZmVNZWRpYVZvbHVtZURldmljZXMuc2l6ZSgpOyArK2kpICB7CisgICAgICAgICAgICBpbnQgZGV2aWNlVHlwZSA9IG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmtleUF0KGkpOworICAgICAgICAgICAgaW50IGluZGV4ID0gc3RyZWFtU3RhdGUuZ2V0SW5kZXgoZGV2aWNlVHlwZSk7CisgICAgICAgICAgICBpbnQgc2FmZUluZGV4ID0gc2FmZU1lZGlhVm9sdW1lSW5kZXgoZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPiBzYWZlSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1TdGF0ZS5zZXRJbmRleChzYWZlSW5kZXgsIHZpLm1EZXZpY2VUeXBlLCBjYWxsZXIsCisgICAgICAgICAgICAgICAgc3RyZWFtU3RhdGUuc2V0SW5kZXgoc2FmZUluZGV4LCBkZXZpY2VUeXBlLCBjYWxsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qaGFzTW9kaWZ5QXVkaW9TZXR0aW5ncyovKTsKICAgICAgICAgICAgICAgICBtQXVkaW9IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TRVRfREVWSUNFX1ZPTFVNRSwgdmkubURldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9ERVZJQ0VfVk9MVU1FLCBkZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmFyZzI9Ki8wLCBzdHJlYW1TdGF0ZSksIC8qZGVsYXk9Ki8wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDk0LDcgKzQ5MCw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU2FmZU1lZGlhVm9sdW1lX2woaW50IHN0cmVhbVR5cGUsIGludCBpbmRleCwgaW50IGRldmljZSkgewogICAgICAgICByZXR1cm4gKG1TYWZlTWVkaWFWb2x1bWVTdGF0ZSA9PSBTQUZFX01FRElBX1ZPTFVNRV9BQ1RJVkUpCiAgICAgICAgICAgICAgICAgICAgICYmIChBdWRpb1NlcnZpY2UubVN0cmVhbVZvbHVtZUFsaWFzW3N0cmVhbVR5cGVdID09IEF1ZGlvU3lzdGVtLlNUUkVBTV9NVVNJQykKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmNvbnRhaW5zS2V5KGRldmljZSkpCisgICAgICAgICAgICAgICAgICAgICYmIHNhZmVEZXZpY2VzQ29udGFpbnMoZGV2aWNlKQogICAgICAgICAgICAgICAgICAgICAmJiAoaW5kZXggPiBzYWZlTWVkaWFWb2x1bWVJbmRleChkZXZpY2UpKTsKICAgICB9CiAKQEAgLTU0Niw3ICs1NDIsNyBAQAogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TYWZlTWVkaWFWb2x1bWVTdGF0ZUxvY2spIHsKICAgICAgICAgICAgIGlmIChtU2FmZU1lZGlhVm9sdW1lU3RhdGUgPT0gU0FGRV9NRURJQV9WT0xVTUVfSU5BQ1RJVkUpIHsKICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlID0gbUF1ZGlvU2VydmljZS5nZXREZXZpY2VGb3JTdHJlYW0oQXVkaW9TeXN0ZW0uU1RSRUFNX01VU0lDKTsKLSAgICAgICAgICAgICAgICBpZiAobVNhZmVNZWRpYVZvbHVtZURldmljZXMuY29udGFpbnNLZXkoZGV2aWNlKSAmJiBpc1N0cmVhbUFjdGl2ZSkgeworICAgICAgICAgICAgICAgIGlmIChzYWZlRGV2aWNlc0NvbnRhaW5zKGRldmljZSkgJiYgaXNTdHJlYW1BY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVNdXNpY0FjdGl2ZUNoZWNrKCk7CiAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1BdWRpb1NlcnZpY2UuZ2V0VnNzVm9sdW1lRm9yRGV2aWNlKEF1ZGlvU3lzdGVtLlNUUkVBTV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwpAQCAtNTc0LDEwICs1NzAsOCBAQAogCiAgICAgLypwYWNrYWdlKi8gdm9pZCBjb25maWd1cmVTYWZlTWVkaWEoYm9vbGVhbiBmb3JjZWQsIFN0cmluZyBjYWxsZXIpIHsKICAgICAgICAgaW50IG1zZyA9IE1TR19DT05GSUdVUkVfU0FGRV9NRURJQTsKLSAgICAgICAgaWYgKGZvcmNlZCkgewotICAgICAgICAgICAgLy8gdW5mb3JjZWQgc2hvdWxkIG5vdCBjYW5jZWwgZm9yY2VkIGNvbmZpZ3VyZSBtZXNzYWdlcwotICAgICAgICAgICAgbUF1ZGlvSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhtc2cpOwotICAgICAgICB9CisKKyAgICAgICAgbUF1ZGlvSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhtc2cpOwogCiAgICAgICAgIGxvbmcgdGltZSA9IDA7CiAgICAgICAgIGlmIChmb3JjZWQpIHsKQEAgLTU5MSwxNCArNTg1LDE1IEBACiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZCBpbml0U2FmZU1lZGlhVm9sdW1lSW5kZXgoKSB7Ci0gICAgICAgIGZvciAoU2FmZURldmljZVZvbHVtZUluZm8gdmkgOiBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgdmkubVNhZmVWb2x1bWVJbmRleCA9IGdldFNhZmVEZXZpY2VNZWRpYVZvbHVtZUluZGV4KHZpLm1EZXZpY2VUeXBlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5zaXplKCk7ICsraSkgIHsKKyAgICAgICAgICAgIGludCBkZXZpY2VUeXBlID0gbVNhZmVNZWRpYVZvbHVtZURldmljZXMua2V5QXQoaSk7CisgICAgICAgICAgICBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5wdXQoZGV2aWNlVHlwZSwgZ2V0U2FmZURldmljZU1lZGlhVm9sdW1lSW5kZXgoZGV2aWNlVHlwZSkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gaW50IGdldFNhZmVNZWRpYVZvbHVtZUluZGV4KGludCBkZXZpY2UpIHsKICAgICAgICAgaWYgKG1TYWZlTWVkaWFWb2x1bWVTdGF0ZSA9PSBTQUZFX01FRElBX1ZPTFVNRV9BQ1RJVkUKLSAgICAgICAgICAgICAgICAmJiBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5jb250YWluc0tleShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgJiYgc2FmZURldmljZXNDb250YWlucyhkZXZpY2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gc2FmZU1lZGlhVm9sdW1lSW5kZXgoZGV2aWNlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTYxNiw3ICs2MTEsNyBAQAogICAgIH0KIAogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gc2FmZURldmljZXNDb250YWlucyhpbnQgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5jb250YWluc0tleShkZXZpY2UpOworICAgICAgICByZXR1cm4gbVNhZmVNZWRpYVZvbHVtZURldmljZXMuaW5kZXhPZktleShkZXZpY2UpID49IDA7CiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZCBpbnZhbGlkYXRQZW5kaW5nVm9sdW1lQ29tbWFuZCgpIHsKQEAgLTY2Nyw5ICs2NjIsOSBAQAogICAgICAgICBwdy5wcmludCgiICBtU2FmZU1lZGlhVm9sdW1lU3RhdGU9Iik7CiAgICAgICAgIHB3LnByaW50bG4oc2FmZU1lZGlhVm9sdW1lU3RhdGVUb1N0cmluZyhtU2FmZU1lZGlhVm9sdW1lU3RhdGUpKTsKICAgICAgICAgcHcucHJpbnQoIiAgbVNhZmVNZWRpYVZvbHVtZUluZGV4PSIpOyBwdy5wcmludGxuKG1TYWZlTWVkaWFWb2x1bWVJbmRleCk7Ci0gICAgICAgIGZvciAoU2FmZURldmljZVZvbHVtZUluZm8gdmkgOiBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgcHcucHJpbnQoIiAgbVNhZmVNZWRpYVZvbHVtZUluZGV4WyIpOyBwdy5wcmludCh2aS5tRGV2aWNlVHlwZSk7Ci0gICAgICAgICAgICBwdy5wcmludCgiXT0iKTsgcHcucHJpbnRsbih2aS5tU2FmZVZvbHVtZUluZGV4KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU2FmZU1lZGlhVm9sdW1lRGV2aWNlcy5zaXplKCk7ICsraSkgIHsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1TYWZlTWVkaWFWb2x1bWVJbmRleFsiKTsgcHcucHJpbnQobVNhZmVNZWRpYVZvbHVtZURldmljZXMua2V5QXQoaSkpOworICAgICAgICAgICAgcHcucHJpbnQoIl09Iik7IHB3LnByaW50bG4obVNhZmVNZWRpYVZvbHVtZURldmljZXMudmFsdWVBdChpKSk7CiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnQoIiAgbVNhZmVNZWRpYVZvbHVtZURiZnM9Iik7IHB3LnByaW50bG4obVNhZmVNZWRpYVZvbHVtZURiZnMpOwogICAgICAgICBwdy5wcmludCgiICBtTXVzaWNBY3RpdmVNcz0iKTsgcHcucHJpbnRsbihtTXVzaWNBY3RpdmVNcyk7CkBAIC03MjMsNyArNzE4LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKEF1ZGlvU2VydmljZS5tU3RyZWFtVm9sdW1lQWxpYXNbc3RyZWFtVHlwZV0gPT0gQXVkaW9TeXN0ZW0uU1RSRUFNX01VU0lDCi0gICAgICAgICAgICAgICAgICAgICYmIG1TYWZlTWVkaWFWb2x1bWVEZXZpY2VzLmNvbnRhaW5zS2V5KGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgc2FmZURldmljZXNDb250YWlucyhkZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgc291bmREb3NlLnVwZGF0ZUF0dGVudWF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW0uZ2V0U3RyZWFtVm9sdW1lREIoQXVkaW9TeXN0ZW0uU1RSRUFNX01VU0lDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3SW5kZXggKyA1KSAvIDEwLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9TcGF0aWFsaXplckhlbHBlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hdWRpby9TcGF0aWFsaXplckhlbHBlci5qYXZhCmluZGV4IDNlYTRmNGYuLjhmNTRlNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYXVkaW8vU3BhdGlhbGl6ZXJIZWxwZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2F1ZGlvL1NwYXRpYWxpemVySGVscGVyLmphdmEKQEAgLTEwNjYsNyArMTA2Niw3IEBACiAgICAgICAgIGlmICh0cmFuc2Zvcm0ubGVuZ3RoICE9IDYpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgYXJyYXkgc2l6ZSIgKyB0cmFuc2Zvcm0ubGVuZ3RoKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWNoZWNrU3BhdEZvckhlYWRUcmFja2luZygic2V0R2xvYmFsVHJhbnNmb3JtIikpIHsKKyAgICAgICAgaWYgKCFjaGVja1NwYXRpYWxpemVyRm9ySGVhZFRyYWNraW5nKCJzZXRHbG9iYWxUcmFuc2Zvcm0iKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHRyeSB7CkBAIC0xMDc3LDcgKzEwNzcsNyBAQAogICAgIH0KIAogICAgIHN5bmNocm9uaXplZCB2b2lkIHJlY2VudGVySGVhZFRyYWNrZXIoKSB7Ci0gICAgICAgIGlmICghY2hlY2tTcGF0Rm9ySGVhZFRyYWNraW5nKCJyZWNlbnRlckhlYWRUcmFja2VyIikpIHsKKyAgICAgICAgaWYgKCFjaGVja1NwYXRpYWxpemVyRm9ySGVhZFRyYWNraW5nKCJyZWNlbnRlckhlYWRUcmFja2VyIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICB0cnkgewpAQCAtMTA4Nyw4ICsxMDg3LDMwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBzZXREaXNwbGF5T3JpZW50YXRpb24oZmxvYXQgZGlzcGxheU9yaWVudGF0aW9uKSB7CisgICAgICAgIGlmICghY2hlY2tTcGF0aWFsaXplcigic2V0RGlzcGxheU9yaWVudGF0aW9uIikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNwYXQuc2V0RGlzcGxheU9yaWVudGF0aW9uKGRpc3BsYXlPcmllbnRhdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjYWxsaW5nIHNldERpc3BsYXlPcmllbnRhdGlvbiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgc2V0Rm9sZFN0YXRlKGJvb2xlYW4gZm9sZGVkKSB7CisgICAgICAgIGlmICghY2hlY2tTcGF0aWFsaXplcigic2V0Rm9sZFN0YXRlIikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNwYXQuc2V0Rm9sZFN0YXRlKGZvbGRlZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjYWxsaW5nIHNldEZvbGRTdGF0ZSIsIGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgc3luY2hyb25pemVkIHZvaWQgc2V0RGVzaXJlZEhlYWRUcmFja2luZ01vZGUoQFNwYXRpYWxpemVyLkhlYWRUcmFja2luZ01vZGVTZXQgaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKCFjaGVja1NwYXRGb3JIZWFkVHJhY2tpbmcoInNldERlc2lyZWRIZWFkVHJhY2tpbmdNb2RlIikpIHsKKyAgICAgICAgaWYgKCFjaGVja1NwYXRpYWxpemVyRm9ySGVhZFRyYWNraW5nKCJzZXREZXNpcmVkSGVhZFRyYWNraW5nTW9kZSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1vZGUgIT0gU3BhdGlhbGl6ZXIuSEVBRF9UUkFDS0lOR19NT0RFX0RJU0FCTEVEKSB7CkBAIC0xMTg2LDcgKzEyMDgsNyBAQAogICAgICAgICByZXR1cm4gbUhlYWRUcmFja2VyQXZhaWxhYmxlOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1NwYXRGb3JIZWFkVHJhY2tpbmcoU3RyaW5nIGZ1bmNOYW1lKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU3BhdGlhbGl6ZXIoU3RyaW5nIGZ1bmNOYW1lKSB7CiAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgICAgICBjYXNlIFNUQVRFX1VOSU5JVElBTElaRUQ6CiAgICAgICAgICAgICBjYXNlIFNUQVRFX05PVF9TVVBQT1JURUQ6CkBAIC0xMTk3LDE0ICsxMjE5LDE4IEBACiAgICAgICAgICAgICBjYXNlIFNUQVRFX0VOQUJMRURfQVZBSUxBQkxFOgogICAgICAgICAgICAgICAgIGlmIChtU3BhdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZWNvdmVyIGJ5IHJlc2V0dGluZyB0aGUgbmF0aXZlIHNwYXRpYWxpemVyIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNoZWNrU3BhdEZvckhlYWRUcmFja2luZygpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibmF0aXZlIHNwYXRpYWxpemVyIHNob3VsZCBub3QgYmUgbnVsbCBpbiBzdGF0ZTogIiArIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNoZWNrU3BhdGlhbGl6ZXIoKTogY2FsbGVkIGZyb20gIiArIGZ1bmNOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKCksIG5hdGl2ZSBzcGF0aWFsaXplciBzaG91bGQgbm90IGJlIG51bGwgaW4gc3RhdGU6ICIgKyBtU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICBwb3N0UmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbUlzSGVhZFRyYWNraW5nU3VwcG9ydGVkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tTcGF0aWFsaXplckZvckhlYWRUcmFja2luZyhTdHJpbmcgZnVuY05hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNoZWNrU3BhdGlhbGl6ZXIoZnVuY05hbWUpICYmIG1Jc0hlYWRUcmFja2luZ1N1cHBvcnRlZDsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hBY3R1YWxIZWFkVHJhY2tpbmdNb2RlKGludCBuZXdNb2RlKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Jpb21ldHJpY3MvVEVTVF9NQVBQSU5HIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9iaW9tZXRyaWNzL1RFU1RfTUFQUElORwppbmRleCA4YjgwNjc0Li5kYWNhMDBiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Jpb21ldHJpY3MvVEVTVF9NQVBQSU5HCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYmlvbWV0cmljcy9URVNUX01BUFBJTkcKQEAgLTYsNSArNiwyNCBAQAogICAgICAgICB7CiAgICAgICAgICAgICAibmFtZSI6ICJDdHNCaW9tZXRyaWNzSG9zdFRlc3RDYXNlcyIKICAgICAgICAgfQotICAgIF0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgXSwKKyAgICAiaXJvbndvb2QtcG9zdHN1Ym1pdCI6IFsKKyAgICAgeworICAgICAgIm5hbWUiOiAiQmlvbWV0cmljc0UyZVRlc3RzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5Jd1Rlc3QiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJleGNsdWRlLWFubm90YXRpb24iOiAib3JnLmp1bml0Lklnbm9yZSIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5zY2VuYXJpby5iaW9tZXRyaWNzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZXhjbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5GbGFreVRlc3QiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgICBdCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Jpb21ldHJpY3Mvc2Vuc29ycy9maW5nZXJwcmludC9GaW5nZXJwcmludFNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYmlvbWV0cmljcy9zZW5zb3JzL2ZpbmdlcnByaW50L0ZpbmdlcnByaW50U2VydmljZS5qYXZhCmluZGV4IGRjMDBmZmMuLjAxZmZjN2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYmlvbWV0cmljcy9zZW5zb3JzL2ZpbmdlcnByaW50L0ZpbmdlcnByaW50U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYmlvbWV0cmljcy9zZW5zb3JzL2ZpbmdlcnByaW50L0ZpbmdlcnByaW50U2VydmljZS5qYXZhCkBAIC0zMTQsNyArMzE0LDggQEAKICAgICAgICAgICAgIGZpbmFsIEZpbmdlcnByaW50U2Vuc29yUHJvcGVydGllc0ludGVybmFsIHNlbnNvclByb3BzID0KICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc2Vjb25kLmdldFNlbnNvclByb3BlcnRpZXMob3B0aW9ucy5nZXRTZW5zb3JJZCgpKTsKICAgICAgICAgICAgIGlmICghaXNLZXlndWFyZCAmJiAhVXRpbHMuaXNTZXR0aW5ncyhnZXRDb250ZXh0KCksIG9wUGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICYmIHNlbnNvclByb3BzICE9IG51bGwgJiYgc2Vuc29yUHJvcHMuaXNBbnlVZGZwc1R5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICAmJiBzZW5zb3JQcm9wcyAhPSBudWxsICYmIChzZW5zb3JQcm9wcy5pc0FueVVkZnBzVHlwZSgpCisgICAgICAgICAgICAgICAgICAgIHx8IHNlbnNvclByb3BzLmlzQW55U2lkZWZwc1R5cGUoKSkpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXV0aGVudGljYXRlV2l0aFByb21wdChvcGVyYXRpb25JZCwgc2Vuc29yUHJvcHMsIGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1VzZXJJZCwgcmVjZWl2ZXIsIG9wUGFja2FnZU5hbWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NhbWVyYS9DYW1lcmFTZXJ2aWNlUHJveHkuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY2FtZXJhL0NhbWVyYVNlcnZpY2VQcm94eS5qYXZhCmluZGV4IDRlM2RlM2MuLmU4YWY4NDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY2FtZXJhL0NhbWVyYVNlcnZpY2VQcm94eS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY2FtZXJhL0NhbWVyYVNlcnZpY2VQcm94eS5qYXZhCkBAIC0yNDMsMTEgKzI0MywxMyBAQAogICAgICAgICBwdWJsaWMgTGlzdDxDYW1lcmFTdHJlYW1TdGF0cz4gbVN0cmVhbVN0YXRzOwogICAgICAgICBwdWJsaWMgU3RyaW5nIG1Vc2VyVGFnOwogICAgICAgICBwdWJsaWMgaW50IG1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlOworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBtTG9nSWQ7CiAKICAgICAgICAgcHJpdmF0ZSBsb25nIG1EdXJhdGlvbk9yU3RhcnRUaW1lTXM7ICAvLyBFaXRoZXIgc3RhcnQgdGltZSwgb3IgZHVyYXRpb24gb25jZSBjb21wbGV0ZWQKIAogICAgICAgICBDYW1lcmFVc2FnZUV2ZW50KFN0cmluZyBjYW1lcmFJZCwgaW50IGZhY2luZywgU3RyaW5nIGNsaWVudE5hbWUsIGludCBhcGlMZXZlbCwKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzTmRrLCBpbnQgYWN0aW9uLCBpbnQgbGF0ZW5jeU1zLCBpbnQgb3BlcmF0aW5nTW9kZSwgYm9vbGVhbiBkZXZpY2VFcnJvcikgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNOZGssIGludCBhY3Rpb24sIGludCBsYXRlbmN5TXMsIGludCBvcGVyYXRpbmdNb2RlLCBib29sZWFuIGRldmljZUVycm9yLAorICAgICAgICAgICAgICAgIGxvbmcgbG9nSWQpIHsKICAgICAgICAgICAgIG1DYW1lcmFJZCA9IGNhbWVyYUlkOwogICAgICAgICAgICAgbUNhbWVyYUZhY2luZyA9IGZhY2luZzsKICAgICAgICAgICAgIG1DbGllbnROYW1lID0gY2xpZW50TmFtZTsKQEAgLTI1OSw2ICsyNjEsNyBAQAogICAgICAgICAgICAgbUxhdGVuY3lNcyA9IGxhdGVuY3lNczsKICAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID0gb3BlcmF0aW5nTW9kZTsKICAgICAgICAgICAgIG1EZXZpY2VFcnJvciA9IGRldmljZUVycm9yOworICAgICAgICAgICAgbUxvZ0lkID0gbG9nSWQ7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBtYXJrQ29tcGxldGVkKGludCBpbnRlcm5hbFJlY29uZmlndXJlLCBsb25nIHJlcXVlc3RDb3VudCwKQEAgLTg0MCw3ICs4NDMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBkZXZpY2VFcnJvciAiICsgZS5tRGV2aWNlRXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc3RyZWFtQ291bnQgaXMgIiArIHN0cmVhbUNvdW50CiAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHVzZXJUYWcgaXMgIiArIGUubVVzZXJUYWcKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSAiICsgZS5tVmlkZW9TdGFiaWxpemF0aW9uTW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICArICIsIHZpZGVvU3RhYmlsaXphdGlvbk1vZGUgIiArIGUubVZpZGVvU3RhYmlsaXphdGlvbk1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbG9nSWQgIiArIGUubUxvZ0lkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIENvbnZlcnQgZnJvbSBDYW1lcmFTdHJlYW1TdGF0cyB0byBDYW1lcmFTdHJlYW1Qcm90bwogICAgICAgICAgICAgQ2FtZXJhU3RyZWFtUHJvdG9bXSBzdHJlYW1Qcm90b3MgPSBuZXcgQ2FtZXJhU3RyZWFtUHJvdG9bTUFYX1NUUkVBTV9TVEFUSVNUSUNTXTsKQEAgLTkwMCw3ICs5MDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShzdHJlYW1Qcm90b3NbMl0pLAogICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShzdHJlYW1Qcm90b3NbM10pLAogICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShzdHJlYW1Qcm90b3NbNF0pLAotICAgICAgICAgICAgICAgICAgICBlLm1Vc2VyVGFnLCBlLm1WaWRlb1N0YWJpbGl6YXRpb25Nb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgZS5tVXNlclRhZywgZS5tVmlkZW9TdGFiaWxpemF0aW9uTW9kZSwgZS5tTG9nSWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDg5LDYgKzEwOTMsNyBAQAogICAgICAgICBMaXN0PENhbWVyYVN0cmVhbVN0YXRzPiBzdHJlYW1TdGF0cyA9IGNhbWVyYVN0YXRlLmdldFN0cmVhbVN0YXRzKCk7CiAgICAgICAgIFN0cmluZyB1c2VyVGFnID0gY2FtZXJhU3RhdGUuZ2V0VXNlclRhZygpOwogICAgICAgICBpbnQgdmlkZW9TdGFiaWxpemF0aW9uTW9kZSA9IGNhbWVyYVN0YXRlLmdldFZpZGVvU3RhYmlsaXphdGlvbk1vZGUoKTsKKyAgICAgICAgbG9uZyBsb2dJZCA9IGNhbWVyYVN0YXRlLmdldExvZ0lkKCk7CiAgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgewogICAgICAgICAgICAgLy8gVXBkYXRlIGFjdGl2ZSBjYW1lcmEgbGlzdCBhbmQgbm90aWZ5IE5GQyBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgIGJvb2xlYW4gd2FzRW1wdHkgPSBtQWN0aXZlQ2FtZXJhVXNhZ2UuaXNFbXB0eSgpOwpAQCAtMTExMCw3ICsxMTE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhVXNhZ2VFdmVudCBvcGVuRXZlbnQgPSBuZXcgQ2FtZXJhVXNhZ2VFdmVudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjbGllbnROYW1lLCBhcGlMZXZlbCwgaXNOZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWV3b3JrU3RhdHNMb2cuQ0FNRVJBX0FDVElPTl9FVkVOVF9fQUNUSU9OX19PUEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNcywgc2Vzc2lvblR5cGUsIGRldmljZUVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5TXMsIHNlc3Npb25UeXBlLCBkZXZpY2VFcnJvciwgbG9nSWQpOwogICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhVXNhZ2VIaXN0b3J5LmFkZChvcGVuRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIENhbWVyYVNlc3Npb25TdGF0cy5DQU1FUkFfU1RBVEVfQUNUSVZFOgpAQCAtMTEzNyw3ICsxMTQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhVXNhZ2VFdmVudCBuZXdFdmVudCA9IG5ldyBDYW1lcmFVc2FnZUV2ZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudE5hbWUsIGFwaUxldmVsLCBpc05kaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtTdGF0c0xvZy5DQU1FUkFfQUNUSU9OX0VWRU5UX19BQ1RJT05fX1NFU1NJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeU1zLCBzZXNzaW9uVHlwZSwgZGV2aWNlRXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNcywgc2Vzc2lvblR5cGUsIGRldmljZUVycm9yLCBsb2dJZCk7CiAgICAgICAgICAgICAgICAgICAgIENhbWVyYVVzYWdlRXZlbnQgb2xkRXZlbnQgPSBtQWN0aXZlQ2FtZXJhVXNhZ2UucHV0KGNhbWVyYUlkLCBuZXdFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRFdmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ2FtZXJhICIgKyBjYW1lcmFJZCArICIgd2FzIGFscmVhZHkgbWFya2VkIGFzIGFjdGl2ZSIpOwpAQCAtMTE4MSw3ICsxMTg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVVzYWdlRXZlbnQgY2xvc2VFdmVudCA9IG5ldyBDYW1lcmFVc2FnZUV2ZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjbGllbnROYW1lLCBhcGlMZXZlbCwgaXNOZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1ld29ya1N0YXRzTG9nLkNBTUVSQV9BQ1RJT05fRVZFTlRfX0FDVElPTl9fQ0xPU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNcywgc2Vzc2lvblR5cGUsIGRldmljZUVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeU1zLCBzZXNzaW9uVHlwZSwgZGV2aWNlRXJyb3IsIGxvZ0lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFVc2FnZUhpc3RvcnkuYWRkKGNsb3NlRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGUuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGUuamF2YQppbmRleCBhNTg5MzEzLi4wMGFmMjI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZS5qYXZhCkBAIC03Niw3ICs3NiwxMyBAQAogICAgICAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBzdGF0ZSBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUgZGV2aWNlIGlzCiAgICAgICogb3ZlcmhlYXRpbmcgYW5kIHJlYWNoaW5nIHRoZSBjcml0aWNhbCBzdGF0dXMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwgPSAxIDw8IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VTlNVUFBPUlRFRF9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMID0gMSA8PCA0OworCisgICAgLyoqCisgICAgICogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIHN0YXRlIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHBvd2VyIHNhdmUgbW9kZQorICAgICAqIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VTlNVUFBPUlRFRF9XSEVOX1BPV0VSX1NBVkVfTU9ERSA9IDEgPDwgNTsKIAogICAgIC8qKiBAaGlkZSAqLwogICAgIEBJbnREZWYocHJlZml4ID0geyJGTEFHXyJ9LCBmbGFnID0gdHJ1ZSwgdmFsdWUgPSB7CkBAIC04NCw3ICs5MCw4IEBACiAgICAgICAgICAgICBGTEFHX0FQUF9JTkFDQ0VTU0lCTEUsCiAgICAgICAgICAgICBGTEFHX0VNVUxBVEVEX09OTFksCiAgICAgICAgICAgICBGTEFHX0NBTkNFTF9XSEVOX1JFUVVFU1RFUl9OT1RfT05fVE9QLAotICAgICAgICAgICAgRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwKKyAgICAgICAgICAgIEZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTCwKKyAgICAgICAgICAgIEZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREUKICAgICB9KQogICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKICAgICBwdWJsaWMgQGludGVyZmFjZSBEZXZpY2VTdGF0ZUZsYWdzIHt9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDQzZWU1ZTIuLjk2NDU2OTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5EZXZpY2VTdGF0ZS5GTEFHX0NBTkNFTF9PVkVSUklERV9SRVFVRVNUUzsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmRldmljZXN0YXRlLk92ZXJyaWRlUmVxdWVzdC5PVkVSUklERV9SRVFVRVNUX1RZUEVfQkFTRV9TVEFURTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmRldmljZXN0YXRlLk92ZXJyaWRlUmVxdWVzdC5PVkVSUklERV9SRVFVRVNUX1RZUEVfRU1VTEFURURfU1RBVEU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLkZMQUdfUE9XRVJfU0FWRV9FTkFCTEVEOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIuZGV2aWNlc3RhdGUuT3ZlcnJpZGVSZXF1ZXN0Q29udHJvbGxlci5GTEFHX1RIRVJNQUxfQ1JJVElDQUw7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLlNUQVRVU19BQ1RJVkU7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLlNUQVRVU19DQU5DRUxFRDsKQEAgLTYwOSw3ICs2MTAsOCBAQAogCiAgICAgQEd1YXJkZWRCeSgibUxvY2siKQogICAgIHByaXZhdGUgdm9pZCBvbk92ZXJyaWRlUmVxdWVzdFN0YXR1c0NoYW5nZWRMb2NrZWQoQE5vbk51bGwgT3ZlcnJpZGVSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICBAT3ZlcnJpZGVSZXF1ZXN0Q29udHJvbGxlci5SZXF1ZXN0U3RhdHVzIGludCBzdGF0dXMsIGludCBmbGFncykgeworICAgICAgICAgICAgQE92ZXJyaWRlUmVxdWVzdENvbnRyb2xsZXIuUmVxdWVzdFN0YXR1cyBpbnQgc3RhdHVzLAorICAgICAgICAgICAgQE92ZXJyaWRlUmVxdWVzdENvbnRyb2xsZXIuU3RhdHVzQ2hhbmdlZEZsYWcgaW50IGZsYWdzKSB7CiAgICAgICAgIGlmIChyZXF1ZXN0LmdldFJlcXVlc3RUeXBlKCkgPT0gT1ZFUlJJREVfUkVRVUVTVF9UWVBFX0JBU0VfU1RBVEUpIHsKICAgICAgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBTVEFUVVNfQUNUSVZFOgpAQCAtNjQxLDYgKzY0MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93VGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uSWZOZWVkZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdGVkU3RhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEZMQUdfUE9XRVJfU0FWRV9FTkFCTEVEKSA9PSBGTEFHX1BPV0VSX1NBVkVfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93UG93ZXJTYXZlTm90aWZpY2F0aW9uSWZOZWVkZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdGVkU3RhdGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIuamF2YQppbmRleCA5MDA4NzQwLi5hYjI2MWFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuZGV2aWNlc3RhdGU7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5BQ1RJT05fQkFUVEVSWV9TQVZFUl9TRVRUSU5HUzsKKwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5EcmF3YWJsZVJlczsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CkBAIC0xMDEsMTAgKzEwMywxNiBAQAogICAgICAgICB9CiAgICAgICAgIFN0cmluZyByZXF1ZXN0ZXJBcHBsaWNhdGlvbkxhYmVsID0gZ2V0QXBwbGljYXRpb25MYWJlbChyZXF1ZXN0aW5nQXBwVWlkKTsKICAgICAgICAgaWYgKHJlcXVlc3RlckFwcGxpY2F0aW9uTGFiZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSU5URU5UX0FDVElPTl9DQU5DRUxfU1RBVEUpCisgICAgICAgICAgICAgICAgICAgIC5zZXRQYWNrYWdlKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCAwIC8qIHJlcXVlc3RDb2RlICovLCBpbnRlbnQsIFBlbmRpbmdJbnRlbnQuRkxBR19JTU1VVEFCTEUpOwogICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICAgICAgaW5mby5uYW1lLCBpbmZvLmFjdGl2ZU5vdGlmaWNhdGlvblRpdGxlLAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KGluZm8uYWN0aXZlTm90aWZpY2F0aW9uQ29udGVudCwgcmVxdWVzdGVyQXBwbGljYXRpb25MYWJlbCksCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogb25nb2luZyAqLywgUi5kcmF3YWJsZS5pY19kdWFsX3NjcmVlbgorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIG9uZ29pbmcgKi8sIFIuZHJhd2FibGUuaWNfZHVhbF9zY3JlZW4sCisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3R1cm5fb2ZmX2J1dHRvbikKICAgICAgICAgICAgICk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2Fubm90IGRldGVybWluZSB0aGUgcmVxdWVzdGluZyBhcHAgbmFtZSB3aGVuIHNob3dpbmcgc3RhdGUgYWN0aXZlICIKQEAgLTEyNiw3ICsxMzQsMzMgQEAKICAgICAgICAgc2hvd05vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICBpbmZvLm5hbWUsIGluZm8udGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uVGl0bGUsCiAgICAgICAgICAgICAgICAgaW5mby50aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25Db250ZW50LCBmYWxzZSAvKiBvbmdvaW5nICovLAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuaWNfdGhlcm1vc3RhdAorICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuaWNfdGhlcm1vc3RhdCwKKyAgICAgICAgICAgICAgICBudWxsIC8qIHBlbmRpbmdJbnRlbnQgKi8sCisgICAgICAgICAgICAgICAgbnVsbCAvKiBhY3Rpb25UZXh0ICovCisgICAgICAgICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGxheXMgdGhlIG5vdGlmaWNhdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGRldmljZSBzdGF0ZSBpcyBjYW5jZWxlZCBkdWUgdG8gcG93ZXIKKyAgICAgKiBzYXZlIG1vZGUgYmVpbmcgZW5hYmxlZC4gRG9lcyBub3RoaW5nIGlmIHRoZSBzdGF0ZSBkb2VzIG5vdCBoYXZlIGEgcG93ZXIgc2F2ZSBtb2RlCisgICAgICogbm90aWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXZpY2Ugc3RhdGUgYmVpbmcgY2FuY2VsZWQuCisgICAgICovCisgICAgdm9pZCBzaG93UG93ZXJTYXZlTm90aWZpY2F0aW9uSWZOZWVkZWQoaW50IHN0YXRlKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbkluZm8gaW5mbyA9IG1Ob3RpZmljYXRpb25JbmZvcy5nZXQoc3RhdGUpOworICAgICAgICBpZiAoaW5mbyA9PSBudWxsIHx8ICFpbmZvLmhhc1Bvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9CQVRURVJZX1NBVkVSX1NFVFRJTkdTKTsKKyAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICBtQ29udGV4dCwgMCAvKiByZXF1ZXN0Q29kZSAqLywgaW50ZW50LCBQZW5kaW5nSW50ZW50LkZMQUdfSU1NVVRBQkxFKTsKKyAgICAgICAgc2hvd05vdGlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICBpbmZvLm5hbWUsIGluZm8ucG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlLAorICAgICAgICAgICAgICAgIGluZm8ucG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvbkNvbnRlbnQsIGZhbHNlIC8qIG9uZ29pbmcgKi8sCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY190aGVybW9zdGF0LAorICAgICAgICAgICAgICAgIHBlbmRpbmdJbnRlbnQsCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmRldmljZV9zdGF0ZV9ub3RpZmljYXRpb25fc2V0dGluZ3NfYnV0dG9uKQogICAgICAgICApOwogICAgIH0KIApAQCAtMTYxLDcgKzE5NSw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHNob3dOb3RpZmljYXRpb24oCiAgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgbmFtZSwgQE5vbk51bGwgU3RyaW5nIHRpdGxlLCBATm9uTnVsbCBTdHJpbmcgY29udGVudCwgYm9vbGVhbiBvbmdvaW5nLAotICAgICAgICAgICAgQERyYXdhYmxlUmVzIGludCBpY29uUmVzKSB7CisgICAgICAgICAgICBARHJhd2FibGVSZXMgaW50IGljb25SZXMsCisgICAgICAgICAgICBATnVsbGFibGUgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50LCBATnVsbGFibGUgU3RyaW5nIGFjdGlvblRleHQpIHsKICAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uQ2hhbm5lbCBjaGFubmVsID0gbmV3IE5vdGlmaWNhdGlvbkNoYW5uZWwoCiAgICAgICAgICAgICAgICAgQ0hBTk5FTF9JRCwgbmFtZSwgTm90aWZpY2F0aW9uTWFuYWdlci5JTVBPUlRBTkNFX0hJR0gpOwogICAgICAgICBmaW5hbCBOb3RpZmljYXRpb24uQnVpbGRlciBidWlsZGVyID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0LCBDSEFOTkVMX0lEKQpAQCAtMTczLDE0ICsyMDgsMTAgQEAKICAgICAgICAgICAgICAgICAuc2V0T25nb2luZyhvbmdvaW5nKQogICAgICAgICAgICAgICAgIC5zZXRDYXRlZ29yeShOb3RpZmljYXRpb24uQ0FURUdPUllfU1lTVEVNKTsKIAotICAgICAgICBpZiAob25nb2luZykgewotICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSU5URU5UX0FDVElPTl9DQU5DRUxfU1RBVEUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRQYWNrYWdlKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCAwIC8qIHJlcXVlc3RDb2RlICovLCBpbnRlbnQsIFBlbmRpbmdJbnRlbnQuRkxBR19JTU1VVEFCTEUpOworICAgICAgICBpZiAocGVuZGluZ0ludGVudCAhPSBudWxsICYmIGFjdGlvblRleHQgIT0gbnVsbCkgewogICAgICAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uLkFjdGlvbiBhY3Rpb24gPSBuZXcgTm90aWZpY2F0aW9uLkFjdGlvbi5CdWlsZGVyKAogICAgICAgICAgICAgICAgICAgICBudWxsIC8qIGljb24gKi8sCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5kZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3R1cm5fb2ZmX2J1dHRvbiksCisgICAgICAgICAgICAgICAgICAgIGFjdGlvblRleHQsCiAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbnRlbnQpCiAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICAgICAgYnVpbGRlci5hZGRBY3Rpb24oYWN0aW9uKTsKQEAgLTIxNSwxMiArMjQ2LDIxIEBACiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvbkNvbnRlbnRzID0KICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgUi5hcnJheS5kZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3RoZXJtYWxfY29udGVudHMpOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBwb3dlclNhdmVNb2RlTm90aWZpY2F0aW9uVGl0bGVzID0KKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hcnJheS5kZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfdGl0bGVzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvbkNvbnRlbnRzID0KKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hcnJheS5kZXZpY2Vfc3RhdGVfbm90aWZpY2F0aW9uX3Bvd2VyX3NhdmVfY29udGVudHMpOworCiAKICAgICAgICAgaWYgKHN0YXRlSWRlbnRpZmllcnMubGVuZ3RoICE9IG5hbWVzLmxlbmd0aAogICAgICAgICAgICAgICAgIHx8IHN0YXRlSWRlbnRpZmllcnMubGVuZ3RoICE9IGFjdGl2ZU5vdGlmaWNhdGlvblRpdGxlcy5sZW5ndGgKICAgICAgICAgICAgICAgICB8fCBzdGF0ZUlkZW50aWZpZXJzLmxlbmd0aCAhPSBhY3RpdmVOb3RpZmljYXRpb25Db250ZW50cy5sZW5ndGgKICAgICAgICAgICAgICAgICB8fCBzdGF0ZUlkZW50aWZpZXJzLmxlbmd0aCAhPSB0aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25UaXRsZXMubGVuZ3RoCiAgICAgICAgICAgICAgICAgfHwgc3RhdGVJZGVudGlmaWVycy5sZW5ndGggIT0gdGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uQ29udGVudHMubGVuZ3RoCisgICAgICAgICAgICAgICAgfHwgc3RhdGVJZGVudGlmaWVycy5sZW5ndGggIT0gcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlcy5sZW5ndGgKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZUlkZW50aWZpZXJzLmxlbmd0aCAhPSBwb3dlclNhdmVNb2RlTm90aWZpY2F0aW9uQ29udGVudHMubGVuZ3RoCiAgICAgICAgICkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIlRoZSBsZW5ndGggb2Ygc3RhdGUgaWRlbnRpZmllcnMgYW5kIG5vdGlmaWNhdGlvbiB0ZXh0cyBtdXN0IG1hdGNoISIpOwpAQCAtMjM3LDcgKzI3Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb25JbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzW2ldLCBhY3RpdmVOb3RpZmljYXRpb25UaXRsZXNbaV0sIGFjdGl2ZU5vdGlmaWNhdGlvbkNvbnRlbnRzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvblRpdGxlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25Db250ZW50c1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25Db250ZW50c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlclNhdmVNb2RlTm90aWZpY2F0aW9uVGl0bGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb25Db250ZW50c1tpXSkKICAgICAgICAgICAgICk7CiAgICAgICAgIH0KIApAQCAtMjcyLDE2ICszMTQsMjEgQEAKICAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBhY3RpdmVOb3RpZmljYXRpb25Db250ZW50OwogICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvblRpdGxlOwogICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvbkNvbnRlbnQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlOworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb25Db250ZW50OwogCiAgICAgICAgIE5vdGlmaWNhdGlvbkluZm8oU3RyaW5nIG5hbWUsIFN0cmluZyBhY3RpdmVOb3RpZmljYXRpb25UaXRsZSwKICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aXZlTm90aWZpY2F0aW9uQ29udGVudCwgU3RyaW5nIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvblRpdGxlLAotICAgICAgICAgICAgICAgIFN0cmluZyB0aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25Db250ZW50KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvbkNvbnRlbnQsIFN0cmluZyBwb3dlclNhdmVNb2RlTm90aWZpY2F0aW9uVGl0bGUsCisgICAgICAgICAgICAgICAgU3RyaW5nIHBvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb25Db250ZW50KSB7CiAKICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgICAgICB0aGlzLmFjdGl2ZU5vdGlmaWNhdGlvblRpdGxlID0gYWN0aXZlTm90aWZpY2F0aW9uVGl0bGU7CiAgICAgICAgICAgICB0aGlzLmFjdGl2ZU5vdGlmaWNhdGlvbkNvbnRlbnQgPSBhY3RpdmVOb3RpZmljYXRpb25Db250ZW50OwogICAgICAgICAgICAgdGhpcy50aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25UaXRsZSA9IHRoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvblRpdGxlOwogICAgICAgICAgICAgdGhpcy50aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25Db250ZW50ID0gdGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uQ29udGVudDsKKyAgICAgICAgICAgIHRoaXMucG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlID0gcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlOworICAgICAgICAgICAgdGhpcy5wb3dlclNhdmVNb2RlTm90aWZpY2F0aW9uQ29udGVudCA9IHBvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb25Db250ZW50OwogICAgICAgICB9CiAKICAgICAgICAgYm9vbGVhbiBoYXNBY3RpdmVOb3RpZmljYXRpb24oKSB7CkBAIC0yOTIsNSArMzM5LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gdGhlcm1hbENyaXRpY2FsTm90aWZpY2F0aW9uVGl0bGUgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAmJiB0aGVybWFsQ3JpdGljYWxOb3RpZmljYXRpb25UaXRsZS5sZW5ndGgoKSA+IDA7CiAgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc1Bvd2VyU2F2ZU1vZGVOb3RpZmljYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgcG93ZXJTYXZlTW9kZU5vdGlmaWNhdGlvblRpdGxlLmxlbmd0aCgpID4gMDsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVQcm92aWRlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZVByb3ZpZGVyLmphdmEKaW5kZXggZmVjYzEzZi4uYWYzM2RlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZVByb3ZpZGVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZVByb3ZpZGVyLmphdmEKQEAgLTUyLDExICs1MiwyNCBAQAogICAgICAqLwogICAgIGludCBTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX1RIRVJNQUxfQ1JJVElDQUwgPSAzOwogCisgICAgLyoqCisgICAgICogSW5kaWNhdGluZyB0aGF0IHRoZSBzdXBwb3J0ZWQgZGV2aWNlIHN0YXRlcyBoYXZlIGNoYW5nZWQgYmVjYXVzZSBwb3dlciBzYXZlIG1vZGUgd2FzIGVuYWJsZWQuCisgICAgICovCisgICAgaW50IFNVUFBPUlRFRF9ERVZJQ0VfU1RBVEVTX0NIQU5HRURfUE9XRVJfU0FWRV9FTkFCTEVEID0gNDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRpbmcgdGhhdCB0aGUgc3VwcG9ydGVkIGRldmljZSBzdGF0ZXMgaGF2ZSBjaGFuZ2VkIGJlY2F1c2UgcG93ZXIgc2F2ZSBtb2RlIHdhcworICAgICAqIGRpc2FibGVkLgorICAgICAqLworICAgIGludCBTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX1BPV0VSX1NBVkVfRElTQUJMRUQgPSA1OworCiAgICAgQEludERlZihwcmVmaXggPSB7ICJTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEXyIgfSwgdmFsdWUgPSB7CiAgICAgICAgICAgICBTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX0RFRkFVTFQsCiAgICAgICAgICAgICBTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX0lOSVRJQUxJWkVELAogICAgICAgICAgICAgU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9USEVSTUFMX05PUk1BTCwKLSAgICAgICAgICAgIFNVUFBPUlRFRF9ERVZJQ0VfU1RBVEVTX0NIQU5HRURfVEhFUk1BTF9DUklUSUNBTAorICAgICAgICAgICAgU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9USEVSTUFMX0NSSVRJQ0FMLAorICAgICAgICAgICAgU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9QT1dFUl9TQVZFX0VOQUJMRUQsCisgICAgICAgICAgICBTVVBQT1JURURfREVWSUNFX1NUQVRFU19DSEFOR0VEX1BPV0VSX1NBVkVfRElTQUJMRUQKICAgICB9KQogICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKICAgICBAaW50ZXJmYWNlIFN1cHBvcnRlZFN0YXRlc1VwZGF0ZWRSZWFzb24ge30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvT3ZlcnJpZGVSZXF1ZXN0Q29udHJvbGxlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLmphdmEKaW5kZXggMmVkNDc2NS4uNDZmMGJjMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9PdmVycmlkZVJlcXVlc3RDb250cm9sbGVyLmphdmEKQEAgLTY0LDYgKzY0LDE4IEBACiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1RIRVJNQUxfQ1JJVElDQUwgPSAxIDw8IDA7CiAKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIHdhcyB0cmlnZ2VyZWQgYnkgcG93ZXIgc2F2ZSBtb2RlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QT1dFUl9TQVZFX0VOQUJMRUQgPSAxIDw8IDE7CisKKyAgICBASW50RGVmKGZsYWcgPSB0cnVlLCBwcmVmaXggPSB7IkZMQUdfIn0sIHZhbHVlID0geworICAgICAgICAgICAgRkxBR19USEVSTUFMX0NSSVRJQ0FMLAorICAgICAgICAgICAgRkxBR19QT1dFUl9TQVZFX0VOQUJMRUQKKyAgICB9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBAaW50ZXJmYWNlIFN0YXR1c0NoYW5nZWRGbGFnIHt9CisKICAgICBzdGF0aWMgU3RyaW5nIHN0YXR1c1RvU3RyaW5nKEBSZXF1ZXN0U3RhdHVzIGludCBzdGF0dXMpIHsKICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICAgICAgICAgIGNhc2UgU1RBVFVTX0FDVElWRToKQEAgLTIyOCwxMyArMjQwLDE4IEBACiAgICAgICAgICAgICBARGV2aWNlU3RhdGVQcm92aWRlci5TdXBwb3J0ZWRTdGF0ZXNVcGRhdGVkUmVhc29uIGludCByZWFzb24pIHsKICAgICAgICAgYm9vbGVhbiBpc1RoZXJtYWxDcml0aWNhbCA9CiAgICAgICAgICAgICAgICAgcmVhc29uID09IERldmljZVN0YXRlUHJvdmlkZXIuU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9USEVSTUFMX0NSSVRJQ0FMOworICAgICAgICBib29sZWFuIGlzUG93ZXJTYXZlRW5hYmxlZCA9CisgICAgICAgICAgICAgICAgcmVhc29uID09IERldmljZVN0YXRlUHJvdmlkZXIuU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9QT1dFUl9TQVZFX0VOQUJMRUQ7CisgICAgICAgIEBTdGF0dXNDaGFuZ2VkRmxhZyBpbnQgZmxhZ3MgPSAwOworICAgICAgICBmbGFncyB8PSBpc1RoZXJtYWxDcml0aWNhbCA/IEZMQUdfVEhFUk1BTF9DUklUSUNBTCA6IDA7CisgICAgICAgIGZsYWdzIHw9IGlzUG93ZXJTYXZlRW5hYmxlZCA/IEZMQUdfUE9XRVJfU0FWRV9FTkFCTEVEIDogMDsKICAgICAgICAgaWYgKG1CYXNlU3RhdGVSZXF1ZXN0ICE9IG51bGwgJiYgIWNvbnRhaW5zKG5ld1N1cHBvcnRlZFN0YXRlcywKICAgICAgICAgICAgICAgICBtQmFzZVN0YXRlUmVxdWVzdC5nZXRSZXF1ZXN0ZWRTdGF0ZSgpKSkgewotICAgICAgICAgICAgY2FuY2VsQ3VycmVudEJhc2VTdGF0ZVJlcXVlc3RMb2NrZWQoaXNUaGVybWFsQ3JpdGljYWwgPyBGTEFHX1RIRVJNQUxfQ1JJVElDQUwgOiAwKTsKKyAgICAgICAgICAgIGNhbmNlbEN1cnJlbnRCYXNlU3RhdGVSZXF1ZXN0TG9ja2VkKGZsYWdzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtUmVxdWVzdCAhPSBudWxsICYmICFjb250YWlucyhuZXdTdXBwb3J0ZWRTdGF0ZXMsIG1SZXF1ZXN0LmdldFJlcXVlc3RlZFN0YXRlKCkpKSB7Ci0gICAgICAgICAgICBjYW5jZWxDdXJyZW50UmVxdWVzdExvY2tlZChpc1RoZXJtYWxDcml0aWNhbCA/IEZMQUdfVEhFUk1BTF9DUklUSUNBTCA6IDApOworICAgICAgICAgICAgY2FuY2VsQ3VycmVudFJlcXVlc3RMb2NrZWQoZmxhZ3MpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTUsNyArMjcyLDggQEAKICAgICAgICAgY2FuY2VsUmVxdWVzdExvY2tlZChyZXF1ZXN0VG9DYW5jZWwsIDAgLyogZmxhZ3MgKi8pOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBjYW5jZWxSZXF1ZXN0TG9ja2VkKEBOb25OdWxsIE92ZXJyaWRlUmVxdWVzdCByZXF1ZXN0VG9DYW5jZWwsIGludCBmbGFncykgeworICAgIHByaXZhdGUgdm9pZCBjYW5jZWxSZXF1ZXN0TG9ja2VkKEBOb25OdWxsIE92ZXJyaWRlUmVxdWVzdCByZXF1ZXN0VG9DYW5jZWwsCisgICAgICAgICAgICBAU3RhdHVzQ2hhbmdlZEZsYWcgaW50IGZsYWdzKSB7CiAgICAgICAgIG1MaXN0ZW5lci5vblN0YXR1c0NoYW5nZWQocmVxdWVzdFRvQ2FuY2VsLCBTVEFUVVNfQ0FOQ0VMRUQsIGZsYWdzKTsKICAgICB9CiAKQEAgLTI2Nyw3ICsyODUsNyBAQAogICAgICAgICBjYW5jZWxDdXJyZW50UmVxdWVzdExvY2tlZCgwIC8qIGZsYWdzICovKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgY2FuY2VsQ3VycmVudFJlcXVlc3RMb2NrZWQoaW50IGZsYWdzKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEN1cnJlbnRSZXF1ZXN0TG9ja2VkKEBTdGF0dXNDaGFuZ2VkRmxhZyBpbnQgZmxhZ3MpIHsKICAgICAgICAgaWYgKG1SZXF1ZXN0ID09IG51bGwpIHsKICAgICAgICAgICAgIFNsb2cudyhUQUcsICJBdHRlbXB0ZWQgdG8gY2FuY2VsIGEgbnVsbCBPdmVycmlkZVJlcXVlc3QiKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTI4NSw3ICszMDMsNyBAQAogICAgICAgICBjYW5jZWxDdXJyZW50QmFzZVN0YXRlUmVxdWVzdExvY2tlZCgwIC8qIGZsYWdzICovKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgY2FuY2VsQ3VycmVudEJhc2VTdGF0ZVJlcXVlc3RMb2NrZWQoaW50IGZsYWdzKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEN1cnJlbnRCYXNlU3RhdGVSZXF1ZXN0TG9ja2VkKEBTdGF0dXNDaGFuZ2VkRmxhZyBpbnQgZmxhZ3MpIHsKICAgICAgICAgaWYgKG1CYXNlU3RhdGVSZXF1ZXN0ID09IG51bGwpIHsKICAgICAgICAgICAgIFNsb2cudyhUQUcsICJBdHRlbXB0ZWQgdG8gY2FuY2VsIGEgbnVsbCBPdmVycmlkZVJlcXVlc3QiKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTMxMiw2ICszMzAsNiBAQAogICAgICAgICAgKiBjYW5jZWxsZWQgcmVxdWVzdC4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkKEBOb25OdWxsIE92ZXJyaWRlUmVxdWVzdCByZXF1ZXN0LCBAUmVxdWVzdFN0YXR1cyBpbnQgbmV3U3RhdHVzLAotICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisgICAgICAgICAgICAgICAgQFN0YXR1c0NoYW5nZWRGbGFnIGludCBmbGFncyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kaXNwbGF5L21vZGUvRGlzcGxheU1vZGVEaXJlY3Rvci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kaXNwbGF5L21vZGUvRGlzcGxheU1vZGVEaXJlY3Rvci5qYXZhCmluZGV4IGRiNjk0NGQwLi4zODY0MjAwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Rpc3BsYXkvbW9kZS9EaXNwbGF5TW9kZURpcmVjdG9yLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kaXNwbGF5L21vZGUvRGlzcGxheU1vZGVEaXJlY3Rvci5qYXZhCkBAIC0yMDg4LDcgKzIwODgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgICAgIHZvaWQgb25SZWZyZXNoUmF0ZVNldHRpbmdDaGFuZ2VkTG9ja2VkKGZsb2F0IG1pbiwgZmxvYXQgbWF4KSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaFJhdGVTZXR0aW5nQ2hhbmdlZExvY2tlZChmbG9hdCBtaW4sIGZsb2F0IG1heCkgewogICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VhYmxlID0gKG1heCAtIG1pbiA+IDFmICYmIG1heCA+IDYwZik7CiAgICAgICAgICAgICBpZiAobVJlZnJlc2hSYXRlQ2hhbmdlYWJsZSAhPSBjaGFuZ2VhYmxlKSB7CiAgICAgICAgICAgICAgICAgbVJlZnJlc2hSYXRlQ2hhbmdlYWJsZSA9IGNoYW5nZWFibGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RyZWFtcy9EcmVhbUNvbnRyb2xsZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZHJlYW1zL0RyZWFtQ29udHJvbGxlci5qYXZhCmluZGV4IDNlMmVmZGQuLjIwZmY1MWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZHJlYW1zL0RyZWFtQ29udHJvbGxlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZHJlYW1zL0RyZWFtQ29udHJvbGxlci5qYXZhCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgICAgb3B0aW9ucy5zZXREZWxpdmVyeUdyb3VwTWF0Y2hpbmdLZXkoCiAgICAgICAgICAgICAgICAgRFJFQU1JTkdfREVMSVZFUllfR1JPVVBfTkFNRVNQQUNFLCBEUkVBTUlOR19ERUxJVkVSWV9HUk9VUF9LRVkpOwogICAgICAgICAvLyBUaGlzIGFsbG93cyB0aGUgYnJvYWRjYXN0IGRlbGl2ZXJ5IHRvIGJlIGRlbGF5ZWQgdG8gYXBwcyBpbiB0aGUgQ2FjaGVkIHN0YXRlLgotICAgICAgICBvcHRpb25zLnNldERlZmVyVW50aWxBY3RpdmUodHJ1ZSk7CisgICAgICAgIG9wdGlvbnMuc2V0RGVmZXJyYWxQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfVU5USUxfQUNUSVZFKTsKICAgICAgICAgcmV0dXJuIG9wdGlvbnMudG9CdW5kbGUoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvSW5wdXRNYW5hZ2VySW50ZXJuYWwuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvSW5wdXRNYW5hZ2VySW50ZXJuYWwuamF2YQppbmRleCA0ZDAzZTQ0Li43ZTk5MGM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0L0lucHV0TWFuYWdlckludGVybmFsLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dC9JbnB1dE1hbmFnZXJJbnRlcm5hbC5qYXZhCkBAIC05Niw3ICs5NiwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VmlydHVhbE1vdXNlUG9pbnRlckRpc3BsYXlJZCgpOwogCi0gICAgLyoqIEdldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIG1vdXNlIGN1cnNvci4gKi8KKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBjdXJzb3IuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE5hTi1zIGFzIHRoZSBjb29yZGluYXRlcyBpZiB0aGUgY3Vyc29yIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFBvaW50RiBnZXRDdXJzb3JQb3NpdGlvbigpOwogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0L0lucHV0TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGIyYjIyYTAuLmVmYzRmMTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yODYzLDkgKzI4NjMsNiBAQAogCiAgICAgICAgIGludCBnZXRQb2ludGVyRGlzcGxheUlkKCk7CiAKLSAgICAgICAgLyoqIEdldHMgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnNvcidzIGN1cnJlbnQgcG9zaXRpb24uICovCi0gICAgICAgIFBvaW50RiBnZXRDdXJzb3JQb3NpdGlvbigpOwotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBOb3RpZmllcyB3aW5kb3cgbWFuYWdlciB0aGF0IGEge0BsaW5rIGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCNBQ1RJT05fRE9XTn0gcG9pbnRlciBldmVudAogICAgICAgICAgKiBvY2N1cnJlZCBvbiBhIHdpbmRvdyB0aGF0IGRpZCBub3QgaGF2ZSBmb2N1cy4KQEAgLTMxODksNyArMzE4NiwxMSBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUG9pbnRGIGdldEN1cnNvclBvc2l0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1XaW5kb3dNYW5hZ2VyQ2FsbGJhY2tzLmdldEN1cnNvclBvc2l0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIHAgPSBtTmF0aXZlLmdldE1vdXNlQ3Vyc29yUG9zaXRpb24oKTsKKyAgICAgICAgICAgIGlmIChwID09IG51bGwgfHwgcC5sZW5ndGggIT0gMikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgbW91c2UgY3Vyc29yIHBvc2l0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50RihwWzBdLCBwWzFdKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dC9LZXlib2FyZExheW91dE1hbmFnZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvS2V5Ym9hcmRMYXlvdXRNYW5hZ2VyLmphdmEKaW5kZXggZjg3M2ExYi4uNGQ0YTg3ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dC9LZXlib2FyZExheW91dE1hbmFnZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0L0tleWJvYXJkTGF5b3V0TWFuYWdlci5qYXZhCkBAIC02NSw2ICs2NSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwubWVzc2FnZXMubmFuby5TeXN0ZW1NZXNzYWdlUHJvdG87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwubm90aWZpY2F0aW9uLlN5c3RlbU5vdGlmaWNhdGlvbkNoYW5uZWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlckludGVybmFsOwogCiBpbXBvcnQgbGliY29yZS5pby5TdHJlYW1zOwogCkBAIC0xMjI2LDkgKzEyMjcsMTUgQEAKICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFVzZXJNYW5hZ2VyLmNsYXNzKSk7CiAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbnB1dE1ldGhvZE1hbmFnZXIgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKAogICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoSW5wdXRNZXRob2RNYW5hZ2VyLmNsYXNzKSk7CisgICAgICAgIC8vIE5lZWQgdG8gdXNlIElucHV0TWV0aG9kTWFuYWdlckludGVybmFsIHRvIGNhbGwgZ2V0RW5hYmxlZElucHV0TWV0aG9kTGlzdEFzVXNlcigpCisgICAgICAgIC8vIGluc3RlYWQgb2YgdXNpbmcgSW5wdXRNZXRob2RNYW5hZ2VyIHdoaWNoIHVzZXMgZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9ucygpIHRoYXQKKyAgICAgICAgLy8gYnJlYWtzIHdoZW4gd2UgYXJlIGNhbGxpbmcgdGhlIG1ldGhvZCBmb3Igd29yayBwcm9maWxlIHVzZXIgSUQgc2luY2UgaXQgZG9lc24ndCBjaGVjaworICAgICAgICAvLyBzZWxmIHBlcm1pc3Npb25zLgorICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXJJbnRlcm5hbCBpbnB1dE1ldGhvZE1hbmFnZXJJbnRlcm5hbCA9IElucHV0TWV0aG9kTWFuYWdlckludGVybmFsLmdldCgpOwogICAgICAgICBmb3IgKFVzZXJIYW5kbGUgdXNlckhhbmRsZSA6IHVzZXJNYW5hZ2VyLmdldFVzZXJIYW5kbGVzKHRydWUgLyogZXhjbHVkZUR5aW5nICovKSkgewogICAgICAgICAgICAgaW50IHVzZXJJZCA9IHVzZXJIYW5kbGUuZ2V0SWRlbnRpZmllcigpOwotICAgICAgICAgICAgZm9yIChJbnB1dE1ldGhvZEluZm8gaW1lSW5mbyA6IGlucHV0TWV0aG9kTWFuYWdlci5nZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0QXNVc2VyKAorICAgICAgICAgICAgZm9yIChJbnB1dE1ldGhvZEluZm8gaW1lSW5mbyA6CisgICAgICAgICAgICAgICAgICAgIGlucHV0TWV0aG9kTWFuYWdlckludGVybmFsLmdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3RBc1VzZXIoCiAgICAgICAgICAgICAgICAgICAgIHVzZXJJZCkpIHsKICAgICAgICAgICAgICAgICBmb3IgKElucHV0TWV0aG9kU3VidHlwZSBpbWVTdWJ0eXBlIDoKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0TWV0aG9kTWFuYWdlci5nZXRFbmFibGVkSW5wdXRNZXRob2RTdWJ0eXBlTGlzdCgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvTmF0aXZlSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dC9OYXRpdmVJbnB1dE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMjIyMjZlOC4uNTM5NTMwMmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvTmF0aXZlSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXQvTmF0aXZlSW5wdXRNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yMjQsNiArMjI0LDE2IEBACiAgICAgLyoqIFNldCB3aGV0aGVyIHN0eWx1cyBidXR0b24gcmVwb3J0aW5nIHRocm91Z2ggbW90aW9uIGV2ZW50cyBzaG91bGQgYmUgZW5hYmxlZC4gKi8KICAgICB2b2lkIHNldFN0eWx1c0J1dHRvbk1vdGlvbkV2ZW50c0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgbW91c2UgY3Vyc29yLgorICAgICAqCisgICAgICogSWYgdGhlIG1vdXNlIGN1cnNvciBpcyBub3QgY3VycmVudGx5IHNob3duLCB0aGUgY29vcmRpbmF0ZSB2YWx1ZXMgd2lsbCBiZSBOYU4tcy4KKyAgICAgKgorICAgICAqIE5PVEU6IFRoaXMgd2lsbCBncmFiIHRoZSBQb2ludGVyQ29udHJvbGxlcidzIGxvY2ssIHNvIHdlIG11c3QgYmUgY2FyZWZ1bCBhYm91dCBjYWxsaW5nIHRoaXMKKyAgICAgKiBmcm9tIHRoZSBJbnB1dFJlYWRlciBvciBEaXNwbGF5IHRocmVhZHMsIHdoaWNoIG1heSByZXN1bHQgaW4gYSBkZWFkbG9jay4KKyAgICAgKi8KKyAgICBmbG9hdFtdIGdldE1vdXNlQ3Vyc29yUG9zaXRpb24oKTsKKwogICAgIC8qKiBUaGUgbmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIElucHV0TWFuYWdlclNlcnZpY2UgbWV0aG9kcy4gKi8KICAgICBjbGFzcyBOYXRpdmVJbXBsIGltcGxlbWVudHMgTmF0aXZlSW5wdXRNYW5hZ2VyU2VydmljZSB7CiAgICAgICAgIC8qKiBQb2ludGVyIHRvIG5hdGl2ZSBpbnB1dCBtYW5hZ2VyIHNlcnZpY2Ugb2JqZWN0LCB1c2VkIGJ5IG5hdGl2ZSBjb2RlLiAqLwpAQCAtNDY1LDUgKzQ3NSw4IEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBzZXRTdHlsdXNCdXR0b25Nb3Rpb25FdmVudHNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBuYXRpdmUgZmxvYXRbXSBnZXRNb3VzZUN1cnNvclBvc2l0aW9uKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dG1ldGhvZC9EZWZhdWx0SW1lVmlzaWJpbGl0eUFwcGxpZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvRGVmYXVsdEltZVZpc2liaWxpdHlBcHBsaWVyLmphdmEKaW5kZXggOWY3ZmYzMS4uMGFlMWU4MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dG1ldGhvZC9EZWZhdWx0SW1lVmlzaWJpbGl0eUFwcGxpZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0bWV0aG9kL0RlZmF1bHRJbWVWaXNpYmlsaXR5QXBwbGllci5qYXZhCkBAIC0xMzYsMTcgKzEzNiwxNiBAQAogICAgICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VySW50ZXJuYWwuc2hvd0ltZVBvc3RMYXlvdXQod2luZG93VG9rZW4sIHN0YXRzVG9rZW4pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTVEFURV9ISURFX0lNRToKLSAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UubUN1ckZvY3VzZWRXaW5kb3dDbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5oYXNBdHRhY2hlZENsaWVudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEltZVRyYWNrZXIuZm9yTG9nZ2luZygpLm9uUHJvZ3Jlc3Moc3RhdHNUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWVUcmFja2VyLlBIQVNFX1NFUlZFUl9BUFBMWV9JTUVfVklTSUJJTElUWSk7CiAgICAgICAgICAgICAgICAgICAgIC8vIElNTVMgb25seSBrbm93cyBvZiBmb2N1c2VkIHdpbmRvdywgbm90IHRoZSBhY3R1YWwgSU1FIHRhcmdldC4KICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiBpdCBpc24ndCBhd2FyZSBvZiBhbnkgd2luZG93IHRoYXQgaGFzIGJvdGgKICAgICAgICAgICAgICAgICAgICAgLy8gTk9UX0ZPQ1VTQUJMRSwgQUxUX0ZPQ1VTQUJMRV9JTSBmbGFncyBzZXQgYW5kIGNhbiB0aGUgSU1FIHRhcmdldC4KLSAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBpdCB0byB3aW5kb3cgbWFuYWdlciB0byBoaWRlIElNRSBmcm9tIElNRSB0YXJnZXQgd2luZG93LgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTM5ODYxMjcwKTogc2VuZCB0byBtQ3VyQ2xpZW50LmNsaWVudCBvbmNlIElNTVMgaXMgYXdhcmUgb2YKLSAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsIElNRSB0YXJnZXQuCisgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgaXQgdG8gd2luZG93IG1hbmFnZXIgdG8gaGlkZSBJTUUgZnJvbSB0aGUgYWN0dWFsIElNRSBjb250cm9sIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgdGFyZ2V0IGRpc3BsYXkuCiAgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VySW50ZXJuYWwuaGlkZUltZSh3aW5kb3dUb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5tQ3VyRm9jdXNlZFdpbmRvd0NsaWVudC5tU2VsZlJlcG9ydGVkRGlzcGxheUlkLCBzdGF0c1Rva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5nZXREaXNwbGF5SWRUb1Nob3dJbWVMb2NrZWQoKSwgc3RhdHNUb2tlbik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgSW1lVHJhY2tlci5mb3JMb2dnaW5nKCkub25GYWlsZWQoc3RhdHNUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWVUcmFja2VyLlBIQVNFX1NFUlZFUl9BUFBMWV9JTUVfVklTSUJJTElUWSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0bWV0aG9kL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDkxZjkxZjguLmIzMzZiOTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xNDg4LDE2ICsxNDg4LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFuZ2UgPSBpc1BhY2thZ2VEaXNhcHBlYXJpbmcoaW1pLmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFja2FnZU1vZGlmaWVkKGltaS5nZXRQYWNrYWdlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZGRpdGlvbmFsU3VidHlwZU1hcC5yZW1vdmUoaW1pLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxTdWJ0eXBlVXRpbHMuc2F2ZShtQWRkaXRpb25hbFN1YnR5cGVNYXAsIG1NZXRob2RNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3MuZ2V0Q3VycmVudFVzZXJJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UgPT0gUEFDS0FHRV9URU1QT1JBUllfQ0hBTkdFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5nZSA9PSBQQUNLQUdFX1BFUk1BTkVOVF9DSEFOR0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiSW5wdXQgbWV0aG9kIHVuaW5zdGFsbGVkLCBkaXNhYmxpbmc6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW1pLmdldENvbXBvbmVudCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dE1ldGhvZEVuYWJsZWRMb2NrZWQoaW1pLmdldElkKCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlID09IFBBQ0tBR0VfVVBEQVRJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklucHV0IG1ldGhvZCByZWluc3RhbGxpbmcsIGNsZWFyaW5nIGFkZGl0aW9uYWwgc3VidHlwZXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbWkuZ2V0Q29tcG9uZW50KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZGRpdGlvbmFsU3VidHlwZU1hcC5yZW1vdmUoaW1pLmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxTdWJ0eXBlVXRpbHMuc2F2ZShtQWRkaXRpb25hbFN1YnR5cGVNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWV0aG9kTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzLmdldEN1cnJlbnRVc2VySWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yMzM2LDYgKzIzMzksMTkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIHtAbGluayBDbGllbnRTdGF0ZX0gaGFzIGF0dGFjaGVkIGZyb20gc3RhcnRpbmcgdGhlIGlucHV0IGNvbm5lY3Rpb24uICovCisgICAgQEd1YXJkZWRCeSgiSW1mTG9jay5jbGFzcyIpCisgICAgYm9vbGVhbiBoYXNBdHRhY2hlZENsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJDbGllbnQgIT0gbnVsbDsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICB2b2lkIHNldEF0dGFjaGVkQ2xpZW50Rm9yVGVzdGluZyhATm9uTnVsbCBDbGllbnRTdGF0ZSBjcykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKEltZkxvY2suY2xhc3MpIHsKKyAgICAgICAgICAgIG1DdXJDbGllbnQgPSBjczsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBHdWFyZGVkQnkoIkltZkxvY2suY2xhc3MiKQogICAgIHZvaWQgY2xlYXJJbnB1dFNob3duTG9ja2VkKCkgewogICAgICAgICBtVmlzaWJpbGl0eVN0YXRlQ29tcHV0ZXIuc2V0SW5wdXRTaG93bihmYWxzZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2FsZXMvQXBwTG9jYWxlQ2hhbmdlZEF0b21SZWNvcmQuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYWxlcy9BcHBMb2NhbGVDaGFuZ2VkQXRvbVJlY29yZC5qYXZhCmluZGV4IDI4MmUzYzEuLjJiZTJlZjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYWxlcy9BcHBMb2NhbGVDaGFuZ2VkQXRvbVJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYWxlcy9BcHBMb2NhbGVDaGFuZ2VkQXRvbVJlY29yZC5qYXZhCkBAIC0zMCw3ICszMCw4IEBACiAgICAgU3RyaW5nIG1QcmV2TG9jYWxlcyA9ICIiOwogICAgIGludCBtU3RhdHVzID0gRnJhbWV3b3JrU3RhdHNMb2cKICAgICAgICAgICAgIC5BUFBMSUNBVElPTl9MT0NBTEVTX0NIQU5HRURfX1NUQVRVU19fU1RBVFVTX1VOU1BFQ0lGSUVEOwotCisgICAgaW50IG1DYWxsZXIgPSBGcmFtZXdvcmtTdGF0c0xvZworICAgICAgICAgICAgLkFQUExJQ0FUSU9OX0xPQ0FMRVNfQ0hBTkdFRF9fQ0FMTEVSX19DQUxMRVJfVU5LTk9XTjsKICAgICBBcHBMb2NhbGVDaGFuZ2VkQXRvbVJlY29yZChpbnQgY2FsbGluZ1VpZCkgewogICAgICAgICB0aGlzLm1DYWxsaW5nVWlkID0gY2FsbGluZ1VpZDsKICAgICB9CkBAIC01MCw0ICs1MSw4IEBACiAgICAgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cykgewogICAgICAgICB0aGlzLm1TdGF0dXMgPSBzdGF0dXM7CiAgICAgfQorCisgICAgdm9pZCBzZXRDYWxsZXIoaW50IGNhbGxlcikgeworICAgICAgICB0aGlzLm1DYWxsZXIgPSBjYWxsZXI7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhbGVzL0xvY2FsZU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2FsZXMvTG9jYWxlTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0OGQwNmNhLi5lM2E1NTViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2FsZXMvTG9jYWxlTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2FsZXMvTG9jYWxlTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNTUxLDcgKzU1MSw4IEBACiAgICAgICAgICAgICAgICAgYXRvbVJlY29yZEZvck1ldHJpY3MubVRhcmdldFVpZCwKICAgICAgICAgICAgICAgICBhdG9tUmVjb3JkRm9yTWV0cmljcy5tTmV3TG9jYWxlcywKICAgICAgICAgICAgICAgICBhdG9tUmVjb3JkRm9yTWV0cmljcy5tUHJldkxvY2FsZXMsCi0gICAgICAgICAgICAgICAgYXRvbVJlY29yZEZvck1ldHJpY3MubVN0YXR1cyk7CisgICAgICAgICAgICAgICAgYXRvbVJlY29yZEZvck1ldHJpY3MubVN0YXR1cywKKyAgICAgICAgICAgICAgICBhdG9tUmVjb3JkRm9yTWV0cmljcy5tQ2FsbGVyKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vZ25zcy9HbnNzQ29uZmlndXJhdGlvbi5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9nbnNzL0duc3NDb25maWd1cmF0aW9uLmphdmEKaW5kZXggNzdjZDY3My4uYTA4MWRmZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9nbnNzL0duc3NDb25maWd1cmF0aW9uLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9nbnNzL0duc3NDb25maWd1cmF0aW9uLmphdmEKQEAgLTkyLDYgKzkyLDggQEAKICAgICAvLyBSZXByZXNlbnRzIGFuIEhBTCBpbnRlcmZhY2UgdmVyc2lvbi4gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIGNyZWF0ZWQgaW4gdGhlIEpOSSBsYXllcgogICAgIC8vIGFuZCByZXR1cm5lZCB0aHJvdWdoIG5hdGl2ZSBtZXRob2RzLgogICAgIHN0YXRpYyBjbGFzcyBIYWxJbnRlcmZhY2VWZXJzaW9uIHsKKyAgICAgICAgLy8gbU1ham9yIGJlaW5nIHRoaXMgdmFsdWUgZGVub3RlcyBBSURMIEhBTC4gSW4gdGhpcyBjYXNlLCBtTWlub3IgZGVub3RlcyB0aGUgQUlETCB2ZXJzaW9uLgorICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFJRExfSU5URVJGQUNFID0gMzsKICAgICAgICAgZmluYWwgaW50IG1NYWpvcjsKICAgICAgICAgZmluYWwgaW50IG1NaW5vcjsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9nbnNzL0duc3NNZWFzdXJlbWVudHNQcm92aWRlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9nbnNzL0duc3NNZWFzdXJlbWVudHNQcm92aWRlci5qYXZhCmluZGV4IDZjNGM4MjkuLjA0MWYxMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vZ25zcy9HbnNzTWVhc3VyZW1lbnRzUHJvdmlkZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL2duc3MvR25zc01lYXN1cmVtZW50c1Byb3ZpZGVyLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uLmduc3MuR25zc01hbmFnZXJTZXJ2aWNlLkQ7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbi5nbnNzLkduc3NNYW5hZ2VyU2VydmljZS5UQUc7CiAKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkduc3NNZWFzdXJlbWVudFJlcXVlc3Q7CkBAIC0zMSw2ICszMiw3IEBACiBpbXBvcnQgYW5kcm9pZC5zdGF0cy5sb2NhdGlvbi5Mb2NhdGlvblN0YXRzRW51bXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbi5nbnNzLkduc3NDb25maWd1cmF0aW9uLkhhbEludGVyZmFjZVZlcnNpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uLmduc3MuaGFsLkduc3NOYXRpdmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uLmluamVjdG9yLkFwcE9wc0hlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb24uaW5qZWN0b3IuSW5qZWN0b3I7CkBAIC0xMTUsMTYgKzExNyw2IEBACiAgICAgICAgIGlmIChyZXF1ZXN0LmdldEludGVydmFsTWlsbGlzKCkgPT0gR25zc01lYXN1cmVtZW50UmVxdWVzdC5QQVNTSVZFX0lOVEVSVkFMKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICAvLyBUaGUgSEFMIGRvYyBkb2VzIG5vdCBzcGVjaWZ5IGlmIGNvbnNlY3V0aXZlIHN0YXJ0KCkgY2FsbHMgd2lsbCBiZSBhbGxvd2VkLgotICAgICAgICAvLyBTb21lIHZlbmRvcnMgbWF5IGlnbm9yZSB0aGUgMm5kIHN0YXJ0KCkgY2FsbCBpZiBzdG9wKCkgaXMgbm90IGNhbGxlZC4KLSAgICAgICAgLy8gVGh1cywgaGVyZSB3ZSBhbHdheXMgY2FsbCBzdG9wKCkgYmVmb3JlIGNhbGxpbmcgc3RhcnQoKSB0byBhdm9pZCBiZWluZyBpZ25vcmVkLgotICAgICAgICBpZiAobUduc3NOYXRpdmUuc3RvcE1lYXN1cmVtZW50Q29sbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBpZiAoRCkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInN0b3BwaW5nIGduc3MgbWVhc3VyZW1lbnRzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJlcnJvciBzdG9wcGluZyBnbnNzIG1lYXN1cmVtZW50cyIpOwotICAgICAgICB9CiAgICAgICAgIGlmIChtR25zc05hdGl2ZS5zdGFydE1lYXN1cmVtZW50Q29sbGVjdGlvbihyZXF1ZXN0LmlzRnVsbFRyYWNraW5nKCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdC5pc0NvcnJlbGF0aW9uVmVjdG9yT3V0cHV0c0VuYWJsZWQoKSwKICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldEludGVydmFsTWlsbGlzKCkpKSB7CkBAIC0xMzksNiArMTMxLDI4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVyZWdpc3RlcldpdGhTZXJ2aWNlKEduc3NNZWFzdXJlbWVudFJlcXVlc3Qgb2xkLAorICAgICAgICAgICAgR25zc01lYXN1cmVtZW50UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgQE5vbk51bGwgQ29sbGVjdGlvbjxHbnNzTGlzdGVuZXJSZWdpc3RyYXRpb24+IHJlZ2lzdHJhdGlvbnMpIHsKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0SW50ZXJ2YWxNaWxsaXMoKSA9PSBHbnNzTWVhc3VyZW1lbnRSZXF1ZXN0LlBBU1NJVkVfSU5URVJWQUwpIHsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJXaXRoU2VydmljZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgSGFsSW50ZXJmYWNlVmVyc2lvbiBoYWxJbnRlcmZhY2VWZXJzaW9uID0KKyAgICAgICAgICAgICAgICBtR25zc05hdGl2ZS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0SGFsSW50ZXJmYWNlVmVyc2lvbigpOworICAgICAgICBib29sZWFuIGFpZGxWM1BsdXMgPSBoYWxJbnRlcmZhY2VWZXJzaW9uLm1NYWpvciA9PSBIYWxJbnRlcmZhY2VWZXJzaW9uLkFJRExfSU5URVJGQUNFCisgICAgICAgICAgICAgICAgJiYgaGFsSW50ZXJmYWNlVmVyc2lvbi5tTWlub3IgPj0gMzsKKyAgICAgICAgaWYgKCFhaWRsVjNQbHVzKSB7CisgICAgICAgICAgICAvLyBUaGUgSEFMIGRvYyBkb2VzIG5vdCBzcGVjaWZ5IGlmIGNvbnNlY3V0aXZlIHN0YXJ0KCkgY2FsbHMgd2lsbCBiZSBhbGxvd2VkLgorICAgICAgICAgICAgLy8gU29tZSB2ZW5kb3JzIG1heSBpZ25vcmUgdGhlIDJuZCBzdGFydCgpIGNhbGwgaWYgc3RvcCgpIGlzIG5vdCBjYWxsZWQuCisgICAgICAgICAgICAvLyBUaHVzLCBoZXJlIHdlIGFsd2F5cyBjYWxsIHN0b3AoKSBiZWZvcmUgY2FsbGluZyBzdGFydCgpIHRvIGF2b2lkIGJlaW5nIGlnbm9yZWQuCisgICAgICAgICAgICAvLyBBSURMIHYzKyBpcyBmcmVlIGZyb20gdGhpcyBpc3N1ZS4KKyAgICAgICAgICAgIHVucmVnaXN0ZXJXaXRoU2VydmljZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWdpc3RlcldpdGhTZXJ2aWNlKHJlcXVlc3QsIHJlZ2lzdHJhdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJXaXRoU2VydmljZSgpIHsKICAgICAgICAgaWYgKG1HbnNzTmF0aXZlLnN0b3BNZWFzdXJlbWVudENvbGxlY3Rpb24oKSkgewogICAgICAgICAgICAgaWYgKEQpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9ja3NldHRpbmdzL0xvY2tTZXR0aW5nc1NlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9ja3NldHRpbmdzL0xvY2tTZXR0aW5nc1NlcnZpY2UuamF2YQppbmRleCBhZmFlMDhkLi4yYjVmODc0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2tzZXR0aW5ncy9Mb2NrU2V0dGluZ3NTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2Nrc2V0dGluZ3MvTG9ja1NldHRpbmdzU2VydmljZS5qYXZhCkBAIC00MjEsNiArNDIxLDggQEAKICAgICBzdGF0aWMgY2xhc3MgSW5qZWN0b3IgewogCiAgICAgICAgIHByb3RlY3RlZCBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIFNlcnZpY2VUaHJlYWQgbUhhbmRsZXJUaHJlYWQ7CisgICAgICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKIAogICAgICAgICBwdWJsaWMgSW5qZWN0b3IoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CkBAIC00MzEsMTQgKzQzMywyMCBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFNlcnZpY2VUaHJlYWQgZ2V0U2VydmljZVRocmVhZCgpIHsKLSAgICAgICAgICAgIFNlcnZpY2VUaHJlYWQgaGFuZGxlclRocmVhZCA9IG5ldyBTZXJ2aWNlVGhyZWFkKFRBRywgUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfQkFDS0dST1VORCwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmFsbG93SW8qLyk7Ci0gICAgICAgICAgICBoYW5kbGVyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlclRocmVhZDsKKyAgICAgICAgICAgIGlmIChtSGFuZGxlclRocmVhZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXJUaHJlYWQgPSBuZXcgU2VydmljZVRocmVhZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzLlRIUkVBRF9QUklPUklUWV9CQUNLR1JPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmFsbG93SW8qLyk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtSGFuZGxlclRocmVhZDsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBIYW5kbGVyIGdldEhhbmRsZXIoU2VydmljZVRocmVhZCBoYW5kbGVyVGhyZWFkKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhhbmRsZXIoaGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgICAgICBpZiAobUhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoaGFuZGxlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUhhbmRsZXI7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgTG9ja1NldHRpbmdzU3RvcmFnZSBnZXRTdG9yYWdlKCkgewpAQCAtNTE5LDcgKzUyNyw4IEBACiAKICAgICAgICAgcHVibGljIFJlYm9vdEVzY3Jvd01hbmFnZXIgZ2V0UmVib290RXNjcm93TWFuYWdlcihSZWJvb3RFc2Nyb3dNYW5hZ2VyLkNhbGxiYWNrcyBjYWxsYmFja3MsCiAgICAgICAgICAgICAgICAgTG9ja1NldHRpbmdzU3RvcmFnZSBzdG9yYWdlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlYm9vdEVzY3Jvd01hbmFnZXIobUNvbnRleHQsIGNhbGxiYWNrcywgc3RvcmFnZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlYm9vdEVzY3Jvd01hbmFnZXIobUNvbnRleHQsIGNhbGxiYWNrcywgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0SGFuZGxlcihnZXRTZXJ2aWNlVGhyZWFkKCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBpbnQgYmluZGVyR2V0Q2FsbGluZ1VpZCgpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9ja3NldHRpbmdzL1JlYm9vdEVzY3Jvd01hbmFnZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9ja3NldHRpbmdzL1JlYm9vdEVzY3Jvd01hbmFnZXIuamF2YQppbmRleCA5YjQyY2ZjLi5lMWNkMmM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2tzZXR0aW5ncy9SZWJvb3RFc2Nyb3dNYW5hZ2VyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2Nrc2V0dGluZ3MvUmVib290RXNjcm93TWFuYWdlci5qYXZhCkBAIC0yMDUsNiArMjA1LDggQEAKIAogICAgIHByaXZhdGUgZmluYWwgUmVib290RXNjcm93S2V5U3RvcmVNYW5hZ2VyIG1LZXlTdG9yZU1hbmFnZXI7CiAKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CisKICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVdha2VMb2NrOwogCiAgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlNYW5hZ2VyLk5ldHdvcmtDYWxsYmFjayBtTmV0d29ya0NhbGxiYWNrOwpAQCAtMzk5LDE5ICs0MDEsMjEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIFJlYm9vdEVzY3Jvd01hbmFnZXIoQ29udGV4dCBjb250ZXh0LCBDYWxsYmFja3MgY2FsbGJhY2tzLCBMb2NrU2V0dGluZ3NTdG9yYWdlIHN0b3JhZ2UpIHsKLSAgICAgICAgdGhpcyhuZXcgSW5qZWN0b3IoY29udGV4dCwgc3RvcmFnZSksIGNhbGxiYWNrcywgc3RvcmFnZSk7CisgICAgUmVib290RXNjcm93TWFuYWdlcihDb250ZXh0IGNvbnRleHQsIENhbGxiYWNrcyBjYWxsYmFja3MsIExvY2tTZXR0aW5nc1N0b3JhZ2Ugc3RvcmFnZSwKKyAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICB0aGlzKG5ldyBJbmplY3Rvcihjb250ZXh0LCBzdG9yYWdlKSwgY2FsbGJhY2tzLCBzdG9yYWdlLCBoYW5kbGVyKTsKICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBSZWJvb3RFc2Nyb3dNYW5hZ2VyKEluamVjdG9yIGluamVjdG9yLCBDYWxsYmFja3MgY2FsbGJhY2tzLAotICAgICAgICAgICAgTG9ja1NldHRpbmdzU3RvcmFnZSBzdG9yYWdlKSB7CisgICAgICAgICAgICBMb2NrU2V0dGluZ3NTdG9yYWdlIHN0b3JhZ2UsIEhhbmRsZXIgaGFuZGxlcikgewogICAgICAgICBtSW5qZWN0b3IgPSBpbmplY3RvcjsKICAgICAgICAgbUNhbGxiYWNrcyA9IGNhbGxiYWNrczsKICAgICAgICAgbVN0b3JhZ2UgPSBzdG9yYWdlOwogICAgICAgICBtVXNlck1hbmFnZXIgPSBpbmplY3Rvci5nZXRVc2VyTWFuYWdlcigpOwogICAgICAgICBtRXZlbnRMb2cgPSBpbmplY3Rvci5nZXRFdmVudExvZygpOwogICAgICAgICBtS2V5U3RvcmVNYW5hZ2VyID0gaW5qZWN0b3IuZ2V0S2V5U3RvcmVNYW5hZ2VyKCk7CisgICAgICAgIG1IYW5kbGVyID0gaGFuZGxlcjsKICAgICB9CiAKICAgICAvKiogV3JhcHBlciBmdW5jdGlvbiB0byBzZXQgZXJyb3IgY29kZSBzZXJpYWxpemVkIHRocm91Z2ggaGFuZGxlciwgKi8KQEAgLTkzNyw3ICs5NDEsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHNldFJlYm9vdEVzY3Jvd1JlYWR5KGJvb2xlYW4gcmVhZHkpIHsKICAgICAgICAgaWYgKG1SZWJvb3RFc2Nyb3dSZWFkeSAhPSByZWFkeSkgewotICAgICAgICAgICAgbVJlYm9vdEVzY3Jvd0xpc3RlbmVyLm9uUHJlcGFyZWRGb3JSZWJvb3QocmVhZHkpOworICAgICAgICAgICAgbUhhbmRsZXIucG9zdCgoKSAtPiBtUmVib290RXNjcm93TGlzdGVuZXIub25QcmVwYXJlZEZvclJlYm9vdChyZWFkeSkpOwogICAgICAgICB9CiAgICAgICAgIG1SZWJvb3RFc2Nyb3dSZWFkeSA9IHJlYWR5OwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL0NvbmRpdGlvblByb3ZpZGVycy5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vQ29uZGl0aW9uUHJvdmlkZXJzLmphdmEKaW5kZXggMzMyOWY1NC4uMDMwYzk2ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vQ29uZGl0aW9uUHJvdmlkZXJzLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vQ29uZGl0aW9uUHJvdmlkZXJzLmphdmEKQEAgLTI2MSwxMSArMjYxLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIENvbmRpdGlvbltdIHJlbW92ZUR1cGxpY2F0ZUNvbmRpdGlvbnMoU3RyaW5nIHBrZywgQ29uZGl0aW9uW10gY29uZGl0aW9ucykgeworICAgIHByaXZhdGUgQ29uZGl0aW9uW10gZ2V0VmFsaWRDb25kaXRpb25zKFN0cmluZyBwa2csIENvbmRpdGlvbltdIGNvbmRpdGlvbnMpIHsKICAgICAgICAgaWYgKGNvbmRpdGlvbnMgPT0gbnVsbCB8fCBjb25kaXRpb25zLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKICAgICAgICAgZmluYWwgaW50IE4gPSBjb25kaXRpb25zLmxlbmd0aDsKICAgICAgICAgZmluYWwgQXJyYXlNYXA8VXJpLCBDb25kaXRpb24+IHZhbGlkID0gbmV3IEFycmF5TWFwPFVyaSwgQ29uZGl0aW9uPihOKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb25kaXRpb25zW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiSWdub3JpbmcgbnVsbCBjb25kaXRpb24gZnJvbSAiICsgcGtnKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIFVyaSBpZCA9IGNvbmRpdGlvbnNbaV0uaWQ7CiAgICAgICAgICAgICBpZiAodmFsaWQuY29udGFpbnNLZXkoaWQpKSB7CiAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklnbm9yaW5nIGNvbmRpdGlvbiBmcm9tICIgKyBwa2cgKyAiIGZvciBkdXBsaWNhdGUgaWQ6ICIgKyBpZCk7CkBAIC0zMDMsNyArMzA3LDcgQEAKICAgICAgICAgc3luY2hyb25pemVkKG1NdXRleCkgewogICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAibm90aWZ5Q29uZGl0aW9ucyBwa2c9IiArIHBrZyArICIgaW5mbz0iICsgaW5mbyArICIgY29uZGl0aW9ucz0iCiAgICAgICAgICAgICAgICAgICAgICsgKGNvbmRpdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBBcnJheXMuYXNMaXN0KGNvbmRpdGlvbnMpKSk7Ci0gICAgICAgICAgICBjb25kaXRpb25zID0gcmVtb3ZlRHVwbGljYXRlQ29uZGl0aW9ucyhwa2csIGNvbmRpdGlvbnMpOworICAgICAgICAgICAgY29uZGl0aW9ucyA9IGdldFZhbGlkQ29uZGl0aW9ucyhwa2csIGNvbmRpdGlvbnMpOwogICAgICAgICAgICAgaWYgKGNvbmRpdGlvbnMgPT0gbnVsbCB8fCBjb25kaXRpb25zLmxlbmd0aCA9PSAwKSByZXR1cm47CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IGNvbmRpdGlvbnMubGVuZ3RoOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDUzYjAzZDUuLjQ2MzM3YTkgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjA1NSw4ICsyMDU1LDggQEAKIAogICAgIC8vIFRPRE8gLSByZXBsYWNlIHRoZXNlIG1ldGhvZHMgd2l0aCBuZXcgZmllbGRzIGluIHRoZSBWaXNpYmxlRm9yVGVzdGluZyBjb25zdHJ1Y3RvcgogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHZvaWQgc2V0QXVkaW9NYW5hZ2VyKEF1ZGlvTWFuYWdlciBhdWRpb01hbmFuZ2VyKSB7Ci0gICAgICAgIG1BdWRpb01hbmFnZXIgPSBhdWRpb01hbmFuZ2VyOworICAgIHZvaWQgc2V0QXVkaW9NYW5hZ2VyKEF1ZGlvTWFuYWdlciBhdWRpb01hbmFnZXIpIHsKKyAgICAgICAgbUF1ZGlvTWFuYWdlciA9IGF1ZGlvTWFuYWdlcjsKICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKQEAgLTU3NzIsNyArNTc3Miw3IEBACiAgICAgICAgICAgICAgICAgc3dpdGNoIChyZXBvcnQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRVBPUlRfUkVNT1RFX1ZJRVdTOgogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInB1bGxTdGF0cyBSRVBPUlRfUkVNT1RFX1ZJRVdTIGZyb206ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGFydE1zICsgIiAgd3RpaCAiICsgZG9BZ2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXJ0TXMgKyAiICB3aXRoICIgKyBkb0FnZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBQdWxsZWRTdGF0cyBzdGF0cyA9IG1Vc2FnZVN0YXRzLnJlbW90ZVZpZXdTdGF0cyhzdGFydE1zLCBkb0FnZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hZGQoc3RhdHMudG9QYXJjZWxGaWxlRGVzY3JpcHRvcihyZXBvcnQpKTsKQEAgLTY0NzAsNyArNjQ3MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBEb24ndCBhbGxvdyBjbGllbnQgYXBwbGljYXRpb25zIHRvIGNhbmNlbCBmb3JlZ3JvdW5kIHNlcnZpY2Ugbm90aXMgb3IgYXV0b2J1bmRsZWQKKyAgICAgICAgLy8gRG9uJ3QgYWxsb3cgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBjYW5jZWwgZm9yZWdyb3VuZCBzZXJ2aWNlIG5vdGlmcyBvciBhdXRvYnVuZGxlZAogICAgICAgICAvLyBzdW1tYXJpZXMuCiAgICAgICAgIGZpbmFsIGludCBtdXN0Tm90SGF2ZUZsYWdzID0gaXNDYWxsaW5nVWlkU3lzdGVtKCkgPyAwIDoKICAgICAgICAgICAgICAgICAoRkxBR19GT1JFR1JPVU5EX1NFUlZJQ0UgfCBGTEFHX0FVVE9HUk9VUF9TVU1NQVJZKTsKQEAgLTY4NjQsNyArNjg2NCw4IEBACiAgICAgICogQSBub3RpZmljYXRpb24gc2hvdWxkIGJlIGRpc21pc3NpYmxlLCB1bmxlc3MgaXQncyBleGVtcHRlZCBmb3Igc29tZSByZWFzb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbkJlTm9uRGlzbWlzc2libGUoQXBwbGljYXRpb25JbmZvIGFpLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBub3RpZmljYXRpb24uaXNNZWRpYU5vdGlmaWNhdGlvbigpIHx8IGlzRW50ZXJwcmlzZUV4ZW1wdGVkKGFpKTsKKyAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbi5pc01lZGlhTm90aWZpY2F0aW9uKCkgfHwgaXNFbnRlcnByaXNlRXhlbXB0ZWQoYWkpCisgICAgICAgICAgICAgICAgfHwgaXNDYWxsTm90aWZpY2F0aW9uKGFpLnBhY2thZ2VOYW1lLCBhaS51aWQsIG5vdGlmaWNhdGlvbik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzRW50ZXJwcmlzZUV4ZW1wdGVkKEFwcGxpY2F0aW9uSW5mbyBhaSkgewpAQCAtODM0Miw3ICs4MzQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCh3YWl0TXMpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7IH0KICAgICAgICAgICAgICAgICAgICAgLy8gTm90aWZpY2F0aW9ucyBtaWdodCBiZSBjYW5jZWxlZCBiZWZvcmUgaXQgYWN0dWFsbHkgdmlicmF0ZXMgZHVlIHRvIHdhaXRNcywKLSAgICAgICAgICAgICAgICAgICAgLy8gc28gbmVlZCB0byBjaGVjayB0aGUgbm90aWZpY2F0aW9uIHN0aWxsIHZhbGlkZSBmb3IgdmlicmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gc28gbmVlZCB0byBjaGVjayB0aGF0IHRoZSBub3RpZmljYXRpb24gaXMgc3RpbGwgdmFsaWQgZm9yIHZpYnJhdGUuCiAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobU5vdGlmaWNhdGlvbkxvY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uc0J5S2V5LmdldChyZWNvcmQuZ2V0S2V5KCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldEtleSgpLmVxdWFscyhtVmlicmF0ZU5vdGlmaWNhdGlvbktleSkpIHsKQEAgLTExNjk2LDcgKzExNjk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUFJJT1JJVFlfQVJHLmVxdWFscyhhKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBCdWdyZXBvcnQgd2lsbCBjYWxsIHRoZSBzZXJ2aWNlIHR3aWNlIHdpdGggcHJpb3JpdHkgYXJndW1lbnRzLCBmaXJzdCB0byBkdW1wCi0gICAgICAgICAgICAgICAgICAgIC8vIGNyaXRpY2FsIHNlY3Rpb25zIGFuZCB0aGVuIG5vbiBjcml0aWNhbCBvbmVzLiBTZXQgYXBwcm9yaWF0ZSBmaWx0ZXJzCisgICAgICAgICAgICAgICAgICAgIC8vIGNyaXRpY2FsIHNlY3Rpb25zIGFuZCB0aGVuIG5vbiBjcml0aWNhbCBvbmVzLiBTZXQgYXBwcm9wcmlhdGUgZmlsdGVycwogICAgICAgICAgICAgICAgICAgICAvLyB0byBnZW5lcmF0ZSB0aGUgZGVzaXJlZCBkYXRhLgogICAgICAgICAgICAgICAgICAgICBpZiAoYWkgPCBhcmdzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFpKys7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9WYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZS5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUuamF2YQppbmRleCA1ZTBhMTgwLi44NDE3MDQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9WYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL1ZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIHB1YmxpYyBjbGFzcyBWYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZSBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvblNpZ25hbEV4dHJhY3RvciB7CiAgICAgLy8gVXNpbmcgYSBzaG9ydGVyIGxvZyB0YWcgc2luY2Ugc2V0cHJvcCBoYXMgYSBsaW1pdCBvZiAzMmNoYXJzIG9uIHZhcmlhYmxlIG5hbWUuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWYWxpZGF0ZU5vUGVvcGxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTs7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRU5BQkxFX1BFT1BMRV9WQUxJREFUT1IgPSB0cnVlOwpAQCAtMTA1LDEyICsxMDUsMTMgQEAKICAgICBwcml2YXRlIGludCBtRXZpY3Rpb25Db3VudDsKICAgICBwcml2YXRlIE5vdGlmaWNhdGlvblVzYWdlU3RhdHMgbVVzYWdlU3RhdHM7CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbnRleHQgY29udGV4dCwgTm90aWZpY2F0aW9uVXNhZ2VTdGF0cyB1c2FnZVN0YXRzKSB7CiAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIkluaXRpYWxpemluZyAgIiArIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIi4iKTsKICAgICAgICAgbVVzZXJUb0NvbnRleHRNYXAgPSBuZXcgQXJyYXlNYXA8PigpOwogICAgICAgICBtQmFzZUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtVXNhZ2VTdGF0cyA9IHVzYWdlU3RhdHM7Ci0gICAgICAgIG1QZW9wbGVDYWNoZSA9IG5ldyBMcnVDYWNoZTxTdHJpbmcsIExvb2t1cFJlc3VsdD4oUEVPUExFX0NBQ0hFX1NJWkUpOworICAgICAgICBtUGVvcGxlQ2FjaGUgPSBuZXcgTHJ1Q2FjaGU8PihQRU9QTEVfQ0FDSEVfU0laRSk7CiAgICAgICAgIG1FbmFibGVkID0gRU5BQkxFX1BFT1BMRV9WQUxJREFUT1IgJiYgMSA9PSBTZXR0aW5ncy5HbG9iYWwuZ2V0SW50KAogICAgICAgICAgICAgICAgIG1CYXNlQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU0VUVElOR19FTkFCTEVfUEVPUExFX1ZBTElEQVRPUiwgMSk7CiAgICAgICAgIGlmIChtRW5hYmxlZCkgewpAQCAtMTM0LDcgKzEzNSw3IEBACiAgICAgLy8gRm9yIHRlc3RzOiBqdXN0IGRvIHRoZSBzZXR0aW5nIG9mIHZhcmlvdXMgbG9jYWwgdmFyaWFibGVzIHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgd29yawogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHByb3RlY3RlZCB2b2lkIGluaXRGb3JUZXN0cyhDb250ZXh0IGNvbnRleHQsIE5vdGlmaWNhdGlvblVzYWdlU3RhdHMgdXNhZ2VTdGF0cywKLSAgICAgICAgICAgIExydUNhY2hlIHBlb3BsZUNhY2hlKSB7CisgICAgICAgICAgICBMcnVDYWNoZTxTdHJpbmcsIExvb2t1cFJlc3VsdD4gcGVvcGxlQ2FjaGUpIHsKICAgICAgICAgbVVzZXJUb0NvbnRleHRNYXAgPSBuZXcgQXJyYXlNYXA8PigpOwogICAgICAgICBtQmFzZUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtVXNhZ2VTdGF0cyA9IHVzYWdlU3RhdHM7CkBAIC0xNDIsNiArMTQzLDcgQEAKICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSYW5raW5nUmVjb25zaWRlcmF0aW9uIHByb2Nlc3MoTm90aWZpY2F0aW9uUmVjb3JkIHJlY29yZCkgewogICAgICAgICBpZiAoIW1FbmFibGVkKSB7CiAgICAgICAgICAgICBpZiAoVkVSQk9TRSkgU2xvZy5pKFRBRywgImRpc2FibGVkIik7CkBAIC0yNzIsNyArMjc0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChWRVJCT1NFKSBTbG9nLmkoVEFHLCAiVmFsaWRhdGluZzogIiArIGtleSArICIgZm9yICIgKyBjb250ZXh0LmdldFVzZXJJZCgpKTsKLSAgICAgICAgZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IHBlbmRpbmdMb29rdXBzID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBMaW5rZWRMaXN0PFN0cmluZz4gcGVuZGluZ0xvb2t1cHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAgICAgICAgIGludCBwZXJzb25JZHggPSAwOwogICAgICAgICBmb3IgKFN0cmluZyBoYW5kbGUgOiBwZW9wbGUpIHsKICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShoYW5kbGUpKSBjb250aW51ZTsKQEAgLTMyMCw3ICszMjIsNiBAQAogICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyh1c2VySWQpICsgIjoiICsgaGFuZGxlOwogICAgIH0KIAotICAgIC8vIFZpc2libGVGb3JUZXN0aW5nCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFeHRyYVBlb3BsZShCdW5kbGUgZXh0cmFzKSB7CiAgICAgICAgIFN0cmluZ1tdIHBlb3BsZUxpc3QgPSBnZXRFeHRyYVBlb3BsZUZvcktleShleHRyYXMsIE5vdGlmaWNhdGlvbi5FWFRSQV9QRU9QTEVfTElTVCk7CiAgICAgICAgIFN0cmluZ1tdIGxlZ2FjeVBlb3BsZSA9IGdldEV4dHJhUGVvcGxlRm9yS2V5KGV4dHJhcywgTm90aWZpY2F0aW9uLkVYVFJBX1BFT1BMRSk7CkBAIC00MTcsMTAxICs0MTgsNiBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwcml2YXRlIExvb2t1cFJlc3VsdCByZXNvbHZlUGhvbmVDb250YWN0KENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIG51bWJlcikgewotICAgICAgICBVcmkgcGhvbmVVcmkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChDb250YWN0c0NvbnRyYWN0LlBob25lTG9va3VwLkNPTlRFTlRfRklMVEVSX1VSSSwKLSAgICAgICAgICAgICAgICBVcmkuZW5jb2RlKG51bWJlcikpOwotICAgICAgICByZXR1cm4gc2VhcmNoQ29udGFjdHMoY29udGV4dCwgcGhvbmVVcmkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTG9va3VwUmVzdWx0IHJlc29sdmVFbWFpbENvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgZW1haWwpIHsKLSAgICAgICAgVXJpIG51bWJlclVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKAotICAgICAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsLkNPTlRFTlRfTE9PS1VQX1VSSSwKLSAgICAgICAgICAgICAgICBVcmkuZW5jb2RlKGVtYWlsKSk7Ci0gICAgICAgIHJldHVybiBzZWFyY2hDb250YWN0cyhjb250ZXh0LCBudW1iZXJVcmkpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIExvb2t1cFJlc3VsdCBzZWFyY2hDb250YWN0cyhDb250ZXh0IGNvbnRleHQsIFVyaSBsb29rdXBVcmkpIHsKLSAgICAgICAgTG9va3VwUmVzdWx0IGxvb2t1cFJlc3VsdCA9IG5ldyBMb29rdXBSZXN1bHQoKTsKLSAgICAgICAgZmluYWwgVXJpIGNvcnBMb29rdXBVcmkgPQotICAgICAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuY3JlYXRlQ29ycExvb2t1cFVyaUZyb21FbnRlcnByaXNlTG9va3VwVXJpKGxvb2t1cFVyaSk7Ci0gICAgICAgIGlmIChjb3JwTG9va3VwVXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIGFkZENvbnRhY3RzKGxvb2t1cFJlc3VsdCwgY29udGV4dCwgbG9va3VwVXJpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZFdvcmtDb250YWN0cyhsb29rdXBSZXN1bHQsIGNvbnRleHQsIGNvcnBMb29rdXBVcmkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb29rdXBSZXN1bHQ7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgLy8gUGVyZm9ybXMgYSBjb250YWN0cyBzZWFyY2ggdXNpbmcgc2VhcmNoQ29udGFjdHMsIGFuZCB0aGVuIGZvbGxvd3MgdXAgYnkgbG9va2luZyB1cAotICAgIC8vIGFueSBwaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzdWx0aW5nIGNvbnRhY3QgaW5mb3JtYXRpb24gYW5kIG1lcmdlIHRob3NlCi0gICAgLy8gaW50byB0aGUgbG9va3VwIHJlc3VsdCBhcyB3ZWxsLiBXaWxsIGhhdmUgbm8gYWRkaXRpb25hbCBlZmZlY3QgaWYgdGhlIGNvbnRhY3QgZG9lcwotICAgIC8vIG5vdCBoYXZlIGFueSBwaG9uZSBudW1iZXJzLgotICAgIExvb2t1cFJlc3VsdCBzZWFyY2hDb250YWN0c0FuZExvb2t1cE51bWJlcnMoQ29udGV4dCBjb250ZXh0LCBVcmkgbG9va3VwVXJpKSB7Ci0gICAgICAgIExvb2t1cFJlc3VsdCBsb29rdXBSZXN1bHQgPSBzZWFyY2hDb250YWN0cyhjb250ZXh0LCBsb29rdXBVcmkpOwotICAgICAgICBTdHJpbmcgcGhvbmVMb29rdXBLZXkgPSBsb29rdXBSZXN1bHQuZ2V0UGhvbmVMb29rdXBLZXkoKTsKLSAgICAgICAgaWYgKHBob25lTG9va3VwS2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBDb250YWN0cy5MT09LVVBfS0VZICsgIiA9ID8iOwotICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbXSB7IHBob25lTG9va3VwS2V5IH07Ci0gICAgICAgICAgICB0cnkgKEN1cnNvciBjdXJzb3IgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAotICAgICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZS5DT05URU5UX1VSSSwgUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgLyogc29ydE9yZGVyPSAqLyBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ3Vyc29yIGlzIG51bGwgd2hlbiBxdWVyeWluZyBjb250YWN0IHBob25lIG51bWJlci4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvb2t1cFJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb29rdXBSZXN1bHQubWVyZ2VQaG9uZU51bWJlcihjdXJzb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlByb2JsZW0gZ2V0dGluZyBjb250ZW50IHJlc29sdmVyIG9yIHF1ZXJ5aW5nIHBob25lIG51bWJlcnMuIiwgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvb2t1cFJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkV29ya0NvbnRhY3RzKExvb2t1cFJlc3VsdCBsb29rdXBSZXN1bHQsIENvbnRleHQgY29udGV4dCwgVXJpIGNvcnBMb29rdXBVcmkpIHsKLSAgICAgICAgZmluYWwgaW50IHdvcmtVc2VySWQgPSBmaW5kV29ya1VzZXJJZChjb250ZXh0KTsKLSAgICAgICAgaWYgKHdvcmtVc2VySWQgPT0gLTEpIHsKLSAgICAgICAgICAgIFNsb2cudyhUQUcsICJXb3JrIHByb2ZpbGUgdXNlciBJRCBub3QgZm91bmQgZm9yIHdvcmsgY29udGFjdDogIiArIGNvcnBMb29rdXBVcmkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFVyaSBjb3JwTG9va3VwVXJpV2l0aFVzZXJJZCA9Ci0gICAgICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyLm1heWJlQWRkVXNlcklkKGNvcnBMb29rdXBVcmksIHdvcmtVc2VySWQpOwotICAgICAgICBhZGRDb250YWN0cyhsb29rdXBSZXN1bHQsIGNvbnRleHQsIGNvcnBMb29rdXBVcmlXaXRoVXNlcklkKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgdXNlciBJRCBvZiB0aGUgbWFuYWdlZCBwcm9maWxlIG9yIC0xIGlmIG5vbmUgaXMgZm91bmQuICovCi0gICAgcHJpdmF0ZSBpbnQgZmluZFdvcmtVc2VySWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIFVzZXJNYW5hZ2VyIHVzZXJNYW5hZ2VyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFVzZXJNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgZmluYWwgaW50W10gcHJvZmlsZUlkcyA9Ci0gICAgICAgICAgICAgICAgdXNlck1hbmFnZXIuZ2V0UHJvZmlsZUlkcyhjb250ZXh0LmdldFVzZXJJZCgpLCAvKiBlbmFibGVkT25seT0gKi8gdHJ1ZSk7Ci0gICAgICAgIGZvciAoaW50IHByb2ZpbGVJZCA6IHByb2ZpbGVJZHMpIHsKLSAgICAgICAgICAgIGlmICh1c2VyTWFuYWdlci5pc01hbmFnZWRQcm9maWxlKHByb2ZpbGVJZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZUlkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiogTW9kaWZpZXMgdGhlIGdpdmVuIGxvb2t1cCByZXN1bHQgdG8gYWRkIGNvbnRhY3RzIGZvdW5kIGF0IHRoZSBnaXZlbiBVUkkuICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbnRhY3RzKExvb2t1cFJlc3VsdCBsb29rdXBSZXN1bHQsIENvbnRleHQgY29udGV4dCwgVXJpIHVyaSkgewotICAgICAgICB0cnkgKEN1cnNvciBjID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKLSAgICAgICAgICAgICAgICB1cmksIExPT0tVUF9QUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKSkgewotICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJOdWxsIGN1cnNvciBmcm9tIGNvbnRhY3RzIHF1ZXJ5LiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgICAgIGxvb2t1cFJlc3VsdC5tZXJnZUNvbnRhY3QoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBTbG9nLncoVEFHLCAiUHJvYmxlbSBnZXR0aW5nIGNvbnRlbnQgcmVzb2x2ZXIgb3IgcGVyZm9ybWluZyBjb250YWN0cyBxdWVyeS4iLCB0KTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTG9va3VwUmVzdWx0IHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBDT05UQUNUX1JFRlJFU0hfTUlMTElTID0gNjAgKiA2MCAqIDEwMDA7ICAvLyAxaHIKQEAgLTYxOSwxOSArNTI1LDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIFBlb3BsZVJhbmtpbmdSZWNvbnNpZGVyYXRpb24gZXh0ZW5kcyBSYW5raW5nUmVjb25zaWRlcmF0aW9uIHsKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBjbGFzcyBQZW9wbGVSYW5raW5nUmVjb25zaWRlcmF0aW9uIGV4dGVuZHMgUmFua2luZ1JlY29uc2lkZXJhdGlvbiB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IG1QZW5kaW5nTG9va3VwczsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogCi0gICAgICAgIC8vIEFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIGEgcmVzdWx0IGZyb20gdGhlIGNvbnRhY3RzIGRiIGJlZm9yZSByZWNoZWNraW5nIGFmZmluaXR5LgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIExPT0tVUF9USU1FID0gMTAwMDsKICAgICAgICAgcHJpdmF0ZSBmbG9hdCBtQ29udGFjdEFmZmluaXR5ID0gTk9ORTsKICAgICAgICAgcHJpdmF0ZSBBcnJheVNldDxTdHJpbmc+IG1QaG9uZU51bWJlcnMgPSBudWxsOwogICAgICAgICBwcml2YXRlIE5vdGlmaWNhdGlvblJlY29yZCBtUmVjb3JkOwogCiAgICAgICAgIHByaXZhdGUgUGVvcGxlUmFua2luZ1JlY29uc2lkZXJhdGlvbihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBrZXksCiAgICAgICAgICAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IHBlbmRpbmdMb29rdXBzKSB7Ci0gICAgICAgICAgICBzdXBlcihrZXksIExPT0tVUF9USU1FKTsKKyAgICAgICAgICAgIHN1cGVyKGtleSk7CiAgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgICAgICBtUGVuZGluZ0xvb2t1cHMgPSBwZW5kaW5nTG9va3VwczsKICAgICAgICAgfQpAQCAtNjQyLDcgKzU0Nyw3IEBACiAgICAgICAgICAgICBsb25nIHRpbWVTdGFydE1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBoYW5kbGU6IG1QZW5kaW5nTG9va3VwcykgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjYWNoZUtleSA9IGdldENhY2hlS2V5KG1Db250ZXh0LmdldFVzZXJJZCgpLCBoYW5kbGUpOwotICAgICAgICAgICAgICAgIExvb2t1cFJlc3VsdCBsb29rdXBSZXN1bHQgPSBudWxsOworICAgICAgICAgICAgICAgIExvb2t1cFJlc3VsdCBsb29rdXBSZXN1bHQ7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBjYWNoZUhpdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBlb3BsZUNhY2hlKSB7CiAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFJlc3VsdCA9IG1QZW9wbGVDYWNoZS5nZXQoY2FjaGVLZXkpOwpAQCAtNzAzLDYgKzYwOCwxMDIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHByaXZhdGUgc3RhdGljIExvb2t1cFJlc3VsdCByZXNvbHZlUGhvbmVDb250YWN0KENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIG51bWJlcikgeworICAgICAgICAgICAgVXJpIHBob25lVXJpID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQ29udGFjdHNDb250cmFjdC5QaG9uZUxvb2t1cC5DT05URU5UX0ZJTFRFUl9VUkksCisgICAgICAgICAgICAgICAgICAgIFVyaS5lbmNvZGUobnVtYmVyKSk7CisgICAgICAgICAgICByZXR1cm4gc2VhcmNoQ29udGFjdHMoY29udGV4dCwgcGhvbmVVcmkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTG9va3VwUmVzdWx0IHJlc29sdmVFbWFpbENvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgZW1haWwpIHsKKyAgICAgICAgICAgIFVyaSBudW1iZXJVcmkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aCgKKyAgICAgICAgICAgICAgICAgICAgQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWwuQ09OVEVOVF9MT09LVVBfVVJJLAorICAgICAgICAgICAgICAgICAgICBVcmkuZW5jb2RlKGVtYWlsKSk7CisgICAgICAgICAgICByZXR1cm4gc2VhcmNoQ29udGFjdHMoY29udGV4dCwgbnVtYmVyVXJpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgICAgICBzdGF0aWMgTG9va3VwUmVzdWx0IHNlYXJjaENvbnRhY3RzKENvbnRleHQgY29udGV4dCwgVXJpIGxvb2t1cFVyaSkgeworICAgICAgICAgICAgTG9va3VwUmVzdWx0IGxvb2t1cFJlc3VsdCA9IG5ldyBMb29rdXBSZXN1bHQoKTsKKyAgICAgICAgICAgIGZpbmFsIFVyaSBjb3JwTG9va3VwVXJpID0KKyAgICAgICAgICAgICAgICAgICAgQ29udGFjdHNDb250cmFjdC5Db250YWN0cy5jcmVhdGVDb3JwTG9va3VwVXJpRnJvbUVudGVycHJpc2VMb29rdXBVcmkobG9va3VwVXJpKTsKKyAgICAgICAgICAgIGlmIChjb3JwTG9va3VwVXJpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRDb250YWN0cyhsb29rdXBSZXN1bHQsIGNvbnRleHQsIGxvb2t1cFVyaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkZFdvcmtDb250YWN0cyhsb29rdXBSZXN1bHQsIGNvbnRleHQsIGNvcnBMb29rdXBVcmkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxvb2t1cFJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgICAgICAvLyBQZXJmb3JtcyBhIGNvbnRhY3RzIHNlYXJjaCB1c2luZyBzZWFyY2hDb250YWN0cywgYW5kIHRoZW4gZm9sbG93cyB1cCBieSBsb29raW5nIHVwCisgICAgICAgIC8vIGFueSBwaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzdWx0aW5nIGNvbnRhY3QgaW5mb3JtYXRpb24gYW5kIG1lcmdlIHRob3NlCisgICAgICAgIC8vIGludG8gdGhlIGxvb2t1cCByZXN1bHQgYXMgd2VsbC4gV2lsbCBoYXZlIG5vIGFkZGl0aW9uYWwgZWZmZWN0IGlmIHRoZSBjb250YWN0IGRvZXMKKyAgICAgICAgLy8gbm90IGhhdmUgYW55IHBob25lIG51bWJlcnMuCisgICAgICAgIHN0YXRpYyBMb29rdXBSZXN1bHQgc2VhcmNoQ29udGFjdHNBbmRMb29rdXBOdW1iZXJzKENvbnRleHQgY29udGV4dCwgVXJpIGxvb2t1cFVyaSkgeworICAgICAgICAgICAgTG9va3VwUmVzdWx0IGxvb2t1cFJlc3VsdCA9IHNlYXJjaENvbnRhY3RzKGNvbnRleHQsIGxvb2t1cFVyaSk7CisgICAgICAgICAgICBTdHJpbmcgcGhvbmVMb29rdXBLZXkgPSBsb29rdXBSZXN1bHQuZ2V0UGhvbmVMb29rdXBLZXkoKTsKKyAgICAgICAgICAgIGlmIChwaG9uZUxvb2t1cEtleSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IENvbnRhY3RzLkxPT0tVUF9LRVkgKyAiID0gPyI7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbXSB7IHBob25lTG9va3VwS2V5IH07CisgICAgICAgICAgICAgICAgdHJ5IChDdXJzb3IgY3Vyc29yID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lLkNPTlRFTlRfVVJJLCBQSE9ORV9MT09LVVBfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgLyogc29ydE9yZGVyPSAqLyBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJDdXJzb3IgaXMgbnVsbCB3aGVuIHF1ZXJ5aW5nIGNvbnRhY3QgcGhvbmUgbnVtYmVyLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvb2t1cFJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBSZXN1bHQubWVyZ2VQaG9uZU51bWJlcihjdXJzb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlByb2JsZW0gZ2V0dGluZyBjb250ZW50IHJlc29sdmVyIG9yIHF1ZXJ5aW5nIHBob25lIG51bWJlcnMuIiwgdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxvb2t1cFJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkV29ya0NvbnRhY3RzKExvb2t1cFJlc3VsdCBsb29rdXBSZXN1bHQsIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICBVcmkgY29ycExvb2t1cFVyaSkgeworICAgICAgICAgICAgZmluYWwgaW50IHdvcmtVc2VySWQgPSBmaW5kV29ya1VzZXJJZChjb250ZXh0KTsKKyAgICAgICAgICAgIGlmICh3b3JrVXNlcklkID09IC0xKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIldvcmsgcHJvZmlsZSB1c2VyIElEIG5vdCBmb3VuZCBmb3Igd29yayBjb250YWN0OiAiICsgY29ycExvb2t1cFVyaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgVXJpIGNvcnBMb29rdXBVcmlXaXRoVXNlcklkID0KKyAgICAgICAgICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyLm1heWJlQWRkVXNlcklkKGNvcnBMb29rdXBVcmksIHdvcmtVc2VySWQpOworICAgICAgICAgICAgYWRkQ29udGFjdHMobG9va3VwUmVzdWx0LCBjb250ZXh0LCBjb3JwTG9va3VwVXJpV2l0aFVzZXJJZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgdXNlciBJRCBvZiB0aGUgbWFuYWdlZCBwcm9maWxlIG9yIC0xIGlmIG5vbmUgaXMgZm91bmQuICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBmaW5kV29ya1VzZXJJZChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGZpbmFsIFVzZXJNYW5hZ2VyIHVzZXJNYW5hZ2VyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFVzZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIHByb2ZpbGVJZHMgPQorICAgICAgICAgICAgICAgICAgICB1c2VyTWFuYWdlci5nZXRQcm9maWxlSWRzKGNvbnRleHQuZ2V0VXNlcklkKCksIC8qIGVuYWJsZWRPbmx5PSAqLyB0cnVlKTsKKyAgICAgICAgICAgIGZvciAoaW50IHByb2ZpbGVJZCA6IHByb2ZpbGVJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAodXNlck1hbmFnZXIuaXNNYW5hZ2VkUHJvZmlsZShwcm9maWxlSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1vZGlmaWVzIHRoZSBnaXZlbiBsb29rdXAgcmVzdWx0IHRvIGFkZCBjb250YWN0cyBmb3VuZCBhdCB0aGUgZ2l2ZW4gVVJJLiAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZENvbnRhY3RzKExvb2t1cFJlc3VsdCBsb29rdXBSZXN1bHQsIENvbnRleHQgY29udGV4dCwgVXJpIHVyaSkgeworICAgICAgICAgICAgdHJ5IChDdXJzb3IgYyA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgIHVyaSwgTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiTnVsbCBjdXJzb3IgZnJvbSBjb250YWN0cyBxdWVyeS4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9va3VwUmVzdWx0Lm1lcmdlQ29udGFjdChjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJQcm9ibGVtIGdldHRpbmcgY29udGVudCByZXNvbHZlciBvciBwZXJmb3JtaW5nIGNvbnRhY3RzIHF1ZXJ5LiIsIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5Q2hhbmdlc0xvY2tlZChOb3RpZmljYXRpb25SZWNvcmQgb3BlcmFuZCkgewogICAgICAgICAgICAgZmxvYXQgYWZmaW5pdHlCb3VuZCA9IG9wZXJhbmQuZ2V0Q29udGFjdEFmZmluaXR5KCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0NvbXB1dGVyLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0NvbXB1dGVyLmphdmEKaW5kZXggYzIzMmIzNi4uOTc0OGFiYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Db21wdXRlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vQ29tcHV0ZXIuamF2YQpAQCAtNDEsNiArNDEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TaWduaW5nRGV0YWlsczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uVXNlckluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlZlcnNpb25lZFBhY2thZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CkBAIC00OTksNyArNTAwLDcgQEAKICAgICBTdHJpbmcgZ2V0SW5zdGFsbGVyUGFja2FnZU5hbWUoQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lLCBAVXNlcklkSW50IGludCB1c2VySWQpOwogCiAgICAgQE51bGxhYmxlCi0gICAgSW5zdGFsbFNvdXJjZUluZm8gZ2V0SW5zdGFsbFNvdXJjZUluZm8oQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lKTsKKyAgICBJbnN0YWxsU291cmNlSW5mbyBnZXRJbnN0YWxsU291cmNlSW5mbyhATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUsIEBVc2VySWRJbnQgaW50IHVzZXJJZCk7CiAKICAgICBAUGFja2FnZU1hbmFnZXIuRW5hYmxlZFN0YXRlCiAgICAgaW50IGdldEFwcGxpY2F0aW9uRW5hYmxlZFNldHRpbmcoQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lLCBAVXNlcklkSW50IGludCB1c2VySWQpOwpAQCAtNTE5LDE0ICs1MjAsMTUgQEAKICAgICAgKiByZXR1cm5zIGZhbHNlLgogICAgICAqLwogICAgIGJvb2xlYW4gaXNDb21wb25lbnRFZmZlY3RpdmVseUVuYWJsZWQoQE5vbk51bGwgQ29tcG9uZW50SW5mbyBjb21wb25lbnRJbmZvLAotICAgICAgICAgICAgQFVzZXJJZEludCBpbnQgdXNlcklkKTsKKyAgICAgICAgICAgIEBOb25OdWxsIFVzZXJIYW5kbGUgdXNlckhhbmRsZSk7CiAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJ1bnRpbWUgYXBwIHVzZXIgZW5hYmxlZCBzdGF0ZSBhbmQgdGhlIGluc3RhbGwtdGltZSBhcHAgbWFuaWZlc3QgZW5hYmxlZAogICAgICAqIHN0YXRlIGFyZSBib3RoIGVmZmVjdGl2ZWx5IGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBhcHAuIE9yIGlmIHRoZSBhcHAgY2Fubm90IGJlIGZvdW5kLAogICAgICAqIHJldHVybnMgZmFsc2UuCiAgICAgICovCi0gICAgYm9vbGVhbiBpc0FwcGxpY2F0aW9uRWZmZWN0aXZlbHlFbmFibGVkKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwgQFVzZXJJZEludCBpbnQgdXNlcklkKTsKKyAgICBib29sZWFuIGlzQXBwbGljYXRpb25FZmZlY3RpdmVseUVuYWJsZWQoQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgQE5vbk51bGwgVXNlckhhbmRsZSB1c2VySGFuZGxlKTsKIAogICAgIEBOdWxsYWJsZQogICAgIEtleVNldCBnZXRLZXlTZXRCeUFsaWFzKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwgQE5vbk51bGwgU3RyaW5nIGFsaWFzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vQ29tcHV0ZXJFbmdpbmUuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vQ29tcHV0ZXJFbmdpbmUuamF2YQppbmRleCA1OTg0MzYwLi5hY2Q0YTk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0NvbXB1dGVyRW5naW5lLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Db21wdXRlckVuZ2luZS5qYXZhCkBAIC00OTgyLDkgKzQ5ODIsMTEgQEAKIAogICAgIEBPdmVycmlkZQogICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBJbnN0YWxsU291cmNlSW5mbyBnZXRJbnN0YWxsU291cmNlSW5mbyhATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICBwdWJsaWMgSW5zdGFsbFNvdXJjZUluZm8gZ2V0SW5zdGFsbFNvdXJjZUluZm8oQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgQFVzZXJJZEludCBpbnQgdXNlcklkKSB7CiAgICAgICAgIGZpbmFsIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgZmluYWwgaW50IHVzZXJJZCA9IFVzZXJIYW5kbGUuZ2V0VXNlcklkKGNhbGxpbmdVaWQpOworICAgICAgICBlbmZvcmNlQ3Jvc3NVc2VyUGVybWlzc2lvbihjYWxsaW5nVWlkLCB1c2VySWQsIGZhbHNlIC8qIHJlcXVpcmVGdWxsUGVybWlzc2lvbiAqLywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKiBjaGVja1NoZWxsICovLCAiZ2V0SW5zdGFsbFNvdXJjZUluZm8iKTsKIAogICAgICAgICBTdHJpbmcgaW5zdGFsbGVyUGFja2FnZU5hbWU7CiAgICAgICAgIFN0cmluZyBpbml0aWF0aW5nUGFja2FnZU5hbWU7CkBAIC01MTI5LDkgKzUxMzEsMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcG9uZW50RWZmZWN0aXZlbHlFbmFibGVkKEBOb25OdWxsIENvbXBvbmVudEluZm8gY29tcG9uZW50SW5mbywKLSAgICAgICAgICAgIEBVc2VySWRJbnQgaW50IHVzZXJJZCkgeworICAgICAgICAgICAgQE5vbk51bGwgVXNlckhhbmRsZSB1c2VySGFuZGxlKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjb21wb25lbnRJbmZvLnBhY2thZ2VOYW1lOworICAgICAgICAgICAgaW50IHVzZXJJZCA9IHVzZXJIYW5kbGUuZ2V0SWRlbnRpZmllcigpOwogICAgICAgICAgICAgaW50IGFwcEVuYWJsZWRTZXR0aW5nID0KICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzLmdldEFwcGxpY2F0aW9uRW5hYmxlZFNldHRpbmcocGFja2FnZU5hbWUsIHVzZXJJZCk7CiAgICAgICAgICAgICBpZiAoYXBwRW5hYmxlZFNldHRpbmcgPT0gQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfREVGQVVMVCkgewpAQCAtNTE1NCw5ICs1MTU3LDEwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uRWZmZWN0aXZlbHlFbmFibGVkKEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIEBVc2VySWRJbnQgaW50IHVzZXJJZCkgeworICAgICAgICAgICAgQE5vbk51bGwgVXNlckhhbmRsZSB1c2VySGFuZGxlKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgYXBwRW5hYmxlZFNldHRpbmcgPSBtU2V0dGluZ3MuZ2V0QXBwbGljYXRpb25FbmFibGVkU2V0dGluZyhwYWNrYWdlTmFtZSwgdXNlcklkKTsKKyAgICAgICAgICAgIGludCBhcHBFbmFibGVkU2V0dGluZyA9IG1TZXR0aW5ncy5nZXRBcHBsaWNhdGlvbkVuYWJsZWRTZXR0aW5nKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICB1c2VySGFuZGxlLmdldElkZW50aWZpZXIoKSk7CiAgICAgICAgICAgICBpZiAoYXBwRW5hYmxlZFNldHRpbmcgPT0gQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfREVGQVVMVCkgewogICAgICAgICAgICAgICAgIGZpbmFsIEFuZHJvaWRQYWNrYWdlIHBrZyA9IGdldFBhY2thZ2UocGFja2FnZU5hbWUpOwogICAgICAgICAgICAgICAgIGlmIChwa2cgPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9JUGFja2FnZU1hbmFnZXJCYXNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0lQYWNrYWdlTWFuYWdlckJhc2UuamF2YQppbmRleCBkMzljYWMwLi5jMjllNGQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0lQYWNrYWdlTWFuYWdlckJhc2UuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0lQYWNrYWdlTWFuYWdlckJhc2UuamF2YQpAQCAtNDYzLDggKzQ2Myw5IEBACiAgICAgQE92ZXJyaWRlCiAgICAgQE51bGxhYmxlCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgZmluYWwgSW5zdGFsbFNvdXJjZUluZm8gZ2V0SW5zdGFsbFNvdXJjZUluZm8oQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIHJldHVybiBzbmFwc2hvdCgpLmdldEluc3RhbGxTb3VyY2VJbmZvKHBhY2thZ2VOYW1lKTsKKyAgICBwdWJsaWMgZmluYWwgSW5zdGFsbFNvdXJjZUluZm8gZ2V0SW5zdGFsbFNvdXJjZUluZm8oQE5vbk51bGwgU3RyaW5nIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgQFVzZXJJZEludCBpbnQgdXNlcklkKSB7CisgICAgICAgIHJldHVybiBzbmFwc2hvdCgpLmdldEluc3RhbGxTb3VyY2VJbmZvKHBhY2thZ2VOYW1lLCB1c2VySWQpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9JbmNyZW1lbnRhbFByb2dyZXNzTGlzdGVuZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vSW5jcmVtZW50YWxQcm9ncmVzc0xpc3RlbmVyLmphdmEKaW5kZXggNzAzYmJkYS4uNDIwZTJlOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9JbmNyZW1lbnRhbFByb2dyZXNzTGlzdGVuZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL0luY3JlbWVudGFsUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCkBAIC00Nyw2ICs0Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IHN0YXRlLnNldExvYWRpbmdQcm9ncmVzcyhwcm9ncmVzcykpOwogICAgICAgICAgICAgLy8gT25seSByZXBvcnQgdGhlIHN0YXRlIGNoYW5nZSB3aGVuIGxvYWRpbmcgc3RhdGUgY2hhbmdlcyBmcm9tIGxvYWRpbmcgdG8gbm90CiAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoMS4wZiAtIHByb2dyZXNzKSA8IDAuMDAwMDAwMDFmKSB7CisgICAgICAgICAgICAgICAgbVBtLmNvbW1pdFBhY2thZ2VTdGF0ZU11dGF0aW9uKG51bGwsIG1QYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IHN0YXRlLnNldExvYWRpbmdDb21wbGV0ZWRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CiAgICAgICAgICAgICAgICAgLy8gVW5yZWdpc3RlciBwcm9ncmVzcyBsaXN0ZW5lcgogICAgICAgICAgICAgICAgIG1QbS5tSW5jcmVtZW50YWxNYW5hZ2VyCiAgICAgICAgICAgICAgICAgICAgICAgICAudW5yZWdpc3RlckxvYWRpbmdQcm9ncmVzc0NhbGxiYWNrcyhwYWNrYWdlU3RhdGUuZ2V0UGF0aFN0cmluZygpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUGFja2FnZUluc3RhbGxlclNlc3Npb24uamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUGFja2FnZUluc3RhbGxlclNlc3Npb24uamF2YQppbmRleCBmYTUzNWMzLi4wM2UwZDM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VJbnN0YWxsZXJTZXNzaW9uLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9QYWNrYWdlSW5zdGFsbGVyU2Vzc2lvbi5qYXZhCkBAIC05MjUsNyArOTI1LDcgQEAKICAgICAgICAgZmluYWwgaW50IHRhcmdldFBhY2thZ2VVaWQgPSBzbmFwc2hvdC5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwLCB1c2VySWQpOwogICAgICAgICBmaW5hbCBib29sZWFuIGlzVXBkYXRlID0gdGFyZ2V0UGFja2FnZVVpZCAhPSAtMSB8fCBpc0FwZXhTZXNzaW9uKCk7CiAgICAgICAgIGZpbmFsIEluc3RhbGxTb3VyY2VJbmZvIGV4aXN0aW5nSW5zdGFsbFNvdXJjZUluZm8gPSBpc1VwZGF0ZQotICAgICAgICAgICAgICAgID8gc25hcHNob3QuZ2V0SW5zdGFsbFNvdXJjZUluZm8ocGFja2FnZU5hbWUpCisgICAgICAgICAgICAgICAgPyBzbmFwc2hvdC5nZXRJbnN0YWxsU291cmNlSW5mbyhwYWNrYWdlTmFtZSwgdXNlcklkKQogICAgICAgICAgICAgICAgIDogbnVsbDsKICAgICAgICAgZmluYWwgU3RyaW5nIGV4aXN0aW5nSW5zdGFsbGVyUGFja2FnZU5hbWUgPSBleGlzdGluZ0luc3RhbGxTb3VyY2VJbmZvICE9IG51bGwKICAgICAgICAgICAgICAgICA/IGV4aXN0aW5nSW5zdGFsbFNvdXJjZUluZm8uZ2V0SW5zdGFsbGluZ1BhY2thZ2VOYW1lKCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGQzZWU1MmMuLjZiYzg3NjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTMyOCw3ICsxMzI4LDggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBQYXJjZWxhYmxlRXhjZXB0aW9uKG5ldyBQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24ocGFja2FnZU5hbWUpKTsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIEluc3RhbGxTb3VyY2VJbmZvIGluc3RhbGxTb3VyY2VJbmZvID0gc25hcHNob3QuZ2V0SW5zdGFsbFNvdXJjZUluZm8ocGFja2FnZU5hbWUpOworICAgICAgICBmaW5hbCBJbnN0YWxsU291cmNlSW5mbyBpbnN0YWxsU291cmNlSW5mbyA9IHNuYXBzaG90LmdldEluc3RhbGxTb3VyY2VJbmZvKHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIHVzZXJJZCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBpbnN0YWxsZXJQYWNrYWdlTmFtZTsKICAgICAgICAgaWYgKGluc3RhbGxTb3VyY2VJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoaW5zdGFsbFNvdXJjZUluZm8uZ2V0SW5pdGlhdGluZ1BhY2thZ2VOYW1lKCkpKSB7CkBAIC0yNTY5LDcgKzI1NzAsNyBAQAogCiAgICAgICAgICAgICBpZiAoYmVzdCA9PSBudWxsIHx8IGN1ci5wcmlvcml0eSA+IGJlc3QucHJpb3JpdHkpIHsKICAgICAgICAgICAgICAgICBpZiAoY29tcHV0ZXIuaXNDb21wb25lbnRFZmZlY3RpdmVseUVuYWJsZWQoY3VyLmdldENvbXBvbmVudEluZm8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUuVVNFUl9TWVNURU0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVc2VySGFuZGxlLlNZU1RFTSkpIHsKICAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGN1cjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRG9tYWluIHZlcmlmaWNhdGlvbiBhZ2VudCBmb3VuZCBidXQgbm90IGVuYWJsZWQiKTsKQEAgLTY4MTEsNyArNjgxMiw4IEBACiAgICAgICAgICAgICBpZiAocHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmNyZW1lbnRhbFN0YXRlc0luZm8ocHMuaXNMb2FkaW5nKCksIHBzLmdldExvYWRpbmdQcm9ncmVzcygpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxTdGF0ZXNJbmZvKHBzLmlzTG9hZGluZygpLCBwcy5nZXRMb2FkaW5nUHJvZ3Jlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgcHMuZ2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUGFja2FnZVNldHRpbmcuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUGFja2FnZVNldHRpbmcuamF2YQppbmRleCAyYTExNzJjLi44MzlmZjQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VTZXR0aW5nLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9QYWNrYWdlU2V0dGluZy5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlVzZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5vdmVybGF5Lk92ZXJsYXlQYXRoczsKIGltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5pbmNyZW1lbnRhbC5JbmNyZW1lbnRhbE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnBtLlBhY2thZ2VQcm90bzsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKQEAgLTE0MCw2ICsxNDEsNyBAQAogICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoU3RyaW5nOwogCiAgICAgcHJpdmF0ZSBmbG9hdCBtTG9hZGluZ1Byb2dyZXNzOworICAgIHByaXZhdGUgbG9uZyBtTG9hZGluZ0NvbXBsZXRlZFRpbWU7CiAKICAgICBATnVsbGFibGUKICAgICBwcml2YXRlIFN0cmluZyBtUHJpbWFyeUNwdUFiaTsKQEAgLTYzMCw2ICs2MzIsNyBAQAogICAgICAgICBzdXBlci5jb3B5U2V0dGluZ0Jhc2Uob3RoZXIpOwogICAgICAgICBtU2hhcmVkVXNlckFwcElkID0gb3RoZXIubVNoYXJlZFVzZXJBcHBJZDsKICAgICAgICAgbUxvYWRpbmdQcm9ncmVzcyA9IG90aGVyLm1Mb2FkaW5nUHJvZ3Jlc3M7CisgICAgICAgIG1Mb2FkaW5nQ29tcGxldGVkVGltZSA9IG90aGVyLm1Mb2FkaW5nQ29tcGxldGVkVGltZTsKICAgICAgICAgbGVnYWN5TmF0aXZlTGlicmFyeVBhdGggPSBvdGhlci5sZWdhY3lOYXRpdmVMaWJyYXJ5UGF0aDsKICAgICAgICAgbU5hbWUgPSBvdGhlci5tTmFtZTsKICAgICAgICAgbVJlYWxOYW1lID0gb3RoZXIubVJlYWxOYW1lOwpAQCAtMTE0Niw2ICsxMTQ5LDkgQEAKICAgICAgICAgcmV0dXJuIHJlYWRVc2VyU3RhdGUodXNlcklkKS5nZXRTcGxhc2hTY3JlZW5UaGVtZSgpOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzSW5jcmVtZW50YWwoKSB7CisgICAgICAgIHJldHVybiBJbmNyZW1lbnRhbE1hbmFnZXIuaXNJbmNyZW1lbnRhbFBhdGgobVBhdGhTdHJpbmcpOworICAgIH0KICAgICAvKioKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgcGFja2FnZSBpcyBzdGlsbCBiZWluZyBsb2FkZWQsIGZhbHNlIGlmIHRoZSBwYWNrYWdlIGlzIGZ1bGx5IGxvYWRlZC4KICAgICAgKi8KQEAgLTExNTksNiArMTE2NSwxMiBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICBwdWJsaWMgUGFja2FnZVNldHRpbmcgc2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUobG9uZyBsb2FkaW5nQ29tcGxldGVkVGltZSkgeworICAgICAgICBtTG9hZGluZ0NvbXBsZXRlZFRpbWUgPSBsb2FkaW5nQ29tcGxldGVkVGltZTsKKyAgICAgICAgb25DaGFuZ2VkKCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIEBOb25OdWxsCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgZ2V0VmVyc2lvbkNvZGUoKSB7CkBAIC0xNDg5LDYgKzE1MDEsMTEgQEAKICAgICB9CiAKICAgICBARGF0YUNsYXNzLkdlbmVyYXRlZC5NZW1iZXIKKyAgICBwdWJsaWMgbG9uZyBnZXRMb2FkaW5nQ29tcGxldGVkVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Mb2FkaW5nQ29tcGxldGVkVGltZTsKKyAgICB9CisKKyAgICBARGF0YUNsYXNzLkdlbmVyYXRlZC5NZW1iZXIKICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRDcHVBYmlPdmVycmlkZSgpIHsKICAgICAgICAgcmV0dXJuIG1DcHVBYmlPdmVycmlkZTsKICAgICB9CkBAIC0xNTYzLDEwICsxNTgwLDEwIEBACiAgICAgfQogCiAgICAgQERhdGFDbGFzcy5HZW5lcmF0ZWQoCi0gICAgICAgICAgICB0aW1lID0gMTY2NTc3OTAwMzc0NEwsCisgICAgICAgICAgICB0aW1lID0gMTY3ODIyODYyNTg1M0wsCiAgICAgICAgICAgICBjb2RlZ2VuVmVyc2lvbiA9ICIxLjAuMjMiLAogICAgICAgICAgICAgc291cmNlRmlsZSA9ICJmcmFtZXdvcmtzL2Jhc2Uvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9QYWNrYWdlU2V0dGluZy5qYXZhIiwKLSAgICAgICAgICAgIGlucHV0U2lnbmF0dXJlcyA9ICJwcml2YXRlICBpbnQgbVNoYXJlZFVzZXJBcHBJZFxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5TdHJpbmc+PiBtaW1lR3JvdXBzXG5wcml2YXRlIEBqYXZhLmxhbmcuRGVwcmVjYXRlZCBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLlN0cmluZz4gbU9sZENvZGVQYXRoc1xucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmdbXSB1c2VzU2RrTGlicmFyaWVzXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgbG9uZ1tdIHVzZXNTZGtMaWJyYXJpZXNWZXJzaW9uc01ham9yXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZ1tdIHVzZXNTdGF0aWNMaWJyYXJpZXNcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBsb25nW10gdXNlc1N0YXRpY0xpYnJhcmllc1ZlcnNpb25zXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgQGphdmEubGFuZy5EZXByZWNhdGVkIGphdmEubGFuZy5TdHJpbmcgbGVnYWN5TmF0aXZlTGlicmFyeVBhdGhcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGphdmEubGFuZy5TdHJpbmcgbU5hbWVcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIG1SZWFsTmFtZVxucHJpdmF0ZSAgaW50IG1BcHBJZFxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wYXJzaW5nLnBrZy5BbmRyb2lkUGFja2FnZUludGVybmFsIHBrZ1xucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgamF2YS5pby5GaWxlIG1QYXRoXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBqYXZhLmxhbmcuU3RyaW5nIG1QYXRoU3RyaW5nXG5wcml2YXRlICBmbG9hdCBtTG9hZGluZ1Byb2dyZXNzXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZyBtUHJpbWFyeUNwdUFiaVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgbVNlY29uZGFyeUNwdUFiaVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgbUNwdUFiaU92ZXJyaWRlXG5wcml2YXRlICBsb25nIG1MYXN0TW9kaWZpZWRUaW1lXG5wcml2YXRlICBsb25nIGxhc3RVcGRhdGVUaW1lXG5wcml2YXRlICBsb25nIHZlcnNpb25Db2RlXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNpZ25hdHVyZXMgc2lnbmF0dXJlc1xucHJpdmF0ZSAgYm9vbGVhbiBpbnN0YWxsUGVybWlzc2lvbnNGaXhlZFxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VLZXlTZXREYXRhIGtleVNldERhdGFcbnByaXZhdGUgZmluYWwgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTxjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VVc2VyU3RhdGVJbXBsPiBtVXNlclN0YXRlc1xucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLkluc3RhbGxTb3VyY2UgaW5zdGFsbFNvdXJjZVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgdm9sdW1lVXVpZFxucHJpdmF0ZSAgaW50IGNhdGVnb3J5T3ZlcnJpZGVcbnByaXZhdGUgIGJvb2xlYW4gdXBkYXRlQXZhaWxhYmxlXG5wcml2YXRlICBib29sZWFuIGZvcmNlUXVlcnlhYmxlT3ZlcnJpZGVcbnByaXZhdGUgZmluYWwgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVN0YXRlVW5zZXJpYWxpemVkIHBrZ1N0YXRlXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBqYXZhLnV0aWwuVVVJRCBtRG9tYWluU2V0SWRcbnByaXZhdGUgZmluYWwgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5TbmFwc2hvdENhY2hlPGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZz4gbVNuYXBzaG90XG5wcml2YXRlICBjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuU25hcHNob3RDYWNoZTxjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmc+IG1ha2VDYWNoZSgpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzbmFwc2hvdCgpXG5wdWJsaWMgIHZvaWQgZHVtcERlYnVnKGFuZHJvaWQudXRpbC5wcm90by5Qcm90b091dHB1dFN0cmVhbSxsb25nLGphdmEudXRpbC5MaXN0PGFuZHJvaWQuY29udGVudC5wbS5Vc2VySW5mbz4sY29tLmFuZHJvaWQuc2VydmVyLnBtLnBlcm1pc3Npb24uTGVnYWN5UGVybWlzc2lvbkRhdGFQcm92aWRlcilcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEFwcElkKGludClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldENwdUFiaU92ZXJyaWRlKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRGaXJzdEluc3RhbGxUaW1lRnJvbVJlcGxhY2VkKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVN0YXRlSW50ZXJuYWwsaW50W10pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRGaXJzdEluc3RhbGxUaW1lKGxvbmcsaW50KVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0Rm9yY2VRdWVyeWFibGVPdmVycmlkZShib29sZWFuKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0SW5zdGFsbGVyUGFja2FnZU5hbWUoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEluc3RhbGxTb3VyY2UoY29tLmFuZHJvaWQuc2VydmVyLnBtLkluc3RhbGxTb3VyY2UpXG4gIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyByZW1vdmVJbnN0YWxsZXJQYWNrYWdlKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRJc09ycGhhbmVkKGJvb2xlYW4pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRLZXlTZXREYXRhKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlS2V5U2V0RGF0YSlcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldExhc3RNb2RpZmllZFRpbWUobG9uZylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldExhc3RVcGRhdGVUaW1lKGxvbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRMb25nVmVyc2lvbkNvZGUobG9uZylcbnB1YmxpYyAgYm9vbGVhbiBzZXRNaW1lR3JvdXAoamF2YS5sYW5nLlN0cmluZyxhbmRyb2lkLnV0aWwuQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRQa2coY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5BbmRyb2lkUGFja2FnZSlcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFBrZ1N0YXRlTGlicmFyeUZpbGVzKGphdmEudXRpbC5Db2xsZWN0aW9uPGphdmEubGFuZy5TdHJpbmc+KVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0UHJpbWFyeUNwdUFiaShqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0U2Vjb25kYXJ5Q3B1QWJpKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRTaWduYXR1cmVzKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2lnbmF0dXJlcylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFZvbHVtZVV1aWQoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaXNFeHRlcm5hbFN0b3JhZ2UoKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0VXBkYXRlQXZhaWxhYmxlKGJvb2xlYW4pXG5wdWJsaWMgIHZvaWQgc2V0U2hhcmVkVXNlckFwcElkKGludClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGludCBnZXRTaGFyZWRVc2VyQXBwSWQoKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgYm9vbGVhbiBoYXNTaGFyZWRVc2VyKClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKVxucHJvdGVjdGVkICB2b2lkIGNvcHlNaW1lR3JvdXBzKGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5TdHJpbmc+PilcbnB1YmxpYyAgdm9pZCB1cGRhdGVGcm9tKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZylcbiAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHVwZGF0ZU1pbWVHcm91cHMoamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPilcbnB1YmxpYyBAamF2YS5sYW5nLkRlcHJlY2F0ZWQgQGphdmEubGFuZy5PdmVycmlkZSBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGVybWlzc2lvbi5MZWdhY3lQZXJtaXNzaW9uU3RhdGUgZ2V0TGVnYWN5UGVybWlzc2lvblN0YXRlKClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEluc3RhbGxQZXJtaXNzaW9uc0ZpeGVkKGJvb2xlYW4pXG5wdWJsaWMgIGJvb2xlYW4gaXNQcml2aWxlZ2VkKClcbnB1YmxpYyAgYm9vbGVhbiBpc09lbSgpXG5wdWJsaWMgIGJvb2xlYW4gaXNWZW5kb3IoKVxucHVibGljICBib29sZWFuIGlzUHJvZHVjdCgpXG5wdWJsaWMgQGphdmEubGFuZy5PdmVycmlkZSBib29sZWFuIGlzUmVxdWlyZWRGb3JTeXN0ZW1Vc2VyKClcbnB1YmxpYyAgYm9vbGVhbiBpc1N5c3RlbUV4dCgpXG5wdWJsaWMgIGJvb2xlYW4gaXNPZG0oKVxucHVibGljICBib29sZWFuIGlzU3lzdGVtKClcbnB1YmxpYyAgYW5kcm9pZC5jb250ZW50LnBtLlNpZ25pbmdEZXRhaWxzIGdldFNpZ25pbmdEZXRhaWxzKClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFNpZ25pbmdEZXRhaWxzKGFuZHJvaWQuY29udGVudC5wbS5TaWduaW5nRGV0YWlscylcbnB1YmxpYyAgdm9pZCBjb3B5UGFja2FnZVNldHRpbmcoY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nLGJvb2xlYW4pXG4gQGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVVzZXJTdGF0ZUltcGwgbW9kaWZ5VXNlclN0YXRlKGludClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlVXNlclN0YXRlSW1wbCBnZXRPckNyZWF0ZVVzZXJTdGF0ZShpbnQpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVVzZXJTdGF0ZUludGVybmFsIHJlYWRVc2VyU3RhdGUoaW50KVxuICB2b2lkIHNldEVuYWJsZWQoaW50LGludCxqYXZhLmxhbmcuU3RyaW5nKVxuICBpbnQgZ2V0RW5hYmxlZChpbnQpXG4gIHZvaWQgc2V0SW5zdGFsbGVkKGJvb2xlYW4saW50KVxuICBib29sZWFuIGdldEluc3RhbGxlZChpbnQpXG4gIGludCBnZXRJbnN0YWxsUmVhc29uKGludClcbiAgdm9pZCBzZXRJbnN0YWxsUmVhc29uKGludCxpbnQpXG4gIGludCBnZXRVbmluc3RhbGxSZWFzb24oaW50KVxuICB2b2lkIHNldFVuaW5zdGFsbFJlYXNvbihpbnQsaW50KVxuIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQucG0ub3ZlcmxheS5PdmVybGF5UGF0aHMgZ2V0T3ZlcmxheVBhdGhzKGludClcbiAgYm9vbGVhbiBzZXRPdmVybGF5UGF0aHNGb3JMaWJyYXJ5KGphdmEubGFuZy5TdHJpbmcsYW5kcm9pZC5jb250ZW50LnBtLm92ZXJsYXkuT3ZlcmxheVBhdGhzLGludClcbiAgYm9vbGVhbiBpc0FueUluc3RhbGxlZChpbnRbXSlcbiAgaW50W10gcXVlcnlJbnN0YWxsZWRVc2VycyhpbnRbXSxib29sZWFuKVxuICBsb25nIGdldENlRGF0YUlub2RlKGludClcbiAgdm9pZCBzZXRDZURhdGFJbm9kZShsb25nLGludClcbiAgYm9vbGVhbiBnZXRTdG9wcGVkKGludClcbiAgdm9pZCBzZXRTdG9wcGVkKGJvb2xlYW4saW50KVxuICBib29sZWFuIGdldE5vdExhdW5jaGVkKGludClcbiAgdm9pZCBzZXROb3RMYXVuY2hlZChib29sZWFuLGludClcbiAgYm9vbGVhbiBnZXRIaWRkZW4oaW50KVxuICB2b2lkIHNldEhpZGRlbihib29sZWFuLGludClcbiAgaW50IGdldERpc3RyYWN0aW9uRmxhZ3MoaW50KVxuICB2b2lkIHNldERpc3RyYWN0aW9uRmxhZ3MoaW50LGludClcbnB1YmxpYyAgYm9vbGVhbiBnZXRJbnN0YW50QXBwKGludClcbiAgdm9pZCBzZXRJbnN0YW50QXBwKGJvb2xlYW4saW50KVxuICBib29sZWFuIGdldFZpcnR1YWxQcmVsb2FkKGludClcbiAgdm9pZCBzZXRWaXJ0dWFsUHJlbG9hZChib29sZWFuLGludClcbiAgdm9pZCBzZXRVc2VyU3RhdGUoaW50LGxvbmcsaW50LGJvb2xlYW4sYm9vbGVhbixib29sZWFuLGJvb2xlYW4saW50LGFuZHJvaWQudXRpbC5BcnJheU1hcDxqYXZhLmxhbmcuU3RyaW5nLGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuU3VzcGVuZFBhcmFtcz4sYm9vbGVhbixib29sZWFuLGphdmEubGFuZy5TdHJpbmcsYW5kcm9pZC51dGlsLkFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+LGFuZHJvaWQudXRpbC5BcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPixpbnQsaW50LGphdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLlN0cmluZyxsb25nKVxuICB2b2lkIHNldFVzZXJTdGF0ZShpbnQsY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlVXNlclN0YXRlSW50ZXJuYWwpXG4gIGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5XYXRjaGVkQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4gZ2V0RW5hYmxlZENvbXBvbmVudHMoaW50KVxuICBjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuV2F0Y2hlZEFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+IGdldERpc2FibGVkQ29tcG9uZW50cyhpbnQpXG4gIHZvaWQgc2V0RW5hYmxlZENvbXBvbmVudHMoY29tLmFuZHJvaWQuc2VydmVyLnV0aWxzLldhdGNoZWRBcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPixpbnQpXG4gIHZvaWQgc2V0RGlzYWJsZWRDb21wb25lbnRzKGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5XYXRjaGVkQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4saW50KVxuICB2b2lkIHNldEVuYWJsZWRDb21wb25lbnRzQ29weShjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuV2F0Y2hlZEFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+LGludClcbiAgdm9pZCBzZXREaXNhYmxlZENvbXBvbmVudHNDb3B5KGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5XYXRjaGVkQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4saW50KVxuICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VVc2VyU3RhdGVJbXBsIG1vZGlmeVVzZXJTdGF0ZUNvbXBvbmVudHMoaW50LGJvb2xlYW4sYm9vbGVhbilcbiAgdm9pZCBhZGREaXNhYmxlZENvbXBvbmVudChqYXZhLmxhbmcuU3RyaW5nLGludClcbiAgdm9pZCBhZGRFbmFibGVkQ29tcG9uZW50KGphdmEubGFuZy5TdHJpbmcsaW50KVxuICBib29sZWFuIGVuYWJsZUNvbXBvbmVudExQdyhqYXZhLmxhbmcuU3RyaW5nLGludClcbiAgYm9vbGVhbiBkaXNhYmxlQ29tcG9uZW50TFB3KGphdmEubGFuZy5TdHJpbmcsaW50KVxuICBib29sZWFuIHJlc3RvcmVDb21wb25lbnRMUHcoamF2YS5sYW5nLlN0cmluZyxpbnQpXG4gIGludCBnZXRDdXJyZW50RW5hYmxlZFN0YXRlTFByKGphdmEubGFuZy5TdHJpbmcsaW50KVxuICB2b2lkIHJlbW92ZVVzZXIoaW50KVxucHVibGljICBpbnRbXSBnZXROb3RJbnN0YWxsZWRVc2VySWRzKClcbiAgdm9pZCB3cml0ZVBhY2thZ2VVc2VyUGVybWlzc2lvbnNQcm90byhhbmRyb2lkLnV0aWwucHJvdG8uUHJvdG9PdXRwdXRTdHJlYW0sbG9uZyxqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmNvbnRlbnQucG0uVXNlckluZm8+LGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wZXJtaXNzaW9uLkxlZ2FjeVBlcm1pc3Npb25EYXRhUHJvdmlkZXIpXG5wcm90ZWN0ZWQgIHZvaWQgd3JpdGVVc2Vyc0luZm9Ub1Byb3RvKGFuZHJvaWQudXRpbC5wcm90by5Qcm90b091dHB1dFN0cmVhbSxsb25nKVxuICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0UGF0aChqYXZhLmlvLkZpbGUpXG5wdWJsaWMgQGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nIGJvb2xlYW4gb3ZlcnJpZGVOb25Mb2NhbGl6ZWRMYWJlbEFuZEljb24oYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUsamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuSW50ZWdlcixpbnQpXG5wdWJsaWMgIHZvaWQgcmVzZXRPdmVycmlkZUNvbXBvbmVudExhYmVsSWNvbihpbnQpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIGdldFNwbGFzaFNjcmVlblRoZW1lKGludClcbnB1YmxpYyAgYm9vbGVhbiBpc0xvYWRpbmcoKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0TG9hZGluZ1Byb2dyZXNzKGZsb2F0KVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGxvbmcgZ2V0VmVyc2lvbkNvZGUoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPj4gZ2V0TWltZUdyb3VwcygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlTmFtZSgpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBAamF2YS5sYW5nLk92ZXJyaWRlIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuQW5kcm9pZFBhY2thZ2UgZ2V0QW5kcm9pZFBhY2thZ2UoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQucG0uU2lnbmluZ0luZm8gZ2V0U2lnbmluZ0luZm8oKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGphdmEubGFuZy5TdHJpbmdbXSBnZXRVc2VzU2RrTGlicmFyaWVzKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBsb25nW10gZ2V0VXNlc1Nka0xpYnJhcmllc1ZlcnNpb25zTWFqb3IoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGphdmEubGFuZy5TdHJpbmdbXSBnZXRVc2VzU3RhdGljTGlicmFyaWVzKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBsb25nW10gZ2V0VXNlc1N0YXRpY0xpYnJhcmllc1ZlcnNpb25zKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLnV0aWwuTGlzdDxjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlNoYXJlZExpYnJhcnk+IGdldFVzZXNMaWJyYXJpZXMoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgYWRkVXNlc0xpYnJhcnlJbmZvKGFuZHJvaWQuY29udGVudC5wbS5TaGFyZWRMaWJyYXJ5SW5mbylcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBnZXRVc2VzTGlicmFyeUZpbGVzKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIGFkZFVzZXNMaWJyYXJ5RmlsZShqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgYm9vbGVhbiBpc0hpZGRlblVudGlsSW5zdGFsbGVkKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBsb25nW10gZ2V0TGFzdFBhY2thZ2VVc2FnZVRpbWUoKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgYm9vbGVhbiBpc1VwZGF0ZWRTeXN0ZW1BcHAoKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgYm9vbGVhbiBpc0Fwa0luVXBkYXRlZEFwZXgoKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0RG9tYWluU2V0SWQoamF2YS51dGlsLlVVSUQpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRDYXRlZ29yeU92ZXJyaWRlKGludClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldExlZ2FjeU5hdGl2ZUxpYnJhcnlQYXRoKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRNaW1lR3JvdXBzKGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5TdHJpbmc+PilcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldE9sZENvZGVQYXRocyhqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5TdHJpbmc+KVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0VXNlc1Nka0xpYnJhcmllcyhqYXZhLmxhbmcuU3RyaW5nW10pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRVc2VzU2RrTGlicmFyaWVzVmVyc2lvbnNNYWpvcihsb25nW10pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRVc2VzU3RhdGljTGlicmFyaWVzKGphdmEubGFuZy5TdHJpbmdbXSlcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFVzZXNTdGF0aWNMaWJyYXJpZXNWZXJzaW9ucyhsb25nW10pXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlU3RhdGVVbnNlcmlhbGl6ZWQgZ2V0VHJhbnNpZW50U3RhdGUoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk8PyBleHRlbmRzIFBhY2thZ2VVc2VyU3RhdGVJbnRlcm5hbD4gZ2V0VXNlclN0YXRlcygpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBhZGRNaW1lVHlwZXMoamF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5TdHJpbmc+KVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVVzZXJTdGF0ZSBnZXRTdGF0ZUZvclVzZXIoYW5kcm9pZC5vcy5Vc2VySGFuZGxlKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZyBnZXRQcmltYXJ5Q3B1QWJpKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgZ2V0U2Vjb25kYXJ5Q3B1QWJpKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS5sYW5nLlN0cmluZyBnZXRTZUluZm8oKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZyBnZXRQcmltYXJ5Q3B1QWJpTGVnYWN5KClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgZ2V0U2Vjb25kYXJ5Q3B1QWJpTGVnYWN5KClcbmNsYXNzIFBhY2thZ2VTZXR0aW5nIGV4dGVuZHMgY29tLmFuZHJvaWQuc2VydmVyLnBtLlNldHRpbmdCYXNlIGltcGxlbWVudHMgW2NvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVN0YXRlSW50ZXJuYWxdXG5AY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5EYXRhQ2xhc3MoZ2VuR2V0dGVycz10cnVlLCBnZW5Db25zdHJ1Y3Rvcj1mYWxzZSwgZ2VuU2V0dGVycz1mYWxzZSwgZ2VuQnVpbGRlcj1mYWxzZSkiKQorICAgICAgICAgICAgaW5wdXRTaWduYXR1cmVzID0gInByaXZhdGUgIGludCBtU2hhcmVkVXNlckFwcElkXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLlN0cmluZz4+IG1pbWVHcm91cHNcbnByaXZhdGUgQGphdmEubGFuZy5EZXByZWNhdGVkIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPiBtT2xkQ29kZVBhdGhzXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZ1tdIHVzZXNTZGtMaWJyYXJpZXNcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBsb25nW10gdXNlc1Nka0xpYnJhcmllc1ZlcnNpb25zTWFqb3JcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nW10gdXNlc1N0YXRpY0xpYnJhcmllc1xucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGxvbmdbXSB1c2VzU3RhdGljTGlicmFyaWVzVmVyc2lvbnNcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBAamF2YS5sYW5nLkRlcHJlY2F0ZWQgamF2YS5sYW5nLlN0cmluZyBsZWdhY3lOYXRpdmVMaWJyYXJ5UGF0aFxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgamF2YS5sYW5nLlN0cmluZyBtTmFtZVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgbVJlYWxOYW1lXG5wcml2YXRlICBpbnQgbUFwcElkXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgY29tLmFuZHJvaWQuc2VydmVyLnBtLnBhcnNpbmcucGtnLkFuZHJvaWRQYWNrYWdlSW50ZXJuYWwgcGtnXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBqYXZhLmlvLkZpbGUgbVBhdGhcbnByaXZhdGUgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGphdmEubGFuZy5TdHJpbmcgbVBhdGhTdHJpbmdcbnByaXZhdGUgIGZsb2F0IG1Mb2FkaW5nUHJvZ3Jlc3NcbnByaXZhdGUgIGxvbmcgbUxvYWRpbmdDb21wbGV0ZWRUaW1lXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZyBtUHJpbWFyeUNwdUFiaVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgbVNlY29uZGFyeUNwdUFiaVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgbUNwdUFiaU92ZXJyaWRlXG5wcml2YXRlICBsb25nIG1MYXN0TW9kaWZpZWRUaW1lXG5wcml2YXRlICBsb25nIGxhc3RVcGRhdGVUaW1lXG5wcml2YXRlICBsb25nIHZlcnNpb25Db2RlXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNpZ25hdHVyZXMgc2lnbmF0dXJlc1xucHJpdmF0ZSAgYm9vbGVhbiBpbnN0YWxsUGVybWlzc2lvbnNGaXhlZFxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VLZXlTZXREYXRhIGtleVNldERhdGFcbnByaXZhdGUgZmluYWwgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTxjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VVc2VyU3RhdGVJbXBsPiBtVXNlclN0YXRlc1xucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLkluc3RhbGxTb3VyY2UgaW5zdGFsbFNvdXJjZVxucHJpdmF0ZSBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgdm9sdW1lVXVpZFxucHJpdmF0ZSAgaW50IGNhdGVnb3J5T3ZlcnJpZGVcbnByaXZhdGUgIGJvb2xlYW4gdXBkYXRlQXZhaWxhYmxlXG5wcml2YXRlICBib29sZWFuIGZvcmNlUXVlcnlhYmxlT3ZlcnJpZGVcbnByaXZhdGUgZmluYWwgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVN0YXRlVW5zZXJpYWxpemVkIHBrZ1N0YXRlXG5wcml2YXRlIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBqYXZhLnV0aWwuVVVJRCBtRG9tYWluU2V0SWRcbnByaXZhdGUgZmluYWwgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5TbmFwc2hvdENhY2hlPGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZz4gbVNuYXBzaG90XG5wcml2YXRlICBjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuU25hcHNob3RDYWNoZTxjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmc+IG1ha2VDYWNoZSgpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzbmFwc2hvdCgpXG5wdWJsaWMgIHZvaWQgZHVtcERlYnVnKGFuZHJvaWQudXRpbC5wcm90by5Qcm90b091dHB1dFN0cmVhbSxsb25nLGphdmEudXRpbC5MaXN0PGFuZHJvaWQuY29udGVudC5wbS5Vc2VySW5mbz4sY29tLmFuZHJvaWQuc2VydmVyLnBtLnBlcm1pc3Npb24uTGVnYWN5UGVybWlzc2lvbkRhdGFQcm92aWRlcilcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEFwcElkKGludClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldENwdUFiaU92ZXJyaWRlKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRGaXJzdEluc3RhbGxUaW1lRnJvbVJlcGxhY2VkKGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVN0YXRlSW50ZXJuYWwsaW50W10pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRGaXJzdEluc3RhbGxUaW1lKGxvbmcsaW50KVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0Rm9yY2VRdWVyeWFibGVPdmVycmlkZShib29sZWFuKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0SW5zdGFsbGVyUGFja2FnZShqYXZhLmxhbmcuU3RyaW5nLGludClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFVwZGF0ZU93bmVyUGFja2FnZShqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0SW5zdGFsbFNvdXJjZShjb20uYW5kcm9pZC5zZXJ2ZXIucG0uSW5zdGFsbFNvdXJjZSlcbiAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHJlbW92ZUluc3RhbGxlclBhY2thZ2UoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldElzT3JwaGFuZWQoYm9vbGVhbilcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldEtleVNldERhdGEoY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VLZXlTZXREYXRhKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0TGFzdE1vZGlmaWVkVGltZShsb25nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0TGFzdFVwZGF0ZVRpbWUobG9uZylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldExvbmdWZXJzaW9uQ29kZShsb25nKVxucHVibGljICBib29sZWFuIHNldE1pbWVHcm91cChqYXZhLmxhbmcuU3RyaW5nLGFuZHJvaWQudXRpbC5BcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPilcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFBrZyhjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLkFuZHJvaWRQYWNrYWdlKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0UGtnU3RhdGVMaWJyYXJ5RmlsZXMoamF2YS51dGlsLkNvbGxlY3Rpb248amF2YS5sYW5nLlN0cmluZz4pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRQcmltYXJ5Q3B1QWJpKGphdmEubGFuZy5TdHJpbmcpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRTZWNvbmRhcnlDcHVBYmkoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFNpZ25hdHVyZXMoY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTaWduYXR1cmVzKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0Vm9sdW1lVXVpZChqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgYm9vbGVhbiBpc0V4dGVybmFsU3RvcmFnZSgpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRVcGRhdGVBdmFpbGFibGUoYm9vbGVhbilcbnB1YmxpYyAgdm9pZCBzZXRTaGFyZWRVc2VyQXBwSWQoaW50KVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgaW50IGdldFNoYXJlZFVzZXJBcHBJZCgpXG5wdWJsaWMgQGphdmEubGFuZy5PdmVycmlkZSBib29sZWFuIGhhc1NoYXJlZFVzZXIoKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpXG5wcm90ZWN0ZWQgIHZvaWQgY29weU1pbWVHcm91cHMoamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLlN0cmluZz4+KVxucHVibGljICB2b2lkIHVwZGF0ZUZyb20oY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nKVxuICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgdXBkYXRlTWltZUdyb3VwcyhqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5TdHJpbmc+KVxucHVibGljIEBqYXZhLmxhbmcuRGVwcmVjYXRlZCBAamF2YS5sYW5nLk92ZXJyaWRlIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wZXJtaXNzaW9uLkxlZ2FjeVBlcm1pc3Npb25TdGF0ZSBnZXRMZWdhY3lQZXJtaXNzaW9uU3RhdGUoKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0SW5zdGFsbFBlcm1pc3Npb25zRml4ZWQoYm9vbGVhbilcbnB1YmxpYyAgYm9vbGVhbiBpc1ByaXZpbGVnZWQoKVxucHVibGljICBib29sZWFuIGlzT2VtKClcbnB1YmxpYyAgYm9vbGVhbiBpc1ZlbmRvcigpXG5wdWJsaWMgIGJvb2xlYW4gaXNQcm9kdWN0KClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaXNSZXF1aXJlZEZvclN5c3RlbVVzZXIoKVxucHVibGljICBib29sZWFuIGlzU3lzdGVtRXh0KClcbnB1YmxpYyAgYm9vbGVhbiBpc09kbSgpXG5wdWJsaWMgIGJvb2xlYW4gaXNTeXN0ZW0oKVxucHVibGljICBhbmRyb2lkLmNvbnRlbnQucG0uU2lnbmluZ0RldGFpbHMgZ2V0U2lnbmluZ0RldGFpbHMoKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0U2lnbmluZ0RldGFpbHMoYW5kcm9pZC5jb250ZW50LnBtLlNpZ25pbmdEZXRhaWxzKVxucHVibGljICB2b2lkIGNvcHlQYWNrYWdlU2V0dGluZyhjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcsYm9vbGVhbilcbiBAY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3RpbmcgY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlVXNlclN0YXRlSW1wbCBtb2RpZnlVc2VyU3RhdGUoaW50KVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VVc2VyU3RhdGVJbXBsIGdldE9yQ3JlYXRlVXNlclN0YXRlKGludClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlVXNlclN0YXRlSW50ZXJuYWwgcmVhZFVzZXJTdGF0ZShpbnQpXG4gIHZvaWQgc2V0RW5hYmxlZChpbnQsaW50LGphdmEubGFuZy5TdHJpbmcpXG4gIGludCBnZXRFbmFibGVkKGludClcbiAgdm9pZCBzZXRJbnN0YWxsZWQoYm9vbGVhbixpbnQpXG4gIGJvb2xlYW4gZ2V0SW5zdGFsbGVkKGludClcbiAgaW50IGdldEluc3RhbGxSZWFzb24oaW50KVxuICB2b2lkIHNldEluc3RhbGxSZWFzb24oaW50LGludClcbiAgaW50IGdldFVuaW5zdGFsbFJlYXNvbihpbnQpXG4gIHZvaWQgc2V0VW5pbnN0YWxsUmVhc29uKGludCxpbnQpXG4gQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGFuZHJvaWQuY29udGVudC5wbS5vdmVybGF5Lk92ZXJsYXlQYXRocyBnZXRPdmVybGF5UGF0aHMoaW50KVxuICBib29sZWFuIHNldE92ZXJsYXlQYXRoc0ZvckxpYnJhcnkoamF2YS5sYW5nLlN0cmluZyxhbmRyb2lkLmNvbnRlbnQucG0ub3ZlcmxheS5PdmVybGF5UGF0aHMsaW50KVxuICBib29sZWFuIGlzQW55SW5zdGFsbGVkKGludFtdKVxuICBpbnRbXSBxdWVyeUluc3RhbGxlZFVzZXJzKGludFtdLGJvb2xlYW4pXG4gIGxvbmcgZ2V0Q2VEYXRhSW5vZGUoaW50KVxuICB2b2lkIHNldENlRGF0YUlub2RlKGxvbmcsaW50KVxuICBib29sZWFuIGdldFN0b3BwZWQoaW50KVxuICB2b2lkIHNldFN0b3BwZWQoYm9vbGVhbixpbnQpXG4gIGJvb2xlYW4gZ2V0Tm90TGF1bmNoZWQoaW50KVxuICB2b2lkIHNldE5vdExhdW5jaGVkKGJvb2xlYW4saW50KVxuICBib29sZWFuIGdldEhpZGRlbihpbnQpXG4gIHZvaWQgc2V0SGlkZGVuKGJvb2xlYW4saW50KVxuICBpbnQgZ2V0RGlzdHJhY3Rpb25GbGFncyhpbnQpXG4gIHZvaWQgc2V0RGlzdHJhY3Rpb25GbGFncyhpbnQsaW50KVxucHVibGljICBib29sZWFuIGdldEluc3RhbnRBcHAoaW50KVxuICB2b2lkIHNldEluc3RhbnRBcHAoYm9vbGVhbixpbnQpXG4gIGJvb2xlYW4gZ2V0VmlydHVhbFByZWxvYWQoaW50KVxuICB2b2lkIHNldFZpcnR1YWxQcmVsb2FkKGJvb2xlYW4saW50KVxuICB2b2lkIHNldFVzZXJTdGF0ZShpbnQsbG9uZyxpbnQsYm9vbGVhbixib29sZWFuLGJvb2xlYW4sYm9vbGVhbixpbnQsYW5kcm9pZC51dGlsLkFycmF5TWFwPGphdmEubGFuZy5TdHJpbmcsY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5TdXNwZW5kUGFyYW1zPixib29sZWFuLGJvb2xlYW4samF2YS5sYW5nLlN0cmluZyxhbmRyb2lkLnV0aWwuQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4sYW5kcm9pZC51dGlsLkFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+LGludCxpbnQsamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuU3RyaW5nLGxvbmcpXG4gIHZvaWQgc2V0VXNlclN0YXRlKGludCxjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VVc2VyU3RhdGVJbnRlcm5hbClcbiAgY29tLmFuZHJvaWQuc2VydmVyLnV0aWxzLldhdGNoZWRBcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPiBnZXRFbmFibGVkQ29tcG9uZW50cyhpbnQpXG4gIGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5XYXRjaGVkQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4gZ2V0RGlzYWJsZWRDb21wb25lbnRzKGludClcbiAgdm9pZCBzZXRFbmFibGVkQ29tcG9uZW50cyhjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuV2F0Y2hlZEFycmF5U2V0PGphdmEubGFuZy5TdHJpbmc+LGludClcbiAgdm9pZCBzZXREaXNhYmxlZENvbXBvbmVudHMoY29tLmFuZHJvaWQuc2VydmVyLnV0aWxzLldhdGNoZWRBcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPixpbnQpXG4gIHZvaWQgc2V0RW5hYmxlZENvbXBvbmVudHNDb3B5KGNvbS5hbmRyb2lkLnNlcnZlci51dGlscy5XYXRjaGVkQXJyYXlTZXQ8amF2YS5sYW5nLlN0cmluZz4saW50KVxuICB2b2lkIHNldERpc2FibGVkQ29tcG9uZW50c0NvcHkoY29tLmFuZHJvaWQuc2VydmVyLnV0aWxzLldhdGNoZWRBcnJheVNldDxqYXZhLmxhbmcuU3RyaW5nPixpbnQpXG4gIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVVzZXJTdGF0ZUltcGwgbW9kaWZ5VXNlclN0YXRlQ29tcG9uZW50cyhpbnQsYm9vbGVhbixib29sZWFuKVxuICB2b2lkIGFkZERpc2FibGVkQ29tcG9uZW50KGphdmEubGFuZy5TdHJpbmcsaW50KVxuICB2b2lkIGFkZEVuYWJsZWRDb21wb25lbnQoamF2YS5sYW5nLlN0cmluZyxpbnQpXG4gIGJvb2xlYW4gZW5hYmxlQ29tcG9uZW50TFB3KGphdmEubGFuZy5TdHJpbmcsaW50KVxuICBib29sZWFuIGRpc2FibGVDb21wb25lbnRMUHcoamF2YS5sYW5nLlN0cmluZyxpbnQpXG4gIGJvb2xlYW4gcmVzdG9yZUNvbXBvbmVudExQdyhqYXZhLmxhbmcuU3RyaW5nLGludClcbiAgaW50IGdldEN1cnJlbnRFbmFibGVkU3RhdGVMUHIoamF2YS5sYW5nLlN0cmluZyxpbnQpXG4gIHZvaWQgcmVtb3ZlVXNlcihpbnQpXG5wdWJsaWMgIGludFtdIGdldE5vdEluc3RhbGxlZFVzZXJJZHMoKVxuICB2b2lkIHdyaXRlUGFja2FnZVVzZXJQZXJtaXNzaW9uc1Byb3RvKGFuZHJvaWQudXRpbC5wcm90by5Qcm90b091dHB1dFN0cmVhbSxsb25nLGphdmEudXRpbC5MaXN0PGFuZHJvaWQuY29udGVudC5wbS5Vc2VySW5mbz4sY29tLmFuZHJvaWQuc2VydmVyLnBtLnBlcm1pc3Npb24uTGVnYWN5UGVybWlzc2lvbkRhdGFQcm92aWRlcilcbnByb3RlY3RlZCAgdm9pZCB3cml0ZVVzZXJzSW5mb1RvUHJvdG8oYW5kcm9pZC51dGlsLnByb3RvLlByb3RvT3V0cHV0U3RyZWFtLGxvbmcpXG4gIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRQYXRoKGphdmEuaW8uRmlsZSlcbnB1YmxpYyBAY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3RpbmcgYm9vbGVhbiBvdmVycmlkZU5vbkxvY2FsaXplZExhYmVsQW5kSWNvbihhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSxqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5JbnRlZ2VyLGludClcbnB1YmxpYyAgdm9pZCByZXNldE92ZXJyaWRlQ29tcG9uZW50TGFiZWxJY29uKGludClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlIGphdmEubGFuZy5TdHJpbmcgZ2V0U3BsYXNoU2NyZWVuVGhlbWUoaW50KVxucHVibGljICBib29sZWFuIGlzSW5jcmVtZW50YWwoKVxucHVibGljICBib29sZWFuIGlzTG9hZGluZygpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRMb2FkaW5nUHJvZ3Jlc3MoZmxvYXQpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRMb2FkaW5nQ29tcGxldGVkVGltZShsb25nKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGxvbmcgZ2V0VmVyc2lvbkNvZGUoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPj4gZ2V0TWltZUdyb3VwcygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgamF2YS5sYW5nLlN0cmluZyBnZXRQYWNrYWdlTmFtZSgpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBAamF2YS5sYW5nLk92ZXJyaWRlIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuQW5kcm9pZFBhY2thZ2UgZ2V0QW5kcm9pZFBhY2thZ2UoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQucG0uU2lnbmluZ0luZm8gZ2V0U2lnbmluZ0luZm8oKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGphdmEubGFuZy5TdHJpbmdbXSBnZXRVc2VzU2RrTGlicmFyaWVzKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBsb25nW10gZ2V0VXNlc1Nka0xpYnJhcmllc1ZlcnNpb25zTWFqb3IoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBAamF2YS5sYW5nLk92ZXJyaWRlIGphdmEubGFuZy5TdHJpbmdbXSBnZXRVc2VzU3RhdGljTGlicmFyaWVzKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBsb25nW10gZ2V0VXNlc1N0YXRpY0xpYnJhcmllc1ZlcnNpb25zKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLnV0aWwuTGlzdDxjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlNoYXJlZExpYnJhcnk+IGdldFNoYXJlZExpYnJhcnlEZXBlbmRlbmNpZXMoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgYWRkVXNlc0xpYnJhcnlJbmZvKGFuZHJvaWQuY29udGVudC5wbS5TaGFyZWRMaWJyYXJ5SW5mbylcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBnZXRVc2VzTGlicmFyeUZpbGVzKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIGFkZFVzZXNMaWJyYXJ5RmlsZShqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgYm9vbGVhbiBpc0hpZGRlblVudGlsSW5zdGFsbGVkKClcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBsb25nW10gZ2V0TGFzdFBhY2thZ2VVc2FnZVRpbWUoKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgYm9vbGVhbiBpc1VwZGF0ZWRTeXN0ZW1BcHAoKVxucHVibGljIEBqYXZhLmxhbmcuT3ZlcnJpZGUgYm9vbGVhbiBpc0Fwa0luVXBkYXRlZEFwZXgoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLmxhbmcuU3RyaW5nIGdldEFwZXhNb2R1bGVOYW1lKClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldERvbWFpblNldElkKGphdmEudXRpbC5VVUlEKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0Q2F0ZWdvcnlPdmVycmlkZShpbnQpXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRMZWdhY3lOYXRpdmVMaWJyYXJ5UGF0aChqYXZhLmxhbmcuU3RyaW5nKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0TWltZUdyb3VwcyhqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPj4pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRPbGRDb2RlUGF0aHMoamF2YS51dGlsLlNldDxqYXZhLmxhbmcuU3RyaW5nPilcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIHNldFVzZXNTZGtMaWJyYXJpZXMoamF2YS5sYW5nLlN0cmluZ1tdKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0VXNlc1Nka0xpYnJhcmllc1ZlcnNpb25zTWFqb3IobG9uZ1tdKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0VXNlc1N0YXRpY0xpYnJhcmllcyhqYXZhLmxhbmcuU3RyaW5nW10pXG5wdWJsaWMgIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5QYWNrYWdlU2V0dGluZyBzZXRVc2VzU3RhdGljTGlicmFyaWVzVmVyc2lvbnMobG9uZ1tdKVxucHVibGljICBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZVNldHRpbmcgc2V0QXBleE1vZHVsZU5hbWUoamF2YS5sYW5nLlN0cmluZylcbnB1YmxpYyBAYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGwgQGphdmEubGFuZy5PdmVycmlkZSBjb20uYW5kcm9pZC5zZXJ2ZXIucG0ucGtnLlBhY2thZ2VTdGF0ZVVuc2VyaWFsaXplZCBnZXRUcmFuc2llbnRTdGF0ZSgpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTw/IGV4dGVuZHMgUGFja2FnZVVzZXJTdGF0ZUludGVybmFsPiBnZXRVc2VyU3RhdGVzKClcbnB1YmxpYyAgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VTZXR0aW5nIGFkZE1pbWVUeXBlcyhqYXZhLmxhbmcuU3RyaW5nLGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLlN0cmluZz4pXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIEBqYXZhLmxhbmcuT3ZlcnJpZGUgY29tLmFuZHJvaWQuc2VydmVyLnBtLnBrZy5QYWNrYWdlVXNlclN0YXRlIGdldFN0YXRlRm9yVXNlcihhbmRyb2lkLm9zLlVzZXJIYW5kbGUpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIGdldFByaW1hcnlDcHVBYmkoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZyBnZXRTZWNvbmRhcnlDcHVBYmkoKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgQGphdmEubGFuZy5PdmVycmlkZSBqYXZhLmxhbmcuU3RyaW5nIGdldFNlSW5mbygpXG5wdWJsaWMgQGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZSBqYXZhLmxhbmcuU3RyaW5nIGdldFByaW1hcnlDcHVBYmlMZWdhY3koKVxucHVibGljIEBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGUgamF2YS5sYW5nLlN0cmluZyBnZXRTZWNvbmRhcnlDcHVBYmlMZWdhY3koKVxucHVibGljIEBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvLkhpZGRlbkFwaUVuZm9yY2VtZW50UG9saWN5IEBqYXZhLmxhbmcuT3ZlcnJpZGUgaW50IGdldEhpZGRlbkFwaUVuZm9yY2VtZW50UG9saWN5KClcbnB1YmxpYyBAamF2YS5sYW5nLk92ZXJyaWRlIGJvb2xlYW4gaXNBcGV4KClcbmNsYXNzIFBhY2thZ2VTZXR0aW5nIGV4dGVuZHMgY29tLmFuZHJvaWQuc2VydmVyLnBtLlNldHRpbmdCYXNlIGltcGxlbWVudHMgW2NvbS5hbmRyb2lkLnNlcnZlci5wbS5wa2cuUGFja2FnZVN0YXRlSW50ZXJuYWxdXG5AY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5EYXRhQ2xhc3MoZ2VuR2V0dGVycz10cnVlLCBnZW5Db25zdHJ1Y3Rvcj1mYWxzZSwgZ2VuU2V0dGVycz1mYWxzZSwgZ2VuQnVpbGRlcj1mYWxzZSkiKQogICAgIEBEZXByZWNhdGVkCiAgICAgcHJpdmF0ZSB2b2lkIF9fbWV0YWRhdGEoKSB7fQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1JlY29uY2lsZVBhY2thZ2VVdGlscy5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9SZWNvbmNpbGVQYWNrYWdlVXRpbHMuamF2YQppbmRleCBkMTYwNzQwLi41MzEyYWU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1JlY29uY2lsZVBhY2thZ2VVdGlscy5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vUmVjb25jaWxlUGFja2FnZVV0aWxzLmphdmEKQEAgLTY5LDcgKzY5LDYgQEAKIAogICAgICAgICBmb3IgKEluc3RhbGxSZXF1ZXN0IGluc3RhbGxSZXF1ZXN0IDogIGluc3RhbGxSZXF1ZXN0cykgewogICAgICAgICAgICAgaW5zdGFsbFJlcXVlc3Qub25SZWNvbmNpbGVTdGFydGVkKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW5zdGFsbFBhY2thZ2VOYW1lID0gaW5zdGFsbFJlcXVlc3QuZ2V0UGFyc2VkUGFja2FnZSgpLmdldFBhY2thZ2VOYW1lKCk7CiAKICAgICAgICAgICAgIC8vIGFkZCAvIHJlcGxhY2UgZXhpc3Rpbmcgd2l0aCBpbmNvbWluZyBwYWNrYWdlcwogICAgICAgICAgICAgY29tYmluZWRQYWNrYWdlcy5wdXQoaW5zdGFsbFJlcXVlc3QuZ2V0U2Nhbm5lZFBhY2thZ2VTZXR0aW5nKCkuZ2V0UGFja2FnZU5hbWUoKSwKQEAgLTg0LDEyICs4MywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nU2hhcmVkTGlicmFyaWVzLCBpbmZvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgUmVjb25jaWxlRmFpbHVyZS5vZkludGVybmFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGFyZWQgTGlicmFyeSAiICsgaW5mby5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIGJlaW5nIGluc3RhbGxlZCB0d2ljZSBpbiB0aGlzIHNldCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBiZWluZyBpbnN0YWxsZWQgdHdpY2UgaW4gdGhpcyBzZXQhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJFeGNlcHRpb24uSU5URVJOQUxfRVJST1JfU0hBUkVEX0xJQl9JTlNUQUxMRURfVFdJQ0UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICB9CiAKKyAgICAgICAgZm9yIChJbnN0YWxsUmVxdWVzdCBpbnN0YWxsUmVxdWVzdCA6IGluc3RhbGxSZXF1ZXN0cykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGluc3RhbGxQYWNrYWdlTmFtZSA9IGluc3RhbGxSZXF1ZXN0LmdldFBhcnNlZFBhY2thZ2UoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTaGFyZWRMaWJyYXJ5SW5mbz4gYWxsb3dlZFNoYXJlZExpYkluZm9zID0KKyAgICAgICAgICAgICAgICAgICAgc2hhcmVkTGlicmFyaWVzLmdldEFsbG93ZWRTaGFyZWRMaWJJbmZvcyhpbnN0YWxsUmVxdWVzdCk7CiAKICAgICAgICAgICAgIGZpbmFsIERlbGV0ZVBhY2thZ2VBY3Rpb24gZGVsZXRlUGFja2FnZUFjdGlvbjsKICAgICAgICAgICAgIC8vIHdlIG9ubHkgd2FudCB0byB0cnkgdG8gZGVsZXRlIGZvciBub24gc3lzdGVtIGFwcHMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vU2V0dGluZ3MuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vU2V0dGluZ3MuamF2YQppbmRleCBiNjU1N2QwLi45NGEwMGQ2ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9TZXR0aW5ncy5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vU2V0dGluZ3MuamF2YQpAQCAtMjkwMiw2ICsyOTAyLDggQEAKICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlSW50KG51bGwsICJzaGFyZWRVc2VySWQiLCBwa2cuZ2V0QXBwSWQoKSk7CiAgICAgICAgIH0KICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGVGbG9hdChudWxsLCAibG9hZGluZ1Byb2dyZXNzIiwgcGtnLmdldExvYWRpbmdQcm9ncmVzcygpKTsKKyAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGVMb25nSGV4KG51bGwsICJsb2FkaW5nQ29tcGxldGVkVGltZSIsCisgICAgICAgICAgICAgICAgcGtnLmdldExvYWRpbmdDb21wbGV0ZWRUaW1lKCkpOwogCiAgICAgICAgIHdyaXRlVXNlc1Nka0xpYkxQdyhzZXJpYWxpemVyLCBwa2cuZ2V0VXNlc1Nka0xpYnJhcmllcygpLAogICAgICAgICAgICAgICAgIHBrZy5nZXRVc2VzU2RrTGlicmFyaWVzVmVyc2lvbnNNYWpvcigpKTsKQEAgLTI5ODgsNiArMjk5MCw3IEBACiAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZUJvb2xlYW4obnVsbCwgImlzTG9hZGluZyIsIHRydWUpOwogICAgICAgICB9CiAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlRmxvYXQobnVsbCwgImxvYWRpbmdQcm9ncmVzcyIsIHBrZy5nZXRMb2FkaW5nUHJvZ3Jlc3MoKSk7CisgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlTG9uZ0hleChudWxsLCAibG9hZGluZ0NvbXBsZXRlZFRpbWUiLCBwa2cuZ2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUoKSk7CiAKICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgImRvbWFpblNldElkIiwgcGtnLmdldERvbWFpblNldElkKCkudG9TdHJpbmcoKSk7CiAKQEAgLTM2ODcsOSArMzY5MCw2IEBACiAgICAgICAgICAgICBwcy5zZXRBcHBJZChzaGFyZWRVc2VyQXBwSWQpOwogICAgICAgICAgICAgcHMuc2V0U2hhcmVkVXNlckFwcElkKHNoYXJlZFVzZXJBcHBJZCk7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgZmxvYXQgbG9hZGluZ1Byb2dyZXNzID0KLSAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlRmxvYXQobnVsbCwgImxvYWRpbmdQcm9ncmVzcyIsIDApOwotICAgICAgICBwcy5zZXRMb2FkaW5nUHJvZ3Jlc3MobG9hZGluZ1Byb2dyZXNzKTsKIAogICAgICAgICBpbnQgb3V0ZXJEZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwogICAgICAgICBpbnQgdHlwZTsKQEAgLTM3NjAsNiArMzc2MCw3IEBACiAgICAgICAgIGxvbmcgdmVyc2lvbkNvZGUgPSAwOwogICAgICAgICBib29sZWFuIGluc3RhbGxlZEZvcmNlUXVlcnlhYmxlID0gZmFsc2U7CiAgICAgICAgIGZsb2F0IGxvYWRpbmdQcm9ncmVzcyA9IDA7CisgICAgICAgIGxvbmcgbG9hZGluZ0NvbXBsZXRlZFRpbWUgPSAwOwogICAgICAgICBVVUlEIGRvbWFpblNldElkOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBBVFRSX05BTUUpOwpAQCAtMzc3Nyw2ICszNzc4LDcgQEAKICAgICAgICAgICAgIHVwZGF0ZUF2YWlsYWJsZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVCb29sZWFuKG51bGwsICJ1cGRhdGVBdmFpbGFibGUiLCBmYWxzZSk7CiAgICAgICAgICAgICBpbnN0YWxsZWRGb3JjZVF1ZXJ5YWJsZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVCb29sZWFuKG51bGwsICJmb3JjZVF1ZXJ5YWJsZSIsIGZhbHNlKTsKICAgICAgICAgICAgIGxvYWRpbmdQcm9ncmVzcyA9IHBhcnNlci5nZXRBdHRyaWJ1dGVGbG9hdChudWxsLCAibG9hZGluZ1Byb2dyZXNzIiwgMCk7CisgICAgICAgICAgICBsb2FkaW5nQ29tcGxldGVkVGltZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVMb25nSGV4KG51bGwsICJsb2FkaW5nQ29tcGxldGVkVGltZSIsIDApOwogCiAgICAgICAgICAgICBpZiAocHJpbWFyeUNwdUFiaVN0cmluZyA9PSBudWxsICYmIGxlZ2FjeUNwdUFiaVN0cmluZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcHJpbWFyeUNwdUFiaVN0cmluZyA9IGxlZ2FjeUNwdUFiaVN0cmluZzsKQEAgLTM5MzksNyArMzk0MSw4IEBACiAgICAgICAgICAgICAgICAgICAgIC5zZXRTZWNvbmRhcnlDcHVBYmkoc2Vjb25kYXJ5Q3B1QWJpU3RyaW5nKQogICAgICAgICAgICAgICAgICAgICAuc2V0VXBkYXRlQXZhaWxhYmxlKHVwZGF0ZUF2YWlsYWJsZSkKICAgICAgICAgICAgICAgICAgICAgLnNldEZvcmNlUXVlcnlhYmxlT3ZlcnJpZGUoaW5zdGFsbGVkRm9yY2VRdWVyeWFibGUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRMb2FkaW5nUHJvZ3Jlc3MobG9hZGluZ1Byb2dyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgLnNldExvYWRpbmdQcm9ncmVzcyhsb2FkaW5nUHJvZ3Jlc3MpCisgICAgICAgICAgICAgICAgICAgIC5zZXRMb2FkaW5nQ29tcGxldGVkVGltZShsb2FkaW5nQ29tcGxldGVkVGltZSk7CiAgICAgICAgICAgICAvLyBIYW5kbGUgbGVnYWN5IHN0cmluZyBoZXJlIGZvciBzaW5nbGUtdXNlciBtb2RlCiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5hYmxlZFN0ciA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBBVFRSX0VOQUJMRUQpOwogICAgICAgICAgICAgaWYgKGVuYWJsZWRTdHIgIT0gbnVsbCkgewpAQCAtNDkwMCw5ICs0OTAzLDExIEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIiAgcGFja2FnZVNvdXJjZT0iKTsKICAgICAgICAgcHcucHJpbnRsbihwcy5nZXRJbnN0YWxsU291cmNlKCkubVBhY2thZ2VTb3VyY2UpOwotICAgICAgICBpZiAocHMuaXNMb2FkaW5nKCkpIHsKKyAgICAgICAgaWYgKHBzLmlzSW5jcmVtZW50YWwoKSkgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnRsbigiICBsb2FkaW5nUHJvZ3Jlc3M9IiArCiAgICAgICAgICAgICAgICAgICAgIChpbnQpIChwcy5nZXRMb2FkaW5nUHJvZ3Jlc3MoKSAqIDEwMCkgKyAiJSIpOworICAgICAgICAgICAgZGF0ZS5zZXRUaW1lKHBzLmdldExvYWRpbmdDb21wbGV0ZWRUaW1lKCkpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnRsbigiICBsb2FkaW5nQ29tcGxldGVkVGltZT0iICsgc2RmLmZvcm1hdChkYXRlKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBzLmdldFZvbHVtZVV1aWQoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiICB2b2x1bWVVdWlkPSIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Vc2VyTWFuYWdlckludGVybmFsLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJNYW5hZ2VySW50ZXJuYWwuamF2YQppbmRleCBiNGQ0NjdmLi43MjFhZDg4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJNYW5hZ2VySW50ZXJuYWwuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJNYW5hZ2VySW50ZXJuYWwuamF2YQpAQCAtNDkxLDggKzQ5MSwxMSBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVXNlclZpc2libGUoQFVzZXJJZEludCBpbnQgdXNlcklkLCBpbnQgZGlzcGxheUlkKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpc3BsYXkgaWQgYXNzaWduZWQgdG8gdGhlIHVzZXIsIG9yIHtAY29kZSBEaXNwbGF5LklOVkFMSURfRElTUExBWX0gaWYgdGhlCi0gICAgICogdXNlciBpcyBub3QgYXNzaWduZWQgdG8gYW55IGRpc3BsYXkuCisgICAgICogUmV0dXJucyB0aGUgbWFpbiBkaXNwbGF5IGlkIGFzc2lnbmVkIHRvIHRoZSB1c2VyLCBvciB7QGNvZGUgRGlzcGxheS5JTlZBTElEX0RJU1BMQVl9IGlmIHRoZQorICAgICAqIHVzZXIgaXMgbm90IGFzc2lnbmVkIHRvIGFueSBtYWluIGRpc3BsYXkuCisgICAgICoKKyAgICAgKiA8cD5JbiB0aGUgY29udGV4dCBvZiBtdWx0aS11c2VyIG11bHRpLWRpc3BsYXksIHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBtYWluIGRpc3BsYXlzLCBhdCBtb3N0CisgICAgICogb25lIHBlciBlYWNoIHpvbmUuIE1haW4gZGlzcGxheXMgYXJlIHdoZXJlIFVJIGlzIGxhdW5jaGVkIHdoaWNoIGEgdXNlciBpbnRlcmFjdHMgd2l0aC4KICAgICAgKgogICAgICAqIDxwPlRoZSBjdXJyZW50IGZvcmVncm91bmQgdXNlciBhbmQgaXRzIHJ1bm5pbmcgcHJvZmlsZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LkRpc3BsYXkjREVGQVVMVF9ESVNQTEFZIGRlZmF1bHQgZGlzcGxheX0sIHdoaWxlIG90aGVyIHVzZXJzIHdvdWxkIG9ubHkgYmUKQEAgLTUwMyw5ICs1MDYsMjAgQEAKICAgICAgKgogICAgICAqIDxwPklmIHRoZSB1c2VyIGlzIGEgcHJvZmlsZSBhbmQgaXMgcnVubmluZywgaXQncyBhc3NpZ25lZCB0byBpdHMgcGFyZW50IGRpc3BsYXkuCiAgICAgICovCisgICAgLy8gVE9ETyhiLzI3MjM2NjQ4MykgcmVuYW1lIHRoaXMgbWV0aG9kIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIGdldERpc3BsYXlzQXNzaWduZWRUT1VzZXIoKS4KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldERpc3BsYXlBc3NpZ25lZFRvVXNlcihAVXNlcklkSW50IGludCB1c2VySWQpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgZGlzcGxheSBpZHMgYXNzaWduZWQgdG8gdGhlIHVzZXIgaW5jbHVkaW5nIHtAbGluaworICAgICAqICNhc3NpZ25Vc2VyVG9FeHRyYURpc3BsYXkoaW50LCBpbnQpIGV4dHJhIGRpc3BsYXlzfSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIG5vIGRpc3BsYXkKKyAgICAgKiBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWVkIHVzZXIuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgZGlmZmVyZW50IGZyb20ge0BsaW5rICNnZXREaXNwbGF5QXNzaWduZWRUb1VzZXIoaW50KX0sIHdoaWNoCisgICAgICogcmV0dXJucyBhIG1haW4gZGlzcGxheSBvbmx5LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBATnVsbGFibGUgaW50W10gZ2V0RGlzcGxheXNBc3NpZ25lZFRvVXNlcihAVXNlcklkSW50IGludCB1c2VySWQpOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbWFpbiB1c2VyIChpLmUuLCBub3QgYSBwcm9maWxlKSB0aGF0IGlzIGFzc2lnbmVkIHRvIHRoZSBkaXNwbGF5LCBvciB0aGUKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyI2dldEN1cnJlbnRVc2VyKCkgY3VycmVudCBmb3JlZ3JvdW5kIHVzZXJ9IGlmIG5vIHVzZXIgaXMKICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc3BsYXkuCkBAIC01NzMsNSArNTg3LDYgQEAKIAogICAgICAqIEB0aHJvd3MgVXNlck1hbmFnZXIuQ2hlY2tlZFVzZXJPcGVyYXRpb25FeGNlcHRpb24gaWYgbm8gc3dpdGNoYWJsZSB1c2VyIGNhbiBiZSBmb3VuZAogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBAVXNlcklkSW50IGludCBnZXRCb290VXNlcigpIHRocm93cyBVc2VyTWFuYWdlci5DaGVja2VkVXNlck9wZXJhdGlvbkV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYWJzdHJhY3QgQFVzZXJJZEludCBpbnQgZ2V0Qm9vdFVzZXIoYm9vbGVhbiB3YWl0VW50aWxTZXQpCisgICAgICAgICAgICB0aHJvd3MgVXNlck1hbmFnZXIuQ2hlY2tlZFVzZXJPcGVyYXRpb25FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Vc2VyTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAzMzQzMTcyLi5mZGMyYWZmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlck1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE2MSw3ICsxNjEsOSBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIApAQCAtMjc4LDYgKzI4MCw4IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBXUklURV9VU0VSX01TRyA9IDE7CiAgICAgc3RhdGljIGZpbmFsIGludCBXUklURV9VU0VSX0RFTEFZID0gMioxMDAwOyAgLy8gMiBzZWNvbmRzCiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEJPT1RfVVNFUl9TRVRfVElNRU9VVF9NUyA9IDMwMF8wMDA7CisKICAgICAvLyBUcm9uIGNvdW50ZXJzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRST05fR1VFU1RfQ1JFQVRFRCA9ICJ1c2Vyc19ndWVzdF9jcmVhdGVkIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJPTl9VU0VSX0NSRUFURUQgPSAidXNlcnNfdXNlcl9jcmVhdGVkIjsKQEAgLTMzMyw2ICszMzcsOCBAQAogICAgIC8qKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIHRoZSAxc3QgYm9vdCBhZnRlciB0aGUgc3lzdGVtIHVzZXIgbW9kZSB3YXMgY2hhbmdlZCBieSBlbXVsYXRpb24uICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG1VcGRhdGluZ1N5c3RlbVVzZXJNb2RlOwogCisgICAgLyoqIENvdW50IGRvd24gbGF0Y2ggdG8gd2FpdCB3aGlsZSBib290IHVzZXIgaXMgbm90IHNldC4qLworICAgIHByaXZhdGUgZmluYWwgQ291bnREb3duTGF0Y2ggbUJvb3RVc2VyTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgbm9uLXBhcmNlbGFibGUgd3JhcHBlciBmb3IgVXNlckluZm8gdGhhdCBpcyBub3QgZXhwb3NlZCB0byBvdGhlciBzeXN0ZW0gYXBwcy4KICAgICAgKi8KQEAgLTk1MiwxOCArOTU4LDYyIEBACiAgICAgICAgICAgICBTbG9nZi5pKExPR19UQUcsICJzZXRCb290VXNlciAlZCIsIHVzZXJJZCk7CiAgICAgICAgICAgICBtQm9vdFVzZXIgPSB1c2VySWQ7CiAgICAgICAgIH0KKyAgICAgICAgbUJvb3RVc2VyTGF0Y2guY291bnREb3duKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEBVc2VySWRJbnQgaW50IGdldEJvb3RVc2VyKCkgewogICAgICAgICBjaGVja0NyZWF0ZVVzZXJzUGVybWlzc2lvbigiR2V0IGJvb3QgdXNlciIpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1Mb2NhbFNlcnZpY2UuZ2V0Qm9vdFVzZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRCb290VXNlclVuY2hlY2tlZCgpOwogICAgICAgICB9IGNhdGNoIChVc2VyTWFuYWdlci5DaGVja2VkVXNlck9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBlLnRvU2VydmljZVNwZWNpZmljRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIEBVc2VySWRJbnQgaW50IGdldEJvb3RVc2VyVW5jaGVja2VkKCkgdGhyb3dzIFVzZXJNYW5hZ2VyLkNoZWNrZWRVc2VyT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtVXNlcnNMb2NrKSB7CisgICAgICAgICAgICBpZiAobUJvb3RVc2VyICE9IFVzZXJIYW5kbGUuVVNFUl9OVUxMKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVXNlckRhdGEgdXNlckRhdGEgPSBtVXNlcnMuZ2V0KG1Cb290VXNlcik7CisgICAgICAgICAgICAgICAgaWYgKHVzZXJEYXRhICE9IG51bGwgJiYgdXNlckRhdGEuaW5mby5zdXBwb3J0c1N3aXRjaFRvQnlVc2VyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZ2YuaShMT0dfVEFHLCAiVXNpbmcgcHJvdmlkZWQgYm9vdCB1c2VyOiAlZCIsIG1Cb290VXNlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQm9vdFVzZXI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZ2YudyhMT0dfVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlZCBib290IHVzZXIgY2Fubm90IGJlIHN3aXRjaGVkIHRvOiAlZCIsIG1Cb290VXNlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzSGVhZGxlc3NTeXN0ZW1Vc2VyTW9kZSgpKSB7CisgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHByZXZpb3VzIGZvcmVncm91bmQgdXNlciwgaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgZmluYWwgaW50IHByZXZpb3VzVXNlciA9IGdldFByZXZpb3VzRnVsbFVzZXJUb0VudGVyRm9yZWdyb3VuZCgpOworICAgICAgICAgICAgaWYgKHByZXZpb3VzVXNlciAhPSBVc2VySGFuZGxlLlVTRVJfTlVMTCkgeworICAgICAgICAgICAgICAgIFNsb2dmLmkoTE9HX1RBRywgIkJvb3QgdXNlciBpcyBwcmV2aW91cyB1c2VyICVkIiwgcHJldmlvdXNVc2VyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNVc2VyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm8gcHJldmlvdXMgdXNlci4gUmV0dXJuIHRoZSBmaXJzdCBzd2l0Y2hhYmxlIHVzZXIgaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtVXNlcnNMb2NrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHVzZXJTaXplID0gbVVzZXJzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVzZXJTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVXNlckRhdGEgdXNlckRhdGEgPSBtVXNlcnMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJEYXRhLmluZm8uc3VwcG9ydHNTd2l0Y2hUb0J5VXNlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RTd2l0Y2hhYmxlID0gdXNlckRhdGEuaW5mby5pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2dmLmkoTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvb3QgdXNlciBpcyBmaXJzdCBzd2l0Y2hhYmxlIHVzZXIgJWQiLCBmaXJzdFN3aXRjaGFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0U3dpdGNoYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vIHN3aXRjaGFibGUgdXNlcnMgZm91bmQuIFVoIG9oIQorICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJNYW5hZ2VyLkNoZWNrZWRVc2VyT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTm8gc3dpdGNoYWJsZSB1c2VycyBmb3VuZCIsIFVTRVJfT1BFUkFUSU9OX0VSUk9SX1VOS05PV04pOworICAgICAgICB9CisgICAgICAgIC8vIE5vdCBIU1VNLCByZXR1cm4gc3lzdGVtIHVzZXIuCisgICAgICAgIHJldHVybiBVc2VySGFuZGxlLlVTRVJfU1lTVEVNOworICAgIH0KKworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRQcmV2aW91c0Z1bGxVc2VyVG9FbnRlckZvcmVncm91bmQoKSB7CiAgICAgICAgIGNoZWNrUXVlcnlPckNyZWF0ZVVzZXJzUGVybWlzc2lvbigiZ2V0IHByZXZpb3VzIHVzZXIiKTsKQEAgLTE0OTUsNyArMTU0NSw4IEBACiAgICAgICAgIC8vIGludGVudFNlbmRlcgogICAgICAgICB1bmxvY2tJbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0lOVEVOVCwgcGVuZGluZ0ludGVudC5nZXRJbnRlbnRTZW5kZXIoKSk7CiAgICAgICAgIHVubG9ja0ludGVudC5zZXRGbGFncyhGTEFHX0FDVElWSVRZX05FV19UQVNLIHwgRkxBR19BQ1RJVklUWV9FWENMVURFX0ZST01fUkVDRU5UUyk7Ci0gICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkodW5sb2NrSW50ZW50KTsKKyAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eUFzVXNlcigKKyAgICAgICAgICAgICAgICB1bmxvY2tJbnRlbnQsIFVzZXJIYW5kbGUub2YoZ2V0UHJvZmlsZVBhcmVudElkVW5jaGVja2VkKHVzZXJJZCkpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTU4MTQsMjAgKzU4NjUsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rCi0gICAgICogYW5kcm9pZC5jb250ZW50LlJlc3RyaWN0aW9uc01hbmFnZXIjZ2V0QXBwbGljYXRpb25SZXN0cmljdGlvbnNQZXJBZG1pbn0gaW5zdGVhZC4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgdmVyc2lvbiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1VQU0lERV9ET1dOX0NBS0V9LAorICAgICAqIGl0IGlzIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSBtdWx0aXBsZSBtYW5hZ2luZyBhZ2VudHMgb24gdGhlIGRldmljZSB3aXRoIHRoZSBhYmlsaXR5IHRvIHNldAorICAgICAqIHJlc3RyaWN0aW9ucywgZS5nLiBhbiBFbnRlcnByaXNlIERQQyBhbmQgYSBTdXBlcnZpc2lvbiBhZG1pbi4gVGhpcyBBUEkgd2lsbCBvbmx5IHRvIHJldHVybgorICAgICAqIHRoZSByZXN0cmljdGlvbnMgc2V0IGJ5IHRoZSBEUENzLiBUbyByZXRyaWV2ZSByZXN0cmljdGlvbnMgc2V0IGJ5IGFsbCBhZ2VudHMsIHVzZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuUmVzdHJpY3Rpb25zTWFuYWdlciNnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9uc1BlckFkbWlufSBpbnN0ZWFkLgogICAgICAqLwotICAgIEBEZXByZWNhdGVkCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEJ1bmRsZSBnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9ucyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgcmV0dXJuIGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zRm9yVXNlcihwYWNrYWdlTmFtZSwgVXNlckhhbmRsZS5nZXRDYWxsaW5nVXNlcklkKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsKLSAgICAgKiBhbmRyb2lkLmNvbnRlbnQuUmVzdHJpY3Rpb25zTWFuYWdlciNnZXRBcHBsaWNhdGlvblJlc3RyaWN0aW9uc1BlckFkbWlufSBpbnN0ZWFkLgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCB2ZXJzaW9uIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjVVBTSURFX0RPV05fQ0FLRX0sCisgICAgICogaXQgaXMgcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIG11bHRpcGxlIG1hbmFnaW5nIGFnZW50cyBvbiB0aGUgZGV2aWNlIHdpdGggdGhlIGFiaWxpdHkgdG8gc2V0CisgICAgICogcmVzdHJpY3Rpb25zLCBlLmcuIGFuIEVudGVycHJpc2UgRFBDIGFuZCBhIFN1cGVydmlzaW9uIGFkbWluLiBUaGlzIEFQSSB3aWxsIG9ubHkgdG8gcmV0dXJuCisgICAgICogdGhlIHJlc3RyaWN0aW9ucyBzZXQgYnkgdGhlIERQQ3MuIFRvIHJldHJpZXZlIHJlc3RyaWN0aW9ucyBzZXQgYnkgYWxsIGFnZW50cywgdXNlCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5SZXN0cmljdGlvbnNNYW5hZ2VyI2dldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zUGVyQWRtaW59IGluc3RlYWQuCiAgICAgICovCi0gICAgQERlcHJlY2F0ZWQKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQnVuZGxlIGdldEFwcGxpY2F0aW9uUmVzdHJpY3Rpb25zRm9yVXNlcihTdHJpbmcgcGFja2FnZU5hbWUsIEBVc2VySWRJbnQgaW50IHVzZXJJZCkgewogICAgICAgICBpZiAoVXNlckhhbmRsZS5nZXRDYWxsaW5nVXNlcklkKCkgIT0gdXNlcklkCkBAIC03MTM5LDYgKzcxOTQsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQE51bGxhYmxlIGludFtdIGdldERpc3BsYXlzQXNzaWduZWRUb1VzZXIoQFVzZXJJZEludCBpbnQgdXNlcklkKSB7CisgICAgICAgICAgICByZXR1cm4gbVVzZXJWaXNpYmlsaXR5TWVkaWF0b3IuZ2V0RGlzcGxheXNBc3NpZ25lZFRvVXNlcih1c2VySWQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBAVXNlcklkSW50IGludCBnZXRVc2VyQXNzaWduZWRUb0Rpc3BsYXkoaW50IGRpc3BsYXlJZCkgewogICAgICAgICAgICAgcmV0dXJuIG1Vc2VyVmlzaWJpbGl0eU1lZGlhdG9yLmdldFVzZXJBc3NpZ25lZFRvRGlzcGxheShkaXNwbGF5SWQpOwogICAgICAgICB9CkBAIC03MTgyLDQ3ICs3MjQyLDI5IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBVc2VySWRJbnQgaW50IGdldEJvb3RVc2VyKCkgdGhyb3dzIFVzZXJNYW5hZ2VyLkNoZWNrZWRVc2VyT3BlcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVVzZXJzTG9jaykgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8yNDIxOTU0MDkpOiBPbiBBdXRvbW90aXZlLCBibG9jayBpZiBib290IHVzZXIgbm90IHByb3ZpZGVkLgotICAgICAgICAgICAgICAgIGlmIChtQm9vdFVzZXIgIT0gVXNlckhhbmRsZS5VU0VSX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgVXNlckRhdGEgdXNlckRhdGEgPSBtVXNlcnMuZ2V0KG1Cb290VXNlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyRGF0YSAhPSBudWxsICYmIHVzZXJEYXRhLmluZm8uc3VwcG9ydHNTd2l0Y2hUb0J5VXNlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nZi5pKExPR19UQUcsICJVc2luZyBwcm92aWRlZCBib290IHVzZXI6ICVkIiwgbUJvb3RVc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQm9vdFVzZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nZi53KExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlZCBib290IHVzZXIgY2Fubm90IGJlIHN3aXRjaGVkIHRvOiAlZCIsIG1Cb290VXNlcik7CisgICAgICAgIHB1YmxpYyBAVXNlcklkSW50IGludCBnZXRCb290VXNlcihib29sZWFuIHdhaXRVbnRpbFNldCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgVXNlck1hbmFnZXIuQ2hlY2tlZFVzZXJPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHdhaXRVbnRpbFNldCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRpbWluZ3NUcmFjZUFuZFNsb2cgdCA9IG5ldyBUaW1pbmdzVHJhY2VBbmRTbG9nKCk7CisgICAgICAgICAgICAgICAgdC50cmFjZUJlZ2luKCJ3YWl0LWJvb3QtdXNlciIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQm9vdFVzZXJMYXRjaC5nZXRDb3VudCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2dmLmQoTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNsZWVwaW5nIGZvciBib290IHVzZXIgdG8gYmUgc2V0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1heCBzbGVlcCBmb3IgVGltZTogJWQiLCBCT09UX1VTRVJfU0VUX1RJTUVPVVRfTVMpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghbUJvb3RVc2VyTGF0Y2guYXdhaXQoQk9PVF9VU0VSX1NFVF9USU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nZi53KExPR19UQUcsICJCb290IHVzZXIgbm90IHNldC4gVGltZW91dDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09UX1VTRVJfU0VUX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICBTbG9nZi53KExPR19UQUcsIGUsICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBkdXJpbmcgd2FpdCBmb3IgYm9vdCB1c2VyLiIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0LnRyYWNlRW5kKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpc0hlYWRsZXNzU3lzdGVtVXNlck1vZGUoKSkgewotICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgcHJldmlvdXMgZm9yZWdyb3VuZCB1c2VyLCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHByZXZpb3VzVXNlciA9IGdldFByZXZpb3VzRnVsbFVzZXJUb0VudGVyRm9yZWdyb3VuZCgpOwotICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1VzZXIgIT0gVXNlckhhbmRsZS5VU0VSX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZ2YuaShMT0dfVEFHLCAiQm9vdCB1c2VyIGlzIHByZXZpb3VzIHVzZXIgJWQiLCBwcmV2aW91c1VzZXIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNVc2VyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBObyBwcmV2aW91cyB1c2VyLiBSZXR1cm4gdGhlIGZpcnN0IHN3aXRjaGFibGUgdXNlciBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVXNlcnNMb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB1c2VyU2l6ZSA9IG1Vc2Vycy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXNlclNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVXNlckRhdGEgdXNlckRhdGEgPSBtVXNlcnMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyRGF0YS5pbmZvLnN1cHBvcnRzU3dpdGNoVG9CeVVzZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdFN3aXRjaGFibGUgPSB1c2VyRGF0YS5pbmZvLmlkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2dmLmkoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb290IHVzZXIgaXMgZmlyc3Qgc3dpdGNoYWJsZSB1c2VyICVkIiwgZmlyc3RTd2l0Y2hhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RTd2l0Y2hhYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIE5vIHN3aXRjaGFibGUgdXNlcnMgZm91bmQuIFVoIG9oIQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyTWFuYWdlci5DaGVja2VkVXNlck9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJObyBzd2l0Y2hhYmxlIHVzZXJzIGZvdW5kIiwgVVNFUl9PUEVSQVRJT05fRVJST1JfVU5LTk9XTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBOb3QgSFNVTSwgcmV0dXJuIHN5c3RlbSB1c2VyLgotICAgICAgICAgICAgcmV0dXJuIFVzZXJIYW5kbGUuVVNFUl9TWVNURU07CisgICAgICAgICAgICByZXR1cm4gZ2V0Qm9vdFVzZXJVbmNoZWNrZWQoKTsKICAgICAgICAgfQogCiAgICAgfSAvLyBjbGFzcyBMb2NhbFNlcnZpY2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlclN5c3RlbVBhY2thZ2VJbnN0YWxsZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlclN5c3RlbVBhY2thZ2VJbnN0YWxsZXIuamF2YQppbmRleCAxMmM5ZTk4Li4yZjk5MDYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJTeXN0ZW1QYWNrYWdlSW5zdGFsbGVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Vc2VyU3lzdGVtUGFja2FnZUluc3RhbGxlci5qYXZhCkBAIC0yMjIsNyArMjIyLDcgQEAKICAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHVzZXJBbGxvd2xpc3QgPSBnZXRJbnN0YWxsYWJsZVBhY2thZ2VzRm9yVXNlcklkKHVzZXJJZCk7CiAKICAgICAgICAgICAgIHBtSW50LmZvckVhY2hQYWNrYWdlU3RhdGUocGFja2FnZVN0YXRlIC0+IHsKLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZVN0YXRlLmdldFBrZygpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFja2FnZVN0YXRlLmdldFBrZygpID09IG51bGwgfHwgIXBhY2thZ2VTdGF0ZS5pc1N5c3RlbSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbnN0YWxsID0gKHVzZXJBbGxvd2xpc3QgPT0gbnVsbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Vc2VyVmlzaWJpbGl0eU1lZGlhdG9yLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJWaXNpYmlsaXR5TWVkaWF0b3IuamF2YQppbmRleCBhODYxNWMyLi4zNzEwYWY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJWaXNpYmlsaXR5TWVkaWF0b3IuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJWaXNpYmlsaXR5TWVkaWF0b3IuamF2YQpAQCAtNjMsMTkgKzYzLDM5IEBACiAvKioKICAqIENsYXNzIHJlc3BvbnNpYmxlIGZvciBkZWNpZGluZyB3aGV0aGVyIGEgdXNlciBpcyB2aXNpYmxlIChvciB2aXNpYmxlIGZvciBhIGdpdmVuIGRpc3BsYXkpLgogICoKLSAqIDxwPkN1cnJlbnRseSwgaXQgaGFzIDIgIm1vZGVzIiAoc2V0IG9uIGNvbnN0cnVjdG9yKSwgd2hpY2ggZGVmaW5lcyB0aGUgY2xhc3MgYmVoYXZpb3IgKGkuZSwgdGhlCisgKiA8cD5DdXJyZW50bHksIGl0IGhhcyAzICJtb2RlcyIgKHNldCBvbiBjb25zdHJ1Y3RvciksIHdoaWNoIGRlZmluZXMgdGhlIGNsYXNzIGJlaGF2aW9yIChpLmUsIHRoZQogICogbG9naWMgdGhhdCBkaWN0YXRlcyB0aGUgcmVzdWx0IG9mIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgI2lzVXNlclZpc2libGUoaW50KX0gYW5kCiAgKiB7QGxpbmsgI2lzVXNlclZpc2libGUoaW50LCBpbnQpfSk6CiAgKgogICogPHVsPgotICogICA8bGk+ZGVmYXVsdDogdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gbW9kZSAodXNlZCBieSBwaG9uZXMsIHRhYmxldHMsIGZvbGRhYmxlcywgYXV0b21vdGl2ZXMgd2l0aAotICogICBqdXN0IGNsdXN0ZXIgYW5kIGRyaXZlciBkaXNwbGF5ZXMsIGV0Yy4uLiksIHdoZXJlIHRoZSBsb2dpYyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGN1cnJlbnQKLSAqICAgZm9yZWdyb3VuZCB1c2VyIChhbmQgaXRzIHN0YXJ0ZWQgcHJvZmlsZXMpCi0gKiAgIDxsaT57QGNvZGUgTVVNRH06IG1vZGUgZm9yICIoY29uY3VycmVudCkgTXVsdGlwbGUgVXNlcnMgb24gTXVsdGlwbGUgRGlzcGxheXMiLCB3aGljaCBpcyB1c2VkIG9uCi0gKiAgIGF1dG9tb3RpdmVzIHdpdGggcGFzc2VuZ2VyIGRpc3BsYXkuIEluIHRoaXMgbW9kZSwgdXNlcnMgc3RhcnRlZCBpbiBiYWNrZ3JvdW5kIG9uIHRoZSBzZWNvbmRhcnkKLSAqICAgZGlzcGxheSBhcmUgc3RvcmVkIGluIG1hcC4KKyAqICAgPGxpPmRlZmF1bHQgKEEuSy5BIHtAY29kZSBTVVNEfSAtIFNpbmdsZSBVc2VyIG9uIFNpbmdsZSBEaXNwbGF5KTogdGhpcyBpcyB0aGUgbW9zdCBjb21tb24gbW9kZQorICogICAodXNlZCBieSBwaG9uZXMsIHRhYmxldHMsIGZvbGRhYmxlcywgY2FycyB3aXRoIGp1c3QgY2x1c3RlciBhbmQgZHJpdmVyIGRpc3BsYXlzLCBldGMuKSwKKyAqICAgd2hlcmUganVzdCB0aGUgY3VycmVudCBmb3JlZ3JvdW5kIHVzZXIgYW5kIGl0cyBwcm9maWxlcyBhcmUgdmlzaWJsZTsgaGVuY2UsIG1vc3QgbWV0aG9kcyBhcmUKKyAqICAgb3B0aW1pemVkIHRvIGp1c3QgY2hlY2sgZm9yIHRoZSBjdXJyZW50IHVzZXIgLyBwcm9maWxlLiBUaGlzIG1vZGUgaXMgdW5pdCB0ZXN0ZWQgYnkKKyAqICAge0BsaW5rIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5Vc2VyVmlzaWJpbGl0eU1lZGlhdG9yU1VTRFRlc3R9IGFuZCBDVFMgdGVzdGVkIGJ5CisgKiAgIHtAbGluayBhbmRyb2lkLm11bHRpdXNlci5jdHMuVXNlclZpc2liaWxpdHlUZXN0fS4KKyAqICAgPGxpPmNvbmN1cnJlbnQgdXNlcnMgKEEuSy5BLiB7QGNvZGUgTVVNRH0gLSBNdWx0aXBsZSBVc2VycyBvbiBNdWx0aXBsZSBEaXNwbGF5cyk6IHR5cGljYWxseQorICogICB1c2VkIG9uIGF1dG9tb3RpdmUgYnVpbGRzIHdoZXJlIHRoZSBjYXIgaGFzIGFkZGl0aW9uYWwgZGlzcGxheXMgZm9yIHBhc3NlbmdlcnMsIGl0IGFsbG93cyB1c2VycworICogICB0byBiZSBzdGFydGVkIGluIHRoZSBiYWNrZ3JvdW5kIGJ1dCB2aXNpYmxlIG9uIHRoZXNlIGRpc3BsYXlzOyBoZW5jZSwgaXQgY29udGFpbnMgYWRkaXRpb25hbAorICogICBtYXBzIHRvIGFjY291bnQgZm9yIHRoZSB2aXNpYmlsaXR5IHN0YXRlLiBUaGlzIG1vZGUgaXMgdW5pdCB0ZXN0ZWQgYnkKKyAqICAge0BsaW5rIGNvbS5hbmRyb2lkLnNlcnZlci5wbS5Vc2VyVmlzaWJpbGl0eU1lZGlhdG9yTVVNRFRlc3R9IGFuZCBDVFMgdGVzdGVkIGJ5CisgKiAgIHtAbGluayBhbmRyb2lkLm11bHRpdXNlci5jdHMuVXNlclZpc2liaWxpdHlUZXN0fS4KKyAqICAgPGxpPm5vIGRyaXZlciAoQS5LLkEuIHtAY29kZSBNVVBBTkR9IC0gTVVsdGlwbGUgUEFzc2VuZ2VycywgTm8gRHJpdmVyKTogZXh0ZW5zaW9uIG9mIHRoZQorICogICBwcmV2aW91cyBtb2RlIGFuZCB0eXBpY2FsbHkgdXNlZCBvbiBhdXRvbW90aXZlIGJ1aWxkcyB3aGVyZSB0aGUgY2FyIGhhcyBhZGRpdGlvbmFsIGRpc3BsYXlzIGZvcgorICogICBwYXNzZW5nZXJzIGJ1dCB1c2VzIGEgc2Vjb25kYXJ5IEFuZHJvaWQgc3lzdGVtIGZvciB0aGUgYmFjayBwYXNzZW5nZXJzLCBzbyBhbGwgImh1bWFuIiB1c2VycworICogICBhcmUgc3RhcnRlZCBpbiB0aGUgYmFja2dyb3VuZCAoYW5kIHRoZSBjdXJyZW50IGZvcmVncm91bmQgdXNlciBpcyB0aGUgc3lzdGVtIHVzZXIpLCBoZW5jZSB0aGUKKyAqICAgIm5vIGRyaXZlciBuYW1lIi4gVGhpcyBtb2RlIGlzIHVuaXQgdGVzdGVkIGJ5CisgKiAgIHtAbGluayBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uVXNlclZpc2liaWxpdHlNZWRpYXRvck1VUEFORFRlc3R9IGFuZCBDVFMgdGVzdGVkIGJ5CisgKiAgIHtAbGluayBhbmRyb2lkLm11bHRpdXNlci5jdHMuVXNlclZpc2liaWxpdHlWaXNpYmxlQmFja2dyb3VuZFVzZXJzT25EZWZhdWx0RGlzcGxheVRlc3R9LgogICogPC91bD4KICAqCisgKiA8cD5XaGVuIHlvdSBtYWtlIGNoYW5nZXMgaW4gdGhpcyBjbGFzcywgeW91IHNob3VsZCBydW4gYXQgbGVhc3QgdGhlIDMgdW5pdCB0ZXN0cyBhbmQKKyAqIHtAbGluayBhbmRyb2lkLm11bHRpdXNlci5jdHMuVXNlclZpc2liaWxpdHlUZXN0fSAod2hpY2ggYWN0dWFsbHkgYXBwbGllcyBmb3IgYWxsIG1vZGVzKTsgZm9yCisgKiBleGFtcGxlLCBieSBjYWxsaW5nIHtAY29kZSBhdGVzdCBVc2VyVmlzaWJpbGl0eU1lZGlhdG9yU1VTRFRlc3QgVXNlclZpc2liaWxpdHlNZWRpYXRvck1VTURUZXN0CisgKiBVc2VyVmlzaWJpbGl0eU1lZGlhdG9yTVVQQU5EVGVzdCBVc2VyVmlzaWJpbGl0eVRlc3R9LiBJZGVhbGx5LCB5b3Ugc2hvdWxkIHJ1biB0aGUgb3RoZXIgMiBDVFMKKyAqIHRlc3RzIGFzIHdlbGwgKHlvdSBjYW4gZW11bGF0ZSB0aGVzZSBtb2RlcyB1c2luZyB7QGNvZGUgYWRifSBjb21tYW5kczsgdGhlaXIgamF2YWRvYyBwcm92aWRlcworICogaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBkbyBzbykuCisgKgogICogPHA+VGhpcyBjbGFzcyBpcyB0aHJlYWQgc2FmZS4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFVzZXJWaXNpYmlsaXR5TWVkaWF0b3IgaW1wbGVtZW50cyBEdW1wYWJsZSB7CkBAIC03ODYsNiArODA2LDQ5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiogU2VlIHtAbGluayBVc2VyTWFuYWdlckludGVybmFsI2dldERpc3BsYXlzQXNzaWduZWRUb1VzZXIoaW50KX0uICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIGludFtdIGdldERpc3BsYXlzQXNzaWduZWRUb1VzZXIoQFVzZXJJZEludCBpbnQgdXNlcklkKSB7CisgICAgICAgIGludCBtYWluRGlzcGxheUlkID0gZ2V0RGlzcGxheUFzc2lnbmVkVG9Vc2VyKHVzZXJJZCk7CisgICAgICAgIGlmIChtYWluRGlzcGxheUlkID09IElOVkFMSURfRElTUExBWSkgeworICAgICAgICAgICAgLy8gVGhlIHVzZXIgd2lsbCBub3QgaGF2ZSBhbnkgZXh0cmEgZGlzcGxheXMgaWYgdGhleSBoYXZlIG5vIG1haW4gZGlzcGxheS4KKyAgICAgICAgICAgIC8vIFJldHVybiBudWxsIGlmIG5vIGRpc3BsYXkgaXMgYXNzaWduZWQgdG8gdGhlIHVzZXIuCisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgU2xvZ2YuZChUQUcsICJnZXREaXNwbGF5c0Fzc2lnbmVkVG9Vc2VyKCk6IHJldHVybmluZyBudWxsIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGlzcGxheSBhc3NpZ25lZCB0byB1c2VyICVkIiwgdXNlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1FeHRyYURpc3BsYXlzQXNzaWduZWRUb1VzZXJzID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgbUV4dHJhRGlzcGxheXNBc3NpZ25lZFRvVXNlcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGludFtde21haW5EaXNwbGF5SWR9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgaW50W10gZGlzcGxheUlkcyA9IG5ldyBpbnRbbUV4dHJhRGlzcGxheXNBc3NpZ25lZFRvVXNlcnMuc2l6ZSgpICsgMV07CisgICAgICAgICAgICBkaXNwbGF5SWRzW2NvdW50KytdID0gbWFpbkRpc3BsYXlJZDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUV4dHJhRGlzcGxheXNBc3NpZ25lZFRvVXNlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAobUV4dHJhRGlzcGxheXNBc3NpZ25lZFRvVXNlcnMudmFsdWVBdChpKSA9PSB1c2VySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheUlkc1tjb3VudCsrXSA9IG1FeHRyYURpc3BsYXlzQXNzaWduZWRUb1VzZXJzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgYXJyYXkgaWYgdGhlIGFycmF5IGxlbmd0aCBoYXBwZW5zIHRvIGJlIGNvcnJlY3QuCisgICAgICAgICAgICBpZiAoZGlzcGxheUlkcy5sZW5ndGggPT0gY291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzcGxheUlkczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29weSB0aGUgcmVzdWx0cyB0byBhIG5ldyBhcnJheSB3aXRoIHRoZSBleGFjdCBsZW5ndGguIFRoZSBzaXplIG9mIGRpc3BsYXlJZHNbXSBpcworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgdG8gYDEgKyBtRXh0cmFEaXNwbGF5c0Fzc2lnbmVkVG9Vc2Vycy5zaXplKClgLCB3aGljaCBpcyB1c3VhbGx5IGxhcmdlcgorICAgICAgICAgICAgLy8gdGhhbiB0aGUgYWN0dWFsIGxlbmd0aCwgYmVjYXVzZSBtRXh0cmFEaXNwbGF5c0Fzc2lnbmVkVG9Vc2VycyBjb250YWlucyBkaXNwbGF5SWRzIGZvcgorICAgICAgICAgICAgLy8gb3RoZXIgdXNlcnMuIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBjb3B5IHRvIGEgbmV3IGFycmF5IHdpdGggdGhlIGNvcnJlY3QgbGVuZ3RoLgorICAgICAgICAgICAgaW50W10gcmVzdWx0cyA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkaXNwbGF5SWRzLCAwLCByZXN1bHRzLCAwLCBjb3VudCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFNlZSB7QGxpbmsgVXNlck1hbmFnZXJJbnRlcm5hbCNnZXRVc2VyQXNzaWduZWRUb0Rpc3BsYXkoaW50KX0uCiAgICAgICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1ZlcmlmeWluZ1Nlc3Npb24uamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVmVyaWZ5aW5nU2Vzc2lvbi5qYXZhCmluZGV4IDViOTY3ZWMuLmYzNDBmOTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVmVyaWZ5aW5nU2Vzc2lvbi5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVmVyaWZ5aW5nU2Vzc2lvbi5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5TaWduaW5nRGV0YWlscy5TaWduYXR1cmVTY2hlbWVWZXJzaW9uLlNJR05JTkdfQkxPQ0tfVjQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuUG93ZXJXaGl0ZWxpc3RNYW5hZ2VyLlJFQVNPTl9QQUNLQUdFX1ZFUklGSUVSOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLlBvd2VyV2hpdGVsaXN0TWFuYWdlci5URU1QT1JBUllfQUxMT1dMSVNUX1RZUEVfRk9SRUdST1VORF9TRVJWSUNFX0FMTE9XRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQub3MuUHJvY2Vzcy5TWVNURU1fVUlEOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLlRyYWNlLlRSQUNFX1RBR19QQUNLQUdFX01BTkFHRVI7CiAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VNYW5hZ2VyU2VydmljZS5DSEVDS19QRU5ESU5HX0lOVEVHUklUWV9WRVJJRklDQVRJT047CkBAIC00MDgsNyArNDA3LDcgQEAKICAgICAgICAgZmluYWwgaW50IG51bVJlcXVpcmVkVmVyaWZpZXJQYWNrYWdlcyA9IHJlcXVpcmVkVmVyaWZpZXJQYWNrYWdlcy5zaXplKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSBudW1SZXF1aXJlZFZlcmlmaWVyUGFja2FnZXMgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgaWYgKCFzbmFwc2hvdC5pc0FwcGxpY2F0aW9uRWZmZWN0aXZlbHlFbmFibGVkKHJlcXVpcmVkVmVyaWZpZXJQYWNrYWdlcy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgIFNZU1RFTV9VSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIHZlcmlmaWVyVXNlcikpIHsKICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLAogICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVkIHZlcmlmaWVyOiAiICsgcmVxdWlyZWRWZXJpZmllclBhY2thZ2VzLmdldChpKSArICIgaXMgZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgICByZXF1aXJlZFZlcmlmaWVyUGFja2FnZXMucmVtb3ZlKGkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wa2cvUGFja2FnZVN0YXRlSW50ZXJuYWwuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vcGtnL1BhY2thZ2VTdGF0ZUludGVybmFsLmphdmEKaW5kZXggMmY0YzAyNzcuLjNhMGZmMjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vcGtnL1BhY2thZ2VTdGF0ZUludGVybmFsLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wa2cvUGFja2FnZVN0YXRlSW50ZXJuYWwuamF2YQpAQCAtODEsNiArODEsOCBAQAogCiAgICAgZmxvYXQgZ2V0TG9hZGluZ1Byb2dyZXNzKCk7CiAKKyAgICBsb25nIGdldExvYWRpbmdDb21wbGV0ZWRUaW1lKCk7CisKICAgICBATm9uTnVsbAogICAgIFBhY2thZ2VLZXlTZXREYXRhIGdldEtleVNldERhdGEoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wa2cvbXV0YXRlL1BhY2thZ2VTdGF0ZU11dGF0b3IuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vcGtnL211dGF0ZS9QYWNrYWdlU3RhdGVNdXRhdG9yLmphdmEKaW5kZXggNTk0N2Q0Ny4uODEyNWIwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wa2cvbXV0YXRlL1BhY2thZ2VTdGF0ZU11dGF0b3IuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BrZy9tdXRhdGUvUGFja2FnZVN0YXRlTXV0YXRvci5qYXZhCkBAIC0yNzQsNiArMjc0LDE1IEBACiAKICAgICAgICAgQE5vbk51bGwKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQYWNrYWdlU3RhdGVXcml0ZSBzZXRMb2FkaW5nQ29tcGxldGVkVGltZShsb25nIGxvYWRpbmdDb21wbGV0ZWRUaW1lKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3RhdGUuc2V0TG9hZGluZ0NvbXBsZXRlZFRpbWUobG9hZGluZ0NvbXBsZXRlZFRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBATm9uTnVsbAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFBhY2thZ2VTdGF0ZVdyaXRlIHNldE92ZXJyaWRlU2VJbmZvKEBOdWxsYWJsZSBTdHJpbmcgbmV3U2VJbmZvKSB7CiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtU3RhdGUuZ2V0VHJhbnNpZW50U3RhdGUoKS5zZXRPdmVycmlkZVNlSW5mbyhuZXdTZUluZm8pOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wa2cvbXV0YXRlL1BhY2thZ2VTdGF0ZVdyaXRlLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BrZy9tdXRhdGUvUGFja2FnZVN0YXRlV3JpdGUuamF2YQppbmRleCBjNjEwYzAyLi41NWQ5NmYzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BrZy9tdXRhdGUvUGFja2FnZVN0YXRlV3JpdGUuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BrZy9tdXRhdGUvUGFja2FnZVN0YXRlV3JpdGUuamF2YQpAQCAtNTMsNiArNTMsOSBAQAogICAgIFBhY2thZ2VTdGF0ZVdyaXRlIHNldExvYWRpbmdQcm9ncmVzcyhmbG9hdCBwcm9ncmVzcyk7CiAKICAgICBATm9uTnVsbAorICAgIFBhY2thZ2VTdGF0ZVdyaXRlIHNldExvYWRpbmdDb21wbGV0ZWRUaW1lKGxvbmcgbG9hZGluZ0NvbXBsZXRlZFRpbWUpOworCisgICAgQE5vbk51bGwKICAgICBQYWNrYWdlU3RhdGVXcml0ZSBzZXRPdmVycmlkZVNlSW5mbyhATnVsbGFibGUgU3RyaW5nIG5ld1NlSW5mbyk7CiAKICAgICBATm9uTnVsbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb2xpY3kvRGV2aWNlU3RhdGVQcm92aWRlckltcGwuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG9saWN5L0RldmljZVN0YXRlUHJvdmlkZXJJbXBsLmphdmEKaW5kZXggOGQ3Zjc4Mi4uMzY0NDA1NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb2xpY3kvRGV2aWNlU3RhdGVQcm92aWRlckltcGwuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BvbGljeS9EZXZpY2VTdGF0ZVByb3ZpZGVySW1wbC5qYXZhCkBAIC0yMSw3ICsyMSwxMCBAQAogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3I7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50TGlzdGVuZXI7CkBAIC0xMDEsOCArMTA0LDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU1VTEFURURfT05MWSA9ICJGTEFHX0VNVUxBVEVEX09OTFkiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NBTkNFTF9XSEVOX1JFUVVFU1RFUl9OT1RfT05fVE9QID0KICAgICAgICAgICAgICJGTEFHX0NBTkNFTF9XSEVOX1JFUVVFU1RFUl9OT1RfT05fVE9QIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwgPQotICAgICAgICAgICAgIkZMQUdfRElTQUJMRV9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19VTlNVUFBPUlRFRF9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMID0KKyAgICAgICAgICAgICJGTEFHX1VOU1VQUE9SVEVEX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1VOU1VQUE9SVEVEX1dIRU5fUE9XRVJfU0FWRV9NT0RFID0KKyAgICAgICAgICAgICJGTEFHX1VOU1VQUE9SVEVEX1dIRU5fUE9XRVJfU0FWRV9NT0RFIjsKIAogICAgIC8qKiBJbnRlcmZhY2UgdGhhdCBhbGxvd3MgcmVhZGluZyB0aGUgZGV2aWNlIHN0YXRlIGNvbmZpZ3VyYXRpb24uICovCiAgICAgaW50ZXJmYWNlIFJlYWRhYmxlQ29uZmlnIHsKQEAgLTE2Miw5ICsxNjcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGTEFHX0NBTkNFTF9XSEVOX1JFUVVFU1RFUl9OT1RfT05fVE9QOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRGV2aWNlU3RhdGUuRkxBR19DQU5DRUxfV0hFTl9SRVFVRVNURVJfTk9UX09OX1RPUDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZMQUdfRElTQUJMRV9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRGV2aWNlU3RhdGUuRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxBR19VTlNVUFBPUlRFRF9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRGV2aWNlU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBEZXZpY2VTdGF0ZS5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fUE9XRVJfU0FWRV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlBhcnNlZCB1bmtub3duIGZsYWcgd2l0aCBuYW1lOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZmlnRmxhZ1N0cmluZyk7CkBAIC0yMTAsNiArMjE4LDkgQEAKICAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCiAgICAgcHJpdmF0ZSBAUG93ZXJNYW5hZ2VyLlRoZXJtYWxTdGF0dXMgaW50IG1UaGVybWFsU3RhdHVzID0gUG93ZXJNYW5hZ2VyLlRIRVJNQUxfU1RBVFVTX05PTkU7CiAKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBib29sZWFuIG1Qb3dlclNhdmVNb2RlRW5hYmxlZDsKKwogICAgIHByaXZhdGUgRGV2aWNlU3RhdGVQcm92aWRlckltcGwoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0LAogICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxEZXZpY2VTdGF0ZT4gZGV2aWNlU3RhdGVzLAogICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxDb25kaXRpb25zPiBzdGF0ZUNvbmRpdGlvbnMpIHsKQEAgLTIyNCwxNCArMjM1LDMyIEBACiAKICAgICAgICAgc2V0U3RhdGVDb25kaXRpb25zKGRldmljZVN0YXRlcywgc3RhdGVDb25kaXRpb25zKTsKIAotICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIGRldmljZSBzdGF0ZXMgYXJlIHRoZXJtYWwgc2Vuc2l0aXZlLCBpLmUuIGl0IHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotICAgICAgICAvLyBkZXZpY2UgaXMgb3ZlcmhlYXRpbmcsIHRoZW4gd2Ugd2lsbCB1cGRhdGUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHN0YXRlcyB3aGVuIHRoZXJtYWwKLSAgICAgICAgLy8gc3RhdHVzIGNoYW5nZXMuCi0gICAgICAgIGlmIChoYXNUaGVybWFsU2Vuc2l0aXZlU3RhdGUoZGV2aWNlU3RhdGVzKSkgewotICAgICAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShQb3dlck1hbmFnZXIuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHBvd2VyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoUG93ZXJNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgaWYgKHBvd2VyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIGRldmljZSBzdGF0ZXMgYXJlIHRoZXJtYWwgc2Vuc2l0aXZlLCBpLmUuIGl0IHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgZGV2aWNlIGlzIG92ZXJoZWF0aW5nLCB0aGVuIHdlIHdpbGwgdXBkYXRlIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzdGF0ZXMgd2hlbgorICAgICAgICAgICAgLy8gdGhlcm1hbCBzdGF0dXMgY2hhbmdlcy4KKyAgICAgICAgICAgIGlmIChoYXNUaGVybWFsU2Vuc2l0aXZlU3RhdGUoZGV2aWNlU3RhdGVzKSkgewogICAgICAgICAgICAgICAgIHBvd2VyTWFuYWdlci5hZGRUaGVybWFsU3RhdHVzTGlzdGVuZXIodGhpcyk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgZGV2aWNlIHN0YXRlcyBhcmUgcG93ZXIgc2Vuc2l0aXZlLCBpLmUuIGl0IHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuCisgICAgICAgICAgICAvLyBwb3dlciBzYXZlIG1vZGUgaXMgZW5hYmxlZCwgdGhlbiB3ZSB3aWxsIHVwZGF0ZSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgc3RhdGVzIHdoZW4KKyAgICAgICAgICAgIC8vIHBvd2VyIHNhdmUgbW9kZSBpcyB0b2dnbGVkLgorICAgICAgICAgICAgaWYgKGhhc1Bvd2VyU2F2ZVNlbnNpdGl2ZVN0YXRlKGRldmljZVN0YXRlcykpIHsKKyAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyTWFuYWdlci5BQ1RJT05fUE9XRVJfU0FWRV9NT0RFX0NIQU5HRURfSU5URVJOQUwpOworICAgICAgICAgICAgICAgIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBvd2VyTWFuYWdlci5BQ1RJT05fUE9XRVJfU0FWRV9NT0RFX0NIQU5HRURfSU5URVJOQUwuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Qb3dlclNhdmVNb2RlQ2hhbmdlZChwb3dlck1hbmFnZXIuaXNQb3dlclNhdmVNb2RlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0zODIsNyArNDExLDExIEBACiAgICAgICAgICAgICBmb3IgKERldmljZVN0YXRlIGRldmljZVN0YXRlIDogbU9yZGVyZWRTdGF0ZXMpIHsKICAgICAgICAgICAgICAgICBpZiAoaXNUaGVybWFsU3RhdHVzQ3JpdGljYWxPckFib3ZlKG1UaGVybWFsU3RhdHVzKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGV2aWNlU3RhdGUuaGFzRmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlU3RhdGUuRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtUG93ZXJTYXZlTW9kZUVuYWJsZWQgJiYgZGV2aWNlU3RhdGUuaGFzRmxhZygKKyAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRTdGF0ZXMuYWRkKGRldmljZVN0YXRlKTsKQEAgLTY3NCw2ICs3MDcsMTggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHZvaWQgb25Qb3dlclNhdmVNb2RlQ2hhbmdlZChib29sZWFuIGlzUG93ZXJTYXZlTW9kZUVuYWJsZWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1Qb3dlclNhdmVNb2RlRW5hYmxlZCAhPSBpc1Bvd2VyU2F2ZU1vZGVFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgbVBvd2VyU2F2ZU1vZGVFbmFibGVkID0gaXNQb3dlclNhdmVNb2RlRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBub3RpZnlTdXBwb3J0ZWRTdGF0ZXNDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgaXNQb3dlclNhdmVNb2RlRW5hYmxlZCA/IFNVUFBPUlRFRF9ERVZJQ0VfU1RBVEVTX0NIQU5HRURfUE9XRVJfU0FWRV9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9QT1dFUl9TQVZFX0RJU0FCTEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uVGhlcm1hbFN0YXR1c0NoYW5nZWQoQFBvd2VyTWFuYWdlci5UaGVybWFsU3RhdHVzIGludCB0aGVybWFsU3RhdHVzKSB7CiAgICAgICAgIGludCBwcmV2aW91c1RoZXJtYWxTdGF0dXM7CkBAIC03MDksNyArNzU0LDE2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1RoZXJtYWxTZW5zaXRpdmVTdGF0ZShMaXN0PERldmljZVN0YXRlPiBkZXZpY2VTdGF0ZXMpIHsKICAgICAgICAgZm9yIChEZXZpY2VTdGF0ZSBzdGF0ZSA6IGRldmljZVN0YXRlcykgewotICAgICAgICAgICAgaWYgKHN0YXRlLmhhc0ZsYWcoRGV2aWNlU3RhdGUuRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwpKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUuaGFzRmxhZyhEZXZpY2VTdGF0ZS5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzUG93ZXJTYXZlU2Vuc2l0aXZlU3RhdGUoTGlzdDxEZXZpY2VTdGF0ZT4gZGV2aWNlU3RhdGVzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGV2aWNlU3RhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlU3RhdGVzLmdldChpKS5oYXNGbGFnKERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG9saWN5L1Bob25lV2luZG93TWFuYWdlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb2xpY3kvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKaW5kZXggNGVjOGFmZC4uZWE1M2VhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb2xpY3kvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb2xpY3kvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKQEAgLTY0Nyw2ICs2NDcsOSBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2NrTm93UGVuZGluZyA9IGZhbHNlOwogCisgICAgLy8gVGltZW91dCBmb3Igc2hvd2luZyB0aGUga2V5Z3VhcmQgYWZ0ZXIgdGhlIHNjcmVlbiBpcyBvbiwgaW4gY2FzZSBubyAicmVhZHkiIGlzIHJlY2VpdmVkLgorICAgIHByaXZhdGUgaW50IG1LZXlndWFyZERyYXduVGltZW91dCA9IDEwMDA7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RJU1BBVENIX01FRElBX0tFWV9XSVRIX1dBS0VfTE9DSyA9IDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ESVNQQVRDSF9NRURJQV9LRVlfUkVQRUFUX1dJVEhfV0FLRV9MT0NLID0gNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0tFWUdVQVJEX0RSQVdOX0NPTVBMRVRFID0gNTsKQEAgLTIyMzYsNiArMjIzOSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCisgICAgICAgIG1LZXlndWFyZERyYXduVGltZW91dCA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pbnRlZ2VyLmNvbmZpZ19rZXlndWFyZERyYXduVGltZW91dCk7CiAgICAgICAgIG1LZXlndWFyZERlbGVnYXRlID0gbmV3IEtleWd1YXJkU2VydmljZURlbGVnYXRlKG1Db250ZXh0LAogICAgICAgICAgICAgICAgIG5ldyBTdGF0ZUNhbGxiYWNrKCkgewogICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTQ5ODEsNyArNDk4Niw3IEBACiAgICAgICAgIGZpbmFsIGJvb2xlYW4gYm9vdENvbXBsZXRlZCA9CiAgICAgICAgICAgICAgICAgTG9jYWxTZXJ2aWNlcy5nZXRTZXJ2aWNlKFN5c3RlbVNlcnZpY2VNYW5hZ2VyLmNsYXNzKS5pc0Jvb3RDb21wbGV0ZWQoKTsKICAgICAgICAgLy8gU2V0IGxvbmdlciB0aW1lb3V0IGlmIGl0IGhhcyBub3QgYm9vdGVkIHlldCB0byBwcmV2ZW50IHNob3dpbmcgZW1wdHkgd2luZG93LgotICAgICAgICByZXR1cm4gYm9vdENvbXBsZXRlZCA/IDEwMDAgOiA1MDAwOworICAgICAgICByZXR1cm4gYm9vdENvbXBsZXRlZCA/IG1LZXlndWFyZERyYXduVGltZW91dCA6IDUwMDA7CiAgICAgfQogCiAgICAgLy8gQ2FsbGVkIG9uIHRoZSBEaXNwbGF5TWFuYWdlcidzIERpc3BsYXlQb3dlckNvbnRyb2xsZXIgdGhyZWFkLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb3dlci9Ob3RpZmllci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb3dlci9Ob3RpZmllci5qYXZhCmluZGV4IGRhN2FhYTQuLmQwZWQ5YmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG93ZXIvTm90aWZpZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3Bvd2VyL05vdGlmaWVyLmphdmEKQEAgLTI0MSw3ICsyNDEsNyBAQAogICAgICAgICAgICAgICAgIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgSW50ZW50LkFDVElPTl9TQ1JFRU5fT04pOwogICAgICAgICAvLyBUaGlzIGFsbG93cyB0aGUgYnJvYWRjYXN0IGRlbGl2ZXJ5IHRvIGJlIGRlbGF5ZWQgdG8gYXBwcyBpbiB0aGUgQ2FjaGVkIHN0YXRlLgotICAgICAgICBvcHRpb25zLnNldERlZmVyVW50aWxBY3RpdmUodHJ1ZSk7CisgICAgICAgIG9wdGlvbnMuc2V0RGVmZXJyYWxQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfVU5USUxfQUNUSVZFKTsKICAgICAgICAgcmV0dXJuIG9wdGlvbnMudG9CdW5kbGUoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG93ZXIvc3RhdHMvQmF0dGVyeVN0YXRzSW1wbC5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb3dlci9zdGF0cy9CYXR0ZXJ5U3RhdHNJbXBsLmphdmEKaW5kZXggYmMyMzAyMC4uNjYxNzE1YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb3dlci9zdGF0cy9CYXR0ZXJ5U3RhdHNJbXBsLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wb3dlci9zdGF0cy9CYXR0ZXJ5U3RhdHNJbXBsLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC51c2FnZS5OZXR3b3JrU3RhdHNNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFjdGl2aXR5RW5lcmd5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5VaWRUcmFmZmljOwpAQCAtNTAwLDE0ICs1MDEsNiBAQAogCiAgICAgfQogCi0gICAgLyoqIEhhbmRsZXMgY2FsbHMgdG8gQWxhcm1NYW5hZ2VyICovCi0gICAgcHVibGljIGludGVyZmFjZSBBbGFybUludGVyZmFjZSB7Ci0gICAgICAgIC8qKiBTY2hlZHVsZSBhbiBSVEMgYWxhcm0gKi8KLSAgICAgICAgdm9pZCBzY2hlZHVsZShsb25nIHJ0Y1RpbWVNcywgbG9uZyB3aW5kb3dMZW5ndGhNcyk7Ci0gICAgICAgIC8qKiBDYW5jZWwgdGhlIHByZXZpb3VzbHkgc2NoZWR1bGVkIGFsYXJtICovCi0gICAgICAgIHZvaWQgY2FuY2VsKCk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBmaW5hbCBQbGF0Zm9ybUlkbGVTdGF0ZUNhbGxiYWNrIG1QbGF0Zm9ybUlkbGVTdGF0ZUNhbGxiYWNrOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtRGVmZXJTZXRDaGFyZ2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKQEAgLTE1NjksOCArMTU2MiwxNSBAQAogICAgIEBHdWFyZGVkQnkoInRoaXMiKQogICAgIHByb3RlY3RlZCBCYXR0ZXJ5U3RhdHNDb25maWcgbUJhdHRlcnlTdGF0c0NvbmZpZyA9IG5ldyBCYXR0ZXJ5U3RhdHNDb25maWcuQnVpbGRlcigpLmJ1aWxkKCk7CiAKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwcm90ZWN0ZWQgQWxhcm1JbnRlcmZhY2UgbUxvbmdQbHVnSW5BbGFybUludGVyZmFjZSA9IG51bGw7CisgICAgQEd1YXJkZWRCeSgidGhpcyIpCisgICAgcHJpdmF0ZSBBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlciA9IG51bGw7CisKKyAgICBwcml2YXRlIGZpbmFsIEFsYXJtTWFuYWdlci5PbkFsYXJtTGlzdGVuZXIgbUxvbmdQbHVnSW5BbGFybUhhbmRsZXIgPSAoKSAtPgorICAgICAgICAgICAgbUhhbmRsZXIucG9zdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChCYXR0ZXJ5U3RhdHNJbXBsLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF5YmVSZXNldFdoaWxlUGx1Z2dlZEluTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CiAKICAgICAvKgogICAgICAqIEhvbGRzIGEgU2FtcGxpbmdUaW1lciBhc3NvY2lhdGVkIHdpdGggZWFjaCBSZXNvdXJjZSBQb3dlciBNYW5hZ2VyIHN0YXRlIGFuZCB2b3RlciwKQEAgLTExMDYxLDE4ICsxMTA2MSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5qZWN0cyBhbiBBbGFybUludGVyZmFjZSBmb3IgdGhlIGxvbmcgcGx1ZyBpbiBhbGFybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nUGx1Z0luQWxhcm1JbnRlcmZhY2UoQWxhcm1JbnRlcmZhY2UgbG9uZ1BsdWdJbkFsYXJtSW50ZXJmYWNlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgbUxvbmdQbHVnSW5BbGFybUludGVyZmFjZSA9IGxvbmdQbHVnSW5BbGFybUludGVyZmFjZTsKLSAgICAgICAgICAgIGlmIChtQmF0dGVyeVBsdWdnZWRJbikgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlTmV4dFJlc2V0V2hpbGVQbHVnZ2VkSW5DaGVjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogU3RhcnRzIHRyYWNraW5nIENQVSB0aW1lLWluLXN0YXRlIGZvciB0aHJlYWRzIG9mIHRoZSBzeXN0ZW0gc2VydmVyIHByb2Nlc3MsCiAgICAgICoga2VlcGluZyBhIHNlcGFyYXRlIGFjY291bnQgb2YgdGhyZWFkcyByZWNlaXZpbmcgaW5jb21pbmcgYmluZGVyIGNhbGxzLgogICAgICAqLwpAQCAtMTQxNzMsNiArMTQxNjEsNyBAQAogICAgIC8qKgogICAgICAqIE1pZ2h0IHJlc2V0IGJhdHRlcnkgc3RhdHMgaWYgY29uZGl0aW9ucyBhcmUgbWV0LiBBc3N1bWVkIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IHBsdWdnZWQgaW4uCiAgICAgICovCisgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgQEd1YXJkZWRCeSgidGhpcyIpCiAgICAgcHVibGljIHZvaWQgbWF5YmVSZXNldFdoaWxlUGx1Z2dlZEluTG9ja2VkKCkgewogICAgICAgICBmaW5hbCBsb25nIGVsYXBzZWRSZWFsdGltZU1zID0gbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwpAQCAtMTQxODksMjggKzE0MTc4LDMxIEBACiAKICAgICBAR3VhcmRlZEJ5KCJ0aGlzIikKICAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVOZXh0UmVzZXRXaGlsZVBsdWdnZWRJbkNoZWNrKCkgewotICAgICAgICBpZiAobUxvbmdQbHVnSW5BbGFybUludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHRpbWVvdXRNcyA9IG1DbG9jay5jdXJyZW50VGltZU1pbGxpcygpCi0gICAgICAgICAgICAgICAgICAgICsgbUNvbnN0YW50cy5SRVNFVF9XSElMRV9QTFVHR0VEX0lOX01JTklNVU1fRFVSQVRJT05fSE9VUlMKLSAgICAgICAgICAgICAgICAgICAgKiBEYXRlVXRpbHMuSE9VUl9JTl9NSUxMSVM7Ci0gICAgICAgICAgICBDYWxlbmRhciBuZXh0QWxhcm0gPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgbmV4dEFsYXJtLnNldFRpbWVJbk1pbGxpcyh0aW1lb3V0TXMpOworICAgICAgICBpZiAobUFsYXJtTWFuYWdlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGZpbmFsIGxvbmcgdGltZW91dE1zID0gbUNsb2NrLmN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgICAgICAgICArIG1Db25zdGFudHMuUkVTRVRfV0hJTEVfUExVR0dFRF9JTl9NSU5JTVVNX0RVUkFUSU9OX0hPVVJTCisgICAgICAgICAgICAgICAgKiBEYXRlVXRpbHMuSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIENhbGVuZGFyIG5leHRBbGFybSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5leHRBbGFybS5zZXRUaW1lSW5NaWxsaXModGltZW91dE1zKTsKIAotICAgICAgICAgICAgLy8gRmluZCB0aGUgMiBBTSB0aGUgc2FtZSBkYXkgYXMgdGhlIGVuZCBvZiB0aGUgbWluaW11bSBkdXJhdGlvbi4KLSAgICAgICAgICAgIC8vIFRoaXMgbG9naWMgZG9lcyBub3QgaGFuZGxlIGEgRGF5bGlnaHQgU2F2aW5ncyB0cmFuc2l0aW9uLCBvciBhIHRpbWV6b25lIGNoYW5nZQotICAgICAgICAgICAgLy8gd2hpbGUgdGhlIGFsYXJtIGhhcyBiZWVuIHNldC4gVGhlIG5lZWQgdG8gcmVzZXQgYWZ0ZXIgYSBsb25nIHBlcmlvZCB3aGlsZSBwbHVnZ2VkCi0gICAgICAgICAgICAvLyBpbiBpcyBub3Qgc3RyaWN0IGVub3VnaCB0byB3YXJyYW50IGEgd2VsbCBhcmNoaXRlY3RlZCBvdXQgc29sdXRpb24uCi0gICAgICAgICAgICBuZXh0QWxhcm0uc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKLSAgICAgICAgICAgIG5leHRBbGFybS5zZXQoQ2FsZW5kYXIuU0VDT05ELCAwKTsKLSAgICAgICAgICAgIG5leHRBbGFybS5zZXQoQ2FsZW5kYXIuTUlOVVRFLCAwKTsKLSAgICAgICAgICAgIG5leHRBbGFybS5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIDIpOwotICAgICAgICAgICAgbG9uZyBuZXh0VGltZU1zID0gbmV4dEFsYXJtLmdldFRpbWVJbk1pbGxpcygpOwotICAgICAgICAgICAgaWYgKG5leHRUaW1lTXMgPCB0aW1lb3V0TXMpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgMkFNIG9uIHRoZSBkYXkgb2YgdGhlIHRpbWVvdXQsIG1vdmUgb24gdGhlIG5leHQgZGF5LgotICAgICAgICAgICAgICAgIG5leHRUaW1lTXMgKz0gRGF0ZVV0aWxzLkRBWV9JTl9NSUxMSVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTG9uZ1BsdWdJbkFsYXJtSW50ZXJmYWNlLnNjaGVkdWxlKG5leHRUaW1lTXMsIERhdGVVdGlscy5IT1VSX0lOX01JTExJUyk7CisgICAgICAgIC8vIEZpbmQgdGhlIDIgQU0gdGhlIHNhbWUgZGF5IGFzIHRoZSBlbmQgb2YgdGhlIG1pbmltdW0gZHVyYXRpb24uCisgICAgICAgIC8vIFRoaXMgbG9naWMgZG9lcyBub3QgaGFuZGxlIGEgRGF5bGlnaHQgU2F2aW5ncyB0cmFuc2l0aW9uLCBvciBhIHRpbWV6b25lIGNoYW5nZQorICAgICAgICAvLyB3aGlsZSB0aGUgYWxhcm0gaGFzIGJlZW4gc2V0LiBUaGUgbmVlZCB0byByZXNldCBhZnRlciBhIGxvbmcgcGVyaW9kIHdoaWxlIHBsdWdnZWQKKyAgICAgICAgLy8gaW4gaXMgbm90IHN0cmljdCBlbm91Z2ggdG8gd2FycmFudCBhIHdlbGwgYXJjaGl0ZWN0ZWQgb3V0IHNvbHV0aW9uLgorICAgICAgICBuZXh0QWxhcm0uc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKKyAgICAgICAgbmV4dEFsYXJtLnNldChDYWxlbmRhci5TRUNPTkQsIDApOworICAgICAgICBuZXh0QWxhcm0uc2V0KENhbGVuZGFyLk1JTlVURSwgMCk7CisgICAgICAgIG5leHRBbGFybS5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIDIpOworICAgICAgICBsb25nIHBvc3NpYmxlTmV4dFRpbWVNcyA9IG5leHRBbGFybS5nZXRUaW1lSW5NaWxsaXMoKTsKKyAgICAgICAgaWYgKHBvc3NpYmxlTmV4dFRpbWVNcyA8IHRpbWVvdXRNcykgeworICAgICAgICAgICAgLy8gVGhlIDJBTSBvbiB0aGUgZGF5IG9mIHRoZSB0aW1lb3V0LCBtb3ZlIG9uIHRoZSBuZXh0IGRheS4KKyAgICAgICAgICAgIHBvc3NpYmxlTmV4dFRpbWVNcyArPSBEYXRlVXRpbHMuREFZX0lOX01JTExJUzsKICAgICAgICAgfQorICAgICAgICBmaW5hbCBsb25nIG5leHRUaW1lTXMgPSBwb3NzaWJsZU5leHRUaW1lTXM7CisgICAgICAgIGZpbmFsIEFsYXJtTWFuYWdlciBhbSA9IG1BbGFybU1hbmFnZXI7CisgICAgICAgIG1IYW5kbGVyLnBvc3QoKCkgLT4gYW0uc2V0V2luZG93KEFsYXJtTWFuYWdlci5SVEMsIG5leHRUaW1lTXMsCisgICAgICAgICAgICAgICAgRGF0ZVV0aWxzLkhPVVJfSU5fTUlMTElTLAorICAgICAgICAgICAgICAgIFRBRywgbUxvbmdQbHVnSW5BbGFybUhhbmRsZXIsIG1IYW5kbGVyKSk7CiAgICAgfQogCiAKQEAgLTE0MzM5LDggKzE0MzMxLDEyIEBACiAgICAgICAgICAgICAgICAgaW5pdEFjdGl2ZUhpc3RvcnlFdmVudHNMb2NrZWQobVNlY1JlYWx0aW1lLCBtU2VjVXB0aW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1CYXR0ZXJ5UGx1Z2dlZEluID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobUxvbmdQbHVnSW5BbGFybUludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxvbmdQbHVnSW5BbGFybUludGVyZmFjZS5jYW5jZWwoKTsKKyAgICAgICAgICAgIGlmIChtQWxhcm1NYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBBbGFybU1hbmFnZXIgYW0gPSBtQWxhcm1NYW5hZ2VyOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QoKCkgLT4geworICAgICAgICAgICAgICAgICAgICAvLyBObyBsb25nZXIgcGx1Z2dlZCBpbi4gQ2FuY2VsIHRoZSBsb25nIHBsdWcgaW4gYWxhcm0uCisgICAgICAgICAgICAgICAgICAgIGFtLmNhbmNlbChtTG9uZ1BsdWdJbkFsYXJtSGFuZGxlcik7CisgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtSGlzdG9yeS5yZWNvcmRCYXR0ZXJ5U3RhdGUobVNlY1JlYWx0aW1lLCBtU2VjVXB0aW1lLCBsZXZlbCwgbUJhdHRlcnlQbHVnZ2VkSW4pOwogICAgICAgICAgICAgbURpc2NoYXJnZUN1cnJlbnRMZXZlbCA9IG1EaXNjaGFyZ2VVbnBsdWdMZXZlbCA9IGxldmVsOwpAQCAtMTUxNzgsNiArMTUxNzQsMTQgQEAKICAgICBwdWJsaWMgdm9pZCBzeXN0ZW1TZXJ2aWNlc1JlYWR5KENvbnRleHQgY29udGV4dCkgewogICAgICAgICBtQ29uc3RhbnRzLnN0YXJ0T2JzZXJ2aW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkpOwogICAgICAgICByZWdpc3RlclVzYlN0YXRlUmVjZWl2ZXIoY29udGV4dCk7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtQWxhcm1NYW5hZ2VyID0gY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEFsYXJtTWFuYWdlci5jbGFzcyk7CisgICAgICAgICAgICBpZiAobUJhdHRlcnlQbHVnZ2VkSW4pIHsKKyAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHBsdWdnZWQgaW4uIFNjaGVkdWxlIHRoZSBsb25nIHBsdWcgaW4gYWxhcm0uCisgICAgICAgICAgICAgICAgc2NoZWR1bGVOZXh0UmVzZXRXaGlsZVBsdWdnZWRJbkNoZWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc3BlZWNoL1JlbW90ZVNwZWVjaFJlY29nbml0aW9uU2VydmljZS5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9zcGVlY2gvUmVtb3RlU3BlZWNoUmVjb2duaXRpb25TZXJ2aWNlLmphdmEKaW5kZXggOGU4YWJmNi4uOTZmNGEwMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9zcGVlY2gvUmVtb3RlU3BlZWNoUmVjb2duaXRpb25TZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9zcGVlY2gvUmVtb3RlU3BlZWNoUmVjb2duaXRpb25TZXJ2aWNlLmphdmEKQEAgLTI1MCwxNSArMjUwLDcgQEAKICAgICAgICAgICAgICAgICBzZXJ2aWNlLmNoZWNrUmVjb2duaXRpb25TdXBwb3J0KHJlY29nbml6ZXJJbnRlbnQsIGF0dHJpYnV0aW9uU291cmNlLCBjYWxsYmFjaykpOwogICAgIH0KIAotICAgIHZvaWQgdHJpZ2dlck1vZGVsRG93bmxvYWQoSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKSB7Ci0gICAgICAgIGlmICghbUNvbm5lY3RlZCkgewotICAgICAgICAgICAgU2xvZy5lKFRBRywgIiNkb3dubG9hZE1vZGVsIGZhaWxlZCBkdWUgdG8gY29ubmVjdGlvbi4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBydW4oc2VydmljZSAtPiBzZXJ2aWNlLnRyaWdnZXJNb2RlbERvd25sb2FkKHJlY29nbml6ZXJJbnRlbnQsIGF0dHJpYnV0aW9uU291cmNlKSk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRNb2RlbERvd25sb2FkTGlzdGVuZXIoCisgICAgdm9pZCB0cmlnZ2VyTW9kZWxEb3dubG9hZCgKICAgICAgICAgICAgIEludGVudCByZWNvZ25pemVySW50ZW50LAogICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgICAgICBJTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyKSB7CkBAIC0yNjYsMjUgKzI1OCwxMiBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkVycm9yKFNwZWVjaFJlY29nbml6ZXIuRVJST1JfU0VSVkVSX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJGYWlsZWQgdG8gcmVwb3J0IHRoZSBjb25uZWN0aW9uIGJyb2tlIHRvIHRoZSBjYWxsZXIuIiwgZSk7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIiNkb3dubG9hZE1vZGVsIGZhaWxlZCBkdWUgdG8gY29ubmVjdGlvbi4iLCBlKTsKICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KLSAgICAgICAgcnVuKHNlcnZpY2UgLT4KLSAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldE1vZGVsRG93bmxvYWRMaXN0ZW5lcihyZWNvZ25pemVySW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSwgbGlzdGVuZXIpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyTW9kZWxEb3dubG9hZExpc3RlbmVyKAotICAgICAgICAgICAgSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsCi0gICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSkgewotICAgICAgICBpZiAoIW1Db25uZWN0ZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHJ1bihzZXJ2aWNlIC0+Ci0gICAgICAgICAgICAgICAgc2VydmljZS5jbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcihyZWNvZ25pemVySW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSkpOworICAgICAgICBydW4oc2VydmljZSAtPiBzZXJ2aWNlLnRyaWdnZXJNb2RlbERvd25sb2FkKHJlY29nbml6ZXJJbnRlbnQsIGF0dHJpYnV0aW9uU291cmNlLCBsaXN0ZW5lcikpOwogICAgIH0KIAogICAgIHZvaWQgc2h1dGRvd24oSUJpbmRlciBjbGllbnRUb2tlbikgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25NYW5hZ2VyU2VydmljZUltcGwuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uTWFuYWdlclNlcnZpY2VJbXBsLmphdmEKaW5kZXggYmM3M2RiMS4uYmZmNmQ1MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25NYW5hZ2VyU2VydmljZUltcGwuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3NwZWVjaC9TcGVlY2hSZWNvZ25pdGlvbk1hbmFnZXJTZXJ2aWNlSW1wbC5qYXZhCkBAIC0xOTMsMjUgKzE5MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyTW9kZWxEb3dubG9hZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50IHJlY29nbml6ZXJJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlIGF0dHJpYnV0aW9uU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS50cmlnZ2VyTW9kZWxEb3dubG9hZChyZWNvZ25pemVySW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQgcmVjb2duaXplckludGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2UgYXR0cmlidXRpb25Tb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNb2RlbERvd25sb2FkTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0TW9kZWxEb3dubG9hZExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTW9kZWxEb3dubG9hZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS50cmlnZ2VyTW9kZWxEb3dubG9hZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29nbml6ZXJJbnRlbnQsIGF0dHJpYnV0aW9uU291cmNlLCBsaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXJNb2RlbERvd25sb2FkTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudCByZWNvZ25pemVySW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZSBhdHRyaWJ1dGlvblNvdXJjZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5jbGVhck1vZGVsRG93bmxvYWRMaXN0ZW5lcihyZWNvZ25pemVySW50ZW50LCBhdHRyaWJ1dGlvblNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJFcnJvciBjcmVhdGluZyBhIHNwZWVjaCByZWNvZ25pdGlvbiBzZXNzaW9uIiwgZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3N0YXRzL3B1bGwvU3RhdHNQdWxsQXRvbVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc3RhdHMvcHVsbC9TdGF0c1B1bGxBdG9tU2VydmljZS5qYXZhCmluZGV4IDYwMWQwZTIuLjNkOGY1MzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc3RhdHMvcHVsbC9TdGF0c1B1bGxBdG9tU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc3RhdHMvcHVsbC9TdGF0c1B1bGxBdG9tU2VydmljZS5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtUZW1wbGF0ZS5PRU1fTUFOQUdFRF9QUklWQVRFOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLkRlYnVnLmdldElvbkhlYXBzU2l6ZUtiOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLlByb2Nlc3MuTEFTVF9TSEFSRURfQVBQTElDQVRJT05fR0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLlByb2Nlc3MuU1lTVEVNX1VJRDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5Qcm9jZXNzLmdldFVpZEZvclBpZDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5vcy5zdG9yYWdlLlZvbHVtZUluZm8uVFlQRV9QUklWQVRFOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm9zLnN0b3JhZ2UuVm9sdW1lSW5mby5UWVBFX1BVQkxJQzsKQEAgLTg5LDggKzkwLDEwIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JbmNyZW1lbnRhbFN0YXRlc0luZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXJJbnRlcm5hbDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGVybWlzc2lvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlVzZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuYmlvbWV0cmljcy5CaW9tZXRyaWNzUHJvdG9FbnVtczsKQEAgLTQyMTMsMjAgKzQyMTYsMjYgQEAKIAogICAgIGludCBwdWxsSW5zdGFsbGVkSW5jcmVtZW50YWxQYWNrYWdlc0xvY2tlZChpbnQgYXRvbVRhZywgTGlzdDxTdGF0c0V2ZW50PiBwdWxsZWREYXRhKSB7CiAgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXJJbnRlcm5hbCBwbUludGVucmFsID0KKyAgICAgICAgICAgICAgICBMb2NhbFNlcnZpY2VzLmdldFNlcnZpY2UoUGFja2FnZU1hbmFnZXJJbnRlcm5hbC5jbGFzcyk7CiAgICAgICAgIGlmICghcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0lOQ1JFTUVOVEFMX0RFTElWRVJZKSkgewogICAgICAgICAgICAgLy8gSW5jcmVtZW50YWwgaXMgbm90IGVuYWJsZWQgb24gdGhpcyBkZXZpY2UuIFRoZSByZXN1bHQgbGlzdCB3aWxsIGJlIGVtcHR5LgogICAgICAgICAgICAgcmV0dXJuIFN0YXRzTWFuYWdlci5QVUxMX1NVQ0NFU1M7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgbG9uZyB0b2tlbiA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50W10gdXNlcklkcyA9IExvY2FsU2VydmljZXMuZ2V0U2VydmljZShVc2VyTWFuYWdlckludGVybmFsLmNsYXNzKS5nZXRVc2VySWRzKCk7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSB1c2VySWRzID0gTG9jYWxTZXJ2aWNlcy5nZXRTZXJ2aWNlKFVzZXJNYW5hZ2VySW50ZXJuYWwuY2xhc3MpLmdldFVzZXJJZHMoKTsKICAgICAgICAgICAgIGZvciAoaW50IHVzZXJJZCA6IHVzZXJJZHMpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFBhY2thZ2VJbmZvPiBpbnN0YWxsZWRQYWNrYWdlcyA9IHBtLmdldEluc3RhbGxlZFBhY2thZ2VzQXNVc2VyKDAsIHVzZXJJZCk7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxQYWNrYWdlSW5mbz4gaW5zdGFsbGVkUGFja2FnZXMgPSBwbS5nZXRJbnN0YWxsZWRQYWNrYWdlc0FzVXNlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHVzZXJJZCk7CiAgICAgICAgICAgICAgICAgZm9yIChQYWNrYWdlSW5mbyBwaSA6IGluc3RhbGxlZFBhY2thZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChJbmNyZW1lbnRhbE1hbmFnZXIuaXNJbmNyZW1lbnRhbFBhdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuYXBwbGljYXRpb25JbmZvLmdldEJhc2VDb2RlUGF0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5jcmVtZW50YWxTdGF0ZXNJbmZvIGluZm8gPSBwbUludGVucmFsLmdldEluY3JlbWVudGFsU3RhdGVzSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkucGFja2FnZU5hbWUsIFNZU1RFTV9VSUQsIHVzZXJJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwdWxsZWREYXRhLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWV3b3JrU3RhdHNMb2cuYnVpbGRTdGF0c0V2ZW50KGF0b21UYWcsIHBpLmFwcGxpY2F0aW9uSW5mby51aWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWV3b3JrU3RhdHNMb2cuYnVpbGRTdGF0c0V2ZW50KGF0b21UYWcsIHBpLmFwcGxpY2F0aW9uSW5mby51aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5pc0xvYWRpbmcoKSwgaW5mby5nZXRMb2FkaW5nQ29tcGxldGVkVGltZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3R2L3R1bmVycmVzb3VyY2VtYW5hZ2VyL1R1bmVyUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci90di90dW5lcnJlc291cmNlbWFuYWdlci9UdW5lclJlc291cmNlTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBlZDkxNzc1Li4yZDM5MjhjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3R2L3R1bmVycmVzb3VyY2VtYW5hZ2VyL1R1bmVyUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdHYvdHVuZXJyZXNvdXJjZW1hbmFnZXIvVHVuZXJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTEwMTksNiArMTAxOSw3IEBACiAgICAgICAgIGludCBpblVzZUxvd2VzdFByaW9yaXR5RnJIYW5kbGUgPSBUdW5lclJlc291cmNlTWFuYWdlci5JTlZBTElEX1JFU09VUkNFX0hBTkRMRTsKICAgICAgICAgLy8gUHJpb3JpdHkgbWF4IHZhbHVlIGlzIDEwMDAKICAgICAgICAgaW50IGN1cnJlbnRMb3dlc3RQcmlvcml0eSA9IE1BWF9DTElFTlRfUFJJT1JJVFkgKyAxOworICAgICAgICBib29sZWFuIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcyA9IGZhbHNlOwogICAgICAgICAvLyBJZiB0aGUgZGVzaXJlZCBmcm9udGVuZCBpZCB3YXMgc3BlY2lmaWVkLCB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIGZyb250ZW5kLgogICAgICAgICBib29sZWFuIGhhc0Rlc2lyZWRGcm9udGVuZCA9IHJlcXVlc3QuZGVzaXJlZElkICE9IFR1bmVyRnJvbnRlbmRSZXF1ZXN0LkRFRkFVTFRfREVTSVJFRF9JRDsKICAgICAgICAgZm9yIChGcm9udGVuZFJlc291cmNlIGZyIDogZ2V0RnJvbnRlbmRSZXNvdXJjZXMoKS52YWx1ZXMoKSkgewpAQCAtMTA0OCw2ICsxMDQ5LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb3dlc3RQcmlvcml0eSA+IHByaW9yaXR5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpblVzZUxvd2VzdFByaW9yaXR5RnJIYW5kbGUgPSBmci5nZXRIYW5kbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb3dlc3RQcmlvcml0eSA9IHByaW9yaXR5OworICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXF1ZXN0RnJvbVNhbWVQcm9jZXNzID0gKHJlcXVlc3RDbGllbnQuZ2V0UHJvY2Vzc0lkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAoZ2V0Q2xpZW50UHJvZmlsZShmci5nZXRPd25lckNsaWVudElkKCkpKS5nZXRQcm9jZXNzSWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMDYzLDcgKzEwNjYsOCBAQAogICAgICAgICAvLyBXaGVuIGFsbCB0aGUgcmVzb3VyY2VzIGFyZSBvY2N1cGllZCwgZ3JhbnQgdGhlIGxvd2VzdCBwcmlvcml0eSByZXNvdXJjZSBpZiB0aGUKICAgICAgICAgLy8gcmVxdWVzdCBjbGllbnQgaGFzIGhpZ2hlciBwcmlvcml0eS4KICAgICAgICAgaWYgKGluVXNlTG93ZXN0UHJpb3JpdHlGckhhbmRsZSAhPSBUdW5lclJlc291cmNlTWFuYWdlci5JTlZBTElEX1JFU09VUkNFX0hBTkRMRQotICAgICAgICAgICAgICAgICYmIChyZXF1ZXN0Q2xpZW50LmdldFByaW9yaXR5KCkgPiBjdXJyZW50TG93ZXN0UHJpb3JpdHkpKSB7CisgICAgICAgICAgICAmJiAoKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA+IGN1cnJlbnRMb3dlc3RQcmlvcml0eSkgfHwgKAorICAgICAgICAgICAgKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA9PSBjdXJyZW50TG93ZXN0UHJpb3JpdHkpICYmIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcykpKSB7CiAgICAgICAgICAgICBpZiAoIXJlY2xhaW1SZXNvdXJjZSgKICAgICAgICAgICAgICAgICAgICAgZ2V0RnJvbnRlbmRSZXNvdXJjZShpblVzZUxvd2VzdFByaW9yaXR5RnJIYW5kbGUpLmdldE93bmVyQ2xpZW50SWQoKSwKICAgICAgICAgICAgICAgICAgICAgVHVuZXJSZXNvdXJjZU1hbmFnZXIuVFVORVJfUkVTT1VSQ0VfVFlQRV9GUk9OVEVORCkpIHsKQEAgLTExODIsNiArMTE4Niw3IEBACiAgICAgICAgIGludCBpblVzZUxvd2VzdFByaW9yaXR5TG5iSGFuZGxlID0gVHVuZXJSZXNvdXJjZU1hbmFnZXIuSU5WQUxJRF9SRVNPVVJDRV9IQU5ETEU7CiAgICAgICAgIC8vIFByaW9yaXR5IG1heCB2YWx1ZSBpcyAxMDAwCiAgICAgICAgIGludCBjdXJyZW50TG93ZXN0UHJpb3JpdHkgPSBNQVhfQ0xJRU5UX1BSSU9SSVRZICsgMTsKKyAgICAgICAgYm9vbGVhbiBpc1JlcXVlc3RGcm9tU2FtZVByb2Nlc3MgPSBmYWxzZTsKICAgICAgICAgZm9yIChMbmJSZXNvdXJjZSBsbmIgOiBnZXRMbmJSZXNvdXJjZXMoKS52YWx1ZXMoKSkgewogICAgICAgICAgICAgaWYgKCFsbmIuaXNJblVzZSgpKSB7CiAgICAgICAgICAgICAgICAgLy8gR3JhbnQgdGhlIHVudXNlZCBsbmIgd2l0aCBsb3dlciBoYW5kbGUgZmlyc3QKQEAgLTExOTQsNiArMTE5OSw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb3dlc3RQcmlvcml0eSA+IHByaW9yaXR5KSB7CiAgICAgICAgICAgICAgICAgICAgIGluVXNlTG93ZXN0UHJpb3JpdHlMbmJIYW5kbGUgPSBsbmIuZ2V0SGFuZGxlKCk7CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb3dlc3RQcmlvcml0eSA9IHByaW9yaXR5OworICAgICAgICAgICAgICAgICAgICBpc1JlcXVlc3RGcm9tU2FtZVByb2Nlc3MgPSAocmVxdWVzdENsaWVudC5nZXRQcm9jZXNzSWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gKGdldENsaWVudFByb2ZpbGUobG5iLmdldE93bmVyQ2xpZW50SWQoKSkpLmdldFByb2Nlc3NJZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEyMDgsNyArMTIxNSw4IEBACiAgICAgICAgIC8vIFdoZW4gYWxsIHRoZSByZXNvdXJjZXMgYXJlIG9jY3VwaWVkLCBncmFudCB0aGUgbG93ZXN0IHByaW9yaXR5IHJlc291cmNlIGlmIHRoZQogICAgICAgICAvLyByZXF1ZXN0IGNsaWVudCBoYXMgaGlnaGVyIHByaW9yaXR5LgogICAgICAgICBpZiAoaW5Vc2VMb3dlc3RQcmlvcml0eUxuYkhhbmRsZSA+IFR1bmVyUmVzb3VyY2VNYW5hZ2VyLklOVkFMSURfUkVTT1VSQ0VfSEFORExFCi0gICAgICAgICAgICAgICAgJiYgKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA+IGN1cnJlbnRMb3dlc3RQcmlvcml0eSkpIHsKKyAgICAgICAgICAgICYmICgocmVxdWVzdENsaWVudC5nZXRQcmlvcml0eSgpID4gY3VycmVudExvd2VzdFByaW9yaXR5KSB8fCAoCisgICAgICAgICAgICAocmVxdWVzdENsaWVudC5nZXRQcmlvcml0eSgpID09IGN1cnJlbnRMb3dlc3RQcmlvcml0eSkgJiYgaXNSZXF1ZXN0RnJvbVNhbWVQcm9jZXNzKSkpIHsKICAgICAgICAgICAgIGlmICghcmVjbGFpbVJlc291cmNlKGdldExuYlJlc291cmNlKGluVXNlTG93ZXN0UHJpb3JpdHlMbmJIYW5kbGUpLmdldE93bmVyQ2xpZW50SWQoKSwKICAgICAgICAgICAgICAgICAgICAgVHVuZXJSZXNvdXJjZU1hbmFnZXIuVFVORVJfUkVTT1VSQ0VfVFlQRV9MTkIpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTI0MCw2ICsxMjQ4LDcgQEAKICAgICAgICAgaW50IGxvd2VzdFByaW9yaXR5T3duZXJJZCA9IC0xOwogICAgICAgICAvLyBQcmlvcml0eSBtYXggdmFsdWUgaXMgMTAwMAogICAgICAgICBpbnQgY3VycmVudExvd2VzdFByaW9yaXR5ID0gTUFYX0NMSUVOVF9QUklPUklUWSArIDE7CisgICAgICAgIGJvb2xlYW4gaXNSZXF1ZXN0RnJvbVNhbWVQcm9jZXNzID0gZmFsc2U7CiAgICAgICAgIGlmICghY2FzLmlzRnVsbHlVc2VkKCkpIHsKICAgICAgICAgICAgIGNhc1Nlc3Npb25IYW5kbGVbMF0gPSBnZW5lcmF0ZVJlc291cmNlSGFuZGxlKAogICAgICAgICAgICAgICAgICAgICBUdW5lclJlc291cmNlTWFuYWdlci5UVU5FUl9SRVNPVVJDRV9UWVBFX0NBU19TRVNTSU9OLCBjYXMuZ2V0U3lzdGVtSWQoKSk7CkBAIC0xMjUyLDEyICsxMjYxLDE1IEBACiAgICAgICAgICAgICBpZiAoY3VycmVudExvd2VzdFByaW9yaXR5ID4gcHJpb3JpdHkpIHsKICAgICAgICAgICAgICAgICBsb3dlc3RQcmlvcml0eU93bmVySWQgPSBvd25lcklkOwogICAgICAgICAgICAgICAgIGN1cnJlbnRMb3dlc3RQcmlvcml0eSA9IHByaW9yaXR5OworICAgICAgICAgICAgICAgIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcyA9IChyZXF1ZXN0Q2xpZW50LmdldFByb2Nlc3NJZCgpCisgICAgICAgICAgICAgICAgICAgID09IChnZXRDbGllbnRQcm9maWxlKG93bmVySWQpKS5nZXRQcm9jZXNzSWQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBXaGVuIGFsbCB0aGUgQ2FzIHNlc3Npb25zIGFyZSBvY2N1cGllZCwgcmVjbGFpbSB0aGUgbG93ZXN0IHByaW9yaXR5IGNsaWVudCBpZiB0aGUKICAgICAgICAgLy8gcmVxdWVzdCBjbGllbnQgaGFzIGhpZ2hlciBwcmlvcml0eS4KLSAgICAgICAgaWYgKGxvd2VzdFByaW9yaXR5T3duZXJJZCA+IC0xICYmIChyZXF1ZXN0Q2xpZW50LmdldFByaW9yaXR5KCkgPiBjdXJyZW50TG93ZXN0UHJpb3JpdHkpKSB7CisgICAgICAgIGlmIChsb3dlc3RQcmlvcml0eU93bmVySWQgPiAtMSAmJiAoKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA+IGN1cnJlbnRMb3dlc3RQcmlvcml0eSkKKyAgICAgICAgfHwgKChyZXF1ZXN0Q2xpZW50LmdldFByaW9yaXR5KCkgPT0gY3VycmVudExvd2VzdFByaW9yaXR5KSAmJiBpc1JlcXVlc3RGcm9tU2FtZVByb2Nlc3MpKSkgewogICAgICAgICAgICAgaWYgKCFyZWNsYWltUmVzb3VyY2UobG93ZXN0UHJpb3JpdHlPd25lcklkLAogICAgICAgICAgICAgICAgICAgICBUdW5lclJlc291cmNlTWFuYWdlci5UVU5FUl9SRVNPVVJDRV9UWVBFX0NBU19TRVNTSU9OKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEyODksNiArMTMwMSw3IEBACiAgICAgICAgIGludCBsb3dlc3RQcmlvcml0eU93bmVySWQgPSAtMTsKICAgICAgICAgLy8gUHJpb3JpdHkgbWF4IHZhbHVlIGlzIDEwMDAKICAgICAgICAgaW50IGN1cnJlbnRMb3dlc3RQcmlvcml0eSA9IE1BWF9DTElFTlRfUFJJT1JJVFkgKyAxOworICAgICAgICBib29sZWFuIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcyA9IGZhbHNlOwogICAgICAgICBpZiAoIWNpQ2FtLmlzRnVsbHlVc2VkKCkpIHsKICAgICAgICAgICAgIGNpQ2FtSGFuZGxlWzBdID0gZ2VuZXJhdGVSZXNvdXJjZUhhbmRsZSgKICAgICAgICAgICAgICAgICAgICAgVHVuZXJSZXNvdXJjZU1hbmFnZXIuVFVORVJfUkVTT1VSQ0VfVFlQRV9GUk9OVEVORF9DSUNBTSwgY2lDYW0uZ2V0Q2lDYW1JZCgpKTsKQEAgLTEzMDEsMTIgKzEzMTQsMTYgQEAKICAgICAgICAgICAgIGlmIChjdXJyZW50TG93ZXN0UHJpb3JpdHkgPiBwcmlvcml0eSkgewogICAgICAgICAgICAgICAgIGxvd2VzdFByaW9yaXR5T3duZXJJZCA9IG93bmVySWQ7CiAgICAgICAgICAgICAgICAgY3VycmVudExvd2VzdFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgICAgICAgICAgICAgaXNSZXF1ZXN0RnJvbVNhbWVQcm9jZXNzID0gKHJlcXVlc3RDbGllbnQuZ2V0UHJvY2Vzc0lkKCkKKyAgICAgICAgICAgICAgICAgICAgPT0gKGdldENsaWVudFByb2ZpbGUob3duZXJJZCkpLmdldFByb2Nlc3NJZCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIFdoZW4gYWxsIHRoZSBDaUNhbSBzZXNzaW9ucyBhcmUgb2NjdXBpZWQsIHJlY2xhaW0gdGhlIGxvd2VzdCBwcmlvcml0eSBjbGllbnQgaWYgdGhlCiAgICAgICAgIC8vIHJlcXVlc3QgY2xpZW50IGhhcyBoaWdoZXIgcHJpb3JpdHkuCi0gICAgICAgIGlmIChsb3dlc3RQcmlvcml0eU93bmVySWQgPiAtMSAmJiAocmVxdWVzdENsaWVudC5nZXRQcmlvcml0eSgpID4gY3VycmVudExvd2VzdFByaW9yaXR5KSkgeworICAgICAgICBpZiAobG93ZXN0UHJpb3JpdHlPd25lcklkID4gLTEgJiYgKChyZXF1ZXN0Q2xpZW50LmdldFByaW9yaXR5KCkgPiBjdXJyZW50TG93ZXN0UHJpb3JpdHkpCisgICAgICAgICAgICB8fCAoKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA9PSBjdXJyZW50TG93ZXN0UHJpb3JpdHkpCisgICAgICAgICAgICAgICAgJiYgaXNSZXF1ZXN0RnJvbVNhbWVQcm9jZXNzKSkpIHsKICAgICAgICAgICAgIGlmICghcmVjbGFpbVJlc291cmNlKGxvd2VzdFByaW9yaXR5T3duZXJJZCwKICAgICAgICAgICAgICAgICAgICAgVHVuZXJSZXNvdXJjZU1hbmFnZXIuVFVORVJfUkVTT1VSQ0VfVFlQRV9GUk9OVEVORF9DSUNBTSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNDI0LDYgKzE0NDEsNyBAQAogICAgICAgICBpbnQgaW5Vc2VMb3dlc3RQcmlvcml0eURySGFuZGxlID0gVHVuZXJSZXNvdXJjZU1hbmFnZXIuSU5WQUxJRF9SRVNPVVJDRV9IQU5ETEU7CiAgICAgICAgIC8vIFByaW9yaXR5IG1heCB2YWx1ZSBpcyAxMDAwCiAgICAgICAgIGludCBjdXJyZW50TG93ZXN0UHJpb3JpdHkgPSBNQVhfQ0xJRU5UX1BSSU9SSVRZICsgMTsKKyAgICAgICAgYm9vbGVhbiBpc1JlcXVlc3RGcm9tU2FtZVByb2Nlc3MgPSBmYWxzZTsKICAgICAgICAgLy8gSWYgdGhlIGRlc2lyZWQgZGVtdXggaWQgd2FzIHNwZWNpZmllZCwgd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZSBkZW11eC4KICAgICAgICAgYm9vbGVhbiBoYXNEZXNpcmVkRGVtdXhDYXAgPSByZXF1ZXN0LmRlc2lyZWRGaWx0ZXJUeXBlcwogICAgICAgICAgICAgICAgICE9IERlbXV4RmlsdGVyTWFpblR5cGUuVU5ERUZJTkVEOwpAQCAtMTQ0OCw2ICsxNDY2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBsb3dlc3QgcHJpb3JpdHkKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG93ZXN0UHJpb3JpdHkgPiBwcmlvcml0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb3dlc3RQcmlvcml0eSA9IHByaW9yaXR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVxdWVzdEZyb21TYW1lUHJvY2VzcyA9IChyZXF1ZXN0Q2xpZW50LmdldFByb2Nlc3NJZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IChnZXRDbGllbnRQcm9maWxlKGRyLmdldE93bmVyQ2xpZW50SWQoKSkpLmdldFByb2Nlc3NJZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHNtYWxsZXN0IGNhcHMKQEAgLTE0NzMsNyArMTQ5Myw4IEBACiAgICAgICAgIC8vIFdoZW4gYWxsIHRoZSByZXNvdXJjZXMgYXJlIG9jY3VwaWVkLCBncmFudCB0aGUgbG93ZXN0IHByaW9yaXR5IHJlc291cmNlIGlmIHRoZQogICAgICAgICAvLyByZXF1ZXN0IGNsaWVudCBoYXMgaGlnaGVyIHByaW9yaXR5LgogICAgICAgICBpZiAoaW5Vc2VMb3dlc3RQcmlvcml0eURySGFuZGxlICE9IFR1bmVyUmVzb3VyY2VNYW5hZ2VyLklOVkFMSURfUkVTT1VSQ0VfSEFORExFCi0gICAgICAgICAgICAgICAgJiYgKHJlcXVlc3RDbGllbnQuZ2V0UHJpb3JpdHkoKSA+IGN1cnJlbnRMb3dlc3RQcmlvcml0eSkpIHsKKyAgICAgICAgICAgICYmICgocmVxdWVzdENsaWVudC5nZXRQcmlvcml0eSgpID4gY3VycmVudExvd2VzdFByaW9yaXR5KSB8fCAoCisgICAgICAgICAgICAocmVxdWVzdENsaWVudC5nZXRQcmlvcml0eSgpID09IGN1cnJlbnRMb3dlc3RQcmlvcml0eSkgJiYgaXNSZXF1ZXN0RnJvbVNhbWVQcm9jZXNzKSkpIHsKICAgICAgICAgICAgIGlmICghcmVjbGFpbVJlc291cmNlKAogICAgICAgICAgICAgICAgICAgICBnZXREZW11eFJlc291cmNlKGluVXNlTG93ZXN0UHJpb3JpdHlEckhhbmRsZSkuZ2V0T3duZXJDbGllbnRJZCgpLAogICAgICAgICAgICAgICAgICAgICBUdW5lclJlc291cmNlTWFuYWdlci5UVU5FUl9SRVNPVVJDRV9UWVBFX0RFTVVYKSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eUNsaWVudENvbnRyb2xsZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlDbGllbnRDb250cm9sbGVyLmphdmEKaW5kZXggZDEwOGYwZC4uZjE0YTQzMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eUNsaWVudENvbnRyb2xsZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5Q2xpZW50Q29udHJvbGxlci5qYXZhCkBAIC0yNTEsMTEgKzI1MSw2IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHtAbGluayAjcmVzdGFydEFjdGl2aXR5UHJvY2Vzc0lmVmlzaWJsZX0uCiAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRpbmdOYW1lID0gci5hcHAubU5hbWU7CiAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRpbmdVaWQgPSByLmFwcC5tVWlkOwotICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIEVuc3VyZUFjdGl2aXRpZXNWaXNpYmxlSGVscGVyI21ha2VWaXNpYmxlQW5kUmVzdGFydElmTmVlZGVkIG5vdCBza2lwCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnRpbmcgbm9uLXRvcCBhY3Rpdml0eS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gci5nZXRUYXNrKCkudG9wUnVubmluZ0FjdGl2aXR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuc2V0VmlzaWJsZVJlcXVlc3RlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgci5hY3Rpdml0eVN0b3BwZWQoaWNpY2xlLCBwZXJzaXN0ZW50U3RhdGUsIGRlc2NyaXB0aW9uKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlSZWNvcmQuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlSZWNvcmQuamF2YQppbmRleCBmYWEwY2M5Li5lMjFjMTU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5UmVjb3JkLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVJlY29yZC5qYXZhCkBAIC00MTM1LDkgKzQxMzUsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKCFtVmlzaWJsZVJlcXVlc3RlZCAmJiBsYXVuY2hDb3VudCA+IDIKICAgICAgICAgICAgICAgICAmJiBsYXN0TGF1bmNoVGltZSA+IChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIDYwMDAwKSkgewogICAgICAgICAgICAgLy8gV2UgaGF2ZSBsYXVuY2hlZCB0aGlzIGFjdGl2aXR5IHRvbyBtYW55IHRpbWVzIHNpbmNlIGl0IHdhcyBhYmxlIHRvIHJ1biwgc28gZ2l2ZSB1cAotICAgICAgICAgICAgLy8gYW5kIHJlbW92ZSBpdC4gKE5vdGUgaWYgdGhlIGFjdGl2aXR5IGlzIHZpc2libGUsIHdlIGRvbid0IHJlbW92ZSB0aGUgcmVjb3JkLiBXZSBsZWF2ZQotICAgICAgICAgICAgLy8gdGhlIGRlYWQgd2luZG93IG9uIHRoZSBzY3JlZW4gYnV0IHRoZSBwcm9jZXNzIHdpbGwgbm90IGJlIHJlc3RhcnRlZCB1bmxlc3MgdXNlcgotICAgICAgICAgICAgLy8gZXhwbGljaXRseSB0YXAgb24gaXQuKQorICAgICAgICAgICAgLy8gYW5kIHJlbW92ZSBpdC4KICAgICAgICAgICAgIHJlbW92ZSA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBUaGUgcHJvY2VzcyBtYXkgYmUgZ29uZSwgYnV0IHRoZSBhY3Rpdml0eSBsaXZlcyBvbiEKQEAgLTQxNTksMTEgKzQxNTcsNiBAQAogICAgICAgICAgICAgaWYgKERFQlVHX0FQUCkgewogICAgICAgICAgICAgICAgIFNsb2cudihUQUdfQVBQLCAiS2VlcGluZyBlbnRyeSBkdXJpbmcgcmVtb3ZlSGlzdG9yeSBmb3IgYWN0aXZpdHkgIiArIHRoaXMpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU2V0IG5vd1Zpc2libGUgdG8gcHJldmlvdXMgdmlzaWJsZSBzdGF0ZS4gSWYgdGhlIGFwcCB3YXMgdmlzaWJsZSB3aGlsZSBpdCBkaWVkLCB3ZQotICAgICAgICAgICAgLy8gbGVhdmUgdGhlIGRlYWQgd2luZG93IG9uIHNjcmVlbiBzbyBpdCdzIGJhc2ljYWxseSB2aXNpYmxlLiBUaGlzIGlzIG5lZWRlZCB3aGVuIHVzZXIKLSAgICAgICAgICAgIC8vIGxhdGVyIHRhcCBvbiB0aGUgZGVhZCB3aW5kb3csIHdlIG5lZWQgdG8gc3RvcCBvdGhlciBhcHBzIHdoZW4gdXNlciB0cmFuc2ZlcnMgZm9jdXMKLSAgICAgICAgICAgIC8vIHRvIHRoZSByZXN0YXJ0ZWQgYWN0aXZpdHkuCi0gICAgICAgICAgICBub3dWaXNpYmxlID0gbVZpc2libGVSZXF1ZXN0ZWQ7CiAgICAgICAgIH0KICAgICAgICAgLy8gdXBncmFkZSB0cmFuc2l0aW9uIHRyaWdnZXIgdG8gdGFzayBpZiB0aGlzIGlzIHRoZSBsYXN0IGFjdGl2aXR5IHNpbmNlIGl0IG1lYW5zIHdlIGFyZQogICAgICAgICAvLyBjbG9zaW5nIHRoZSB0YXNrLgpAQCAtNDM2NCwxNyArNDM1Nyw2IEBACiAgICAgQE92ZXJyaWRlCiAgICAgdm9pZCBhZGRXaW5kb3coV2luZG93U3RhdGUgdykgewogICAgICAgICBzdXBlci5hZGRXaW5kb3codyk7Ci0KLSAgICAgICAgYm9vbGVhbiBnb3RSZXBsYWNlbWVudFdpbmRvdyA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gbUNoaWxkcmVuLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGF0ZSBjYW5kaWRhdGUgPSBtQ2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgZ290UmVwbGFjZW1lbnRXaW5kb3cgfD0gY2FuZGlkYXRlLnNldFJlcGxhY2VtZW50V2luZG93SWZOZWVkZWQodyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB3ZSBnb3QgYSByZXBsYWNlbWVudCB3aW5kb3csIHJlc2V0IHRoZSB0aW1lb3V0IHRvIGdpdmUgZHJhd2luZyBtb3JlIHRpbWUKLSAgICAgICAgaWYgKGdvdFJlcGxhY2VtZW50V2luZG93KSB7Ci0gICAgICAgICAgICBtV21TZXJ2aWNlLnNjaGVkdWxlV2luZG93UmVwbGFjZW1lbnRUaW1lb3V0cyh0aGlzKTsKLSAgICAgICAgfQogICAgICAgICBjaGVja0tleWd1YXJkRmxhZ3NDaGFuZ2VkKCk7CiAgICAgfQogCkBAIC00Mzg5LDEyICs0MzcxLDYgQEAKICAgICAgICAgdXBkYXRlTGV0dGVyYm94U3VyZmFjZShjaGlsZCk7CiAgICAgfQogCi0gICAgdm9pZCBvbldpbmRvd1JlcGxhY2VtZW50VGltZW91dCgpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IG1DaGlsZHJlbi5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgKG1DaGlsZHJlbi5nZXQoaSkpLm9uV2luZG93UmVwbGFjZW1lbnRUaW1lb3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICB2b2lkIHNldEFwcExheW91dENoYW5nZXMoaW50IGNoYW5nZXMsIFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKCFtQ2hpbGRyZW4uaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBmaW5hbCBEaXNwbGF5Q29udGVudCBkYyA9IGdldERpc3BsYXlDb250ZW50KCk7CkBAIC00NDA1LDE1ICs0MzgxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgcmVtb3ZlUmVwbGFjZWRXaW5kb3dJZk5lZWRlZChXaW5kb3dTdGF0ZSByZXBsYWNlbWVudCkgewotICAgICAgICBmb3IgKGludCBpID0gbUNoaWxkcmVuLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGF0ZSB3aW4gPSBtQ2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHdpbi5yZW1vdmVSZXBsYWNlZFdpbmRvd0lmTmVlZGVkKHJlcGxhY2VtZW50KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbiB0cmFuc2ZlclN0YXJ0aW5nV2luZG93KEBOb25OdWxsIEFjdGl2aXR5UmVjb3JkIGZyb21BY3Rpdml0eSkgewogICAgICAgICBmaW5hbCBXaW5kb3dTdGF0ZSB0U3RhcnRpbmdXaW5kb3cgPSBmcm9tQWN0aXZpdHkubVN0YXJ0aW5nV2luZG93OwogICAgICAgICBpZiAodFN0YXJ0aW5nV2luZG93ICE9IG51bGwgJiYgZnJvbUFjdGl2aXR5Lm1TdGFydGluZ1N1cmZhY2UgIT0gbnVsbCkgewpAQCAtNTIzMiw2ICs1MTk5LDExIEBACiAgICAgICAgICAgICBTbG9nLncoVEFHX1dNLCAiQXR0ZW1wdGVkIHRvIHNldCB2aXNpYmlsaXR5IG9mIG5vbi1leGlzdGluZyBhcHAgdG9rZW46ICIgKyB0b2tlbik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHZpc2libGUgPT0gbVZpc2libGVSZXF1ZXN0ZWQgJiYgdmlzaWJsZSA9PSBtVmlzaWJsZQorICAgICAgICAgICAgICAgICYmIG1UcmFuc2l0aW9uQ29udHJvbGxlci5pc1NoZWxsVHJhbnNpdGlvbnNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIC8vIEZvciBzaGVsbCB0cmFuc2l0aW9uLCBpdCBpcyBuby1vcCBpZiB0aGVyZSBpcyBubyBzdGF0ZSBjaGFuZ2UuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgaWYgKHZpc2libGUpIHsKICAgICAgICAgICAgIG1EZWZlckhpZGluZ0NsaWVudCA9IGZhbHNlOwogICAgICAgICB9CkBAIC01MjcwLDEzICs1MjQyLDE4IEBACiAKICAgICAgICAgLy8gQmVmb3JlIHNldHRpbmcgbVZpc2libGVSZXF1ZXN0ZWQgc28gd2UgY2FuIHRyYWNrIGNoYW5nZXMuCiAgICAgICAgIGJvb2xlYW4gaXNDb2xsZWN0aW5nID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gaW5GaW5pc2hpbmdUcmFuc2l0aW9uID0gZmFsc2U7CiAgICAgICAgIGlmIChtVHJhbnNpdGlvbkNvbnRyb2xsZXIuaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICBpc0NvbGxlY3RpbmcgPSBtVHJhbnNpdGlvbkNvbnRyb2xsZXIuaXNDb2xsZWN0aW5nKCk7CiAgICAgICAgICAgICBpZiAoaXNDb2xsZWN0aW5nKSB7CiAgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25Db250cm9sbGVyLmNvbGxlY3QodGhpcyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJzZXRWaXNpYmlsaXR5PSIgKyB2aXNpYmxlICsgIiB3aGlsZSB0cmFuc2l0aW9uIGlzIG5vdCBjb2xsZWN0aW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGhpcyArICIgY2FsbGVyPSIgKyBEZWJ1Zy5nZXRDYWxsZXJzKDgpKTsKKyAgICAgICAgICAgICAgICBpbkZpbmlzaGluZ1RyYW5zaXRpb24gPSBtVHJhbnNpdGlvbkNvbnRyb2xsZXIuaW5GaW5pc2hpbmdUcmFuc2l0aW9uKHRoaXMpOworICAgICAgICAgICAgICAgIGlmICghaW5GaW5pc2hpbmdUcmFuc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJzZXRWaXNpYmlsaXR5PSIgKyB2aXNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdoaWxlIHRyYW5zaXRpb24gaXMgbm90IGNvbGxlY3Rpbmcgb3IgZmluaXNoaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMgKyAiIGNhbGxlcj0iICsgRGVidWcuZ2V0Q2FsbGVycyg4KSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTUyOTAsMTAgKzUyNjcsNiBAQAogICAgICAgICBtTGFzdERlZmVySGlkaW5nQ2xpZW50ID0gZGVmZXJIaWRpbmdDbGllbnQ7CiAKICAgICAgICAgaWYgKCF2aXNpYmxlKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgYXBwIGlzIGRlYWQgd2hpbGUgaXQgd2FzIHZpc2libGUsIHdlIGtlcHQgaXRzIGRlYWQgd2luZG93IG9uIHNjcmVlbi4KLSAgICAgICAgICAgIC8vIE5vdyB0aGF0IHRoZSBhcHAgaXMgZ29pbmcgaW52aXNpYmxlLCB3ZSBjYW4gcmVtb3ZlIGl0LiBJdCB3aWxsIGJlIHJlc3RhcnRlZAotICAgICAgICAgICAgLy8gaWYgbWFkZSB2aXNpYmxlIGFnYWluLgotICAgICAgICAgICAgcmVtb3ZlRGVhZFdpbmRvd3MoKTsKICAgICAgICAgICAgIC8vIElmIHRoaXMgYWN0aXZpdHkgaXMgYWJvdXQgdG8gZmluaXNoL3N0b3BwZWQgYW5kIG5vdyBiZWNvbWVzIGludmlzaWJsZSwgcmVtb3ZlIGl0CiAgICAgICAgICAgICAvLyBmcm9tIHRoZSB1bmtub3duQXBwIGxpc3QgaW4gY2FzZSB0aGUgYWN0aXZpdHkgZG9lcyBub3Qgd2FudCB0byBkcmF3IGFueXRoaW5nLCB3aGljaAogICAgICAgICAgICAgLy8ga2VlcCB0aGUgdXNlciB3YWl0aW5nIGZvciB0aGUgbmV4dCB0cmFuc2l0aW9uIHRvIHN0YXJ0LgpAQCAtNTM1Nyw2ICs1MzMwLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGluRmluaXNoaW5nVHJhbnNpdGlvbikgeworICAgICAgICAgICAgLy8gTGV0IHRoZSBmaW5pc2hpbmcgdHJhbnNpdGlvbiBjb21taXQgdGhlIHZpc2liaWxpdHkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgLy8gSWYgd2UgYXJlIHByZXBhcmluZyBhbiBhcHAgdHJhbnNpdGlvbiwgdGhlbiBkZWxheSBjaGFuZ2luZwogICAgICAgICAvLyB0aGUgdmlzaWJpbGl0eSBvZiB0aGlzIHRva2VuIHVudGlsIHdlIGV4ZWN1dGUgdGhhdCB0cmFuc2l0aW9uLgogICAgICAgICBpZiAoZGVmZXJDb21taXRWaXNpYmlsaXR5Q2hhbmdlKHZpc2libGUpKSB7CkBAIC01NjMwLDEwICs1NjA3LDcgQEAKICAgICAgICAgLy8gKiBhY3Rpdml0eSBpcyB0cmFuc2l0aW9uaW5nIHZpc2liaWxpdHkgc3RhdGUKICAgICAgICAgLy8gKiBvciB0aGUgYWN0aXZpdHkgd2FzIG1hcmtlZCBhcyBoaWRkZW4gYW5kIGlzIGV4aXRpbmcgYmVmb3JlIHdlIGhhZCBhIGNoYW5jZSB0byBwbGF5IHRoZQogICAgICAgICAvLyB0cmFuc2l0aW9uIGFuaW1hdGlvbgotICAgICAgICAvLyAqIG9yIHRoaXMgaXMgYW4gb3BlbmluZyBhcHAgYW5kIHdpbmRvd3MgYXJlIGJlaW5nIHJlcGxhY2VkIChlLmcuIGZyZWVmb3JtIHdpbmRvdyB0bwotICAgICAgICAvLyAgIG5vcm1hbCB3aW5kb3cpLgotICAgICAgICByZXR1cm4gaXNWaXNpYmxlKCkgIT0gdmlzaWJsZSB8fCBtUmVxdWVzdEZvcmNlVHJhbnNpdGlvbiB8fCAoIWlzVmlzaWJsZSgpICYmIG1Jc0V4aXRpbmcpCi0gICAgICAgICAgICAgICAgfHwgKHZpc2libGUgJiYgZm9yQWxsV2luZG93cyhXaW5kb3dTdGF0ZTo6d2FpdGluZ0ZvclJlcGxhY2VtZW50LCB0cnVlKSk7CisgICAgICAgIHJldHVybiBpc1Zpc2libGUoKSAhPSB2aXNpYmxlIHx8IG1SZXF1ZXN0Rm9yY2VUcmFuc2l0aW9uIHx8ICghaXNWaXNpYmxlKCkgJiYgbUlzRXhpdGluZyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NjQyLDkgKzY2MTYsNiBAQAogICAgICAgICAvLyBzdG9wIHRyYWNraW5nCiAgICAgICAgIG1TcGxhc2hTY3JlZW5TdHlsZVNvbGlkQ29sb3IgPSB0cnVlOwogCi0gICAgICAgIC8vIFdlIG5vdyBoYXZlIGEgZ29vZCB3aW5kb3cgdG8gc2hvdywgcmVtb3ZlIGRlYWQgcGxhY2Vob2xkZXJzCi0gICAgICAgIHJlbW92ZURlYWRXaW5kb3dzKCk7Ci0KICAgICAgICAgaWYgKG1TdGFydGluZ1dpbmRvdyAhPSBudWxsKSB7CiAgICAgICAgICAgICBQcm90b0xvZy52KFdNX0RFQlVHX1NUQVJUSU5HX1dJTkRPVywgIkZpbmlzaCBzdGFydGluZyAlcyIKICAgICAgICAgICAgICAgICAgICAgKyAiOiBmaXJzdCByZWFsIHdpbmRvdyBpcyBzaG93biwgbm8gYW5pbWF0aW9uIiwgd2luLm1Ub2tlbik7CkBAIC03MzgwLDQ5ICs3MzUxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgcmVtb3ZlRGVhZFdpbmRvd3MoKSB7Ci0gICAgICAgIGZvciAoaW50IHdpbk5keCA9IG1DaGlsZHJlbi5zaXplKCkgLSAxOyB3aW5OZHggPj0gMDsgLS13aW5OZHgpIHsKLSAgICAgICAgICAgIFdpbmRvd1N0YXRlIHdpbiA9IG1DaGlsZHJlbi5nZXQod2luTmR4KTsKLSAgICAgICAgICAgIGlmICh3aW4ubUFwcERpZWQpIHsKLSAgICAgICAgICAgICAgICBQcm90b0xvZy53KFdNX0RFQlVHX0FERF9SRU1PVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRGVhZFdpbmRvd3M6ICVzIiwgd2luKTsKLSAgICAgICAgICAgICAgICAvLyBTZXQgbURlc3Ryb3lpbmcsIHdlIGRvbid0IHdhbnQgYW55IGFuaW1hdGlvbiBvciBkZWxheWVkIHJlbW92YWwgaGVyZS4KLSAgICAgICAgICAgICAgICB3aW4ubURlc3Ryb3lpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIEFsc28gcmVtb3ZlcyBjaGlsZCB3aW5kb3dzLgotICAgICAgICAgICAgICAgIHdpbi5yZW1vdmVJZlBvc3NpYmxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNldFdpbGxSZXBsYWNlV2luZG93cyhib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgUHJvdG9Mb2cuZChXTV9ERUJVR19BRERfUkVNT1ZFLAotICAgICAgICAgICAgICAgICJNYXJraW5nIGFwcCB0b2tlbiAlcyB3aXRoIHJlcGxhY2luZyB3aW5kb3dzLiIsIHRoaXMpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSBtQ2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YXRlIHcgPSBtQ2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgdy5zZXRXaWxsUmVwbGFjZVdpbmRvdyhhbmltYXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0V2lsbFJlcGxhY2VDaGlsZFdpbmRvd3MoKSB7Ci0gICAgICAgIFByb3RvTG9nLmQoV01fREVCVUdfQUREX1JFTU9WRSwgIk1hcmtpbmcgYXBwIHRva2VuICVzIgotICAgICAgICAgICAgICAgICsgIiB3aXRoIHJlcGxhY2luZyBjaGlsZCB3aW5kb3dzLiIsIHRoaXMpOwotICAgICAgICBmb3IgKGludCBpID0gbUNoaWxkcmVuLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGF0ZSB3ID0gbUNoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgIHcuc2V0V2lsbFJlcGxhY2VDaGlsZFdpbmRvd3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgY2xlYXJXaWxsUmVwbGFjZVdpbmRvd3MoKSB7Ci0gICAgICAgIFByb3RvTG9nLmQoV01fREVCVUdfQUREX1JFTU9WRSwKLSAgICAgICAgICAgICAgICAiUmVzZXR0aW5nIGFwcCB0b2tlbiAlcyBvZiByZXBsYWNpbmcgd2luZG93IG1hcmtzLiIsIHRoaXMpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSBtQ2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YXRlIHcgPSBtQ2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgdy5jbGVhcldpbGxSZXBsYWNlV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICB2b2lkIHJlcXVlc3RVcGRhdGVXYWxscGFwZXJJZk5lZWRlZCgpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IG1DaGlsZHJlbi5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgZmluYWwgV2luZG93U3RhdGUgdyA9IG1DaGlsZHJlbi5nZXQoaSk7CkBAIC05MDc0LDYgKzkwMDIsNyBAQAogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gd2FzSW5QaWN0dXJlSW5QaWN0dXJlID0gaW5QaW5uZWRXaW5kb3dpbmdNb2RlKCk7CiAgICAgICAgIGZpbmFsIERpc3BsYXlDb250ZW50IGRpc3BsYXkgPSBtRGlzcGxheUNvbnRlbnQ7CisgICAgICAgIGZpbmFsIGludCBhY3Rpdml0eVR5cGUgPSBnZXRBY3Rpdml0eVR5cGUoKTsKICAgICAgICAgaWYgKHdhc0luUGljdHVyZUluUGljdHVyZSAmJiBhdHRhY2hlZFRvUHJvY2VzcygpICYmIGRpc3BsYXkgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gSWYgdGhlIFBJUCBhY3Rpdml0eSBpcyBjaGFuZ2luZyB0byBmdWxsc2NyZWVuIHdpdGggZGlzcGxheSBvcmllbnRhdGlvbiBjaGFuZ2UsIHRoZQogICAgICAgICAgICAgLy8gZml4ZWQgcm90YXRpb24gd2lsbCB0YWtlIGVmZmVjdCB0aGF0IHJlcXVpcmVzIHRvIHNlbmQgZml4ZWQgcm90YXRpb24gYWRqdXN0bWVudHMKQEAgLTkwOTgsNiArOTAyNywxMSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdQYXJlbnRDb25maWcpOwogICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpdml0eVR5cGUgIT0gQUNUSVZJVFlfVFlQRV9VTkRFRklORUQKKyAgICAgICAgICAgICAgICAmJiBhY3Rpdml0eVR5cGUgIT0gZ2V0QWN0aXZpdHlUeXBlKCkpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJDYW4ndCBjaGFuZ2UgYWN0aXZpdHkgdHlwZSBvbmNlIHNldDogIiArIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFjdGl2aXR5VHlwZT0iICsgYWN0aXZpdHlUeXBlVG9TdHJpbmcoZ2V0QWN0aXZpdHlUeXBlKCkpKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIENvbmZpZ3VyYXRpb24ncyBlcXVhbGl0eSBkb2Vzbid0IGNvbnNpZGVyIHNlcSBzbyBpZiBvbmx5IHNlcSBudW1iZXIgY2hhbmdlcyBpbiByZXNvbHZlZAogICAgICAgICAvLyBvdmVycmlkZSBjb25maWd1cmF0aW9uLiBUaGVyZWZvcmUgQ29uZmlndXJhdGlvbkNvbnRhaW5lciBkb2Vzbid0IGNoYW5nZSBtZXJnZWQgb3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlSZWNvcmRJbnB1dFNpbmsuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlSZWNvcmRJbnB1dFNpbmsuamF2YQppbmRleCA1ZDAzOGRjLi5iZTdkOWI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5UmVjb3JkSW5wdXRTaW5rLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVJlY29yZElucHV0U2luay5qYXZhCkBAIC05Miw2ICs5Miw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtSW5wdXRXaW5kb3dIYW5kbGVXcmFwcGVyLnNldElucHV0Q29uZmlnTWFza2VkKDAsIElucHV0Q29uZmlnLk5PVF9UT1VDSEFCTEUpOwogICAgICAgICB9CisgICAgICAgIG1JbnB1dFdpbmRvd0hhbmRsZVdyYXBwZXIuc2V0RGlzcGxheUlkKG1BY3Rpdml0eVJlY29yZC5nZXREaXNwbGF5SWQoKSk7CiAgICAgICAgIHJldHVybiBtSW5wdXRXaW5kb3dIYW5kbGVXcmFwcGVyOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVNlY3VyaXR5TW9kZWxGZWF0dXJlRmxhZ3MuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlTZWN1cml0eU1vZGVsRmVhdHVyZUZsYWdzLmphdmEKaW5kZXggMWY3YWY0MS4uMTlkODEyOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVNlY3VyaXR5TW9kZWxGZWF0dXJlRmxhZ3MuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5U2VjdXJpdHlNb2RlbEZlYXR1cmVGbGFncy5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfTElOSyA9ICJnby9hbmRyb2lkLWFzbSI7CiAKICAgICAvKiogVXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdmVyc2lvbiBvZiB0aGUgQVNNIGxvZ2ljIHdhcyB1c2VkIGluIGxvZ3Mgd2hpbGUgd2UgaXRlcmF0ZSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQVNNX1ZFUlNJT04gPSA2OworICAgIHN0YXRpYyBmaW5hbCBpbnQgQVNNX1ZFUlNJT04gPSA3OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9IE5BTUVTUEFDRV9XSU5ET1dfTUFOQUdFUjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FTTV9QUkVGSVggPSAiQWN0aXZpdHlTZWN1cml0eV9fIjsKQEAgLTg5LDYgKzg5LDkgQEAKIAogICAgICAgICBpZiAoZmxhZ0VuYWJsZWQpIHsKICAgICAgICAgICAgIFN0cmluZ1tdIHBhY2thZ2VOYW1lcyA9IHNQbS5nZXRQYWNrYWdlc0ZvclVpZCh1aWQpOworICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VOYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChzRXhjbHVkZWRQYWNrYWdlTmFtZXMuY29udGFpbnMocGFja2FnZU5hbWVzW2ldKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5U3RhcnRlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVN0YXJ0ZXIuamF2YQppbmRleCA4OWNkN2RiLi5jZTI5NTY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FjdGl2aXR5U3RhcnRlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlTdGFydGVyLmphdmEKQEAgLTE2ODAsNiArMTY4MCwxMSBAQAogICAgICAgICAgICAgICAgIHRhcmdldFRhc2sucmVtb3ZlSW1tZWRpYXRlbHkoImJ1bGt5LXRhc2siKTsKICAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfQUJPUlRFRDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFdoZW4gcnVubmluZyB0cmFuc2llbnQgdHJhbnNpdGlvbiwgdGhlIHRyYW5zaWVudCBsYXVuY2ggdGFyZ2V0IHNob3VsZCBrZWVwIG9uIHRvcC4KKyAgICAgICAgICAgIC8vIFNvIGRpc2FsbG93IHRoZSB0cmFuc2llbnQgaGlkZSBhY3Rpdml0eSB0byBtb3ZlIGl0c2VsZiB0byBmcm9udCwgZS5nLiB0cmFtcG9saW5lLgorICAgICAgICAgICAgaWYgKCFtQXZvaWRNb3ZlVG9Gcm9udCAmJiByLm1UcmFuc2l0aW9uQ29udHJvbGxlci5pc1RyYW5zaWVudEhpZGUodGFyZ2V0VGFzaykpIHsKKyAgICAgICAgICAgICAgICBtQXZvaWRNb3ZlVG9Gcm9udCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUHJpb3JBYm92ZVRhc2sgPSBUYXNrRGlzcGxheUFyZWEuZ2V0Um9vdFRhc2tBYm92ZSh0YXJnZXRUYXNrLmdldFJvb3RUYXNrKCkpOwogICAgICAgICB9CiAKQEAgLTE3OTYsNyArMTgwMSw3IEBACiAgICAgICAgICAgICAgICAgLy8gcm9vdC10YXNrIHRvIHRoZSB3aWxsIG5vdCB1cGRhdGUgdGhlIGZvY3VzZWQgcm9vdC10YXNrLiAgSWYgc3RhcnRpbmcgdGhlIG5ldwogICAgICAgICAgICAgICAgIC8vIGFjdGl2aXR5IG5vdyBhbGxvd3MgdGhlIHRhc2sgcm9vdC10YXNrIHRvIGJlIGZvY3VzYWJsZSwgdGhlbiBlbnN1cmUgdGhhdCB3ZQogICAgICAgICAgICAgICAgIC8vIG5vdyB1cGRhdGUgdGhlIGZvY3VzZWQgcm9vdC10YXNrIGFjY29yZGluZ2x5LgotICAgICAgICAgICAgICAgIGlmIChtVGFyZ2V0Um9vdFRhc2suaXNUb3BBY3Rpdml0eUZvY3VzYWJsZSgpCisgICAgICAgICAgICAgICAgaWYgKCFtQXZvaWRNb3ZlVG9Gcm9udCAmJiBtVGFyZ2V0Um9vdFRhc2suaXNUb3BBY3Rpdml0eUZvY3VzYWJsZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbVJvb3RXaW5kb3dDb250YWluZXIuaXNUb3BEaXNwbGF5Rm9jdXNlZFJvb3RUYXNrKG1UYXJnZXRSb290VGFzaykpIHsKICAgICAgICAgICAgICAgICAgICAgbVRhcmdldFJvb3RUYXNrLm1vdmVUb0Zyb250KCJzdGFydEFjdGl2aXR5SW5uZXIiKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMjY5LDEzICsyMjc0LDE0IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNsZWFyVG9wSWZOZWVkZWQoQE5vbk51bGwgVGFzayB0YXJnZXRUYXNrLCBpbnQgY2FsbGluZ1VpZCwgaW50IHJlYWxDYWxsaW5nVWlkLAogICAgICAgICAgICAgaW50IHN0YXJ0aW5nVWlkLCBpbnQgbGF1bmNoRmxhZ3MpIHsKLSAgICAgICAgaWYgKChsYXVuY2hGbGFncyAmIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0spICE9IEZMQUdfQUNUSVZJVFlfTkVXX1RBU0spIHsKLSAgICAgICAgICAgIC8vIExhdW5jaCBpcyBmcm9tIHRoZSBzYW1lIHRhc2ssIHNvIG11c3QgYmUgYSB0b3Agb3IgcHJpdmlsZWdlZCBVSUQKKyAgICAgICAgaWYgKChsYXVuY2hGbGFncyAmIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0spICE9IEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sKKyAgICAgICAgICAgICAgICB8fCBtQmFsQ29kZSA9PSBCQUxfQUxMT1dfQUxMT1dMSVNURURfVUlEKSB7CisgICAgICAgICAgICAvLyBMYXVuY2ggaXMgZnJvbSB0aGUgc2FtZSB0YXNrLCAoYSB0b3Agb3IgcHJpdmlsZWdlZCBVSUQpLCBvciBpcyBkaXJlY3RseSBwcml2aWxlZ2VkLgogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgUHJlZGljYXRlPEFjdGl2aXR5UmVjb3JkPiBpc0xhdW5jaGluZ09yTGF1bmNoZWQgPSBhciAtPiAhYXIuZmluaXNoaW5nCi0gICAgICAgICAgICAgICAgJiYgKGFyLmlzVWlkKHN0YXJ0aW5nVWlkKSB8fCBhci5pc1VpZChjYWxsaW5nVWlkKSB8fCBhci5pc1VpZChyZWFsQ2FsbGluZ1VpZCkpOworICAgICAgICBQcmVkaWNhdGU8QWN0aXZpdHlSZWNvcmQ+IGlzTGF1bmNoaW5nT3JMYXVuY2hlZCA9IGFyIC0+CisgICAgICAgICAgICAgICAgYXIuaXNVaWQoc3RhcnRpbmdVaWQpIHx8IGFyLmlzVWlkKGNhbGxpbmdVaWQpIHx8IGFyLmlzVWlkKHJlYWxDYWxsaW5nVWlkKTsKIAogICAgICAgICAvLyBSZXR1cm4gZWFybHkgaWYgd2Uga25vdyBmb3Igc3VyZSB3ZSB3b24ndCBuZWVkIHRvIGNsZWFyIGFueSBhY3Rpdml0aWVzIGJ5IGp1c3QgY2hlY2tpbmcKICAgICAgICAgLy8gdGhlIHRvcCBhY3Rpdml0eS4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQWN0aXZpdHlUYXNrU3VwZXJ2aXNvci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVRhc2tTdXBlcnZpc29yLmphdmEKaW5kZXggYTBhMjU1Ny4uZWFmNTU4MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVRhc2tTdXBlcnZpc29yLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BY3Rpdml0eVRhc2tTdXBlcnZpc29yLmphdmEKQEAgLTE2NjYsNyArMTY2Niw3IEBACiAgICAgICAgICAgICBTdHJpbmcgY2FsbGVyQWN0aXZpdHlDbGFzc05hbWUpIHsKICAgICAgICAgLy8gV2UgbWF5IGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlIGNhbGxpbmdVaWQgaGFzIGFkZGl0aW9uYWwgY2xlYXJUYXNrIHByaXZpbGVnZXMsIGFuZAogICAgICAgICAvLyBjbGVhcmVkIHRoZSBjYWxsaW5nIGlkZW50aWZ5LiBJZiBzbywgd2UgaW5mZXIgd2UgZG8gbm90IG5lZWQgZnVydGhlciByZXN0cmljdGlvbnMgaGVyZS4KLSAgICAgICAgaWYgKGNhbGxpbmdVaWQgPT0gU1lTVEVNX1VJRCkgeworICAgICAgICBpZiAoY2FsbGluZ1VpZCA9PSBTWVNURU1fVUlEIHx8ICF0YXNrLmlzVmlzaWJsZSgpIHx8IHRhc2suaW5NdWx0aVdpbmRvd01vZGUoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTE3NzIsMTMgKzE3NzIsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgUGFpcjw+KHRydWUsIHRydWUpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gQWx3YXlzIGFsbG93IGFjdHVhbCB0b3AgYWN0aXZpdHkgdG8gY2xlYXIgdGFzaworICAgICAgICBBY3Rpdml0eVJlY29yZCB0b3BBY3Rpdml0eSA9IHRhc2suZ2V0VG9wTW9zdEFjdGl2aXR5KCk7CisgICAgICAgIGlmICh0b3BBY3Rpdml0eSAhPSBudWxsICYmIHRvcEFjdGl2aXR5LmlzVWlkKHVpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFpcjw+KHRydWUsIHRydWUpOworICAgICAgICB9CisKICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIHNvdXJjZSBhY3Rpdml0eSwgd2hldGhlciBvciBub3QgaXQgaXMgZmluaXNoaW5nLiBEbyBub3QgY29uc2lkZXIgYW55IG90aGVyCiAgICAgICAgIC8vIGZpbmlzaGluZyBhY3Rpdml0eS4KICAgICAgICAgUHJlZGljYXRlPEFjdGl2aXR5UmVjb3JkPiB0b3BPZlN0YWNrUHJlZGljYXRlID0gKGFyKSAtPiBhci5lcXVhbHMoc291cmNlUmVjb3JkKQogICAgICAgICAgICAgICAgIHx8ICghYXIuZmluaXNoaW5nICYmICFhci5pc0Fsd2F5c09uVG9wKCkpOwogCiAgICAgICAgIC8vIENoZWNrIHRvcCBvZiBzdGFjayAob3IgdGhlIGZpcnN0IHRhc2sgZnJhZ21lbnQgZm9yIGVtYmVkZGluZykuCi0gICAgICAgIEFjdGl2aXR5UmVjb3JkIHRvcEFjdGl2aXR5ID0gdGFzay5nZXRBY3Rpdml0eSh0b3BPZlN0YWNrUHJlZGljYXRlKTsKKyAgICAgICAgdG9wQWN0aXZpdHkgPSB0YXNrLmdldEFjdGl2aXR5KHRvcE9mU3RhY2tQcmVkaWNhdGUpOwogICAgICAgICBpZiAodG9wQWN0aXZpdHkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWlyPD4oZmFsc2UsIGZhbHNlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9CYWNrTmF2aWdhdGlvbkNvbnRyb2xsZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQmFja05hdmlnYXRpb25Db250cm9sbGVyLmphdmEKaW5kZXggZjlmOTcyYy4uYjY3YmM2MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9CYWNrTmF2aWdhdGlvbkNvbnRyb2xsZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0JhY2tOYXZpZ2F0aW9uQ29udHJvbGxlci5qYXZhCkBAIC04NjIsOCArODYyLDE2IEBACiAgICAgICAgICAgICAgICAgV2luZG93Q29udGFpbmVyIHRhcmdldCwgYm9vbGVhbiBpc09wZW4pIHsKICAgICAgICAgICAgIGZpbmFsIEJhY2tXaW5kb3dBbmltYXRpb25BZGFwdG9yIGFkYXB0b3IgPQogICAgICAgICAgICAgICAgICAgICBuZXcgQmFja1dpbmRvd0FuaW1hdGlvbkFkYXB0b3IodGFyZ2V0LCBpc09wZW4pOwotICAgICAgICAgICAgdGFyZ2V0LnN0YXJ0QW5pbWF0aW9uKHRhcmdldC5nZXRQZW5kaW5nVHJhbnNhY3Rpb24oKSwgYWRhcHRvciwgZmFsc2UgLyogaGlkZGVuICovLAotICAgICAgICAgICAgICAgICAgICBBTklNQVRJT05fVFlQRV9QUkVESUNUX0JBQ0spOworICAgICAgICAgICAgZmluYWwgU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gcHQgPSB0YXJnZXQuZ2V0UGVuZGluZ1RyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB0YXJnZXQuc3RhcnRBbmltYXRpb24ocHQsIGFkYXB0b3IsIGZhbHNlIC8qIGhpZGRlbiAqLywgQU5JTUFUSU9OX1RZUEVfUFJFRElDVF9CQUNLKTsKKyAgICAgICAgICAgIC8vIFdvcmthcm91bmQgdG8gc2hvdyBUYXNrRnJhZ21lbnQgd2hpY2ggY2FuIGJlIGhpZGUgaW4gVHJhbnNpdGlvbnMgYW5kIHdvbid0IHNob3cKKyAgICAgICAgICAgIC8vIGR1cmluZyBpc0FuaW1hdGluZy4KKyAgICAgICAgICAgIGlmIChpc09wZW4gJiYgdGFyZ2V0LmFzQWN0aXZpdHlSZWNvcmQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGFza0ZyYWdtZW50IGZyYWdtZW50ID0gdGFyZ2V0LmFzQWN0aXZpdHlSZWNvcmQoKS5nZXRUYXNrRnJhZ21lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwdC5zaG93KGZyYWdtZW50Lm1TdXJmYWNlQ29udHJvbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3I7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9EcmFnU3RhdGUuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vRHJhZ1N0YXRlLmphdmEKaW5kZXggMGIyOGJhMi4uYmM5ZWZjOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9EcmFnU3RhdGUuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0RyYWdTdGF0ZS5qYXZhCkBAIC0zNzcsMTUgKzM3NywxMCBAQAogICAgICAgICAgICAgbURyYWdXaW5kb3dIYW5kbGUub3duZXJVaWQgPSBNWV9VSUQ7CiAgICAgICAgICAgICBtRHJhZ1dpbmRvd0hhbmRsZS5zY2FsZUZhY3RvciA9IDEuMGY7CiAKLSAgICAgICAgICAgIC8vIElucHV0Q29uZmlnLlBSRVZFTlRfU1BMSVRUSU5HOiBUbyBrZWVwIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgd2luZG93IHRvIGJlCi0gICAgICAgICAgICAvLyBmb2N1c2FibGUsIHdoaWNoIGFsbG93cyB0aGUgc3lzdGVtIHRvIGNvbnN1bWUga2V5cyB3aGVuIGRyYWdnaW5nIGlzIGFjdGl2ZS4gVGhpcyBjYW4KLSAgICAgICAgICAgIC8vIGFsc28gYmUgdXNlZCB0byBtb2RpZnkgdGhlIGRyYWcgc3RhdGUgb24ga2V5IHByZXNzLiBGb3IgZXhhbXBsZSwgY2FuY2VsIGRyYWcgb24KLSAgICAgICAgICAgIC8vIGVzY2FwZSBrZXkuCiAgICAgICAgICAgICAvLyBJbnB1dENvbmZpZy5UUlVTVEVEX09WRVJMQVk6IFRvIG5vdCBibG9jayBhbnkgdG91Y2hlcyB3aGlsZSBEJkQgb25nb2luZyBhbmQgYWxsb3dpbmcKICAgICAgICAgICAgIC8vIHRvdWNoZXMgdG8gcGFzcyB0aHJvdWdoIHRvIHdpbmRvd3MgdW5kZXJuZWF0aC4gVGhpcyBhbGxvd3MgdXNlciB0byBpbnRlcmFjdCB3aXRoIHRoZQogICAgICAgICAgICAgLy8gVUkgdG8gbmF2aWdhdGUgd2hpbGUgZHJhZ2dpbmcuCi0gICAgICAgICAgICBtRHJhZ1dpbmRvd0hhbmRsZS5pbnB1dENvbmZpZyA9Ci0gICAgICAgICAgICAgICAgICAgIElucHV0Q29uZmlnLlBSRVZFTlRfU1BMSVRUSU5HIHwgSW5wdXRDb25maWcuVFJVU1RFRF9PVkVSTEFZOworICAgICAgICAgICAgbURyYWdXaW5kb3dIYW5kbGUuaW5wdXRDb25maWcgPSBJbnB1dENvbmZpZy5UUlVTVEVEX09WRVJMQVk7CiAKICAgICAgICAgICAgIC8vIFRoZSBkcmFnIHdpbmRvdyBjYW5ub3QgcmVjZWl2ZSBuZXcgdG91Y2hlcy4KICAgICAgICAgICAgIG1EcmFnV2luZG93SGFuZGxlLnRvdWNoYWJsZVJlZ2lvbi5zZXRFbXB0eSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9FbnN1cmVBY3Rpdml0aWVzVmlzaWJsZUhlbHBlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9FbnN1cmVBY3Rpdml0aWVzVmlzaWJsZUhlbHBlci5qYXZhCmluZGV4IGRkZTg5ZTkuLjljYzMxMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vRW5zdXJlQWN0aXZpdGllc1Zpc2libGVIZWxwZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0Vuc3VyZUFjdGl2aXRpZXNWaXNpYmxlSGVscGVyLmphdmEKQEAgLTE5Myw3ICsxOTMsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoIXIuYXR0YWNoZWRUb1Byb2Nlc3MoKSkgewotICAgICAgICAgICAgICAgIG1ha2VWaXNpYmxlQW5kUmVzdGFydElmTmVlZGVkKG1TdGFydGluZywgbUNvbmZpZ0NoYW5nZXMsIGlzVG9wLAorICAgICAgICAgICAgICAgIG1ha2VWaXNpYmxlQW5kUmVzdGFydElmTmVlZGVkKG1TdGFydGluZywgbUNvbmZpZ0NoYW5nZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUb3BBY3Rpdml0eSAmJiBpc1RvcCwgcik7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHIuaXNWaXNpYmxlUmVxdWVzdGVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFjdGl2aXR5IGlzIGFscmVhZHkgdmlzaWJsZSwgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuCkBAIC0yNDMsMTUgKzI0Myw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG1ha2VWaXNpYmxlQW5kUmVzdGFydElmTmVlZGVkKEFjdGl2aXR5UmVjb3JkIHN0YXJ0aW5nLCBpbnQgY29uZmlnQ2hhbmdlcywKLSAgICAgICAgICAgIGJvb2xlYW4gaXNUb3AsIGJvb2xlYW4gYW5kUmVzdW1lLCBBY3Rpdml0eVJlY29yZCByKSB7Ci0gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBhcHAgaXMgcnVubmluZyBpZiBpdCdzIHRoZSB0b3AsIG9yIGl0IGlzIGp1c3QgbWFkZSB2aXNpYmxlIGZyb20KLSAgICAgICAgLy8gaW52aXNpYmxlLiBJZiB0aGUgYXBwIGlzIGFscmVhZHkgdmlzaWJsZSwgaXQgbXVzdCBoYXZlIGRpZWQgd2hpbGUgaXQgd2FzIHZpc2libGUuIEluIHRoaXMKLSAgICAgICAgLy8gY2FzZSwgd2UnbGwgc2hvdyB0aGUgZGVhZCB3aW5kb3cgYnV0IHdpbGwgbm90IHJlc3RhcnQgdGhlIGFwcC4gT3RoZXJ3aXNlIHdlIGNvdWxkIGVuZCB1cAotICAgICAgICAvLyB0aHJhc2hpbmcuCi0gICAgICAgIGlmICghaXNUb3AgJiYgci5pc1Zpc2libGVSZXF1ZXN0ZWQoKSAmJiAhci5pc1N0YXRlKElOSVRJQUxJWklORykpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCisgICAgICAgICAgICBib29sZWFuIGFuZFJlc3VtZSwgQWN0aXZpdHlSZWNvcmQgcikgewogICAgICAgICAvLyBUaGlzIGFjdGl2aXR5IG5lZWRzIHRvIGJlIHZpc2libGUsIGJ1dCBpc24ndCBldmVuIHJ1bm5pbmcuLi4KICAgICAgICAgLy8gZ2V0IGl0IHN0YXJ0ZWQgYW5kIHJlc3VtZSBpZiBubyBvdGhlciByb290IHRhc2sgaW4gdGhpcyByb290IHRhc2sgaXMgcmVzdW1lZC4KICAgICAgICAgaWYgKERFQlVHX1ZJU0lCSUxJVFkpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vSW5wdXRNYW5hZ2VyQ2FsbGJhY2suamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vSW5wdXRNYW5hZ2VyQ2FsbGJhY2suamF2YQppbmRleCAxZTlkNDUxLi4wYTQ3ZmUwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0lucHV0TWFuYWdlckNhbGxiYWNrLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9JbnB1dE1hbmFnZXJDYWxsYmFjay5qYXZhCkBAIC0yNSw3ICsyNSw2IEBACiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludEY7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CkBAIC0yMjEsMTEgKzIyMCw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBvaW50RiBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldExhdGVzdE1vdXNlUG9zaXRpb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvblBvaW50ZXJEb3duT3V0c2lkZUZvY3VzKElCaW5kZXIgdG91Y2hlZFRva2VuKSB7CiAgICAgICAgIG1TZXJ2aWNlLm1ILm9idGFpbk1lc3NhZ2UoT05fUE9JTlRFUl9ET1dOX09VVFNJREVfRk9DVVMsIHRvdWNoZWRUb2tlbikuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9MZXR0ZXJib3hVaUNvbnRyb2xsZXIuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vTGV0dGVyYm94VWlDb250cm9sbGVyLmphdmEKaW5kZXggZjM1NWYwOC4uNWRiMzlmYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9MZXR0ZXJib3hVaUNvbnRyb2xsZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0xldHRlcmJveFVpQ29udHJvbGxlci5qYXZhCkBAIC05OTcsNyArOTk3LDggQEAKIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIGJvb2xlYW4gc2hvdWxkU2hvd0xldHRlcmJveFVpKFdpbmRvd1N0YXRlIG1haW5XaW5kb3cpIHsKLSAgICAgICAgcmV0dXJuIGlzU3VyZmFjZVZpc2libGUobWFpbldpbmRvdykgJiYgbWFpbldpbmRvdy5hcmVBcHBXaW5kb3dCb3VuZHNMZXR0ZXJib3hlZCgpCisgICAgICAgIHJldHVybiAobUFjdGl2aXR5UmVjb3JkLmlzSW5MZXR0ZXJib3hBbmltYXRpb24oKSB8fCBpc1N1cmZhY2VWaXNpYmxlKG1haW5XaW5kb3cpKQorICAgICAgICAgICAgICAgICYmIG1haW5XaW5kb3cuYXJlQXBwV2luZG93Qm91bmRzTGV0dGVyYm94ZWQoKQogICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBGTEFHX1NIT1dfV0FMTFBBUEVSIGV4cGxpY2l0bHkgaW5zdGVhZCBvZiB1c2luZwogICAgICAgICAgICAgICAgIC8vIFdpbmRvd0NvbnRhaW5lciNzaG93V2FsbHBhcGVyIGJlY2F1c2UgdGhlIGxhdGVyIHdpbGwgcmV0dXJuIHRydWUgd2hlbiB0aGlzCiAgICAgICAgICAgICAgICAgLy8gYWN0aXZpdHkgaXMgdXNpbmcgYmx1cnJlZCB3YWxscGFwZXIgZm9yIGxldHRlcmJveCBiYWNrZ3JvdW5kLgpAQCAtMTEwNCw3ICsxMTA1LDcgQEAKICAgICAvLyBmb3IgYWxsIGNvcm5lcnMgZm9yIGNvbnNpc3RlbmN5IGFuZCBwaWNrIGEgbWluaW1hbCBib3R0b20gb25lIGZvciBjb25zaXN0ZW5jeSB3aXRoIGEKICAgICAvLyB0YXNrYmFyIHJvdW5kZWQgY29ybmVycy4KICAgICBpbnQgZ2V0Um91bmRlZENvcm5lcnNSYWRpdXMoZmluYWwgV2luZG93U3RhdGUgbWFpbldpbmRvdykgewotICAgICAgICBpZiAoIXJlcXVpcmVzUm91bmRlZENvcm5lcnMobWFpbldpbmRvdykgfHwgbUFjdGl2aXR5UmVjb3JkLmlzSW5MZXR0ZXJib3hBbmltYXRpb24oKSkgeworICAgICAgICBpZiAoIXJlcXVpcmVzUm91bmRlZENvcm5lcnMobWFpbldpbmRvdykpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vUm9vdFdpbmRvd0NvbnRhaW5lci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9Sb290V2luZG93Q29udGFpbmVyLmphdmEKaW5kZXggYjJhNGRmMS4uZmRhMjEyNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9Sb290V2luZG93Q29udGFpbmVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9Sb290V2luZG93Q29udGFpbmVyLmphdmEKQEAgLTQ0LDcgKzQ0LDYgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwucHJvdG9sb2cuUHJvdG9Mb2dHcm91cC5XTV9ERUJVR19UQVNLUzsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwucHJvdG9sb2cuUHJvdG9Mb2dHcm91cC5XTV9ERUJVR19XQUxMUEFQRVI7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnByb3RvbG9nLlByb3RvTG9nR3JvdXAuV01fU0hPV19TVVJGQUNFX0FMTE9DOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5wcm90b2xvZy5Qcm90b0xvZ0dyb3VwLldNX1NIT1dfVFJBTlNBQ1RJT05TOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIucG9saWN5LlBob25lV2luZG93TWFuYWdlci5TWVNURU1fRElBTE9HX1JFQVNPTl9BU1NJU1Q7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5wb2xpY3kuV2luZG93TWFuYWdlclBvbGljeS5GSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIucG9saWN5LldpbmRvd01hbmFnZXJQb2xpY3kuRklOSVNIX0xBWU9VVF9SRURPX1dBTExQQVBFUjsKQEAgLTQzMiwxMyArNDMxLDYgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25zdW1lcjxXaW5kb3dTdGF0ZT4gc1JlbW92ZVJlcGxhY2VkV2luZG93c0NvbnN1bWVyID0gdyAtPiB7Ci0gICAgICAgIGZpbmFsIEFjdGl2aXR5UmVjb3JkIGFjdGl2aXR5ID0gdy5tQWN0aXZpdHlSZWNvcmQ7Ci0gICAgICAgIGlmIChhY3Rpdml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhY3Rpdml0eS5yZW1vdmVSZXBsYWNlZFdpbmRvd0lmTmVlZGVkKHcpOwotICAgICAgICB9Ci0gICAgfTsKLQogICAgIFJvb3RXaW5kb3dDb250YWluZXIoV2luZG93TWFuYWdlclNlcnZpY2Ugc2VydmljZSkgewogICAgICAgICBzdXBlcihzZXJ2aWNlKTsKICAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKHNlcnZpY2UubUguZ2V0TG9vcGVyKCkpOwpAQCAtNjYyLDE3ICs2NTQsNiBAQAogICAgICAgICBmb3JBbGxXaW5kb3dzKG1DbG9zZVN5c3RlbURpYWxvZ3NDb25zdW1lciwgZmFsc2UgLyogdHJhdmVyc2VUb3BUb0JvdHRvbSAqLyk7CiAgICAgfQogCi0gICAgdm9pZCByZW1vdmVSZXBsYWNlZFdpbmRvd3MoKSB7Ci0gICAgICAgIFByb3RvTG9nLmkoV01fU0hPV19UUkFOU0FDVElPTlMsICI+Pj4gT1BFTiBUUkFOU0FDVElPTiByZW1vdmVSZXBsYWNlZFdpbmRvd3MiKTsKLSAgICAgICAgbVdtU2VydmljZS5vcGVuU3VyZmFjZVRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3JBbGxXaW5kb3dzKHNSZW1vdmVSZXBsYWNlZFdpbmRvd3NDb25zdW1lciwgdHJ1ZSAvKiB0cmF2ZXJzZVRvcFRvQm90dG9tICovKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1XbVNlcnZpY2UuY2xvc2VTdXJmYWNlVHJhbnNhY3Rpb24oInJlbW92ZVJlcGxhY2VkV2luZG93cyIpOwotICAgICAgICAgICAgUHJvdG9Mb2cuaShXTV9TSE9XX1RSQU5TQUNUSU9OUywgIjw8PCBDTE9TRSBUUkFOU0FDVElPTiByZW1vdmVSZXBsYWNlZFdpbmRvd3MiKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIGJvb2xlYW4gaGFzUGVuZGluZ0xheW91dENoYW5nZXMoV2luZG93QW5pbWF0b3IgYW5pbWF0b3IpIHsKICAgICAgICAgYm9vbGVhbiBoYXNDaGFuZ2VzID0gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU2Vzc2lvbi5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9TZXNzaW9uLmphdmEKaW5kZXggY2U5YmZmOC4uNzhlZTZmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9TZXNzaW9uLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9TZXNzaW9uLmphdmEKQEAgLTIzMiwxMSArMjMyLDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlVG9SZXBsYWNlV2luZG93cyhJQmluZGVyIGFwcFRva2VuLCBib29sZWFuIGNoaWxkcmVuT25seSkgewotICAgICAgICBtU2VydmljZS5zZXRXaWxsUmVwbGFjZVdpbmRvd3MoYXBwVG9rZW4sIGNoaWxkcmVuT25seSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsRHJhdyhJV2luZG93IHdpbmRvdykgewogICAgICAgICByZXR1cm4gbVNlcnZpY2UuY2FuY2VsRHJhdyh0aGlzLCB3aW5kb3cpOwogICAgIH0KQEAgLTg2Miw3ICs4NTcsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGdyYW50SW5wdXRDaGFubmVsKGludCBkaXNwbGF5SWQsIFN1cmZhY2VDb250cm9sIHN1cmZhY2UsCiAgICAgICAgICAgICBJV2luZG93IHdpbmRvdywgSUJpbmRlciBob3N0SW5wdXRUb2tlbiwgaW50IGZsYWdzLCBpbnQgcHJpdmF0ZUZsYWdzLCBpbnQgdHlwZSwKLSAgICAgICAgICAgIElCaW5kZXIgd2luZG93VG9rZW4sIElCaW5kZXIgZm9jdXNHcmFudFRva2VuLCBTdHJpbmcgaW5wdXRIYW5kbGVOYW1lLAorICAgICAgICAgICAgaW50IGlucHV0RmVhdHVyZXMsIElCaW5kZXIgd2luZG93VG9rZW4sIElCaW5kZXIgZm9jdXNHcmFudFRva2VuLCBTdHJpbmcgaW5wdXRIYW5kbGVOYW1lLAogICAgICAgICAgICAgSW5wdXRDaGFubmVsIG91dElucHV0Q2hhbm5lbCkgewogICAgICAgICBpZiAoaG9zdElucHV0VG9rZW4gPT0gbnVsbCAmJiAhbUNhbkFkZEludGVybmFsU3lzdGVtV2luZG93KSB7CiAgICAgICAgICAgICAvLyBDYWxsZXJzIHdpdGhvdXQgSU5URVJOQUxfU1lTVEVNX1dJTkRPVyBwZXJtaXNzaW9uIGNhbm5vdCBncmFudCBpbnB1dCBjaGFubmVsIHRvCkBAIC04NzQsNyArODY5LDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1TZXJ2aWNlLmdyYW50SW5wdXRDaGFubmVsKHRoaXMsIG1VaWQsIG1QaWQsIGRpc3BsYXlJZCwgc3VyZmFjZSwgd2luZG93LCBob3N0SW5wdXRUb2tlbiwKICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG1DYW5BZGRJbnRlcm5hbFN5c3RlbVdpbmRvdyA/IHByaXZhdGVGbGFncyA6IDAsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIHdpbmRvd1Rva2VuLCBmb2N1c0dyYW50VG9rZW4sIGlucHV0SGFuZGxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSwgaW5wdXRGZWF0dXJlcywgd2luZG93VG9rZW4sIGZvY3VzR3JhbnRUb2tlbiwgaW5wdXRIYW5kbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICBvdXRJbnB1dENoYW5uZWwpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHkpOwpAQCAtODgzLDExICs4NzgsMTEgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUlucHV0Q2hhbm5lbChJQmluZGVyIGNoYW5uZWxUb2tlbiwgaW50IGRpc3BsYXlJZCwgU3VyZmFjZUNvbnRyb2wgc3VyZmFjZSwKLSAgICAgICAgICAgIGludCBmbGFncywgaW50IHByaXZhdGVGbGFncywgUmVnaW9uIHJlZ2lvbikgeworICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgcHJpdmF0ZUZsYWdzLCBpbnQgaW5wdXRGZWF0dXJlcywgUmVnaW9uIHJlZ2lvbikgewogICAgICAgICBmaW5hbCBsb25nIGlkZW50aXR5ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtU2VydmljZS51cGRhdGVJbnB1dENoYW5uZWwoY2hhbm5lbFRva2VuLCBkaXNwbGF5SWQsIHN1cmZhY2UsIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICBtQ2FuQWRkSW50ZXJuYWxTeXN0ZW1XaW5kb3cgPyBwcml2YXRlRmxhZ3MgOiAwLCByZWdpb24pOworICAgICAgICAgICAgICAgICAgICBtQ2FuQWRkSW50ZXJuYWxTeXN0ZW1XaW5kb3cgPyBwcml2YXRlRmxhZ3MgOiAwLCBpbnB1dEZlYXR1cmVzLCByZWdpb24pOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1Rhc2suamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVGFzay5qYXZhCmluZGV4IGViZGM1MzcuLjY4ODJlNGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVGFzay5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVGFzay5qYXZhCkBAIC04NjYsMjMgKzg2Niw4IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBpbnQgdG9Sb290VGFza1dpbmRvd2luZ01vZGUgPSB0b1Jvb3RUYXNrLmdldFdpbmRvd2luZ01vZGUoKTsKICAgICAgICAgZmluYWwgQWN0aXZpdHlSZWNvcmQgdG9wQWN0aXZpdHkgPSBnZXRUb3BOb25GaW5pc2hpbmdBY3Rpdml0eSgpOwogCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gbWlnaHRSZXBsYWNlV2luZG93ID0gdG9wQWN0aXZpdHkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIHJlcGxhY2VXaW5kb3dzT25UYXNrTW92ZShnZXRXaW5kb3dpbmdNb2RlKCksIHRvUm9vdFRhc2tXaW5kb3dpbmdNb2RlKTsKLSAgICAgICAgaWYgKG1pZ2h0UmVwbGFjZVdpbmRvdykgewotICAgICAgICAgICAgLy8gV2UgYXJlIGFib3V0IHRvIHJlbGF1bmNoIHRoZSBhY3Rpdml0eSBiZWNhdXNlIGl0cyBjb25maWd1cmF0aW9uIGNoYW5nZWQgZHVlIHRvCi0gICAgICAgICAgICAvLyBiZWluZyBtYXhpbWl6ZWQsIGkuZS4gc2l6ZSBjaGFuZ2UuIFRoZSBhY3Rpdml0eSB3aWxsIGZpcnN0IHJlbW92ZSB0aGUgb2xkIHdpbmRvdwotICAgICAgICAgICAgLy8gYW5kIHRoZW4gYWRkIGEgbmV3IG9uZS4gVGhpcyBjYWxsIHdpbGwgdGVsbCB3aW5kb3cgbWFuYWdlciBhYm91dCB0aGlzLCBzbyBpdCBjYW4KLSAgICAgICAgICAgIC8vIHByZXNlcnZlIHRoZSBvbGQgd2luZG93IHVudGlsIHRoZSBuZXcgb25lIGlzIGRyYXduLiBUaGlzIHByZXZlbnRzIGhhdmluZyBhIGdhcAotICAgICAgICAgICAgLy8gYmV0d2VlbiB0aGUgcmVtb3ZhbCBhbmQgYWRkaXRpb24sIGluIHdoaWNoIG5vIHdpbmRvdyBpcyB2aXNpYmxlLiBXZSBhbHNvIHdhbnQgdGhlCi0gICAgICAgICAgICAvLyBlbnRyYW5jZSBvZiB0aGUgbmV3IHdpbmRvdyB0byBiZSBwcm9wZXJseSBhbmltYXRlZC4KLSAgICAgICAgICAgIC8vIE5vdGUgaGVyZSB3ZSBhbHdheXMgc2V0IHRoZSByZXBsYWNpbmcgd2luZG93IGZpcnN0LCBhcyB0aGUgZmxhZ3MgbWlnaHQgYmUgbmVlZGVkCi0gICAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbGF1bmNoLiBJZiB3ZSBlbmQgdXAgbm90IGRvaW5nIGFueSByZWxhdW5jaCwgd2UgY2xlYXIgdGhlIGZsYWdzIGxhdGVyLgotICAgICAgICAgICAgd2luZG93TWFuYWdlci5zZXRXaWxsUmVwbGFjZVdpbmRvdyh0b3BBY3Rpdml0eS50b2tlbiwgYW5pbWF0ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICBtQXRtU2VydmljZS5kZWZlcldpbmRvd0xheW91dCgpOwogICAgICAgICBib29sZWFuIGtlcHQgPSB0cnVlOwogICAgICAgICB0cnkgewpAQCAtOTI2LDE3ICs5MTEsMTAgQEAKICAgICAgICAgICAgIG1BdG1TZXJ2aWNlLmNvbnRpbnVlV2luZG93TGF5b3V0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobWlnaHRSZXBsYWNlV2luZG93KSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgYWN0dWFsIGRvIGEgcmVsYXVuY2ggKGluZGljYXRlZCBieSBrZXB0PT10cnVlIG1lYW5pbmcgd2Uga2VwdCB0aGUgb2xkCi0gICAgICAgICAgICAvLyB3aW5kb3cpLCB3ZSBuZWVkIHRvIGNsZWFyIHRoZSByZXBsYWNlIHdpbmRvdyBzZXR0aW5ncy4gT3RoZXJ3aXNlLCB3ZSBzY2hlZHVsZSBhCi0gICAgICAgICAgICAvLyB0aW1lb3V0IHRvIHJlbW92ZSB0aGUgb2xkIHdpbmRvdyBpZiB0aGUgcmVwbGFjaW5nIHdpbmRvdyBpcyBub3QgY29taW5nIGluIHRpbWUuCi0gICAgICAgICAgICB3aW5kb3dNYW5hZ2VyLnNjaGVkdWxlQ2xlYXJXaWxsUmVwbGFjZVdpbmRvd3ModG9wQWN0aXZpdHkudG9rZW4sICFrZXB0KTsKLSAgICAgICAgfQotCiAgICAgICAgIGlmICghZGVmZXJSZXN1bWUpIHsKICAgICAgICAgICAgIC8vIFRoZSB0YXNrIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIHJ1bm5pbmcgYW5kIGl0cyB2aXNpYmlsaXR5IG5lZWRzIHRvIGJlIHN5bmNocm9uaXplZAogICAgICAgICAgICAgLy8gd2l0aCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgcm9vdCB0YXNrIC8gd2luZG93cy4KLSAgICAgICAgICAgIHJvb3QuZW5zdXJlQWN0aXZpdGllc1Zpc2libGUobnVsbCwgMCwgIW1pZ2h0UmVwbGFjZVdpbmRvdyk7CisgICAgICAgICAgICByb290LmVuc3VyZUFjdGl2aXRpZXNWaXNpYmxlKG51bGwsIDAsIFBSRVNFUlZFX1dJTkRPV1MpOwogICAgICAgICAgICAgcm9vdC5yZXN1bWVGb2N1c2VkVGFza3NUb3BBY3Rpdml0aWVzKCk7CiAgICAgICAgIH0KIApAQCAtOTQ3LDE3ICs5MjUsNiBAQAogICAgICAgICByZXR1cm4gKHByZWZlcnJlZFJvb3RUYXNrID09IHRvUm9vdFRhc2spOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB3aW5kb3dzIG9mIHRhc2tzIGJlaW5nIG1vdmVkIHRvIHRoZSB0YXJnZXQgcm9vdCB0YXNrIGZyb20gdGhlCi0gICAgICogc291cmNlIHJvb3QgdGFzayBzaG91bGQgYmUgcmVwbGFjZWQsIG1lYW5pbmcgdGhhdCB3aW5kb3cgbWFuYWdlciB3aWxsIGtlZXAgdGhlIG9sZCB3aW5kb3cKLSAgICAgKiBhcm91bmQgdW50aWwgdGhlIG5ldyBpcyByZWFkeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlcGxhY2VXaW5kb3dzT25UYXNrTW92ZSgKLSAgICAgICAgICAgIGludCBzb3VyY2VXaW5kb3dpbmdNb2RlLCBpbnQgdGFyZ2V0V2luZG93aW5nTW9kZSkgewotICAgICAgICByZXR1cm4gc291cmNlV2luZG93aW5nTW9kZSA9PSBXSU5ET1dJTkdfTU9ERV9GUkVFRk9STQotICAgICAgICAgICAgICAgIHx8IHRhcmdldFdpbmRvd2luZ01vZGUgPT0gV0lORE9XSU5HX01PREVfRlJFRUZPUk07Ci0gICAgfQotCiAgICAgdm9pZCB0b3VjaEFjdGl2ZVRpbWUoKSB7CiAgICAgICAgIGxhc3RBY3RpdmVUaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAgICAgfQpAQCAtMzM5OCw4ICszMzY1LDEwIEBACiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1RvcEFjdGl2aXR5UmVzdW1lZCA9IHRvcCAhPSBudWxsCiAgICAgICAgICAgICAgICAgJiYgdG9wLmdldE9yZ2FuaXplZFRhc2soKSA9PSB0aGlzICYmIHRvcC5pc1N0YXRlKFJFU1VNRUQpOwotICAgICAgICAvLyBXaGV0aGVyIHRoZSBkaXJlY3QgdG9wIGFjdGl2aXR5IGlzIGluIHNpemUgY29tcGF0IG1vZGUgb24gZm9yZWdyb3VuZC4KLSAgICAgICAgaW5mby50b3BBY3Rpdml0eUluU2l6ZUNvbXBhdCA9IGlzVG9wQWN0aXZpdHlSZXN1bWVkICYmIHRvcC5pblNpemVDb21wYXRNb2RlKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNUb3BBY3Rpdml0eVZpc2libGUgPSB0b3AgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHRvcC5nZXRPcmdhbml6ZWRUYXNrKCkgPT0gdGhpcyAmJiB0b3AuaXNWaXNpYmxlKCk7CisgICAgICAgIC8vIFdoZXRoZXIgdGhlIGRpcmVjdCB0b3AgYWN0aXZpdHkgaXMgaW4gc2l6ZSBjb21wYXQgbW9kZQorICAgICAgICBpbmZvLnRvcEFjdGl2aXR5SW5TaXplQ29tcGF0ID0gaXNUb3BBY3Rpdml0eVZpc2libGUgJiYgdG9wLmluU2l6ZUNvbXBhdE1vZGUoKTsKICAgICAgICAgaWYgKGluZm8udG9wQWN0aXZpdHlJblNpemVDb21wYXQKICAgICAgICAgICAgICAgICAmJiBtV21TZXJ2aWNlLm1MZXR0ZXJib3hDb25maWd1cmF0aW9uLmlzVHJhbnNsdWNlbnRMZXR0ZXJib3hpbmdFbmFibGVkKCkpIHsKICAgICAgICAgICAgIC8vIFdlIGhpZGUgdGhlIHJlc3RhcnQgYnV0dG9uIGluIGNhc2Ugb2YgdHJhbnNwYXJlbnQgYWN0aXZpdGllcy4KQEAgLTU3ODEsOCArNTc1MCwxMSBAQAogICAgICAgICAgICAgZmluYWwgaW50IHRhc2tJZCA9IGFjdGl2aXR5ICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAgPyBtVGFza1N1cGVydmlzb3IuZ2V0TmV4dFRhc2tJZEZvclVzZXIoYWN0aXZpdHkubVVzZXJJZCkKICAgICAgICAgICAgICAgICAgICAgOiBtVGFza1N1cGVydmlzb3IuZ2V0TmV4dFRhc2tJZEZvclVzZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpdml0eVR5cGUgPSBnZXRBY3Rpdml0eVR5cGUoKTsKICAgICAgICAgICAgIHRhc2sgPSBuZXcgVGFzay5CdWlsZGVyKG1BdG1TZXJ2aWNlKQogICAgICAgICAgICAgICAgICAgICAuc2V0VGFza0lkKHRhc2tJZCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5VHlwZShhY3Rpdml0eVR5cGUgIT0gQUNUSVZJVFlfVFlQRV9VTkRFRklORUQgPyBhY3Rpdml0eVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFDVElWSVRZX1RZUEVfU1RBTkRBUkQpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRBY3Rpdml0eUluZm8oaW5mbykKICAgICAgICAgICAgICAgICAgICAgLnNldEFjdGl2aXR5T3B0aW9ucyhvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZW50KGludGVudCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVGFza0ZyYWdtZW50LmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1Rhc2tGcmFnbWVudC5qYXZhCmluZGV4IDJkZGIzMDcuLjdjNTdkYzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVGFza0ZyYWdtZW50LmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UYXNrRnJhZ21lbnQuamF2YQpAQCAtMTAxMiw2ICsxMDEyLDEwIEBACiAgICAgICAgIGlmIChpc1RvcEFjdGl2aXR5TGF1bmNoZWRCZWhpbmQoKSkgewogICAgICAgICAgICAgcmV0dXJuIFRBU0tfRlJBR01FTlRfVklTSUJJTElUWV9WSVNJQkxFOwogICAgICAgICB9CisgICAgICAgIGZpbmFsIFRhc2sgdGhpc1Rhc2sgPSBhc1Rhc2soKTsKKyAgICAgICAgaWYgKHRoaXNUYXNrICE9IG51bGwgJiYgbVRyYW5zaXRpb25Db250cm9sbGVyLmlzVHJhbnNpZW50SGlkZSh0aGlzVGFzaykpIHsKKyAgICAgICAgICAgIHJldHVybiBUQVNLX0ZSQUdNRU5UX1ZJU0lCSUxJVFlfVklTSUJMRTsKKyAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gZ290VHJhbnNsdWNlbnRGdWxsc2NyZWVuID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gZ290VHJhbnNsdWNlbnRBZGphY2VudCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UcmFuc2l0aW9uLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1RyYW5zaXRpb24uamF2YQppbmRleCA2MDZmMDExLi4zNzBkMzA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1RyYW5zaXRpb24uamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1RyYW5zaXRpb24uamF2YQpAQCAtMTk0LDYgKzE5NCwxMyBAQAogICAgICAqLwogICAgIHByaXZhdGUgQXJyYXlNYXA8QWN0aXZpdHlSZWNvcmQsIFRhc2s+IG1UcmFuc2llbnRMYXVuY2hlcyA9IG51bGw7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgdGFza3MgdGhhdCBtYXkgYmUgb2NjbHVkZWQgYnkgdGhlIHRyYW5zaWVudCBhY3Rpdml0eS4gQXNzdW1lIHRoZSB0YXNrIHN0YWNrIGlzCisgICAgICogW0hvbWUsIEEob3BhcXVlKSwgQihvcGFxdWUpLCBDKHRyYW5zbHVjZW50KV0gKGJvdHRvbSB0byB0b3ApLCB0aGVuIEEgaXMgdGhlIHJlc3RvcmUtYmVsb3cKKyAgICAgKiB0YXNrLCBhbmQgW0IsIENdIGFyZSB0aGUgdHJhbnNpZW50LWhpZGUgdGFza3MuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8VGFzaz4gbVRyYW5zaWVudEhpZGVUYXNrczsKKwogICAgIC8qKiBDdXN0b20gYWN0aXZpdHktbGV2ZWwgYW5pbWF0aW9uIG9wdGlvbnMgYW5kIGNhbGxiYWNrcy4gKi8KICAgICBwcml2YXRlIFRyYW5zaXRpb25JbmZvLkFuaW1hdGlvbk9wdGlvbnMgbU92ZXJyaWRlT3B0aW9uczsKICAgICBwcml2YXRlIElSZW1vdGVDYWxsYmFjayBtQ2xpZW50QW5pbWF0aW9uU3RhcnRDYWxsYmFjayA9IG51bGw7CkBAIC0yNjUsMzUgKzI3Miw1MSBAQAogICAgIHZvaWQgc2V0VHJhbnNpZW50TGF1bmNoKEBOb25OdWxsIEFjdGl2aXR5UmVjb3JkIGFjdGl2aXR5LCBATnVsbGFibGUgVGFzayByZXN0b3JlQmVsb3cpIHsKICAgICAgICAgaWYgKG1UcmFuc2llbnRMYXVuY2hlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICBtVHJhbnNpZW50TGF1bmNoZXMgPSBuZXcgQXJyYXlNYXA8PigpOworICAgICAgICAgICAgbVRyYW5zaWVudEhpZGVUYXNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICB9CiAgICAgICAgIG1UcmFuc2llbnRMYXVuY2hlcy5wdXQoYWN0aXZpdHksIHJlc3RvcmVCZWxvdyk7CiAgICAgICAgIHNldFRyYW5zaWVudExhdW5jaFRvQ2hhbmdlcyhhY3Rpdml0eSk7CiAKICAgICAgICAgaWYgKHJlc3RvcmVCZWxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBDaGFuZ2VJbmZvIGluZm8gPSBtQ2hhbmdlcy5nZXQocmVzdG9yZUJlbG93KTsKLSAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbmZvLm1GbGFncyB8PSBDaGFuZ2VJbmZvLkZMQUdfQUJPVkVfVFJBTlNJRU5UX0xBVU5DSDsKKyAgICAgICAgICAgIC8vIENvbGxlY3QgYWxsIHZpc2libGUgYWN0aXZpdGllcyB3aGljaCBjYW4gYmUgb2NjbHVkZWQgYnkgdGhlIHRyYW5zaWVudCBhY3Rpdml0eSB0bworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZXkgYXJlIGluIHRoZSBwYXJ0aWNpcGFudHMgc28gdGhlaXIgdmlzaWJpbGl0aWVzIGNhbiBiZSB1cGRhdGVkIHdoZW4KKyAgICAgICAgICAgIC8vIGZpbmlzaGluZyB0cmFuc2l0aW9uLgorICAgICAgICAgICAgKChXaW5kb3dDb250YWluZXI8Pz4pIHJlc3RvcmVCZWxvdy5nZXRQYXJlbnQoKSkuZm9yQWxsVGFza3ModCAtPiB7CisgICAgICAgICAgICAgICAgaWYgKHQuaXNWaXNpYmxlUmVxdWVzdGVkKCkgJiYgIXQuaXNBbHdheXNPblRvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdC5nZXRXaW5kb3dDb25maWd1cmF0aW9uKCkudGFza3NBcmVGbG9hdGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0LmlzUm9vdFRhc2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zaWVudEhpZGVUYXNrcy5hZGQodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNMZWFmVGFzaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmZvckFsbEFjdGl2aXRpZXMociAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuaXNWaXNpYmxlUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdChyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdCA9PSByZXN0b3JlQmVsb3c7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIC8vIEFkZCBGTEFHX0FCT1ZFX1RSQU5TSUVOVF9MQVVOQ0ggdG8gdGhlIHRyZWUgb2YgdHJhbnNpZW50LWhpZGUgdGFza3MsCisgICAgICAgICAgICAvLyBzbyBDaGFuZ2VJbmZvI2hhc0NoYW5nZWQoKSBjYW4gcmV0dXJuIHRydWUgdG8gcmVwb3J0IHRoZSB0cmFuc2l0aW9uIGluZm8uCisgICAgICAgICAgICBmb3IgKGludCBpID0gbUNoYW5nZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBXaW5kb3dDb250YWluZXI8Pz4gd2MgPSBtQ2hhbmdlcy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAod2MuYXNUYXNrRnJhZ21lbnQoKSA9PSBudWxsICYmIHdjLmFzQWN0aXZpdHlSZWNvcmQoKSA9PSBudWxsKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoaXNJblRyYW5zaWVudEhpZGUod2MpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGFuZ2VzLnZhbHVlQXQoaSkubUZsYWdzIHw9IENoYW5nZUluZm8uRkxBR19BQk9WRV9UUkFOU0lFTlRfTEFVTkNIOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBQcm90b0xvZy52KFByb3RvTG9nR3JvdXAuV01fREVCVUdfV0lORE9XX1RSQU5TSVRJT05TLCAiVHJhbnNpdGlvbiAlZDogU2V0ICVzIGFzICIKICAgICAgICAgICAgICAgICArICJ0cmFuc2llbnQtbGF1bmNoIiwgbVN5bmNJZCwgYWN0aXZpdHkpOwogICAgIH0KIAotICAgIGJvb2xlYW4gaXNUcmFuc2llbnRIaWRlKEBOb25OdWxsIFRhc2sgdGFzaykgewotICAgICAgICBpZiAobVRyYW5zaWVudExhdW5jaGVzID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVHJhbnNpZW50TGF1bmNoZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChtVHJhbnNpZW50TGF1bmNoZXMudmFsdWVBdChpKSA9PSB0YXNrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQogICAgIC8qKiBAcmV0dXJuIHdoZXRoZXIgYHdjYCBpcyBhIGRlc2NlbmRlbnQgb2YgYSB0cmFuc2llbnQtaGlkZSB3aW5kb3cuICovCiAgICAgYm9vbGVhbiBpc0luVHJhbnNpZW50SGlkZShATm9uTnVsbCBXaW5kb3dDb250YWluZXIgd2MpIHsKLSAgICAgICAgaWYgKG1UcmFuc2llbnRMYXVuY2hlcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVRyYW5zaWVudExhdW5jaGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAod2MuaXNEZXNjZW5kYW50T2YobVRyYW5zaWVudExhdW5jaGVzLnZhbHVlQXQoaSkpKSB7CisgICAgICAgIGlmIChtVHJhbnNpZW50SGlkZVRhc2tzID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1UcmFuc2llbnRIaWRlVGFza3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIGZpbmFsIFRhc2sgdGFzayA9IG1UcmFuc2llbnRIaWRlVGFza3MuZ2V0KGkpOworICAgICAgICAgICAgaWYgKHdjID09IHRhc2sgfHwgd2MuaXNEZXNjZW5kYW50T2YodGFzaykpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjc1LDcgKzY5OCw3IEBACiAgICAgICogbmVlZHMgdG8gYmUgcGFzc2VkL2FwcGxpZWQgaW4gc2hlbGwgYmVjYXVzZSB1bnRpbCBmaW5pc2ggaXMgY2FsbGVkLCBzaGVsbCBvd25zIHRoZSBzdXJmYWNlcy4KICAgICAgKiBBZGRpdGlvbmFsbHksIHRoaXMgZ2l2ZXMgc2hlbGwgdGhlIGFiaWxpdHkgdG8gYmV0dGVyIGRlYWwgd2l0aCBtZXJnZWQgdHJhbnNpdGlvbnMuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkRmluaXNoVHJhbnNhY3Rpb24oU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gdCwgU3VyZmFjZUNvbnRyb2wgcm9vdExlYXNoKSB7CisgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkRmluaXNoVHJhbnNhY3Rpb24oU3VyZmFjZUNvbnRyb2wuVHJhbnNhY3Rpb24gdCwgVHJhbnNpdGlvbkluZm8gaW5mbykgewogICAgICAgICBmaW5hbCBQb2ludCB0bXBQb3MgPSBuZXcgUG9pbnQoKTsKICAgICAgICAgLy8gdXN1YWxseSBvbmx5IHNpemUgMQogICAgICAgICBmaW5hbCBBcnJheVNldDxEaXNwbGF5Q29udGVudD4gZGlzcGxheXMgPSBuZXcgQXJyYXlTZXQ8PigpOwpAQCAtNzI4LDggKzc1MSw4IEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBtQ29udHJvbGxlci5tQnVpbGRpbmdGaW5pc2hMYXllcnMgPSBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBpZiAocm9vdExlYXNoLmlzVmFsaWQoKSkgewotICAgICAgICAgICAgdC5yZXBhcmVudChyb290TGVhc2gsIG51bGwpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZm8uZ2V0Um9vdENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgdC5yZXBhcmVudChpbmZvLmdldFJvb3QoaSkuZ2V0TGVhc2goKSwgbnVsbCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgxNCw2ICs4MzcsMTUgQEAKICAgICAgICAgaWYgKG1TdGF0ZSA8IFNUQVRFX1BMQVlJTkcpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGZpbmlzaCBhIG5vbi1wbGF5aW5nIHRyYW5zaXRpb24gIiArIG1TeW5jSWQpOwogICAgICAgICB9CisgICAgICAgIG1Db250cm9sbGVyLm1GaW5pc2hpbmdUcmFuc2l0aW9uID0gdGhpczsKKworICAgICAgICBpZiAobVRyYW5zaWVudEhpZGVUYXNrcyAhPSBudWxsICYmICFtVHJhbnNpZW50SGlkZVRhc2tzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gVGhlIHRyYW5zaWVudCBoaWRlIHRhc2tzIGNvdWxkIGJlIG9jY2x1ZGVkIG5vdywgZS5nLiByZXR1cm5pbmcgdG8gaG9tZS4gU28gdHJpZ2dlcgorICAgICAgICAgICAgLy8gdGhlIHVwZGF0ZSB0byBtYWtlIHRoZSBhY3Rpdml0aWVzIGluIHRoZSB0YXNrcyBpbnZpc2libGUtcmVxdWVzdGVkLCB0aGVuIHRoZSBuZXh0CisgICAgICAgICAgICAvLyBzdGVwIGNhbiBjb250aW51ZSB0byBjb21taXQgdGhlIHZpc2liaWxpdHkuCisgICAgICAgICAgICBtQ29udHJvbGxlci5tQXRtLm1Sb290V2luZG93Q29udGFpbmVyLmVuc3VyZUFjdGl2aXRpZXNWaXNpYmxlKG51bGwgLyogc3RhcnRpbmcgKi8sCisgICAgICAgICAgICAgICAgICAgIDAgLyogY29uZmlnQ2hhbmdlcyAqLywgdHJ1ZSAvKiBwcmVzZXJ2ZVdpbmRvd3MgKi8pOworICAgICAgICB9CiAKICAgICAgICAgYm9vbGVhbiBoYXNQYXJ0aWNpcGF0ZWREaXNwbGF5ID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gaGFzVmlzaWJsZVRyYW5zaWVudExhdW5jaCA9IGZhbHNlOwpAQCAtOTgwLDYgKzEwMTIsNyBAQAogICAgICAgICAgICAgZGMucmVtb3ZlSW1lU3VyZmFjZUltbWVkaWF0ZWx5KCk7CiAgICAgICAgICAgICBkYy5oYW5kbGVDb21wbGV0ZURlZmVycmVkUmVtb3ZhbCgpOwogICAgICAgICB9CisgICAgICAgIHZhbGlkYXRlVmlzaWJpbGl0eSgpOwogCiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOwogICAgICAgICBtQ29udHJvbGxlci5tVHJhbnNpdGlvblRyYWNlci5sb2dTdGF0ZSh0aGlzKTsKQEAgLTk5NSw2ICsxMDI4LDcgQEAKIAogICAgICAgICAvLyBIYW5kbGUgYmFjayBhbmltYXRpb24gaWYgaXQncyBhbHJlYWR5IHN0YXJ0ZWQuCiAgICAgICAgIG1Db250cm9sbGVyLm1BdG0ubUJhY2tOYXZpZ2F0aW9uQ29udHJvbGxlci5oYW5kbGVEZWZlcnJlZEJhY2tBbmltYXRpb24obVRhcmdldHMpOworICAgICAgICBtQ29udHJvbGxlci5tRmluaXNoaW5nVHJhbnNpdGlvbiA9IG51bGw7CiAgICAgfQogCiAgICAgdm9pZCBhYm9ydCgpIHsKQEAgLTEwNjYsMTMgKzExMDAsNiBAQAogICAgICAgICAgICAgU2xvZy5lKFRBRywgIlVuZXhwZWN0ZWQgU3luYyBJRCAiICsgc3luY0lkICsgIi4gRXhwZWN0ZWQgIiArIG1TeW5jSWQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtVGFyZ2V0RGlzcGxheXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtVGFyZ2V0RGlzcGxheXMuYWRkKG1Db250cm9sbGVyLm1BdG0ubVJvb3RXaW5kb3dDb250YWluZXIuZ2V0RGVmYXVsdERpc3BsYXkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gV2hpbGUgdGhlcmUgY2FuIGJlIG11bHRpcGxlIERDJ3MgaW52b2x2ZWQuIEZvciBub3csIHdlIGp1c3QgdXNlIHRoZSBmaXJzdCBvbmUgYXMKLSAgICAgICAgLy8gdGhlICJwcmltYXJ5IiBvbmUgZm9yIG1vc3QgdGhpbmdzLiBFdmVudHVhbGx5LCB0aGlzIHdpbGwgbmVlZCB0byBjaGFuZ2UsIGJ1dCwgZm9yIHRoZQotICAgICAgICAvLyB0aW1lIGJlaW5nLCB3ZSBkb24ndCBoYXZlIGZ1bGwgY3Jvc3MtZGlzcGxheSB0cmFuc2l0aW9ucyBzbyBpdCBpc24ndCBhIHByb2JsZW0uCi0gICAgICAgIGZpbmFsIERpc3BsYXlDb250ZW50IGRjID0gbVRhcmdldERpc3BsYXlzLmdldCgwKTsKIAogICAgICAgICAvLyBDb21taXQgdGhlIHZpc2liaWxpdHkgb2YgdmlzaWJsZSBhY3Rpdml0aWVzIGJlZm9yZSBjYWxjdWxhdGVUcmFuc2l0aW9uSW5mbygpLCBzbyB0aGUKICAgICAgICAgLy8gVGFza0luZm8gY2FuIGJlIHZpc2libGUuIEFsc28gaXQgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgbW92ZVRvUGxheWluZygpLCBvdGhlcndpc2UKQEAgLTEwODIsNiArMTEwOSw5IEBACiAKICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQk9SVCkgewogICAgICAgICAgICAgbUNvbnRyb2xsZXIuYWJvcnQodGhpcyk7CisgICAgICAgICAgICAvLyBGYWxsLWJhY2sgdG8gdGhlIGRlZmF1bHQgZGlzcGxheSBpZiB0aGVyZSBpc24ndCBvbmUgcGFydGljaXBhdGluZy4KKyAgICAgICAgICAgIGZpbmFsIERpc3BsYXlDb250ZW50IGRjID0gIW1UYXJnZXREaXNwbGF5cy5pc0VtcHR5KCkgPyBtVGFyZ2V0RGlzcGxheXMuZ2V0KDApCisgICAgICAgICAgICAgICAgICAgIDogbUNvbnRyb2xsZXIubUF0bS5tUm9vdFdpbmRvd0NvbnRhaW5lci5nZXREZWZhdWx0RGlzcGxheSgpOwogICAgICAgICAgICAgZGMuZ2V0UGVuZGluZ1RyYW5zYWN0aW9uKCkubWVyZ2UodHJhbnNhY3Rpb24pOwogICAgICAgICAgICAgbVN5bmNJZCA9IC0xOwogICAgICAgICAgICAgbU92ZXJyaWRlT3B0aW9ucyA9IG51bGw7CkBAIC0xMDk0LDE2ICsxMTI0LDI0IEBACiAgICAgICAgIG1GaW5pc2hUcmFuc2FjdGlvbiA9IG1Db250cm9sbGVyLm1BdG0ubVdpbmRvd01hbmFnZXIubVRyYW5zYWN0aW9uRmFjdG9yeS5nZXQoKTsKICAgICAgICAgbUNvbnRyb2xsZXIubW92ZVRvUGxheWluZyh0aGlzKTsKIAotICAgICAgICBpZiAoZGMuaXNLZXlndWFyZExvY2tlZCgpKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gVFJBTlNJVF9GTEFHX0tFWUdVQVJEX0xPQ0tFRDsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHBhcnRpY2lwYW50cyB3ZXJlIGFuaW1hdGVkIGZyb20gYmFjayBuYXZpZ2F0aW9uLgogICAgICAgICBmaW5hbCBib29sZWFuIG1hcmtCYWNrQW5pbWF0ZWQgPSBtQ29udHJvbGxlci5tQXRtLm1CYWNrTmF2aWdhdGlvbkNvbnRyb2xsZXIKICAgICAgICAgICAgICAgICAuY29udGFpbnNCYWNrQW5pbWF0aW9uVGFyZ2V0cyh0aGlzKTsKLSAgICAgICAgLy8gUmVzb2x2ZSB0aGUgYW5pbWF0aW5nIHRhcmdldHMgZnJvbSB0aGUgcGFydGljaXBhbnRzCisgICAgICAgIC8vIFJlc29sdmUgdGhlIGFuaW1hdGluZyB0YXJnZXRzIGZyb20gdGhlIHBhcnRpY2lwYW50cy4KICAgICAgICAgbVRhcmdldHMgPSBjYWxjdWxhdGVUYXJnZXRzKG1QYXJ0aWNpcGFudHMsIG1DaGFuZ2VzKTsKICAgICAgICAgZmluYWwgVHJhbnNpdGlvbkluZm8gaW5mbyA9IGNhbGN1bGF0ZVRyYW5zaXRpb25JbmZvKG1UeXBlLCBtRmxhZ3MsIG1UYXJnZXRzLCB0cmFuc2FjdGlvbik7CisKKyAgICAgICAgLy8gUmVwb3B1bGF0ZSB0aGUgZGlzcGxheXMgYmFzZWQgb24gdGhlIHJlc29sdmVkIHRhcmdldHMuCisgICAgICAgIG1UYXJnZXREaXNwbGF5cy5jbGVhcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZm8uZ2V0Um9vdENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgZmluYWwgRGlzcGxheUNvbnRlbnQgZGMgPSBtQ29udHJvbGxlci5tQXRtLm1Sb290V2luZG93Q29udGFpbmVyLmdldERpc3BsYXlDb250ZW50KAorICAgICAgICAgICAgICAgICAgICBpbmZvLmdldFJvb3QoaSkuZ2V0RGlzcGxheUlkKCkpOworICAgICAgICAgICAgbVRhcmdldERpc3BsYXlzLmFkZChkYyk7CisgICAgICAgICAgICBpZiAoZGMuaXNLZXlndWFyZExvY2tlZCgpKSB7CisgICAgICAgICAgICAgICAgbUZsYWdzIHw9IFRSQU5TSVRfRkxBR19LRVlHVUFSRF9MT0NLRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpZiAobWFya0JhY2tBbmltYXRlZCkgewogICAgICAgICAgICAgbUNvbnRyb2xsZXIubUF0bS5tQmFja05hdmlnYXRpb25Db250cm9sbGVyLmNsZWFyQmFja0FuaW1hdGlvbnMobVN0YXJ0VHJhbnNhY3Rpb24pOwogICAgICAgICB9CkBAIC0xMTI1LDkgKzExNjMsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRPRE8oYi8xODg2Njk4MjEpOiBNb3ZlIHRvIGFuaW1hdGlvbiBpbXBsIGluIHNoZWxsLgotICAgICAgICBoYW5kbGVMZWdhY3lSZWNlbnRzU3RhcnRCZWhhdmlvcihkYywgaW5mbyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVRhcmdldERpc3BsYXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBoYW5kbGVMZWdhY3lSZWNlbnRzU3RhcnRCZWhhdmlvcihtVGFyZ2V0RGlzcGxheXMuZ2V0KGkpLCBpbmZvKTsKKyAgICAgICAgICAgIGlmIChtUmVjZW50c0Rpc3BsYXlJZCAhPSBJTlZBTElEX0RJU1BMQVkpIGJyZWFrOworICAgICAgICB9CiAKLSAgICAgICAgaGFuZGxlTm9uQXBwV2luZG93c0luVHJhbnNpdGlvbihkYywgbVR5cGUsIG1GbGFncyk7CisgICAgICAgIGhhbmRsZU5vbkFwcFdpbmRvd3NJblRyYW5zaXRpb24obVR5cGUsIG1GbGFncyk7CiAKICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjdXN0b20gYWN0aXZpdHktbGV2ZWwgY2xpZW50IGFuaW1hdGlvbnMKICAgICAgICAgc2VuZFJlbW90ZUNhbGxiYWNrKG1DbGllbnRBbmltYXRpb25TdGFydENhbGxiYWNrKTsKQEAgLTExNjYsMTQgKzEyMDcsMTMgQEAKIAogICAgICAgICAvLyBSZWNvcmQgd2luZG93dG9rZW5zIChhY3Rpdml0eS93YWxscGFwZXIpIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIHZpc2libGUgYWZ0ZXIgdGhlCiAgICAgICAgIC8vIHRyYW5zaXRpb24gYW5pbWF0aW9uLiBUaGlzIHdpbGwgYmUgdXNlZCBpbiBmaW5pc2hUcmFuc2l0aW9uIHRvIHByZXZlbnQgcHJlbWF0dXJlbHkKLSAgICAgICAgLy8gY29tbWl0dGluZyB2aXNpYmlsaXR5LgotICAgICAgICBmb3IgKGludCBpID0gbVBhcnRpY2lwYW50cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgZmluYWwgV2luZG93Q29udGFpbmVyIHdjID0gbVBhcnRpY2lwYW50cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKHdjLmFzV2luZG93VG9rZW4oKSA9PSBudWxsIHx8ICF3Yy5pc1Zpc2libGVSZXF1ZXN0ZWQoKSkgY29udGludWU7Ci0gICAgICAgICAgICAvLyBkb24ndCBpbmNsdWRlIHRyYW5zaWVudCBsYXVuY2hlcywgdGhvdWdoLCBzaW5jZSB0aG9zZSBhcmUgb25seSB0ZW1wb3JhcmlseSB2aXNpYmxlLgotICAgICAgICAgICAgaWYgKG1UcmFuc2llbnRMYXVuY2hlcyAhPSBudWxsICYmIHdjLmFzQWN0aXZpdHlSZWNvcmQoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIG1UcmFuc2llbnRMYXVuY2hlcy5jb250YWluc0tleSh3Yy5hc0FjdGl2aXR5UmVjb3JkKCkpKSBjb250aW51ZTsKLSAgICAgICAgICAgIG1WaXNpYmxlQXRUcmFuc2l0aW9uRW5kVG9rZW5zLmFkZCh3Yy5hc1dpbmRvd1Rva2VuKCkpOworICAgICAgICAvLyBjb21taXR0aW5nIHZpc2liaWxpdHkuIFNraXAgdHJhbnNpZW50IGxhdW5jaGVzIHNpbmNlIHRob3NlIGFyZSBvbmx5IHRlbXBvcmFyaWx5IHZpc2libGUuCisgICAgICAgIGlmIChtVHJhbnNpZW50TGF1bmNoZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1QYXJ0aWNpcGFudHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBXaW5kb3dDb250YWluZXIgd2MgPSBtUGFydGljaXBhbnRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHdjLmFzV2luZG93VG9rZW4oKSA9PSBudWxsIHx8ICF3Yy5pc1Zpc2libGVSZXF1ZXN0ZWQoKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgbVZpc2libGVBdFRyYW5zaXRpb25FbmRUb2tlbnMuYWRkKHdjLmFzV2luZG93VG9rZW4oKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBUYWtlIHRhc2sgc25hcHNob3RzIGJlZm9yZSB0aGUgYW5pbWF0aW9uIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgSU1FIGJlZm9yZSBpdCBnZXRzCkBAIC0xMTkxLDExICsxMjMxLDE0IEBACiAKICAgICAgICAgLy8gVGhpcyBpcyBub24tbnVsbCBvbmx5IGlmIGRpc3BsYXkgaGFzIGNoYW5nZXMuIEl0IGhhbmRsZXMgdGhlIHZpc2libGUgd2luZG93cyB0aGF0IGRvbid0CiAgICAgICAgIC8vIG5lZWQgdG8gYmUgcGFydGljaXBhdGVkIGluIHRoZSB0cmFuc2l0aW9uLgotICAgICAgICBmaW5hbCBBc3luY1JvdGF0aW9uQ29udHJvbGxlciBjb250cm9sbGVyID0gZGMuZ2V0QXN5bmNSb3RhdGlvbkNvbnRyb2xsZXIoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCAmJiBjb250YWluc0NoYW5nZUZvcihkYywgbVRhcmdldHMpKSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyLnNldHVwU3RhcnRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVRhcmdldERpc3BsYXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBmaW5hbCBEaXNwbGF5Q29udGVudCBkYyA9IG1UYXJnZXREaXNwbGF5cy5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBBc3luY1JvdGF0aW9uQ29udHJvbGxlciBjb250cm9sbGVyID0gZGMuZ2V0QXN5bmNSb3RhdGlvbkNvbnRyb2xsZXIoKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwgJiYgY29udGFpbnNDaGFuZ2VGb3IoZGMsIG1UYXJnZXRzKSkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuc2V0dXBTdGFydFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBidWlsZEZpbmlzaFRyYW5zYWN0aW9uKG1GaW5pc2hUcmFuc2FjdGlvbiwgaW5mby5nZXRSb290TGVhc2goKSk7CisgICAgICAgIGJ1aWxkRmluaXNoVHJhbnNhY3Rpb24obUZpbmlzaFRyYW5zYWN0aW9uLCBpbmZvKTsKICAgICAgICAgaWYgKG1Db250cm9sbGVyLmdldFRyYW5zaXRpb25QbGF5ZXIoKSAhPSBudWxsICYmIG1Jc1BsYXllckVuYWJsZWQpIHsKICAgICAgICAgICAgIG1Db250cm9sbGVyLmRpc3BhdGNoTGVnYWN5QXBwVHJhbnNpdGlvblN0YXJ0aW5nKGluZm8sIG1TdGF0dXNCYXJUcmFuc2l0aW9uRGVsYXkpOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTEyMTYsMTAgKzEyNTksMTMgQEAKICAgICAgICAgICAgICAgICAvLyBjbGllbnQsIHdlIHNob3VsZCBmaW5pc2ggYW5kIGFwcGx5IGl0IGhlcmUgc28gdGhlIHRyYW5zYWN0aW9ucyBhcmVuJ3QgbG9zdC4KICAgICAgICAgICAgICAgICBwb3N0Q2xlYW51cE9uRmFpbHVyZSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIgYWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBkYy5tV21TZXJ2aWNlLm1BY2Nlc3NpYmlsaXR5Q29udHJvbGxlcjsKLSAgICAgICAgICAgIGlmIChhY2Nlc3NpYmlsaXR5Q29udHJvbGxlci5oYXNDYWxsYmFja3MoKSkgewotICAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlDb250cm9sbGVyLm9uV01UcmFuc2l0aW9uKGRjLmdldERpc3BsYXlJZCgpLCBtVHlwZSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1UYXJnZXREaXNwbGF5cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGZpbmFsIERpc3BsYXlDb250ZW50IGRjID0gbVRhcmdldERpc3BsYXlzLmdldChpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5Q29udHJvbGxlciBhY2Nlc3NpYmlsaXR5Q29udHJvbGxlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBkYy5tV21TZXJ2aWNlLm1BY2Nlc3NpYmlsaXR5Q29udHJvbGxlcjsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIuaGFzQ2FsbGJhY2tzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIub25XTVRyYW5zaXRpb24oZGMuZ2V0RGlzcGxheUlkKCksIG1UeXBlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBObyBwbGF5ZXIgcmVnaXN0ZXJlZCBvciBpdCdzIG5vdCBlbmFibGVkLCBzbyBqdXN0IGZpbmlzaC9hcHBseSBpbW1lZGlhdGVseQpAQCAtMTI2MSw3ICsxMzA3LDcgQEAKICAgICAgICAgaWYgKG1GaW5pc2hUcmFuc2FjdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBtRmluaXNoVHJhbnNhY3Rpb24uYXBwbHkoKTsKICAgICAgICAgfQotICAgICAgICBtQ29udHJvbGxlci5maW5pc2hUcmFuc2l0aW9uKG1Ub2tlbik7CisgICAgICAgIG1Db250cm9sbGVyLmZpbmlzaFRyYW5zaXRpb24odGhpcyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNsZWFuVXBJbnRlcm5hbCgpIHsKQEAgLTEyOTYsMTYgKzEzNDIsMTUgQEAKICAgICAgICAgaWYgKChtRmxhZ3MgJiBUUkFOU0lUX0ZMQUdfSVNfUkVDRU5UUykgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1SZWNlbnRzRGlzcGxheUlkID0gZGMubURpc3BsYXlJZDsKIAogICAgICAgICAvLyBSZWNlbnRzIGhhcyBhbiBpbnB1dC1jb25zdW1lciB0byBncmFiIGlucHV0IGZyb20gdGhlICJsaXZlIHRpbGUiIGFwcC4gU2V0IHRoYXQgdXAgaGVyZQogICAgICAgICBmaW5hbCBJbnB1dENvbnN1bWVySW1wbCByZWNlbnRzQW5pbWF0aW9uSW5wdXRDb25zdW1lciA9CiAgICAgICAgICAgICAgICAgZGMuZ2V0SW5wdXRNb25pdG9yKCkuZ2V0SW5wdXRDb25zdW1lcihJTlBVVF9DT05TVU1FUl9SRUNFTlRTX0FOSU1BVElPTik7CisgICAgICAgIEFjdGl2aXR5UmVjb3JkIHJlY2VudHNBY3Rpdml0eSA9IG51bGw7CiAgICAgICAgIGlmIChyZWNlbnRzQW5pbWF0aW9uSW5wdXRDb25zdW1lciAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBmaW5kIHRoZSB0b3AtbW9zdCBnb2luZy1hd2F5IGFjdGl2aXR5IGFuZCB0aGUgcmVjZW50cyBhY3Rpdml0eS4gVGhlIHRvcC1tb3N0CiAgICAgICAgICAgICAvLyBpcyB1c2VkIGFzIGxheWVyIHJlZmVyZW5jZSB3aGlsZSB0aGUgcmVjZW50cyBpcyB1c2VkIGZvciByZWdpc3RlcmluZyB0aGUgY29uc3VtZXIKICAgICAgICAgICAgIC8vIG92ZXJyaWRlLgotICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgcmVjZW50c0FjdGl2aXR5ID0gbnVsbDsKICAgICAgICAgICAgIEFjdGl2aXR5UmVjb3JkIHRvcEFjdGl2aXR5ID0gbnVsbDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5mby5nZXRDaGFuZ2VzKCkuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBUcmFuc2l0aW9uSW5mby5DaGFuZ2UgY2hhbmdlID0gaW5mby5nZXRDaGFuZ2VzKCkuZ2V0KGkpOwpAQCAtMTMyOSw2ICsxMzc0LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAocmVjZW50c0FjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIE5vIHJlY2VudHMgYWN0aXZpdHkgb24gYGRjYCwgaXRzIHByb2JhYmx5IG9uIGEgZGlmZmVyZW50IGRpc3BsYXkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVJlY2VudHNEaXNwbGF5SWQgPSBkYy5tRGlzcGxheUlkOworCiAgICAgICAgIC8vIFRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaGFuZGxlcyBuYXYtYmFyIHJlcGFyZW50aW5nCiAKICAgICAgICAgaWYgKCFkYy5nZXREaXNwbGF5UG9saWN5KCkuc2hvdWxkQXR0YWNoTmF2QmFyVG9BcHBEdXJpbmdUcmFuc2l0aW9uKCkKQEAgLTE0MjMsNyArMTQ3NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTm9uQXBwV2luZG93c0luVHJhbnNpdGlvbihATm9uTnVsbCBEaXNwbGF5Q29udGVudCBkYywKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlTm9uQXBwV2luZG93c0luVHJhbnNpdGlvbigKICAgICAgICAgICAgIEBUcmFuc2l0aW9uVHlwZSBpbnQgdHJhbnNpdCwgQFRyYW5zaXRpb25GbGFncyBpbnQgZmxhZ3MpIHsKICAgICAgICAgaWYgKChmbGFncyAmIFRSQU5TSVRfRkxBR19LRVlHVUFSRF9MT0NLRUQpICE9IDApIHsKICAgICAgICAgICAgIC8vIElmIHRoZSBvY2NsdXNpb24gY2hhbmdlZCBidXQgdGhlIHRyYW5zaXRpb24gaXNuJ3QgYW4gb2NjbHVkZS91bm9jY2x1ZGUgdHJhbnNpdGlvbiwKQEAgLTE4MDEsNiArMTg1Miw0MSBAQAogICAgICAgICByZXR1cm4gd2MgaW5zdGFuY2VvZiBEaXNwbGF5Q29udGVudDsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGlzcGxheUlkKEBOb25OdWxsIFdpbmRvd0NvbnRhaW5lciB3YykgeworICAgICAgICByZXR1cm4gd2MuZ2V0RGlzcGxheUNvbnRlbnQoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgPyB3Yy5nZXREaXNwbGF5Q29udGVudCgpLmdldERpc3BsYXlJZCgpIDogSU5WQUxJRF9ESVNQTEFZOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZVRyYW5zaXRpb25Sb290cyhATm9uTnVsbCBUcmFuc2l0aW9uSW5mbyBvdXRJbmZvLAorICAgICAgICAgICAgQXJyYXlMaXN0PENoYW5nZUluZm8+IHNvcnRlZFRhcmdldHMsCisgICAgICAgICAgICBATm9uTnVsbCBTdXJmYWNlQ29udHJvbC5UcmFuc2FjdGlvbiBzdGFydFQpIHsKKyAgICAgICAgLy8gVGhlcmUgbmVlZHMgdG8gYmUgYSByb290IG9uIGVhY2ggZGlzcGxheS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0ZWRUYXJnZXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBmaW5hbCBXaW5kb3dDb250YWluZXI8Pz4gd2MgPSBzb3J0ZWRUYXJnZXRzLmdldChpKS5tQ29udGFpbmVyOworICAgICAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB3YWxscGFwZXJzIHNpbmNlIHRoZXkgYXJlIGluIGEgZGlmZmVyZW50IERBLgorICAgICAgICAgICAgaWYgKGlzV2FsbHBhcGVyKHdjKSkgY29udGludWU7CisgICAgICAgICAgICBmaW5hbCBpbnQgZW5kRGlzcGxheUlkID0gZ2V0RGlzcGxheUlkKHdjKTsKKyAgICAgICAgICAgIGlmIChlbmREaXNwbGF5SWQgPCAwKSBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgUm9vdCB3YXMgYWxyZWFkeSBjcmVhdGVkIGZvciB0aGlzIGRpc3BsYXkgd2l0aCBhIGhpZ2hlci1aIHdpbmRvdworICAgICAgICAgICAgaWYgKG91dEluZm8uZmluZFJvb3RJbmRleChlbmREaXNwbGF5SWQpID49IDApIGNvbnRpbnVlOworCisgICAgICAgICAgICBXaW5kb3dDb250YWluZXI8Pz4gYW5jZXN0b3IgPSBmaW5kQ29tbW9uQW5jZXN0b3Ioc29ydGVkVGFyZ2V0cywgd2MpOworCisgICAgICAgICAgICAvLyBNYWtlIGxlYXNoIGJhc2VkIG9uIGhpZ2hlc3QgKHotb3JkZXIpIGRpcmVjdCBjaGlsZCBvZiBhbmNlc3RvciB3aXRoIGEgcGFydGljaXBhbnQuCisgICAgICAgICAgICBXaW5kb3dDb250YWluZXIgbGVhc2hSZWZlcmVuY2UgPSB3YzsKKyAgICAgICAgICAgIHdoaWxlIChsZWFzaFJlZmVyZW5jZS5nZXRQYXJlbnQoKSAhPSBhbmNlc3RvcikgeworICAgICAgICAgICAgICAgIGxlYXNoUmVmZXJlbmNlID0gbGVhc2hSZWZlcmVuY2UuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdXJmYWNlQ29udHJvbCByb290TGVhc2ggPSBsZWFzaFJlZmVyZW5jZS5tYWtlQW5pbWF0aW9uTGVhc2goKS5zZXROYW1lKAorICAgICAgICAgICAgICAgICAgICAiVHJhbnNpdGlvbiBSb290OiAiICsgbGVhc2hSZWZlcmVuY2UuZ2V0TmFtZSgpKS5idWlsZCgpOworICAgICAgICAgICAgc3RhcnRULnNldExheWVyKHJvb3RMZWFzaCwgbGVhc2hSZWZlcmVuY2UuZ2V0TGFzdExheWVyKCkpOworICAgICAgICAgICAgb3V0SW5mby5hZGRSb290TGVhc2goZW5kRGlzcGxheUlkLCByb290TGVhc2gsCisgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLmdldEJvdW5kcygpLmxlZnQsIGFuY2VzdG9yLmdldEJvdW5kcygpLnRvcCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBUcmFuc2l0aW9uSW5mbyBvYmplY3QgZnJvbSBhIHNldCBvZiB0YXJnZXRzIGFuZCBjaGFuZ2VzLiBBbHNvIHBvcHVsYXRlcyB0aGUKICAgICAgKiByb290IHN1cmZhY2UuCkBAIC0xODExLDM3ICsxODk3LDEzIEBACiAgICAgQE5vbk51bGwKICAgICBzdGF0aWMgVHJhbnNpdGlvbkluZm8gY2FsY3VsYXRlVHJhbnNpdGlvbkluZm8oQFRyYW5zaXRpb25UeXBlIGludCB0eXBlLCBpbnQgZmxhZ3MsCiAgICAgICAgICAgICBBcnJheUxpc3Q8Q2hhbmdlSW5mbz4gc29ydGVkVGFyZ2V0cywKLSAgICAgICAgICAgIEBOdWxsYWJsZSBTdXJmYWNlQ29udHJvbC5UcmFuc2FjdGlvbiBzdGFydFQpIHsKKyAgICAgICAgICAgIEBOb25OdWxsIFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uIHN0YXJ0VCkgewogICAgICAgICBmaW5hbCBUcmFuc2l0aW9uSW5mbyBvdXQgPSBuZXcgVHJhbnNpdGlvbkluZm8odHlwZSwgZmxhZ3MpOwotCi0gICAgICAgIFdpbmRvd0NvbnRhaW5lcjw/PiB0b3BBcHAgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvcnRlZFRhcmdldHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd0NvbnRhaW5lcjw/PiB3YyA9IHNvcnRlZFRhcmdldHMuZ2V0KGkpLm1Db250YWluZXI7Ci0gICAgICAgICAgICBpZiAoIWlzV2FsbHBhcGVyKHdjKSkgewotICAgICAgICAgICAgICAgIHRvcEFwcCA9IHdjOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0b3BBcHAgPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0LnNldFJvb3RMZWFzaChuZXcgU3VyZmFjZUNvbnRyb2woKSwgMCwgMCk7CisgICAgICAgIGNhbGN1bGF0ZVRyYW5zaXRpb25Sb290cyhvdXQsIHNvcnRlZFRhcmdldHMsIHN0YXJ0VCk7CisgICAgICAgIGlmIChvdXQuZ2V0Um9vdENvdW50KCkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgfQogCi0gICAgICAgIFdpbmRvd0NvbnRhaW5lcjw/PiBhbmNlc3RvciA9IGZpbmRDb21tb25BbmNlc3Rvcihzb3J0ZWRUYXJnZXRzLCB0b3BBcHApOwotCi0gICAgICAgIC8vIE1ha2UgbGVhc2ggYmFzZWQgb24gaGlnaGVzdCAoei1vcmRlcikgZGlyZWN0IGNoaWxkIG9mIGFuY2VzdG9yIHdpdGggYSBwYXJ0aWNpcGFudC4KLSAgICAgICAgLy8gVE9ETyhiLzI2MTQxODg1OSk6IEhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSB0YXJnZXQgY29udGFpbnMgd2luZG93IGNvbnRhaW5lcnMgd2hpY2gKLSAgICAgICAgLy8gYmVsb25nIHRvIGEgZGlmZmVyZW50IGRpc3BsYXkuIEFzIGEgd29ya2Fyb3VuZCB3ZSB1c2UgdG9wQXBwLCBmcm9tIHdoaWNoIHdhbGxwYXBlcgotICAgICAgICAvLyB3aW5kb3cgY29udGFpbmVyIGlzIHJlbW92ZWQsIGluc3RlYWQgb2Ygc29ydGVkVGFyZ2V0cyBoZXJlLgotICAgICAgICBXaW5kb3dDb250YWluZXIgbGVhc2hSZWZlcmVuY2UgPSB0b3BBcHA7Ci0gICAgICAgIHdoaWxlIChsZWFzaFJlZmVyZW5jZS5nZXRQYXJlbnQoKSAhPSBhbmNlc3RvcikgewotICAgICAgICAgICAgbGVhc2hSZWZlcmVuY2UgPSBsZWFzaFJlZmVyZW5jZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdXJmYWNlQ29udHJvbCByb290TGVhc2ggPSBsZWFzaFJlZmVyZW5jZS5tYWtlQW5pbWF0aW9uTGVhc2goKS5zZXROYW1lKAotICAgICAgICAgICAgICAgICJUcmFuc2l0aW9uIFJvb3Q6ICIgKyBsZWFzaFJlZmVyZW5jZS5nZXROYW1lKCkpLmJ1aWxkKCk7Ci0gICAgICAgIHN0YXJ0VC5zZXRMYXllcihyb290TGVhc2gsIGxlYXNoUmVmZXJlbmNlLmdldExhc3RMYXllcigpKTsKLSAgICAgICAgb3V0LnNldFJvb3RMZWFzaChyb290TGVhc2gsIGFuY2VzdG9yLmdldEJvdW5kcygpLmxlZnQsIGFuY2VzdG9yLmdldEJvdW5kcygpLnRvcCk7Ci0KICAgICAgICAgLy8gQ29udmVydCBhbGwgdGhlIHJlc29sdmVkIENoYW5nZUluZm9zIGludG8gVHJhbnNhY3Rpb25JbmZvLkNoYW5nZSBvYmplY3RzIGluIG9yZGVyLgogICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBzb3J0ZWRUYXJnZXRzLnNpemUoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CkBAIC0xODU5LDggKzE5MjEsMTAgQEAKICAgICAgICAgICAgICAgICBjaGFuZ2Uuc2V0TGFzdFBhcmVudChpbmZvLm1TdGFydFBhcmVudC5tUmVtb3RlVG9rZW4udG9XaW5kb3dDb250YWluZXJUb2tlbigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNoYW5nZS5zZXRNb2RlKGluZm8uZ2V0VHJhbnNpdE1vZGUodGFyZ2V0KSk7CisgICAgICAgICAgICBpbmZvLm1SZWFkeU1vZGUgPSBjaGFuZ2UuZ2V0TW9kZSgpOwogICAgICAgICAgICAgY2hhbmdlLnNldFN0YXJ0QWJzQm91bmRzKGluZm8ubUFic29sdXRlQm91bmRzKTsKICAgICAgICAgICAgIGNoYW5nZS5zZXRGbGFncyhpbmZvLmdldENoYW5nZUZsYWdzKHRhcmdldCkpOworICAgICAgICAgICAgY2hhbmdlLnNldERpc3BsYXlJZChpbmZvLm1EaXNwbGF5SWQsIGdldERpc3BsYXlJZCh0YXJnZXQpKTsKIAogICAgICAgICAgICAgZmluYWwgVGFzayB0YXNrID0gdGFyZ2V0LmFzVGFzaygpOwogICAgICAgICAgICAgZmluYWwgVGFza0ZyYWdtZW50IHRhc2tGcmFnbWVudCA9IHRhcmdldC5hc1Rhc2tGcmFnbWVudCgpOwpAQCAtMTk0Nyw2ICsyMDExLDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBUcmFuc2l0aW9uSW5mby5BbmltYXRpb25PcHRpb25zIGFuaW1PcHRpb25zID0gbnVsbDsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgdG9wLW1vc3QgYXBwIGlzIGFuIGFjdGl2aXR5IChpZS4gYWN0aXZpdHktPmFjdGl2aXR5KS4gSWYgc28sIG1ha2Ugc3VyZSB0bworICAgICAgICAvLyBob25vciBpdHMgY3VzdG9tIHRyYW5zaXRpb24gb3B0aW9ucy4KKyAgICAgICAgV2luZG93Q29udGFpbmVyPD8+IHRvcEFwcCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkVGFyZ2V0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGlzV2FsbHBhcGVyKHNvcnRlZFRhcmdldHMuZ2V0KGkpLm1Db250YWluZXIpKSBjb250aW51ZTsKKyAgICAgICAgICAgIHRvcEFwcCA9IHNvcnRlZFRhcmdldHMuZ2V0KGkpLm1Db250YWluZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBpZiAodG9wQXBwLmFzQWN0aXZpdHlSZWNvcmQoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eVJlY29yZCB0b3BBY3Rpdml0eSA9IHRvcEFwcC5hc0FjdGl2aXR5UmVjb3JkKCk7CiAgICAgICAgICAgICBhbmltT3B0aW9ucyA9IGFkZEN1c3RvbUFjdGl2aXR5VHJhbnNpdGlvbih0b3BBY3Rpdml0eSwgdHJ1ZS8qIG9wZW4gKi8sIG51bGwpOwpAQCAtMTk5NywxNCArMjA3MCwxNSBAQAogICAgIHByaXZhdGUgc3RhdGljIFdpbmRvd0NvbnRhaW5lcjw/PiBmaW5kQ29tbW9uQW5jZXN0b3IoCiAgICAgICAgICAgICBATm9uTnVsbCBBcnJheUxpc3Q8Q2hhbmdlSW5mbz4gdGFyZ2V0cywKICAgICAgICAgICAgIEBOb25OdWxsIFdpbmRvd0NvbnRhaW5lcjw/PiB0b3BBcHApIHsKKyAgICAgICAgZmluYWwgaW50IGRpc3BsYXlJZCA9IGdldERpc3BsYXlJZCh0b3BBcHApOwogICAgICAgICBXaW5kb3dDb250YWluZXI8Pz4gYW5jZXN0b3IgPSB0b3BBcHAuZ2V0UGFyZW50KCk7CiAgICAgICAgIC8vIEdvIHVwIGFuY2VzdG9yIHBhcmVudCBjaGFpbiB1bnRpbCBhbGwgdGFyZ2V0cyBhcmUgZGVzY2VuZGFudHMuIEFuY2VzdG9yIHNob3VsZCBuZXZlciBiZQogICAgICAgICAvLyBudWxsIGJlY2F1c2UgYWxsIHRhcmdldHMgYXJlIGF0dGFjaGVkLgogICAgICAgICBmb3IgKGludCBpID0gdGFyZ2V0cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgZmluYWwgQ2hhbmdlSW5mbyBjaGFuZ2UgPSB0YXJnZXRzLmdldChpKTsKICAgICAgICAgICAgIGZpbmFsIFdpbmRvd0NvbnRhaW5lciB3YyA9IGNoYW5nZS5tQ29udGFpbmVyOwotICAgICAgICAgICAgaWYgKGlzV2FsbHBhcGVyKHdjKSkgewotICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIG5vbi1hcHAgd2luZG93LgorICAgICAgICAgICAgaWYgKGlzV2FsbHBhcGVyKHdjKSB8fCBnZXREaXNwbGF5SWQod2MpICE9IGRpc3BsYXlJZCkgeworICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIG5vbi1hcHAgd2luZG93IG9yIHdpbmRvd3Mgb24gYSBkaWZmZXJlbnQgZGlzcGxheQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgd2hpbGUgKCF3Yy5pc0Rlc2NlbmRhbnRPZihhbmNlc3RvcikpIHsKQEAgLTIxMDUsNiArMjE3OSwyNiBAQAogICAgICAgICByZXR1cm4gbWFpbldpbi5nZXRBdHRycygpLnJvdGF0aW9uQW5pbWF0aW9uOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVZpc2liaWxpdHkoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBtVGFyZ2V0cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgaWYgKHJlZHVjZU1vZGUobVRhcmdldHMuZ2V0KGkpLm1SZWFkeU1vZGUpICE9IFRSQU5TSVRfQ0xPU0UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQWxsIG1vZGVzIGFyZSBDTE9TRS4gVGhlIHN1cmZhY2VzIG1heSBiZSBoaWRkZW4gYnkgdGhlIGFuaW1hdGlvbiB1bmV4cGVjdGVkbHkuCisgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgY29udGFpbmVyIHNob3VsZCBiZSB2aXNpYmxlLCB0aGVuIHJlY292ZXIgaXQuCisgICAgICAgIG1Db250cm9sbGVyLm1TdGF0ZVZhbGlkYXRvcnMuYWRkKCgpIC0+IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtVGFyZ2V0cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgIGZpbmFsIENoYW5nZUluZm8gY2hhbmdlID0gbVRhcmdldHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmICghY2hhbmdlLm1Db250YWluZXIuaXNWaXNpYmxlUmVxdWVzdGVkKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGb3JjZSBzaG93IGZvciB2aXNpYmxlICIgKyBjaGFuZ2UubUNvbnRhaW5lcgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdoaWNoIG1heSBiZSBoaWRkZW4gYnkgdHJhbnNpdGlvbiB1bmV4cGVjdGVkbHkiKTsKKyAgICAgICAgICAgICAgICBjaGFuZ2UubUNvbnRhaW5lci5nZXRTeW5jVHJhbnNhY3Rpb24oKS5zaG93KGNoYW5nZS5tQ29udGFpbmVyLm1TdXJmYWNlQ29udHJvbCk7CisgICAgICAgICAgICAgICAgY2hhbmdlLm1Db250YWluZXIuc2NoZWR1bGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCiAgICAgLyoqIEFwcGxpZXMgdGhlIG5ldyBjb25maWd1cmF0aW9uIGZvciB0aGUgY2hhbmdlZCBkaXNwbGF5cy4gKi8KICAgICB2b2lkIGFwcGx5RGlzcGxheUNoYW5nZUlmTmVlZGVkKCkgewogICAgICAgICBmb3IgKGludCBpID0gbVBhcnRpY2lwYW50cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewpAQCAtMjE4MCw2ICsyMjc0LDcgQEAKICAgICAgICAgZmluYWwgUmVjdCBtQWJzb2x1dGVCb3VuZHMgPSBuZXcgUmVjdCgpOwogICAgICAgICBib29sZWFuIG1TaG93V2FsbHBhcGVyOwogICAgICAgICBpbnQgbVJvdGF0aW9uID0gUk9UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBpbnQgbURpc3BsYXlJZCA9IC0xOwogICAgICAgICBAQWN0aXZpdHlJbmZvLkNvbmZpZyBpbnQgbUtub3duQ29uZmlnQ2hhbmdlczsKIAogICAgICAgICAvKiogVGhlc2UgYXJlIGp1c3QgZXh0cmEgaW5mby4gVGhleSBhcmVuJ3QgdXNlZCBmb3IgY2hhbmdlLWRldGVjdGlvbi4gKi8KQEAgLTIxODksNiArMjI4NCwxMCBAQAogICAgICAgICBTdXJmYWNlQ29udHJvbCBtU25hcHNob3Q7CiAgICAgICAgIGZsb2F0IG1TbmFwc2hvdEx1bWE7CiAKKyAgICAgICAgLyoqIFRoZSBtb2RlIHdoaWNoIGlzIHNldCB3aGVuIHRoZSB0cmFuc2l0aW9uIGlzIHJlYWR5LiAqLworICAgICAgICBAVHJhbnNpdGlvbkluZm8uVHJhbnNpdGlvbk1vZGUKKyAgICAgICAgaW50IG1SZWFkeU1vZGU7CisKICAgICAgICAgQ2hhbmdlSW5mbyhATm9uTnVsbCBXaW5kb3dDb250YWluZXIgb3JpZ1N0YXRlKSB7CiAgICAgICAgICAgICBtQ29udGFpbmVyID0gb3JpZ1N0YXRlOwogICAgICAgICAgICAgbVZpc2libGUgPSBvcmlnU3RhdGUuaXNWaXNpYmxlUmVxdWVzdGVkKCk7CkBAIC0yMTk3LDYgKzIyOTYsNyBAQAogICAgICAgICAgICAgbVNob3dXYWxscGFwZXIgPSBvcmlnU3RhdGUuc2hvd1dhbGxwYXBlcigpOwogICAgICAgICAgICAgbVJvdGF0aW9uID0gb3JpZ1N0YXRlLmdldFdpbmRvd0NvbmZpZ3VyYXRpb24oKS5nZXRSb3RhdGlvbigpOwogICAgICAgICAgICAgbVN0YXJ0UGFyZW50ID0gb3JpZ1N0YXRlLmdldFBhcmVudCgpOworICAgICAgICAgICAgbURpc3BsYXlJZCA9IGdldERpc3BsYXlJZChvcmlnU3RhdGUpOwogICAgICAgICB9CiAKICAgICAgICAgQFZpc2libGVGb3JUZXN0aW5nCkBAIC0yMjI4LDcgKzIzMjgsOCBAQAogICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgbm8gY2hhbmdlIGluIHdpbmRvd2luZy1tb2RlLgogICAgICAgICAgICAgICAgICAgICB8fCAobVdpbmRvd2luZ01vZGUgIT0gMCAmJiBtQ29udGFpbmVyLmdldFdpbmRvd2luZ01vZGUoKSAhPSBtV2luZG93aW5nTW9kZSkKICAgICAgICAgICAgICAgICAgICAgfHwgIW1Db250YWluZXIuZ2V0Qm91bmRzKCkuZXF1YWxzKG1BYnNvbHV0ZUJvdW5kcykKLSAgICAgICAgICAgICAgICAgICAgfHwgbVJvdGF0aW9uICE9IG1Db250YWluZXIuZ2V0V2luZG93Q29uZmlndXJhdGlvbigpLmdldFJvdGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHx8IG1Sb3RhdGlvbiAhPSBtQ29udGFpbmVyLmdldFdpbmRvd0NvbmZpZ3VyYXRpb24oKS5nZXRSb3RhdGlvbigpCisgICAgICAgICAgICAgICAgICAgIHx8IG1EaXNwbGF5SWQgIT0gZ2V0RGlzcGxheUlkKG1Db250YWluZXIpOwogICAgICAgICB9CiAKICAgICAgICAgQFRyYW5zaXRpb25JbmZvLlRyYW5zaXRpb25Nb2RlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1RyYW5zaXRpb25Db250cm9sbGVyLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1RyYW5zaXRpb25Db250cm9sbGVyLmphdmEKaW5kZXggYmFjYzZlNi4uODZiYjZiNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UcmFuc2l0aW9uQ29udHJvbGxlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVHJhbnNpdGlvbkNvbnRyb2xsZXIuamF2YQpAQCAtMTA3LDYgKzEwNyw5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8VHJhbnNpdGlvbj4gbVBsYXlpbmdUcmFuc2l0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCisgICAgLyoqIFRoZSBjdXJyZW50bHkgZmluaXNoaW5nIHRyYW5zaXRpb24uICovCisgICAgVHJhbnNpdGlvbiBtRmluaXNoaW5nVHJhbnNpdGlvbjsKKwogICAgIC8qKgogICAgICAqIFRoZSB3aW5kb3dzIHRoYXQgcmVxdWVzdCB0byBiZSBpbnZpc2libGUgd2hpbGUgaXQgaXMgaW4gdHJhbnNpdGlvbi4gQWZ0ZXIgdGhlIHRyYW5zaXRpb24KICAgICAgKiBpcyBmaW5pc2hlZCBhbmQgdGhlIHdpbmRvd3MgYXJlIG5vIGxvbmdlciBhbmltYXRpbmcsIHRoZWlyIHN1cmZhY2VzIHdpbGwgYmUgZGVzdHJveWVkLgpAQCAtMzEzLDYgKzMxNiwxMSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLyoqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBgd2NgIGlzIGEgcGFydGljaXBhbnQgb2YgdGhlIGZpbmlzaGluZyB0cmFuc2l0aW9uLiAqLworICAgIGJvb2xlYW4gaW5GaW5pc2hpbmdUcmFuc2l0aW9uKFdpbmRvd0NvbnRhaW5lcjw/PiB3YykgeworICAgICAgICByZXR1cm4gbUZpbmlzaGluZ1RyYW5zaXRpb24gIT0gbnVsbCAmJiBtRmluaXNoaW5nVHJhbnNpdGlvbi5tUGFydGljaXBhbnRzLmNvbnRhaW5zKHdjKTsKKyAgICB9CisKICAgICAvKiogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSB0cmFuc2l0aW9uIGlzIHJ1bm5pbmcgKi8KICAgICBib29sZWFuIGluVHJhbnNpdGlvbigpIHsKICAgICAgICAgLy8gVE9ETyhzaGVsbC10cmFuc2l0aW9ucyk6IGV2ZW50dWFsbHkgcHJvcGVybHkgc3VwcG9ydCBtdWx0aXBsZQpAQCAtMzU4LDExICszNjYsMTEgQEAKICAgICB9CiAKICAgICBib29sZWFuIGlzVHJhbnNpZW50SGlkZShATm9uTnVsbCBUYXNrIHRhc2spIHsKLSAgICAgICAgaWYgKG1Db2xsZWN0aW5nVHJhbnNpdGlvbiAhPSBudWxsICYmIG1Db2xsZWN0aW5nVHJhbnNpdGlvbi5pc1RyYW5zaWVudEhpZGUodGFzaykpIHsKKyAgICAgICAgaWYgKG1Db2xsZWN0aW5nVHJhbnNpdGlvbiAhPSBudWxsICYmIG1Db2xsZWN0aW5nVHJhbnNpdGlvbi5pc0luVHJhbnNpZW50SGlkZSh0YXNrKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgaSA9IG1QbGF5aW5nVHJhbnNpdGlvbnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIGlmIChtUGxheWluZ1RyYW5zaXRpb25zLmdldChpKS5pc1RyYW5zaWVudEhpZGUodGFzaykpIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG1QbGF5aW5nVHJhbnNpdGlvbnMuZ2V0KGkpLmlzSW5UcmFuc2llbnRIaWRlKHRhc2spKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNjcyLDE0ICs2ODAsMTMgQEAKICAgICB9CiAKICAgICAvKiogQHNlZSBUcmFuc2l0aW9uI2ZpbmlzaFRyYW5zaXRpb24gKi8KLSAgICB2b2lkIGZpbmlzaFRyYW5zaXRpb24oQE5vbk51bGwgSUJpbmRlciB0b2tlbikgeworICAgIHZvaWQgZmluaXNoVHJhbnNpdGlvbihUcmFuc2l0aW9uIHJlY29yZCkgewogICAgICAgICAvLyBJdCBpcyB1c3VhbGx5IGEgbm8tb3AgYnV0IG1ha2Ugc3VyZSB0aGF0IHRoZSBtZXRyaWMgY29uc3VtZXIgaXMgcmVtb3ZlZC4KLSAgICAgICAgbVRyYW5zaXRpb25NZXRyaWNzUmVwb3J0ZXIucmVwb3J0QW5pbWF0aW9uU3RhcnQodG9rZW4sIDAgLyogc3RhcnRUaW1lICovKTsKKyAgICAgICAgbVRyYW5zaXRpb25NZXRyaWNzUmVwb3J0ZXIucmVwb3J0QW5pbWF0aW9uU3RhcnQocmVjb3JkLmdldFRva2VuKCksIDAgLyogc3RhcnRUaW1lICovKTsKICAgICAgICAgLy8gSXQgaXMgYSBuby1vcCBpZiB0aGUgdHJhbnNpdGlvbiBkaWQgbm90IGNoYW5nZSB0aGUgZGlzcGxheS4KICAgICAgICAgbUF0bS5lbmRMYXVuY2hQb3dlck1vZGUoUE9XRVJfTU9ERV9SRUFTT05fQ0hBTkdFX0RJU1BMQVkpOwotICAgICAgICBmaW5hbCBUcmFuc2l0aW9uIHJlY29yZCA9IFRyYW5zaXRpb24uZnJvbUJpbmRlcih0b2tlbik7Ci0gICAgICAgIGlmIChyZWNvcmQgPT0gbnVsbCB8fCAhbVBsYXlpbmdUcmFuc2l0aW9ucy5jb250YWlucyhyZWNvcmQpKSB7Ci0gICAgICAgICAgICBTbG9nLmUoVEFHLCAiVHJ5aW5nIHRvIGZpbmlzaCBhIG5vbi1wbGF5aW5nIHRyYW5zaXRpb24gIiArIHRva2VuKTsKKyAgICAgICAgaWYgKCFtUGxheWluZ1RyYW5zaXRpb25zLmNvbnRhaW5zKHJlY29yZCkpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJUcnlpbmcgdG8gZmluaXNoIGEgbm9uLXBsYXlpbmcgdHJhbnNpdGlvbiAiICsgcmVjb3JkKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBQcm90b0xvZy52KFByb3RvTG9nR3JvdXAuV01fREVCVUdfV0lORE9XX1RSQU5TSVRJT05TLCAiRmluaXNoIFRyYW5zaXRpb246ICVzIiwgcmVjb3JkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2FsbHBhcGVyQ29udHJvbGxlci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYWxscGFwZXJDb250cm9sbGVyLmphdmEKaW5kZXggMmI4NDhkNS4uMGI5Y2VlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYWxscGFwZXJDb250cm9sbGVyLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYWxscGFwZXJDb250cm9sbGVyLmphdmEKQEAgLTE2MywxNCArMTYzLDYgQEAKICAgICAgICAgaWYgKERFQlVHX1dBTExQQVBFUikgU2xvZy52KFRBRywgIldpbiAiICsgdyArICI6IGlzT25TY3JlZW49IiArIHcuaXNPblNjcmVlbigpCiAgICAgICAgICAgICAgICAgKyAiIG1EcmF3U3RhdGU9IiArIHcubVdpbkFuaW1hdG9yLm1EcmF3U3RhdGUpOwogCi0gICAgICAgIGlmICh3Lm1XaWxsUmVwbGFjZVdpbmRvdyAmJiBtV2FsbHBhcGVyVGFyZ2V0ID09IG51bGwKLSAgICAgICAgICAgICAgICAmJiAhbUZpbmRSZXN1bHRzLnVzZVRvcFdhbGxwYXBlckFzVGFyZ2V0KSB7Ci0gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSByZXBsYWNpbmcgYSB3aW5kb3cgYW5kIHRoZXJlIHdhcyB3YWxscGFwZXIgYmVmb3JlIHJlcGxhY2VtZW50LCB3ZSB3YW50IHRvCi0gICAgICAgICAgICAvLyBrZWVwIHRoZSB3aW5kb3cgdW50aWwgdGhlIG5ldyB3aW5kb3dzIGZ1bGx5IGFwcGVhciBhbmQgY2FuIGRldGVybWluZSB0aGUgdmlzaWJpbGl0eSwKLSAgICAgICAgICAgIC8vIHRvIGF2b2lkIGZsaWNrZXJpbmcuCi0gICAgICAgICAgICBtRmluZFJlc3VsdHMuc2V0VXNlVG9wV2FsbHBhcGVyQXNUYXJnZXQodHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICBmaW5hbCBXaW5kb3dDb250YWluZXIgYW5pbWF0aW5nQ29udGFpbmVyID0gdy5tQWN0aXZpdHlSZWNvcmQgIT0gbnVsbAogICAgICAgICAgICAgICAgID8gdy5tQWN0aXZpdHlSZWNvcmQuZ2V0QW5pbWF0aW5nQ29udGFpbmVyKCkgOiBudWxsOwogICAgICAgICBmaW5hbCBib29sZWFuIGtleWd1YXJkR29pbmdBd2F5V2l0aFdhbGxwYXBlciA9IChhbmltYXRpbmdDb250YWluZXIgIT0gbnVsbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dBbmltYXRvci5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dBbmltYXRvci5qYXZhCmluZGV4IGMxMTM5MWUuLjI1OTY1MzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93QW5pbWF0b3IuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd0FuaW1hdG9yLmphdmEKQEAgLTY5LDEwICs2OSw2IEBACiAgICAgU3BhcnNlQXJyYXk8RGlzcGxheUNvbnRlbnRzQW5pbWF0b3I+IG1EaXNwbGF5Q29udGVudHNBbmltYXRvcnMgPSBuZXcgU3BhcnNlQXJyYXk8PigyKTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUluaXRpYWxpemVkID0gZmFsc2U7CiAKLSAgICAvLyBXaGVuIHNldCB0byB0cnVlIHRoZSBhbmltYXRvciB3aWxsIGdvIG92ZXIgYWxsIHdpbmRvd3MgYWZ0ZXIgYW4gYW5pbWF0aW9uIGZyYW1lIGlzIHBvc3RlZCBhbmQKLSAgICAvLyBjaGVjayBpZiBzb21lIGdvdCByZXBsYWNlZCBhbmQgY2FuIGJlIHJlbW92ZWQuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1SZW1vdmVSZXBsYWNlZFdpbmRvd3MgPSBmYWxzZTsKLQogICAgIHByaXZhdGUgQ2hvcmVvZ3JhcGhlciBtQ2hvcmVvZ3JhcGhlcjsKIAogICAgIC8qKgpAQCAtMjE3LDExICsyMTMsNiBAQAogICAgICAgICBtU2VydmljZS5jbG9zZVN1cmZhY2VUcmFuc2FjdGlvbigiV2luZG93QW5pbWF0b3IiKTsKICAgICAgICAgUHJvdG9Mb2cuaShXTV9TSE9XX1RSQU5TQUNUSU9OUywgIjw8PCBDTE9TRSBUUkFOU0FDVElPTiBhbmltYXRlIik7CiAKLSAgICAgICAgaWYgKG1SZW1vdmVSZXBsYWNlZFdpbmRvd3MpIHsKLSAgICAgICAgICAgIHJvb3QucmVtb3ZlUmVwbGFjZWRXaW5kb3dzKCk7Ci0gICAgICAgICAgICBtUmVtb3ZlUmVwbGFjZWRXaW5kb3dzID0gZmFsc2U7Ci0gICAgICAgIH0KLQogICAgICAgICBtU2VydmljZS5tQXRtU2VydmljZS5tVGFza09yZ2FuaXplckNvbnRyb2xsZXIuZGlzcGF0Y2hQZW5kaW5nRXZlbnRzKCk7CiAgICAgICAgIGV4ZWN1dGVBZnRlclByZXBhcmVTdXJmYWNlc1J1bm5hYmxlcygpOwogCkBAIC0yODYsMTAgKzI3Nyw2IEBACiAgICAgICAgIHJldHVybiBkaXNwbGF5QW5pbWF0b3I7CiAgICAgfQogCi0gICAgdm9pZCByZXF1ZXN0UmVtb3ZhbE9mUmVwbGFjZWRXaW5kb3dzKFdpbmRvd1N0YXRlIHdpbikgewotICAgICAgICBtUmVtb3ZlUmVwbGFjZWRXaW5kb3dzID0gdHJ1ZTsKLSAgICB9Ci0KICAgICB2b2lkIHNjaGVkdWxlQW5pbWF0aW9uKCkgewogICAgICAgICBpZiAoIW1BbmltYXRpb25GcmFtZUNhbGxiYWNrU2NoZWR1bGVkKSB7CiAgICAgICAgICAgICBtQW5pbWF0aW9uRnJhbWVDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJJbnRlcm5hbC5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VySW50ZXJuYWwuamF2YQppbmRleCAyZjNhNzBlLi45NjlhZmU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJJbnRlcm5hbC5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlckludGVybmFsLmphdmEKQEAgLTc0MCw3ICs3NDAsNyBAQAogICAgIC8qKgogICAgICAqIFNob3cgSU1FIG9uIGltZVRhcmdldFdpbmRvdyBvbmNlIElNRSBoYXMgZmluaXNoZWQgbGF5b3V0LgogICAgICAqCi0gICAgICogQHBhcmFtIGltZVRhcmdldFdpbmRvd1Rva2VuIHRva2VuIG9mIHRoZSAoSU1FIHRhcmdldCkgd2luZG93IG9uIHdoaWNoIElNRSBzaG91bGQgYmUgc2hvd24uCisgICAgICogQHBhcmFtIGltZVRhcmdldFdpbmRvd1Rva2VuIHRva2VuIG9mIHRoZSAoSU1FIHRhcmdldCkgd2luZG93IHdoaWNoIElNRSBzaG91bGQgYmUgc2hvd24uCiAgICAgICogQHBhcmFtIHN0YXRzVG9rZW4gdGhlIHRva2VuIHRyYWNraW5nIHRoZSBjdXJyZW50IElNRSBzaG93IHJlcXVlc3Qgb3Ige0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzaG93SW1lUG9zdExheW91dChJQmluZGVyIGltZVRhcmdldFdpbmRvd1Rva2VuLApAQCAtNzQ5LDcgKzc0OSw3IEBACiAgICAgLyoqCiAgICAgICogSGlkZSBJTUUgdXNpbmcgaW1lVGFyZ2V0V2luZG93IHdoZW4gcmVxdWVzdGVkLgogICAgICAqCi0gICAgICogQHBhcmFtIGltZVRhcmdldFdpbmRvd1Rva2VuIHRva2VuIG9mIHRoZSAoSU1FIHRhcmdldCkgd2luZG93IG9uIHdoaWNoIElNRSBzaG91bGQgYmUgaGlkZGVuLgorICAgICAqIEBwYXJhbSBpbWVUYXJnZXRXaW5kb3dUb2tlbiB0b2tlbiBvZiB0aGUgKElNRSB0YXJnZXQpIHdpbmRvdyBvbiB3aGljaCByZXF1ZXN0cyBoaWRpbmcgSU1FLgogICAgICAqIEBwYXJhbSBkaXNwbGF5SWQgdGhlIGlkIG9mIHRoZSBkaXNwbGF5IHRoZSBJTUUgaXMgb24uCiAgICAgICogQHBhcmFtIHN0YXRzVG9rZW4gdGhlIHRva2VuIHRyYWNraW5nIHRoZSBjdXJyZW50IElNRSBoaWRlIHJlcXVlc3Qgb3Ige0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0NWNkYWNkLi5iZTQyZjM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC04OCw3ICs4OCw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1dBTExQQVBFUjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuUkVNT1ZFX0NPTlRFTlRfTU9ERV9VTkRFRklORUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLlRSQU5TSVRfTk9ORTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuVFJBTlNJVF9SRUxBVU5DSDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuVFJBTlNJVF9UT19GUk9OVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuZml4U2NhbGU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyR2xvYmFsLkFERF9PS0FZOwpAQCAtMTg2LDcgKzE4NSw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb25maWdzdG9yZS5WMV8wLk9wdGlvbmFsQm9vbDsKQEAgLTM4Myw5ICszODEsNiBAQAogICAgIC8qKiBBbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0byBkZWxheSBiZWZvcmUgZGVjbGFyaW5nIGEgd2luZG93IGZyZWV6ZSB0aW1lb3V0LiAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX0ZSRUVaRV9USU1FT1VUX0RVUkFUSU9OID0gMjAwMDsKIAotICAgIC8qKiBBbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0byBkZWxheSBiZWZvcmUgZGVjbGFyaW5nIGEgd2luZG93IHJlcGxhY2VtZW50IHRpbWVvdXQuICovCi0gICAgc3RhdGljIGZpbmFsIGludCBXSU5ET1dfUkVQTEFDRU1FTlRfVElNRU9VVF9EVVJBVElPTiA9IDIwMDA7Ci0KICAgICAvKiogQW1vdW50IG9mIHRpbWUgdG8gYWxsb3cgYSBsYXN0IEFOUiBtZXNzYWdlIHRvIGV4aXN0IGJlZm9yZSBmcmVlaW5nIHRoZSBtZW1vcnkuICovCiAgICAgc3RhdGljIGZpbmFsIGludCBMQVNUX0FOUl9MSUZFVElNRV9EVVJBVElPTl9NU0VDUyA9IDIgKiA2MCAqIDYwICogMTAwMDsgLy8gVHdvIGhvdXJzCiAKQEAgLTU2NiwxMiArNTYxLDYgQEAKICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyR2xvYmFsTG9jayBtR2xvYmFsTG9jazsKIAogICAgIC8qKgotICAgICAqIExpc3Qgb2YgYXBwIHdpbmRvdyB0b2tlbnMgdGhhdCBhcmUgd2FpdGluZyBmb3IgcmVwbGFjaW5nIHdpbmRvd3MuIElmIHRoZQotICAgICAqIHJlcGxhY2VtZW50IGRvZXNuJ3QgY29tZSBpbiB0aW1lIHRoZSBzdGFsZSB3aW5kb3dzIG5lZWRzIHRvIGJlIGRpc3Bvc2VkIG9mLgotICAgICAqLwotICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpdml0eVJlY29yZD4gbVdpbmRvd1JlcGxhY2VtZW50VGltZW91dHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIC8qKgogICAgICAqIFdpbmRvd3MgdGhhdCBhcmUgYmVpbmcgcmVzaXplZC4gIFVzZWQgc28gd2UgY2FuIHRlbGwgdGhlIGNsaWVudCBhYm91dAogICAgICAqIHRoZSByZXNpemUgYWZ0ZXIgY2xvc2luZyB0aGUgdHJhbnNhY3Rpb24gaW4gd2hpY2ggd2UgcmVzaXplZCB0aGUKICAgICAgKiB1bmRlcmx5aW5nIHN1cmZhY2UuCkBAIC0xNzc1LDE1ICsxNzY0LDYgQEAKICAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YXRlQW5pbWF0b3Igd2luQW5pbWF0b3IgPSB3aW4ubVdpbkFuaW1hdG9yOwogICAgICAgICAgICAgd2luQW5pbWF0b3IubUVudGVyQW5pbWF0aW9uUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICB3aW5BbmltYXRvci5tRW50ZXJpbmdBbmltYXRpb24gPSB0cnVlOwotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBwcmVwYXJlIGEgdHJhbnNpdGlvbiBmb3IgcmVwbGFjaW5nIHdpbmRvdyBmaXJzdC4KLSAgICAgICAgICAgIGlmICghd2luLm1UcmFuc2l0aW9uQ29udHJvbGxlci5pc1NoZWxsVHJhbnNpdGlvbnNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgYWN0aXZpdHkgIT0gbnVsbCAmJiBhY3Rpdml0eS5pc1Zpc2libGUoKQotICAgICAgICAgICAgICAgICAgICAmJiAhcHJlcGFyZVdpbmRvd1JlcGxhY2VtZW50VHJhbnNpdGlvbihhY3Rpdml0eSkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBub3QsIGNoZWNrIGlmIG5lZWQgdG8gc2V0IHVwIGEgZHVtbXkgdHJhbnNpdGlvbiBkdXJpbmcgZGlzcGxheSBmcmVlemUKLSAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSB1bmZyZWV6ZSB3YWl0IGZvciB0aGUgYXBwcyB0byBkcmF3LiBUaGlzIG1pZ2h0IGJlIG5lZWRlZCBpZgotICAgICAgICAgICAgICAgIC8vIHRoZSBhcHAgaXMgcmVsYXVuY2hpbmcuCi0gICAgICAgICAgICAgICAgcHJlcGFyZU5vbmVUcmFuc2l0aW9uRm9yUmVsYXVuY2hpbmcoYWN0aXZpdHkpOwotICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZGlzcGxheVBvbGljeS5hcmVTeXN0ZW1CYXJzRm9yY2VkQ29uc3VtZWRMdygpKSB7CiAgICAgICAgICAgICAgICAgcmVzIHw9IFdpbmRvd01hbmFnZXJHbG9iYWwuQUREX0ZMQUdfQUxXQVlTX0NPTlNVTUVfU1lTVEVNX0JBUlM7CkBAIC0xOTQ1LDQ4ICsxOTI1LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgd2UncmUgZG9uZSBzZXR0aW5nIHVwIGFueSB0cmFuc2l0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcHJlcGFyZVdpbmRvd1JlcGxhY2VtZW50VHJhbnNpdGlvbihBY3Rpdml0eVJlY29yZCBhY3Rpdml0eSkgewotICAgICAgICBhY3Rpdml0eS5jbGVhckFsbERyYXduKCk7Ci0gICAgICAgIGZpbmFsIFdpbmRvd1N0YXRlIHJlcGxhY2VkV2luZG93ID0gYWN0aXZpdHkuZ2V0UmVwbGFjaW5nV2luZG93KCk7Ci0gICAgICAgIGlmIChyZXBsYWNlZFdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBXZSBleHBlY3QgdG8gYWxyZWFkeSByZWNlaXZlIGEgcmVxdWVzdCB0byByZW1vdmUgdGhlIG9sZCB3aW5kb3cuIElmIGl0IGRpZCBub3QKLSAgICAgICAgICAgIC8vIGhhcHBlbiwgbGV0J3MganVzdCBzaW1wbHkgYWRkIGEgd2luZG93LgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFdlIHVzZSB0aGUgdmlzaWJsZSBmcmFtZSwgYmVjYXVzZSB3ZSB3YW50IHRoZSBhbmltYXRpb24gdG8gbW9ycGggdGhlIHdpbmRvdyBmcm9tIHdoYXQKLSAgICAgICAgLy8gd2FzIHZpc2libGUgdG8gdGhlIHVzZXIgdG8gdGhlIGZpbmFsIGRlc3RpbmF0aW9uIG9mIHRoZSBuZXcgd2luZG93LgotICAgICAgICBmaW5hbCBSZWN0IGZyYW1lID0gbmV3IFJlY3QocmVwbGFjZWRXaW5kb3cuZ2V0RnJhbWUoKSk7Ci0gICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzID0gcmVwbGFjZWRXaW5kb3cubUF0dHJzOwotICAgICAgICBmcmFtZS5pbnNldChyZXBsYWNlZFdpbmRvdy5nZXRJbnNldHNTdGF0ZVdpdGhWaXNpYmlsaXR5T3ZlcnJpZGUoKS5jYWxjdWxhdGVWaXNpYmxlSW5zZXRzKAotICAgICAgICAgICAgICAgIGZyYW1lLCBhdHRycy50eXBlLCByZXBsYWNlZFdpbmRvdy5nZXRXaW5kb3dpbmdNb2RlKCksIGF0dHJzLnNvZnRJbnB1dE1vZGUsCi0gICAgICAgICAgICAgICAgYXR0cnMuZmxhZ3MpKTsKLSAgICAgICAgLy8gV2UgdHJlYXQgdGhpcyBhcyBpZiB0aGlzIGFjdGl2aXR5IHdhcyBvcGVuaW5nLCBzbyB3ZSBjYW4gdHJpZ2dlciB0aGUgYXBwIHRyYW5zaXRpb24KLSAgICAgICAgLy8gYW5pbWF0aW9uIGFuZCBwaWdneS1iYWNrIG9uIGV4aXN0aW5nIHRyYW5zaXRpb24gYW5pbWF0aW9uIGluZnJhc3RydWN0dXJlLgotICAgICAgICBmaW5hbCBEaXNwbGF5Q29udGVudCBkYyA9IGFjdGl2aXR5LmdldERpc3BsYXlDb250ZW50KCk7Ci0gICAgICAgIGRjLm1PcGVuaW5nQXBwcy5hZGQoYWN0aXZpdHkpOwotICAgICAgICBkYy5wcmVwYXJlQXBwVHJhbnNpdGlvbihUUkFOU0lUX1JFTEFVTkNIKTsKLSAgICAgICAgZGMubUFwcFRyYW5zaXRpb24ub3ZlcnJpZGVQZW5kaW5nQXBwVHJhbnNpdGlvbkNsaXBSZXZlYWwoZnJhbWUubGVmdCwgZnJhbWUudG9wLAotICAgICAgICAgICAgICAgIGZyYW1lLndpZHRoKCksIGZyYW1lLmhlaWdodCgpKTsKLSAgICAgICAgZGMuZXhlY3V0ZUFwcFRyYW5zaXRpb24oKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVOb25lVHJhbnNpdGlvbkZvclJlbGF1bmNoaW5nKEFjdGl2aXR5UmVjb3JkIGFjdGl2aXR5KSB7Ci0gICAgICAgIC8vIFNldCB1cCBhIG5vbmUtdHJhbnNpdGlvbiBhbmQgYWRkIHRoZSBhcHAgdG8gb3BlbmluZyBhcHBzLCBzbyB0aGF0IHRoZSBkaXNwbGF5Ci0gICAgICAgIC8vIHVuZnJlZXplIHdhaXQgZm9yIHRoZSBhcHBzIHRvIGJlIGRyYXduLgotICAgICAgICAvLyBOb3RlIHRoYXQgaWYgdGhlIGRpc3BsYXkgdW5mcm96ZSBhbHJlYWR5IGJlY2F1c2UgYXBwIHVuZnJlZXplIHRpbWVkIG91dCwKLSAgICAgICAgLy8gd2UgZG9uJ3Qgc2V0IHVwIHRoZSB0cmFuc2l0aW9uIGFueW1vcmUgYW5kIGp1c3QgbGV0IGl0IGdvLgotICAgICAgICBmaW5hbCBEaXNwbGF5Q29udGVudCBkYyA9IGFjdGl2aXR5LmdldERpc3BsYXlDb250ZW50KCk7Ci0gICAgICAgIGlmIChtRGlzcGxheUZyb3plbiAmJiAhZGMubU9wZW5pbmdBcHBzLmNvbnRhaW5zKGFjdGl2aXR5KSAmJiBhY3Rpdml0eS5pc1JlbGF1bmNoaW5nKCkpIHsKLSAgICAgICAgICAgIGRjLm1PcGVuaW5nQXBwcy5hZGQoYWN0aXZpdHkpOwotICAgICAgICAgICAgZGMucHJlcGFyZUFwcFRyYW5zaXRpb24oVFJBTlNJVF9OT05FKTsKLSAgICAgICAgICAgIGRjLmV4ZWN1dGVBcHBUcmFuc2l0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBTZXQgd2hldGhlciBzY3JlZW4gY2FwdHVyZSBpcyBkaXNhYmxlZCBmb3IgYWxsIHdpbmRvd3Mgb2YgYSBzcGVjaWZpYyB1c2VyIGZyb20KICAgICAgKiB0aGUgZGV2aWNlIHBvbGljeSBjYWNoZS4KICAgICAgKi8KQEAgLTIzOTEsMTIgKzIzMjksNiBAQAogCiAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGN1cnJlbnRseSBydW5uaW5nIHRoZSBleGl0IGFuaW1hdGlvbiwgd2UgbmVlZCB0byBzZWUgYWJvdXQgc3RhcnRpbmcKICAgICAgICAgICAgIC8vIG9uZS4KLSAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gYW5pbWF0ZSB2aXNpYmlsaXR5IG9mIHdpbmRvd3Mgd2hpY2ggYXJlIHBlbmRpbmcgcmVwbGFjZW1lbnQuCi0gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiBhY3Rpdml0eSByZWxhdW5jaCBjaGlsZCB3aW5kb3dzIGNvdWxkIHJlcXVlc3QgdmlzaWJpbGl0eSBjaGFuZ2VzIGFzCi0gICAgICAgICAgICAvLyB0aGV5IGFyZSBkZXRhY2hlZCBmcm9tIHRoZSBtYWluIGFwcGxpY2F0aW9uIHdpbmRvdyBkdXJpbmcgdGhlIHRlYXIgZG93biBwcm9jZXNzLgotICAgICAgICAgICAgLy8gSWYgd2Ugc2F0aXNmaWVkIHRoZXNlIHZpc2liaWxpdHkgY2hhbmdlcyB0aG91Z2gsIHdlIHdvdWxkIGNhdXNlIGEgdmlzdWFsIGdsaXRjaAotICAgICAgICAgICAgLy8gaGlkaW5nIHRoZSB3aW5kb3cgYmVmb3JlIGl0J3MgcmVwbGFjZW1lbnQgd2FzIGF2YWlsYWJsZS4gU28gd2UganVzdCBkbyBub3RoaW5nIG9uCi0gICAgICAgICAgICAvLyBvdXIgc2lkZS4KICAgICAgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsIHRvIHBlcmZvcm1TdXJmYWNlUGxhY2VtZW50LgogICAgICAgICAgICAgaWYgKCFzaG91bGRSZWxheW91dCAmJiB3aW5BbmltYXRvci5oYXNTdXJmYWNlKCkgJiYgIXdpbi5tQW5pbWF0aW5nRXhpdCkgewogICAgICAgICAgICAgICAgIGlmIChERUJVR19WSVNJQklMSVRZKSB7CkBAIC0yNDA0LDIwICsyMzM2LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbGF5b3V0IGludmlzICIgKyB3aW4gKyAiOiBtQW5pbWF0aW5nRXhpdD0iICsgd2luLm1BbmltYXRpbmdFeGl0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFJFTEFZT1VUX1JFU19TVVJGQUNFX0NIQU5HRUQ7Ci0gICAgICAgICAgICAgICAgaWYgKCF3aW4ubVdpbGxSZXBsYWNlV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gRkxBR19TSE9XX1dBTExQQVBFUiBmbGFnIGlzIHJlbW92ZWQgZnJvbSBhIHdpbmRvdywgd2UgdXN1YWxseSBzZXQgYSBmbGFnCi0gICAgICAgICAgICAgICAgICAgIC8vIGluIERDI3BlbmRpbmdMYXlvdXRDaGFuZ2VzIGFuZCB1cGRhdGUgdGhlIHdhbGxwYXBlciB0YXJnZXQgbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIgaXQncyBwb3NzaWJsZSB0aGF0IEZMQUdfU0hPV19XQUxMUEFQRVIgZmxhZyBpcyByZW1vdmVkIGZyb20gYSB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgd2luZG93IGlzIGFib3V0IHRvIGV4aXQsIHNvIHdlIHVwZGF0ZSB0aGUgd2FsbHBhcGVyIHRhcmdldAotICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBoZXJlLiBPdGhlcndpc2UgdGhpcyB3aW5kb3cgd2lsbCBiZSBzdHVjayBpbiBleGl0aW5nIGFuZCBpdHMKLSAgICAgICAgICAgICAgICAgICAgLy8gc3VyZmFjZSByZW1haW5zIG9uIHRoZSBzY3JlZW4uCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xODk4NTY3MTYpOiBBbGxvdyBkZXN0cm95aW5nIHN1cmZhY2UgZXZlbiBpZiBpdCBiZWxvbmdzIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyAga2V5Z3VhcmQgdGFyZ2V0LgotICAgICAgICAgICAgICAgICAgICBpZiAod2FsbHBhcGVyTWF5TW92ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUNvbnRlbnQubVdhbGxwYXBlckNvbnRyb2xsZXIuYWRqdXN0V2FsbHBhcGVyV2luZG93cygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRyeVN0YXJ0RXhpdGluZ0FuaW1hdGlvbih3aW4sIHdpbkFuaW1hdG9yKTsKKyAgICAgICAgICAgICAgICAvLyBXaGVuIEZMQUdfU0hPV19XQUxMUEFQRVIgZmxhZyBpcyByZW1vdmVkIGZyb20gYSB3aW5kb3csIHdlIHVzdWFsbHkgc2V0IGEgZmxhZworICAgICAgICAgICAgICAgIC8vIGluIERDI3BlbmRpbmdMYXlvdXRDaGFuZ2VzIGFuZCB1cGRhdGUgdGhlIHdhbGxwYXBlciB0YXJnZXQgbGF0ZXIuCisgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBpdCdzIHBvc3NpYmxlIHRoYXQgRkxBR19TSE9XX1dBTExQQVBFUiBmbGFnIGlzIHJlbW92ZWQgZnJvbSBhIHdpbmRvdworICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHdpbmRvdyBpcyBhYm91dCB0byBleGl0LCBzbyB3ZSB1cGRhdGUgdGhlIHdhbGxwYXBlciB0YXJnZXQKKyAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBoZXJlLiBPdGhlcndpc2UgdGhpcyB3aW5kb3cgd2lsbCBiZSBzdHVjayBpbiBleGl0aW5nIGFuZCBpdHMKKyAgICAgICAgICAgICAgICAvLyBzdXJmYWNlIHJlbWFpbnMgb24gdGhlIHNjcmVlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTg5ODU2NzE2KTogQWxsb3cgZGVzdHJveWluZyBzdXJmYWNlIGV2ZW4gaWYgaXQgYmVsb25ncyB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyAga2V5Z3VhcmQgdGFyZ2V0LgorICAgICAgICAgICAgICAgIGlmICh3YWxscGFwZXJNYXlNb3ZlKSB7CisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlDb250ZW50Lm1XYWxscGFwZXJDb250cm9sbGVyLmFkanVzdFdhbGxwYXBlcldpbmRvd3MoKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5U3RhcnRFeGl0aW5nQW5pbWF0aW9uKHdpbiwgd2luQW5pbWF0b3IpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBDcmVhdGUgc3VyZmFjZUNvbnRyb2wgYmVmb3JlIHN1cmZhY2UgcGxhY2VtZW50IG90aGVyd2lzZSBsYXlvdXQgd2lsbCBiZSBza2lwcGVkCkBAIC01MzI5LDggKzUyNTksNiBAQAogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURV9NVUxUSV9XSU5ET1dfU1RBQ0tTID0gNDE7CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX1JFUExBQ0VNRU5UX1RJTUVPVVQgPSA0NjsKLQogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfQU5JTUFUSU9OX1NDQUxFID0gNTE7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJTkRPV19ISURFX1RJTUVPVVQgPSA1MjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVE9SRV9QT0lOVEVSX0lDT04gPSA1NTsKQEAgLTU1NTYsMTYgKzU0ODQsNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFdJTkRPV19SRVBMQUNFTUVOVF9USU1FT1VUOiB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUdsb2JhbExvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtV2luZG93UmVwbGFjZW1lbnRUaW1lb3V0cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5UmVjb3JkIGFjdGl2aXR5ID0gbVdpbmRvd1JlcGxhY2VtZW50VGltZW91dHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5Lm9uV2luZG93UmVwbGFjZW1lbnRUaW1lb3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2luZG93UmVwbGFjZW1lbnRUaW1lb3V0cy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIFdJTkRPV19ISURFX1RJTUVPVVQ6IHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgV2luZG93U3RhdGUgd2luZG93ID0gKFdpbmRvd1N0YXRlKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1HbG9iYWxMb2NrKSB7CkBAIC03MDg0LDk4ICs3MDAyLDYgQEAKICAgICAgICAgcmV0dXJuIG1HbG9iYWxMb2NrOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEhpbnQgdG8gYSB0b2tlbiB0aGF0IGl0cyBhY3Rpdml0eSB3aWxsIHJlbGF1bmNoLCB3aGljaCB3aWxsIHRyaWdnZXIgcmVtb3ZhbCBhbmQgYWRkaXRpb24gb2YKLSAgICAgKiBhIHdpbmRvdy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0b2tlbiBBcHBsaWNhdGlvbiB0b2tlbiBmb3Igd2hpY2ggdGhlIGFjdGl2aXR5IHdpbGwgYmUgcmVsYXVuY2hlZC4KLSAgICAgKi8KLSAgICB2b2lkIHNldFdpbGxSZXBsYWNlV2luZG93KElCaW5kZXIgdG9rZW4sIGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBmaW5hbCBBY3Rpdml0eVJlY29yZCBhY3Rpdml0eSA9IG1Sb290LmdldEFjdGl2aXR5UmVjb3JkKHRva2VuKTsKLSAgICAgICAgaWYgKGFjdGl2aXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIFByb3RvTG9nLncoV01fRVJST1IsICJBdHRlbXB0ZWQgdG8gc2V0IHJlcGxhY2luZyB3aW5kb3cgb24gbm9uLWV4aXN0aW5nIGFwcCB0b2tlbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHRva2VuKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWFjdGl2aXR5Lmhhc0NvbnRlbnRUb0Rpc3BsYXkoKSkgewotICAgICAgICAgICAgUHJvdG9Mb2cudyhXTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBzZXQgcmVwbGFjaW5nIHdpbmRvdyBvbiBhcHAgdG9rZW4gd2l0aCBubyBjb250ZW50ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW4pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGFjdGl2aXR5LnNldFdpbGxSZXBsYWNlV2luZG93cyhhbmltYXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIaW50IHRvIGEgdG9rZW4gdGhhdCBpdHMgd2luZG93cyB3aWxsIGJlIHJlcGxhY2VkIGFjcm9zcyBhY3Rpdml0eSByZWxhdW5jaC4KLSAgICAgKiBUaGUgd2luZG93cyB3b3VsZCBvdGhlcndpc2UgYmUgcmVtb3ZlZCAgc2hvcnRseSBmb2xsb3dpbmcgdGhpcyBhcyB0aGUKLSAgICAgKiBhY3Rpdml0eSBpcyB0b3JuIGRvd24uCi0gICAgICogQHBhcmFtIHRva2VuIEFwcGxpY2F0aW9uIHRva2VuIGZvciB3aGljaCB0aGUgYWN0aXZpdHkgd2lsbCBiZSByZWxhdW5jaGVkLgotICAgICAqIEBwYXJhbSBjaGlsZHJlbk9ubHkgV2hldGhlciB0byBtYXJrIG9ubHkgY2hpbGQgd2luZG93cyBmb3IgcmVwbGFjZW1lbnQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIChmb3IgdGhlIGNhc2Ugd2hlcmUgbWFpbiB3aW5kb3dzIGFyZSBiZWluZyBwcmVzZXJ2ZWQvCi0gICAgICogICAgICAgICAgICAgICAgICAgICByZXVzZWQgcmF0aGVyIHRoYW4gcmVwbGFjZWQpLgotICAgICAqCi0gICAgICovCi0gICAgLy8gVE9ETzogVGhlIHMgYXQgdGhlIGVuZCBvZiB0aGUgbWV0aG9kIG5hbWUgaXMgdGhlIG9ubHkgZGlmZmVyZW5jZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKLSAgICAvLyBhYm92ZS4gV2Ugc2hvdWxkIGNvbWJpbmUgdGhlbSBvciBmaW5kIGJldHRlciBuYW1lcy4KLSAgICB2b2lkIHNldFdpbGxSZXBsYWNlV2luZG93cyhJQmluZGVyIHRva2VuLCBib29sZWFuIGNoaWxkcmVuT25seSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1HbG9iYWxMb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBBY3Rpdml0eVJlY29yZCBhY3Rpdml0eSA9IG1Sb290LmdldEFjdGl2aXR5UmVjb3JkKHRva2VuKTsKLSAgICAgICAgICAgIGlmIChhY3Rpdml0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUHJvdG9Mb2cudyhXTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gc2V0IHJlcGxhY2luZyB3aW5kb3cgb24gbm9uLWV4aXN0aW5nIGFwcCB0b2tlbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhY3Rpdml0eS5oYXNDb250ZW50VG9EaXNwbGF5KCkpIHsKLSAgICAgICAgICAgICAgICBQcm90b0xvZy53KFdNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBzZXQgcmVwbGFjaW5nIHdpbmRvdyBvbiBhcHAgdG9rZW4gd2l0aCBubyBjb250ZW50ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaGlsZHJlbk9ubHkpIHsKLSAgICAgICAgICAgICAgICBhY3Rpdml0eS5zZXRXaWxsUmVwbGFjZUNoaWxkV2luZG93cygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhY3Rpdml0eS5zZXRXaWxsUmVwbGFjZVdpbmRvd3MoZmFsc2UgLyogYW5pbWF0ZSAqLyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNjaGVkdWxlQ2xlYXJXaWxsUmVwbGFjZVdpbmRvd3ModG9rZW4sIHRydWUgLyogcmVwbGFjaW5nICovKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHdlJ3JlIHJlcGxhY2luZyB0aGUgd2luZG93LCBzY2hlZHVsZSBhIHRpbWVyIHRvIGNsZWFyIHRoZSByZXBsYWNlZCB3aW5kb3cKLSAgICAgKiBhZnRlciBhIHRpbWVvdXQsIGluIGNhc2UgdGhlIHJlcGxhY2luZyB3aW5kb3cgaXMgbm90IGNvbWluZy4KLSAgICAgKgotICAgICAqIElmIHdlJ3JlIG5vdCByZXBsYWNpbmcgdGhlIHdpbmRvdywgY2xlYXIgdGhlIHJlcGxhY2Ugd2luZG93IHNldHRpbmdzIG9mIHRoZSBhcHAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdG9rZW4gICAgIEFwcGxpY2F0aW9uIHRva2VuIGZvciB0aGUgYWN0aXZpdHkgd2hvc2Ugd2luZG93IG1pZ2h0IGJlIHJlcGxhY2VkLgotICAgICAqIEBwYXJhbSByZXBsYWNpbmcgV2hldGhlciB0aGUgd2luZG93IGlzIGJlaW5nIHJlcGxhY2VkIG9yIG5vdC4KLSAgICAgKi8KLSAgICB2b2lkIHNjaGVkdWxlQ2xlYXJXaWxsUmVwbGFjZVdpbmRvd3MoSUJpbmRlciB0b2tlbiwgYm9vbGVhbiByZXBsYWNpbmcpIHsKLSAgICAgICAgZmluYWwgQWN0aXZpdHlSZWNvcmQgYWN0aXZpdHkgPSBtUm9vdC5nZXRBY3Rpdml0eVJlY29yZCh0b2tlbik7Ci0gICAgICAgIGlmIChhY3Rpdml0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBQcm90b0xvZy53KFdNX0VSUk9SLCAiQXR0ZW1wdGVkIHRvIHJlc2V0IHJlcGxhY2luZyB3aW5kb3cgb24gbm9uLWV4aXN0aW5nIGFwcCB0b2tlbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHRva2VuKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVwbGFjaW5nKSB7Ci0gICAgICAgICAgICBzY2hlZHVsZVdpbmRvd1JlcGxhY2VtZW50VGltZW91dHMoYWN0aXZpdHkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWN0aXZpdHkuY2xlYXJXaWxsUmVwbGFjZVdpbmRvd3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2NoZWR1bGVXaW5kb3dSZXBsYWNlbWVudFRpbWVvdXRzKEFjdGl2aXR5UmVjb3JkIGFjdGl2aXR5KSB7Ci0gICAgICAgIGlmICghbVdpbmRvd1JlcGxhY2VtZW50VGltZW91dHMuY29udGFpbnMoYWN0aXZpdHkpKSB7Ci0gICAgICAgICAgICBtV2luZG93UmVwbGFjZW1lbnRUaW1lb3V0cy5hZGQoYWN0aXZpdHkpOwotICAgICAgICB9Ci0gICAgICAgIG1ILnJlbW92ZU1lc3NhZ2VzKEguV0lORE9XX1JFUExBQ0VNRU5UX1RJTUVPVVQpOwotICAgICAgICBtSC5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZCgKLSAgICAgICAgICAgICAgICBILldJTkRPV19SRVBMQUNFTUVOVF9USU1FT1VULCBXSU5ET1dfUkVQTEFDRU1FTlRfVElNRU9VVF9EVVJBVElPTik7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXREb2NrZWRTdGFja1NpZGUoKSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtNzM2MSwxNCArNzE4Nyw2IEBACiAgICAgICAgICAgICAgICAgICAgIC5zZXRQb2ludGVySWNvblR5cGUoUG9pbnRlckljb24uVFlQRV9ERUZBVUxUKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIFBvaW50RiBnZXRMYXRlc3RNb3VzZVBvc2l0aW9uKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Nb3VzZVBvc2l0aW9uVHJhY2tlcikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludEYobU1vdXNlUG9zaXRpb25UcmFja2VyLm1MYXRlc3RNb3VzZVgsCi0gICAgICAgICAgICAgICAgICAgIG1Nb3VzZVBvc2l0aW9uVHJhY2tlci5tTGF0ZXN0TW91c2VZKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHZvaWQgc2V0TW91c2VQb2ludGVyRGlzcGxheUlkKGludCBkaXNwbGF5SWQpIHsKICAgICAgICAgbU1vdXNlUG9zaXRpb25UcmFja2VyLnNldFBvaW50ZXJEaXNwbGF5SWQoZGlzcGxheUlkKTsKICAgICB9CkBAIC04NzUzLDggKzg1NzEsOCBAQAogICAgICAqLwogICAgIHZvaWQgZ3JhbnRJbnB1dENoYW5uZWwoU2Vzc2lvbiBzZXNzaW9uLCBpbnQgY2FsbGluZ1VpZCwgaW50IGNhbGxpbmdQaWQsIGludCBkaXNwbGF5SWQsCiAgICAgICAgICAgICBTdXJmYWNlQ29udHJvbCBzdXJmYWNlLCBJV2luZG93IHdpbmRvdywgSUJpbmRlciBob3N0SW5wdXRUb2tlbiwKLSAgICAgICAgICAgIGludCBmbGFncywgaW50IHByaXZhdGVGbGFncywgaW50IHR5cGUsIElCaW5kZXIgd2luZG93VG9rZW4sIElCaW5kZXIgZm9jdXNHcmFudFRva2VuLAotICAgICAgICAgICAgU3RyaW5nIGlucHV0SGFuZGxlTmFtZSwgSW5wdXRDaGFubmVsIG91dElucHV0Q2hhbm5lbCkgeworICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgcHJpdmF0ZUZsYWdzLCBpbnQgaW5wdXRGZWF0dXJlcywgaW50IHR5cGUsIElCaW5kZXIgd2luZG93VG9rZW4sCisgICAgICAgICAgICBJQmluZGVyIGZvY3VzR3JhbnRUb2tlbiwgU3RyaW5nIGlucHV0SGFuZGxlTmFtZSwgSW5wdXRDaGFubmVsIG91dElucHV0Q2hhbm5lbCkgewogICAgICAgICBmaW5hbCBpbnQgc2FuaXRpemVkVHlwZSA9IHNhbml0aXplV2luZG93VHlwZShzZXNzaW9uLCBkaXNwbGF5SWQsIHdpbmRvd1Rva2VuLCB0eXBlKTsKICAgICAgICAgZmluYWwgSW5wdXRBcHBsaWNhdGlvbkhhbmRsZSBhcHBsaWNhdGlvbkhhbmRsZTsKICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWU7CkBAIC04NzcxLDcgKzg1ODksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgdXBkYXRlSW5wdXRDaGFubmVsKGNsaWVudENoYW5uZWwuZ2V0VG9rZW4oKSwgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgZGlzcGxheUlkLCBzdXJmYWNlLAotICAgICAgICAgICAgICAgIG5hbWUsIGFwcGxpY2F0aW9uSGFuZGxlLCBmbGFncywgcHJpdmF0ZUZsYWdzLCBzYW5pdGl6ZWRUeXBlLAorICAgICAgICAgICAgICAgIG5hbWUsIGFwcGxpY2F0aW9uSGFuZGxlLCBmbGFncywgcHJpdmF0ZUZsYWdzLCBpbnB1dEZlYXR1cmVzLCBzYW5pdGl6ZWRUeXBlLAogICAgICAgICAgICAgICAgIG51bGwgLyogcmVnaW9uICovLCB3aW5kb3cpOwogCiAgICAgICAgIGNsaWVudENoYW5uZWwuY29weVRvKG91dElucHV0Q2hhbm5lbCk7CkBAIC04ODEyLDEzICs4NjMwLDE0IEBACiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUlucHV0Q2hhbm5lbChJQmluZGVyIGNoYW5uZWxUb2tlbiwgaW50IGNhbGxpbmdVaWQsIGludCBjYWxsaW5nUGlkLAogICAgICAgICAgICAgaW50IGRpc3BsYXlJZCwgU3VyZmFjZUNvbnRyb2wgc3VyZmFjZSwgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICBJbnB1dEFwcGxpY2F0aW9uSGFuZGxlIGFwcGxpY2F0aW9uSGFuZGxlLCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICBpbnQgcHJpdmF0ZUZsYWdzLCBpbnQgdHlwZSwgUmVnaW9uIHJlZ2lvbiwgSVdpbmRvdyB3aW5kb3cpIHsKKyAgICAgICAgICAgIGludCBwcml2YXRlRmxhZ3MsIGludCBpbnB1dEZlYXR1cmVzLCBpbnQgdHlwZSwgUmVnaW9uIHJlZ2lvbiwgSVdpbmRvdyB3aW5kb3cpIHsKICAgICAgICAgZmluYWwgSW5wdXRXaW5kb3dIYW5kbGUgaCA9IG5ldyBJbnB1dFdpbmRvd0hhbmRsZShhcHBsaWNhdGlvbkhhbmRsZSwgZGlzcGxheUlkKTsKICAgICAgICAgaC50b2tlbiA9IGNoYW5uZWxUb2tlbjsKICAgICAgICAgaC5zZXRXaW5kb3dUb2tlbih3aW5kb3cpOwogICAgICAgICBoLm5hbWUgPSBuYW1lOwogCiAgICAgICAgIGZsYWdzID0gc2FuaXRpemVGbGFnU2xpcHBlcnkoZmxhZ3MsIG5hbWUsIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQpOworICAgICAgICBpbnB1dEZlYXR1cmVzID0gc2FuaXRpemVTcHlXaW5kb3coaW5wdXRGZWF0dXJlcywgbmFtZSwgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCk7CiAKICAgICAgICAgZmluYWwgaW50IHNhbml0aXplZExwRmxhZ3MgPQogICAgICAgICAgICAgICAgIChmbGFncyAmIChGTEFHX05PVF9UT1VDSEFCTEUgfCBGTEFHX1NMSVBQRVJZIHwgTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRSkpCkBAIC04ODI4LDcgKzg2NDcsNyBAQAogCiAgICAgICAgIC8vIERvIG5vdCBhbGxvdyBhbnkgaW5wdXQgZmVhdHVyZXMgdG8gYmUgc2V0IHdpdGhvdXQgc2FuaXRpemluZyB0aGVtIGZpcnN0LgogICAgICAgICBoLmlucHV0Q29uZmlnID0gSW5wdXRDb25maWdBZGFwdGVyLmdldElucHV0Q29uZmlnRnJvbVdpbmRvd1BhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHNhbml0aXplZExwRmxhZ3MsIDAgLyppbnB1dEZlYXR1cmVzKi8pOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgc2FuaXRpemVkTHBGbGFncywgaW5wdXRGZWF0dXJlcyk7CiAKIAogICAgICAgICBpZiAoKGZsYWdzICYgTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRSkgIT0gMCkgewpAQCAtODg2NSw3ICs4Njg0LDcgQEAKICAgICAgKiBpcyB1bmRlZmluZWQuCiAgICAgICovCiAgICAgdm9pZCB1cGRhdGVJbnB1dENoYW5uZWwoSUJpbmRlciBjaGFubmVsVG9rZW4sIGludCBkaXNwbGF5SWQsIFN1cmZhY2VDb250cm9sIHN1cmZhY2UsCi0gICAgICAgICAgICBpbnQgZmxhZ3MsIGludCBwcml2YXRlRmxhZ3MsIFJlZ2lvbiByZWdpb24pIHsKKyAgICAgICAgICAgIGludCBmbGFncywgaW50IHByaXZhdGVGbGFncywgaW50IGlucHV0RmVhdHVyZXMsIFJlZ2lvbiByZWdpb24pIHsKICAgICAgICAgZmluYWwgSW5wdXRBcHBsaWNhdGlvbkhhbmRsZSBhcHBsaWNhdGlvbkhhbmRsZTsKICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWU7CiAgICAgICAgIGZpbmFsIEVtYmVkZGVkV2luZG93Q29udHJvbGxlci5FbWJlZGRlZFdpbmRvdyB3aW47CkBAIC04ODgwLDcgKzg2OTksOCBAQAogICAgICAgICB9CiAKICAgICAgICAgdXBkYXRlSW5wdXRDaGFubmVsKGNoYW5uZWxUb2tlbiwgd2luLm1Pd25lclVpZCwgd2luLm1Pd25lclBpZCwgZGlzcGxheUlkLCBzdXJmYWNlLCBuYW1lLAotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSGFuZGxlLCBmbGFncywgcHJpdmF0ZUZsYWdzLCB3aW4ubVdpbmRvd1R5cGUsIHJlZ2lvbiwgd2luLm1DbGllbnQpOworICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSGFuZGxlLCBmbGFncywgcHJpdmF0ZUZsYWdzLCBpbnB1dEZlYXR1cmVzLCB3aW4ubVdpbmRvd1R5cGUsIHJlZ2lvbiwKKyAgICAgICAgICAgICAgICB3aW4ubUNsaWVudCk7CiAgICAgfQogCiAgICAgLyoqIFJldHVybiB3aGV0aGVyIGxheWVyIHRyYWNpbmcgaXMgZW5hYmxlZCAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2hlbGxDb21tYW5kLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTaGVsbENvbW1hbmQuamF2YQppbmRleCBjZmIzYzZjLi44YzJkZDJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTaGVsbENvbW1hbmQuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTaGVsbENvbW1hbmQuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvdzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKIApAQCAtNTY5LDYgKzU3MCwyMiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZHVtcExvY2FsV2luZG93QXN5bmMoSVdpbmRvdyBjbGllbnQsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCkgeworICAgICAgICAvLyBNYWtlIGl0IGFzeW5jaHJvbm91cyB0byBhdm9pZCB3cml0ZXIgZnJvbSBiZWluZyBibG9ja2VkCisgICAgICAgIC8vIGJ5IHdhaXRpbmcgZm9yIHRoZSBidWZmZXIgdG8gYmUgY29uc3VtZWQgaW4gdGhlIHNhbWUgcHJvY2Vzcy4KKyAgICAgICAgSW9UaHJlYWQuZ2V0RXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUludGVybmFsLm1HbG9iYWxMb2NrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LmV4ZWN1dGVDb21tYW5kKFZpZXdEZWJ1Zy5SRU1PVEVfQ09NTUFORF9EVU1QX0VOQ09ERUQsIG51bGwsIHBmZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIFJlbW90ZUV4Y2VwdGlvbiBmb3IgbG9jYWwgY2FsbC4gSnVzdCBwcmludCB0cmFjZSBmb3Igb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9ucyBjYXVzZWQgYnkgUkMgd2l0aCB0b2xlcmFibGUgbG93IHBvc3NpYmlsaXR5LgorICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBpbnQgcnVuRHVtcFZpc2libGVXaW5kb3dWaWV3cyhQcmludFdyaXRlciBwdykgewogICAgICAgICBpZiAoIW1JbnRlcm5hbC5jaGVja0NhbGxpbmdQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QLAogICAgICAgICAgICAgICAgICJydW5EdW1wVmlzaWJsZVdpbmRvd1ZpZXdzKCkiKSkgewpAQCAtNTkxLDE2ICs2MDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBuZXcgQnl0ZVRyYW5zZmVyUGlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IHBpcGUuZ2V0V3JpdGVGZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3LmlzQ2xpZW50TG9jYWwoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGl0IGFzeW5jaHJvbm91cyB0byBhdm9pZCB3cml0ZXIgZnJvbSBiZWluZyBibG9ja2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHdhaXRpbmcgZm9yIHRoZSBidWZmZXIgdG8gYmUgY29uc3VtZWQgaW4gdGhlIHNhbWUgcHJvY2Vzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW9UaHJlYWQuZ2V0RXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy5tQ2xpZW50LmV4ZWN1dGVDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0RlYnVnLlJFTU9URV9DT01NQU5EX0RVTVBfRU5DT0RFRCwgbnVsbCwgcGZkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGZvciBsb2NhbCBjYWxsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcExvY2FsV2luZG93QXN5bmMody5tQ2xpZW50LCBwZmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcubUNsaWVudC5leGVjdXRlQ29tbWFuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3RGVidWcuUkVNT1RFX0NPTU1BTkRfRFVNUF9FTkNPREVELCBudWxsLCBwZmQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dPcmdhbml6ZXJDb250cm9sbGVyLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd09yZ2FuaXplckNvbnRyb2xsZXIuamF2YQppbmRleCBjM2M4N2FmLi4xN2Q0ZjFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd09yZ2FuaXplckNvbnRyb2xsZXIuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd09yZ2FuaXplckNvbnRyb2xsZXIuamF2YQpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGludCBDT05UUk9MTEFCTEVfQ09ORklHUyA9IEFjdGl2aXR5SW5mby5DT05GSUdfV0lORE9XX0NPTkZJR1VSQVRJT04KICAgICAgICAgICAgIHwgQWN0aXZpdHlJbmZvLkNPTkZJR19TTUFMTEVTVF9TQ1JFRU5fU0laRSB8IEFjdGl2aXR5SW5mby5DT05GSUdfU0NSRUVOX1NJWkUKLSAgICAgICAgICAgIHwgQWN0aXZpdHlJbmZvLkNPTkZJR19MQVlPVVRfRElSRUNUSU9OOworICAgICAgICAgICAgfCBBY3Rpdml0eUluZm8uQ09ORklHX0xBWU9VVF9ESVJFQ1RJT04gfCBBY3Rpdml0eUluZm8uQ09ORklHX0RFTlNJVFk7CiAgICAgc3RhdGljIGZpbmFsIGludCBDT05UUk9MTEFCTEVfV0lORE9XX0NPTkZJR1MgPSBXSU5ET1dfQ09ORklHX0JPVU5EUwogICAgICAgICAgICAgfCBXaW5kb3dDb25maWd1cmF0aW9uLldJTkRPV19DT05GSUdfQVBQX0JPVU5EUzsKIApAQCAtMzkxLDkgKzM5MSwxNCBAQAogICAgICAgICAgICAgICAgIC8vIGFwcGx5IHRoZSBpbmNvbWluZyB0cmFuc2FjdGlvbiBiZWZvcmUgZmluaXNoIGluIGNhc2UgaXQgYWx0ZXJzIHRoZSB2aXNpYmlsaXR5CiAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHBhcnRpY2lwYW50cy4KICAgICAgICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZmluaXNoaW5nIHRyYW5zaXRpb24gYmVmb3JlIGFwcGx5VHJhbnNhY3Rpb24gc28gdGhlIHZpc2liaWxpdHkKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBvZiB0aGUgdHJhbnNpdGlvbiBwYXJ0aWNpcGFudHMgd2lsbCBvbmx5IHNldCB2aXNpYmxlLXJlcXVlc3RlZAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc3RpbGwgbGV0IGZpbmlzaFRyYW5zaXRpb24gaGFuZGxlIHRoZSBwYXJ0aWNpcGFudHMuCisgICAgICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uQ29udHJvbGxlci5tRmluaXNoaW5nVHJhbnNpdGlvbiA9IHRyYW5zaXRpb247CiAgICAgICAgICAgICAgICAgICAgIGFwcGx5VHJhbnNhY3Rpb24odCwgc3luY0lkLCBudWxsIC8qdHJhbnNpdGlvbiovLCBjYWxsZXIsIHRyYW5zaXRpb24pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnZXRUcmFuc2l0aW9uQ29udHJvbGxlcigpLmZpbmlzaFRyYW5zaXRpb24odHJhbnNpdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbkNvbnRyb2xsZXIuZmluaXNoVHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbkNvbnRyb2xsZXIubUZpbmlzaGluZ1RyYW5zaXRpb24gPSBudWxsOwogICAgICAgICAgICAgICAgIGlmIChzeW5jSWQgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZXRTeW5jUmVhZHkoc3luY0lkKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyLmphdmEKaW5kZXggNjk0ZjFiZS4uODM0YjcwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlci5qYXZhCisrKyBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93UHJvY2Vzc0NvbnRyb2xsZXIuamF2YQpAQCAtMTM4MSw2ICsxMzgxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIFdpbmR3b1Byb2Nlc3NDb250cm9sbGVyLCBhZnRlciB0aGUgcHJvY2VzcyBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqLworICAgIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgdW5yZWdpc3RlckNvbmZpZ3VyYXRpb25MaXN0ZW5lcnMoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDaGVjayBpZiBhY3Rpdml0eSBjb25maWd1cmF0aW9uIG92ZXJyaWRlIGZvciB0aGUgYWN0aXZpdHkgcHJvY2VzcyBuZWVkcyBhbiB1cGRhdGUgYW5kIHBlcmZvcm0KICAgICAgKiBpZiBuZWVkZWQuIEJ5IGRlZmF1bHQgd2UgdHJ5IHRvIG92ZXJyaWRlIHRoZSBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gdG8gbWF0Y2ggdGhlIHRvcCBhY3Rpdml0eQogICAgICAqIGNvbmZpZyB0byBpbmNyZWFzZSBhcHAgY29tcGF0aWJpbGl0eSB3aXRoIG11bHRpLXdpbmRvdyBhbmQgbXVsdGktZGlzcGxheS4gVGhlIHByb2Nlc3Mgd2lsbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlck1hcC5qYXZhIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlck1hcC5qYXZhCmluZGV4IDI3Njc5NzIuLjQyNGIwNDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93UHJvY2Vzc0NvbnRyb2xsZXJNYXAuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyTWFwLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBmaW5hbCBjbGFzcyBXaW5kb3dQcm9jZXNzQ29udHJvbGxlck1hcCB7CiAKQEAgLTY3LDYgKzY3LDcgQEAKICAgICAgICAgICAgIG1QaWRNYXAucmVtb3ZlKHBpZCk7CiAgICAgICAgICAgICAvLyByZW1vdmUgcHJvY2VzcyBmcm9tIG1VaWRNYXAKICAgICAgICAgICAgIHJlbW92ZVByb2Nlc3NGcm9tVWlkTWFwKHByb2MpOworICAgICAgICAgICAgcHJvYy5kZXN0cm95KCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93U3RhdGUuamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93U3RhdGUuamF2YQppbmRleCBmODZiOTk3Li44YTA4M2FhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1N0YXRlLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dTdGF0ZS5qYXZhCkBAIC01OSwxMyArNTksMTEgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlBSSVZBVEVfRkxBR19OT19NT1ZFX0FOSU1BVElPTjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlBSSVZBVEVfRkxBR19TWVNURU1fQVBQTElDQVRJT05fT1ZFUkxBWTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlBSSVZBVEVfRkxBR19UUlVTVEVEX09WRVJMQVk7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5QUklWQVRFX0ZMQUdfV0lMTF9OT1RfUkVQTEFDRV9PTl9SRUxBVU5DSDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfQURKVVNUX1JFU0laRTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfTUFTS19BREpVU1Q7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TWVNURU1fRkxBR19ISURFX05PTl9TWVNURU1fT1ZFUkxBWV9XSU5ET1dTOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU1lTVEVNX0ZMQUdfU0hPV19GT1JfQUxMX1VTRVJTOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BQ0NFU1NJQklMSVRZX01BR05JRklDQVRJT05fT1ZFUkxBWTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQVBQTElDQVRJT047CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0FQUExJQ0FUSU9OX01FRElBOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9NRURJQV9PVkVSTEFZOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9PVkVSTEFZOwpAQCAtMjIxLDggKzIxOSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dGb2N1c09ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93SWQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0Q2hhbm5lbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRFdmVudFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dFdpbmRvd0hhbmRsZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5zZXRzU291cmNlOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnNldHNTdGF0ZTsKQEAgLTU3MiwxMiArNTY4LDYgQEAKICAgICBib29sZWFuIG1SZW1vdmVPbkV4aXQ7CiAKICAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBhcHAgZGllZCB3aGlsZSBpdCB3YXMgdmlzaWJsZSwgaWYgdHJ1ZSB3ZSBtaWdodCBuZWVkCi0gICAgICogdG8gY29udGludWUgdG8gc2hvdyBpdCB1bnRpbCBpdCdzIHJlc3RhcnRlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIG1BcHBEaWVkOwotCi0gICAgLyoqCiAgICAgICogU2V0IHdoZW4gdGhlIG9yaWVudGF0aW9uIGlzIGNoYW5naW5nIGFuZCB0aGlzIHdpbmRvdyBoYXMgbm90IHlldAogICAgICAqIGJlZW4gdXBkYXRlZCBmb3IgdGhlIG5ldyBvcmllbnRhdGlvbi4KICAgICAgKi8KQEAgLTY0MCwyMiArNjMwLDYgQEAKIAogICAgIGJvb2xlYW4gbUhhc1N1cmZhY2UgPSBmYWxzZTsKIAotICAgIC8vIFRoaXMgd2luZG93IHdpbGwgYmUgcmVwbGFjZWQgZHVlIHRvIHJlbGF1bmNoLiBUaGlzIGFsbG93cyB3aW5kb3cgbWFuYWdlcgotICAgIC8vIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzaW1wbGUgcmVtb3ZhbCBvZiBhIHdpbmRvdyBhbmQgcmVwbGFjZW1lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSBpdAotICAgIC8vIHdpbGwgcHJlc2VydmUgdGhlIG9sZCB3aW5kb3cgdW50aWwgdGhlIG5ldyBvbmUgaXMgZHJhd24uCi0gICAgYm9vbGVhbiBtV2lsbFJlcGxhY2VXaW5kb3cgPSBmYWxzZTsKLSAgICAvLyBJZiB0cnVlLCB0aGUgcmVwbGFjZWQgd2luZG93IHdhcyBhbHJlYWR5IHJlcXVlc3RlZCB0byBiZSByZW1vdmVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwbGFjaW5nUmVtb3ZlUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgLy8gV2hldGhlciB0aGUgcmVwbGFjZW1lbnQgb2YgdGhlIHdpbmRvdyBzaG91bGQgdHJpZ2dlciBhcHAgdHJhbnNpdGlvbiBhbmltYXRpb24uCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BbmltYXRlUmVwbGFjaW5nV2luZG93ID0gZmFsc2U7Ci0gICAgLy8gSWYgbm90IG51bGwsIHRoZSB3aW5kb3cgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgb2xkIG9uZS4gVGhpcyBpcyBiZWluZyBzZXQgd2hlbgotICAgIC8vIHRoZSB3aW5kb3cgaXMgYWRkZWQgYW5kIHVuc2V0IHdoZW4gdGhpcyB3aW5kb3cgcmVwb3J0cyBpdHMgZmlyc3QgZHJhdy4KLSAgICBwcml2YXRlIFdpbmRvd1N0YXRlIG1SZXBsYWNlbWVudFdpbmRvdyA9IG51bGw7Ci0gICAgLy8gRm9yIHRoZSBuZXcgd2luZG93IGluIHRoZSByZXBsYWNlbWVudCB0cmFuc2l0aW9uLCBpZiB3ZSBoYXZlCi0gICAgLy8gcmVxdWVzdGVkIHRvIHJlcGxhY2Ugd2l0aG91dCBhbmltYXRpb24sIHRoZW4gd2Ugc2hvdWxkCi0gICAgLy8gbWFrZSBzdXJlIHdlIGFsc28gZG9uJ3QgYXBwbHkgYW4gZW50ZXIgYW5pbWF0aW9uIGZvcgotICAgIC8vIHRoZSBuZXcgd2luZG93LgotICAgIGJvb2xlYW4gbVNraXBFbnRlckFuaW1hdGlvbkZvclNlYW1sZXNzUmVwbGFjZW1lbnQgPSBmYWxzZTsKICAgICAvLyBXaGV0aGVyIHRoaXMgd2luZG93IGlzIGJlaW5nIG1vdmVkIHZpYSB0aGUgcmVzaXplIEFQSQogICAgIHByaXZhdGUgYm9vbGVhbiBtTW92ZWRCeVJlc2l6ZTsKIApAQCAtNzYwLDcgKzczNCw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBJbnNldHNTdGF0ZSBtRnJvemVuSW5zZXRzU3RhdGU7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX0RJTV9BTU9VTlRfREVBRF9XSU5ET1cgPSAwLjVmOwogICAgIHByaXZhdGUgS2V5SW50ZXJjZXB0aW9uSW5mbyBtS2V5SW50ZXJjZXB0aW9uSW5mbzsKIAogICAgIC8qKgpAQCAtMTMxOCwxMyArMTI5MSw2IEBACiAgICAgfQogCiAgICAgYm9vbGVhbiBza2lwTGF5b3V0KCkgewotICAgICAgICBpZiAobVdpbGxSZXBsYWNlV2luZG93ICYmIChtQW5pbWF0aW5nRXhpdCB8fCAhbVJlcGxhY2luZ1JlbW92ZVJlcXVlc3RlZCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2luZG93IGlzIGJlaW5nIHJlcGxhY2VkIGFuZCBlaXRoZXIgYWxyZWFkeSBnb3QgaW5mb3JtYXRpb24gdGhhdCBpdCdzIGJlaW5nCi0gICAgICAgICAgICAvLyByZW1vdmVkIG9yIHdlIGFyZSBzdGlsbCB3YWl0aW5nIGZvciBzb21lIGluZm9ybWF0aW9uLiBCZWNhdXNlIG9mIHRoaXMgd2UgZG9uJ3QKLSAgICAgICAgICAgIC8vIHdhbnQgdG8gYXBwbHkgYW55IG1vcmUgY2hhbmdlcyB0byBpdCwgc28gaXQgcmVtYWlucyBpbiB0aGlzIHN0YXRlIHVudGlsIG5ldyB3aW5kb3cKLSAgICAgICAgICAgIC8vIGFwcGVhcnMuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQogICAgICAgICAvLyBTa2lwIGxheW91dCBvZiB0aGUgd2luZG93IHdoZW4gaW4gdHJhbnNpdGlvbiB0byBwaXAgbW9kZS4KICAgICAgICAgcmV0dXJuIG1BY3Rpdml0eVJlY29yZCAhPSBudWxsICYmIG1BY3Rpdml0eVJlY29yZC5tV2FpdEZvckVudGVyaW5nUGlubmVkTW9kZTsKICAgICB9CkBAIC0xNTA0LDEzICsxNDcwLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIElmIGl0J3MgYSBkZWFkIHdpbmRvdyBsZWZ0IG9uIHNjcmVlbiwgYW5kIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZWQsIHRoZXJlIGlzIG5vdGhpbmcKLSAgICAgICAgICAgIC8vIHdlIGNhbiBkbyBhYm91dCBpdC4gUmVtb3ZlIHRoZSB3aW5kb3cgbm93LgotICAgICAgICAgICAgaWYgKG1BY3Rpdml0eVJlY29yZCAhPSBudWxsICYmIG1BcHBEaWVkKSB7Ci0gICAgICAgICAgICAgICAgbUFjdGl2aXR5UmVjb3JkLnJlbW92ZURlYWRXaW5kb3dzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBvblJlc2l6ZUhhbmRsZWQoKTsKICAgICAgICAgICAgIG1XbVNlcnZpY2UubWFrZVdpbmRvd0ZyZWV6aW5nU2NyZWVuSWZOZWVkZWRMb2NrZWQodGhpcyk7CiAKQEAgLTIwMDksNyArMTk2OCw3IEBACiAgICAgYm9vbGVhbiBpc0ludGVyZXN0aW5nKCkgewogICAgICAgICBmaW5hbCBSZWNlbnRzQW5pbWF0aW9uQ29udHJvbGxlciByZWNlbnRzQW5pbWF0aW9uQ29udHJvbGxlciA9CiAgICAgICAgICAgICAgICAgbVdtU2VydmljZS5nZXRSZWNlbnRzQW5pbWF0aW9uQ29udHJvbGxlcigpOwotICAgICAgICByZXR1cm4gbUFjdGl2aXR5UmVjb3JkICE9IG51bGwgJiYgIW1BcHBEaWVkCisgICAgICAgIHJldHVybiBtQWN0aXZpdHlSZWNvcmQgIT0gbnVsbAogICAgICAgICAgICAgICAgICYmICghbUFjdGl2aXR5UmVjb3JkLmlzRnJlZXppbmdTY3JlZW4oKSB8fCAhbUFwcEZyZWV6aW5nKQogICAgICAgICAgICAgICAgICYmIG1WaWV3VmlzaWJpbGl0eSA9PSBWaWV3LlZJU0lCTEUKICAgICAgICAgICAgICAgICAmJiAocmVjZW50c0FuaW1hdGlvbkNvbnRyb2xsZXIgPT0gbnVsbApAQCAtMjM3MCwyNCArMjMyOSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIG9uV2luZG93UmVwbGFjZW1lbnRUaW1lb3V0KCkgewotICAgICAgICBpZiAobVdpbGxSZXBsYWNlV2luZG93KSB7Ci0gICAgICAgICAgICAvLyBTaW5jZSB0aGUgd2luZG93IGFscmVhZHkgdGltZWQgb3V0LCByZW1vdmUgaXQgaW1tZWRpYXRlbHkgbm93LgotICAgICAgICAgICAgLy8gVXNlIFdpbmRvd1N0YXRlI3JlbW92ZUltbWVkaWF0ZWx5KCkgaW5zdGVhZCBvZiBXaW5kb3dTdGF0ZSNyZW1vdmVJZlBvc3NpYmxlKCksIGFzCi0gICAgICAgICAgICAvLyB0aGUgbGF0dGVyIGRlbGF5cyByZW1vdmFsIG9uIGNlcnRhaW4gY29uZGl0aW9ucywgd2hpY2ggd2lsbCBsZWF2ZSB0aGUgc3RhbGUgd2luZG93Ci0gICAgICAgICAgICAvLyBpbiB0aGUgcm9vdCB0YXNrIGFuZCBtYXJrZWQgbVdpbGxSZXBsYWNlV2luZG93PWZhbHNlLCBzbyB0aGUgd2luZG93IHdpbGwgbmV2ZXIgYmUKLSAgICAgICAgICAgIC8vIHJlbW92ZWQuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gQWxzbyByZW1vdmVzIGNoaWxkIHdpbmRvd3MuCi0gICAgICAgICAgICByZW1vdmVJbW1lZGlhdGVseSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1DaGlsZHJlbi5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YXRlIGMgPSBtQ2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgICAgIGMub25XaW5kb3dSZXBsYWNlbWVudFRpbWVvdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHZvaWQgcmVtb3ZlSW1tZWRpYXRlbHkoKSB7CiAgICAgICAgIGlmIChtUmVtb3ZlZCkgewpAQCAtMjQwNCwxMSArMjM0NSw2IEBACiAgICAgICAgIG1XaW5BbmltYXRvci5kZXN0cm95U3VyZmFjZUxvY2tlZChnZXRTeW5jVHJhbnNhY3Rpb24oKSk7CiAgICAgICAgIHN1cGVyLnJlbW92ZUltbWVkaWF0ZWx5KCk7CiAKLSAgICAgICAgbVdpbGxSZXBsYWNlV2luZG93ID0gZmFsc2U7Ci0gICAgICAgIGlmIChtUmVwbGFjZW1lbnRXaW5kb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlcGxhY2VtZW50V2luZG93Lm1Ta2lwRW50ZXJBbmltYXRpb25Gb3JTZWFtbGVzc1JlcGxhY2VtZW50ID0gZmFsc2U7Ci0gICAgICAgIH0KLQogICAgICAgICBmaW5hbCBEaXNwbGF5Q29udGVudCBkYyA9IGdldERpc3BsYXlDb250ZW50KCk7CiAgICAgICAgIGlmIChpc0ltZUxheWVyaW5nVGFyZ2V0KCkpIHsKICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYXR0YWNoZWQgSU1FIHNjcmVlbnNob3Qgc3VyZmFjZS4KQEAgLTI0NDgsMTEgKzIzODQsNiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgdm9pZCByZW1vdmVJZlBvc3NpYmxlKCkgewotICAgICAgICBzdXBlci5yZW1vdmVJZlBvc3NpYmxlKCk7Ci0gICAgICAgIHJlbW92ZUlmUG9zc2libGUoZmFsc2UgLyprZWVwVmlzaWJsZURlYWRXaW5kb3cqLyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUlmUG9zc2libGUoYm9vbGVhbiBrZWVwVmlzaWJsZURlYWRXaW5kb3cpIHsKICAgICAgICAgbVdpbmRvd1JlbW92YWxBbGxvd2VkID0gdHJ1ZTsKICAgICAgICAgUHJvdG9Mb2cudihXTV9ERUJVR19BRERfUkVNT1ZFLAogICAgICAgICAgICAgICAgICJyZW1vdmVJZlBvc3NpYmxlOiAlcyBjYWxsZXJzPSVzIiwgdGhpcywgRGVidWcuZ2V0Q2FsbGVycyg1KSk7CkBAIC0yNDkzLDEyICsyNDI0LDExIEBACiAgICAgICAgICAgICBQcm90b0xvZy52KFdNX0RFQlVHX0FQUF9UUkFOU0lUSU9OUywKICAgICAgICAgICAgICAgICAgICAgIlJlbW92ZSAlczogbVN1cmZhY2VDb250cm9sbGVyPSVzIG1BbmltYXRpbmdFeGl0PSViIG1SZW1vdmVPbkV4aXQ9JWIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1IYXNTdXJmYWNlPSViIHN1cmZhY2VTaG93aW5nPSViIGFuaW1hdGluZz0lYiBhcHAtYW5pbWF0aW9uPSViICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtV2lsbFJlcGxhY2VXaW5kb3c9JWIgbURpc3BsYXlGcm96ZW49JWIgY2FsbGVycz0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibURpc3BsYXlGcm96ZW49JWIgY2FsbGVycz0lcyIsCiAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1XaW5BbmltYXRvci5tU3VyZmFjZUNvbnRyb2xsZXIsIG1BbmltYXRpbmdFeGl0LCBtUmVtb3ZlT25FeGl0LAogICAgICAgICAgICAgICAgICAgICBtSGFzU3VyZmFjZSwgbVdpbkFuaW1hdG9yLmdldFNob3duKCksCiAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0aW5nKFRSQU5TSVRJT04gfCBQQVJFTlRTKSwKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5UmVjb3JkICE9IG51bGwgJiYgbUFjdGl2aXR5UmVjb3JkLmlzQW5pbWF0aW5nKFBBUkVOVFMgfCBUUkFOU0lUSU9OKSwKLSAgICAgICAgICAgICAgICAgICAgbVdpbGxSZXBsYWNlV2luZG93LAogICAgICAgICAgICAgICAgICAgICBtV21TZXJ2aWNlLm1EaXNwbGF5RnJvemVuLCBEZWJ1Zy5nZXRDYWxsZXJzKDYpKTsKIAogICAgICAgICAgICAgLy8gVmlzaWJpbGl0eSBvZiB0aGUgcmVtb3ZlZCB3aW5kb3cuIFdpbGwgYmUgdXNlZCBsYXRlciB0byB1cGRhdGUgb3JpZW50YXRpb24gbGF0ZXIgb24uCkBAIC0yNTA4LDQwICsyNDM4LDkgQEAKICAgICAgICAgICAgIC8vIHdpbmRvdyB1bnRpbCB0aGUgYW5pbWF0aW9uIGlzIGRvbmUuIElmIHRoZSBkaXNwbGF5IGlzIGZyb3plbiwganVzdCByZW1vdmUgaW1tZWRpYXRlbHksCiAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgYW5pbWF0aW9uIHdvdWxkbid0IGJlIHNlZW4uCiAgICAgICAgICAgICBpZiAobUhhc1N1cmZhY2UgJiYgbVRva2VuLm9rVG9BbmltYXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobVdpbGxSZXBsYWNlV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2luZG93IGlzIGdvaW5nIHRvIGJlIHJlcGxhY2VkLiBXZSBuZWVkIHRvIGtlZXAgaXQgYXJvdW5kIHVudGlsIHRoZSBuZXcgb25lCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldHMgYWRkZWQsIHRoZW4gd2Ugd2lsbCBnZXQgcmlkIG9mIHRoaXMgb25lLgotICAgICAgICAgICAgICAgICAgICBQcm90b0xvZy52KFdNX0RFQlVHX0FERF9SRU1PVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZXNlcnZpbmcgJXMgdW50aWwgdGhlIG5ldyBvbmUgaXMgYWRkZWQiLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogV2UgYXJlIG92ZXJsb2FkaW5nIG1BbmltYXRpbmdFeGl0IGZsYWcgdG8gcHJldmVudCB0aGUgd2luZG93IHN0YXRlIGZyb20KLSAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiByZW1vdmVkLiBXZSBwcm9iYWJseSBuZWVkIGFub3RoZXIgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdpbmRvdyByZW1vdmFsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBkZWZmZXJlZCB2cy4gb3ZlcmxvYWRpbmcgdGhlIGZsYWcgdGhhdCBzYXlzIHdlIGFyZSBwbGF5aW5nIGFuIGV4aXQKLSAgICAgICAgICAgICAgICAgICAgLy8gYW5pbWF0aW9uLgotICAgICAgICAgICAgICAgICAgICBQcm90b0xvZy52KFdNX0RFQlVHX0FOSU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCBhbmltYXRpbmdFeGl0OiByZWFzb249cmVtb3ZlL3JlcGxhY2VXaW5kb3cgd2luPSVzIiwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmltYXRpbmdFeGl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbVJlcGxhY2luZ1JlbW92ZVJlcXVlc3RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGN1cnJlbnRseSBydW5uaW5nIHRoZSBleGl0IGFuaW1hdGlvbiwgd2UgbmVlZCB0byBzZWUgYWJvdXQgc3RhcnRpbmcgb25lCiAgICAgICAgICAgICAgICAgd2FzVmlzaWJsZSA9IGlzVmlzaWJsZSgpOwogCi0gICAgICAgICAgICAgICAgaWYgKGtlZXBWaXNpYmxlRGVhZFdpbmRvdykgewotICAgICAgICAgICAgICAgICAgICBQcm90b0xvZy52KFdNX0RFQlVHX0FERF9SRU1PVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCByZW1vdmluZyAlcyBiZWNhdXNlIGFwcCBkaWVkIHdoaWxlIGl0J3MgdmlzaWJsZSIsIHRoaXMpOwotCi0gICAgICAgICAgICAgICAgICAgIG1BcHBEaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheUxheW91dE5lZWRlZCgpOwotICAgICAgICAgICAgICAgICAgICBtV21TZXJ2aWNlLm1XaW5kb3dQbGFjZXJMb2NrZWQucGVyZm9ybVN1cmZhY2VQbGFjZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgYSByZXBsYWNlbWVudCBpbnB1dCBjaGFubmVsIHNpbmNlIHRoZSBhcHAgaXMgbm93IGRlYWQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2F0Y2ggdGFwcGluZyBvbiB0aGUgZGVhZCB3aW5kb3cgdG8gcmVzdGFydCB0aGUgYXBwLgotICAgICAgICAgICAgICAgICAgICBvcGVuSW5wdXRDaGFubmVsKG51bGwpOwotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Q29udGVudC5nZXRJbnB1dE1vbml0b3IoKS51cGRhdGVJbnB1dFdpbmRvd3NMdyh0cnVlIC8qZm9yY2UqLyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaW1tZWRpYXRlbHkgaWYgdGhlcmUgaXMgZGlzcGxheSB0cmFuc2l0aW9uIGJlY2F1c2UgdGhlIGFuaW1hdGlvbiBpcwogICAgICAgICAgICAgICAgIC8vIHVzdWFsbHkgdW5ub3RpY2VhYmxlIChlLmcuIGNvdmVyZWQgYnkgcm90YXRpb24gYW5pbWF0aW9uKSBhbmQgdGhlIGFuaW1hdGlvbgogICAgICAgICAgICAgICAgIC8vIGJvdW5kcyBjb3VsZCBiZSBpbmNvbnNpc3RlbnQsIHN1Y2ggYXMgZGVwZW5kaW5nIG9uIHdoZW4gdGhlIHdpbmRvdyBhcHBsaWVzCkBAIC0yNzE1LDE5ICsyNjE0LDcgQEAKICAgICAgICAgICAgICAgICB8fCAoaXNWaXNpYmxlKCkgJiYgbUFjdGl2aXR5UmVjb3JkICE9IG51bGwgJiYgbUFjdGl2aXR5UmVjb3JkLmlzVmlzaWJsZSgpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIERlYWRXaW5kb3dFdmVudFJlY2VpdmVyIGV4dGVuZHMgSW5wdXRFdmVudFJlY2VpdmVyIHsKLSAgICAgICAgRGVhZFdpbmRvd0V2ZW50UmVjZWl2ZXIoSW5wdXRDaGFubmVsIGlucHV0Q2hhbm5lbCkgewotICAgICAgICAgICAgc3VwZXIoaW5wdXRDaGFubmVsLCBtV21TZXJ2aWNlLm1ILmdldExvb3BlcigpKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JbnB1dEV2ZW50KElucHV0RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGZpbmlzaElucHV0RXZlbnQoZXZlbnQsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKiBGYWtlIGV2ZW50IHJlY2VpdmVyIGZvciB3aW5kb3dzIHRoYXQgZGllZCB2aXNpYmxlLiAqLwotICAgIHByaXZhdGUgRGVhZFdpbmRvd0V2ZW50UmVjZWl2ZXIgbURlYWRXaW5kb3dFdmVudFJlY2VpdmVyOwotCi0gICAgdm9pZCBvcGVuSW5wdXRDaGFubmVsKElucHV0Q2hhbm5lbCBvdXRJbnB1dENoYW5uZWwpIHsKKyAgICB2b2lkIG9wZW5JbnB1dENoYW5uZWwoQE5vbk51bGwgSW5wdXRDaGFubmVsIG91dElucHV0Q2hhbm5lbCkgewogICAgICAgICBpZiAobUlucHV0Q2hhbm5lbCAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJXaW5kb3cgYWxyZWFkeSBoYXMgYW4gaW5wdXQgY2hhbm5lbC4iKTsKICAgICAgICAgfQpAQCAtMjczNiwxNCArMjYyMyw3IEBACiAgICAgICAgIG1JbnB1dENoYW5uZWxUb2tlbiA9IG1JbnB1dENoYW5uZWwuZ2V0VG9rZW4oKTsKICAgICAgICAgbUlucHV0V2luZG93SGFuZGxlLnNldFRva2VuKG1JbnB1dENoYW5uZWxUb2tlbik7CiAgICAgICAgIG1XbVNlcnZpY2UubUlucHV0VG9XaW5kb3dNYXAucHV0KG1JbnB1dENoYW5uZWxUb2tlbiwgdGhpcyk7Ci0gICAgICAgIGlmIChvdXRJbnB1dENoYW5uZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgbUlucHV0Q2hhbm5lbC5jb3B5VG8ob3V0SW5wdXRDaGFubmVsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSB3aW5kb3cgZGllZCB2aXNpYmxlLCB3ZSBzZXR1cCBhIGZha2UgaW5wdXQgY2hhbm5lbCwgc28gdGhhdCB0YXBzCi0gICAgICAgICAgICAvLyBjYW4gc3RpbGwgZGV0ZWN0ZWQgYnkgaW5wdXQgbW9uaXRvciBjaGFubmVsLCBhbmQgd2UgY2FuIHJlbGF1bmNoIHRoZSBhcHAuCi0gICAgICAgICAgICAvLyBDcmVhdGUgZmFrZSBldmVudCByZWNlaXZlciB0aGF0IHNpbXBseSByZXBvcnRzIGFsbCBldmVudHMgYXMgaGFuZGxlZC4KLSAgICAgICAgICAgIG1EZWFkV2luZG93RXZlbnRSZWNlaXZlciA9IG5ldyBEZWFkV2luZG93RXZlbnRSZWNlaXZlcihtSW5wdXRDaGFubmVsKTsKLSAgICAgICAgfQorICAgICAgICBtSW5wdXRDaGFubmVsLmNvcHlUbyhvdXRJbnB1dENoYW5uZWwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc1NCwxMCArMjYzNCw2IEBACiAgICAgfQogCiAgICAgdm9pZCBkaXNwb3NlSW5wdXRDaGFubmVsKCkgewotICAgICAgICBpZiAobURlYWRXaW5kb3dFdmVudFJlY2VpdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EZWFkV2luZG93RXZlbnRSZWNlaXZlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBtRGVhZFdpbmRvd0V2ZW50UmVjZWl2ZXIgPSBudWxsOwotICAgICAgICB9CiAgICAgICAgIGlmIChtSW5wdXRDaGFubmVsVG9rZW4gIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gVW5yZWdpc3RlciBzZXJ2ZXIgY2hhbm5lbCBmaXJzdCBvdGhlcndpc2UgaXQgY29tcGxhaW5zIGFib3V0IGJyb2tlbiBjaGFubmVsLgogICAgICAgICAgICAgbVdtU2VydmljZS5tSW5wdXRNYW5hZ2VyLnJlbW92ZUlucHV0Q2hhbm5lbChtSW5wdXRDaGFubmVsVG9rZW4pOwpAQCAtMjc3Myw1MyArMjY0OSw2IEBACiAgICAgICAgIG1JbnB1dFdpbmRvd0hhbmRsZS5zZXRUb2tlbihudWxsKTsKICAgICB9CiAKLSAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSByZXBsYWNlbWVudCB3aW5kb3cgd2FzIHJlbW92ZWQuICovCi0gICAgYm9vbGVhbiByZW1vdmVSZXBsYWNlZFdpbmRvd0lmTmVlZGVkKFdpbmRvd1N0YXRlIHJlcGxhY2VtZW50KSB7Ci0gICAgICAgIGlmIChtV2lsbFJlcGxhY2VXaW5kb3cgJiYgbVJlcGxhY2VtZW50V2luZG93ID09IHJlcGxhY2VtZW50ICYmIHJlcGxhY2VtZW50Lmhhc0RyYXduKCkpIHsKLSAgICAgICAgICAgIHJlcGxhY2VtZW50Lm1Ta2lwRW50ZXJBbmltYXRpb25Gb3JTZWFtbGVzc1JlcGxhY2VtZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICByZW1vdmVSZXBsYWNlZFdpbmRvdygpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gbUNoaWxkcmVuLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGF0ZSBjID0gbUNoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgIGlmIChjLnJlbW92ZVJlcGxhY2VkV2luZG93SWZOZWVkZWQocmVwbGFjZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVSZXBsYWNlZFdpbmRvdygpIHsKLSAgICAgICAgUHJvdG9Mb2cuZChXTV9ERUJVR19BRERfUkVNT1ZFLCAiUmVtb3ZpbmcgcmVwbGFjZWQgd2luZG93OiAlcyIsIHRoaXMpOwotICAgICAgICBtV2lsbFJlcGxhY2VXaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgbUFuaW1hdGVSZXBsYWNpbmdXaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgbVJlcGxhY2luZ1JlbW92ZVJlcXVlc3RlZCA9IGZhbHNlOwotICAgICAgICBtUmVwbGFjZW1lbnRXaW5kb3cgPSBudWxsOwotICAgICAgICBpZiAobUFuaW1hdGluZ0V4aXQgfHwgIW1BbmltYXRlUmVwbGFjaW5nV2luZG93KSB7Ci0gICAgICAgICAgICByZW1vdmVJbW1lZGlhdGVseSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBzZXRSZXBsYWNlbWVudFdpbmRvd0lmTmVlZGVkKFdpbmRvd1N0YXRlIHJlcGxhY2VtZW50Q2FuZGlkYXRlKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVwbGFjZW1lbnRTZXQgPSBmYWxzZTsKLQotICAgICAgICBpZiAobVdpbGxSZXBsYWNlV2luZG93ICYmIG1SZXBsYWNlbWVudFdpbmRvdyA9PSBudWxsCi0gICAgICAgICAgICAgICAgJiYgZ2V0V2luZG93VGFnKCkudG9TdHJpbmcoKS5lcXVhbHMocmVwbGFjZW1lbnRDYW5kaWRhdGUuZ2V0V2luZG93VGFnKCkudG9TdHJpbmcoKSkpIHsKLQotICAgICAgICAgICAgbVJlcGxhY2VtZW50V2luZG93ID0gcmVwbGFjZW1lbnRDYW5kaWRhdGU7Ci0gICAgICAgICAgICByZXBsYWNlbWVudENhbmRpZGF0ZS5tU2tpcEVudGVyQW5pbWF0aW9uRm9yU2VhbWxlc3NSZXBsYWNlbWVudCA9ICFtQW5pbWF0ZVJlcGxhY2luZ1dpbmRvdzsKLSAgICAgICAgICAgIHJlcGxhY2VtZW50U2V0ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSBtQ2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YXRlIGMgPSBtQ2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgcmVwbGFjZW1lbnRTZXQgfD0gYy5zZXRSZXBsYWNlbWVudFdpbmRvd0lmTmVlZGVkKHJlcGxhY2VtZW50Q2FuZGlkYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXBsYWNlbWVudFNldDsKLSAgICB9Ci0KICAgICB2b2lkIHNldERpc3BsYXlMYXlvdXROZWVkZWQoKSB7CiAgICAgICAgIGZpbmFsIERpc3BsYXlDb250ZW50IGRjID0gZ2V0RGlzcGxheUNvbnRlbnQoKTsKICAgICAgICAgaWYgKGRjICE9IG51bGwpIHsKQEAgLTMwODQsMTEgKzI5MTMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2luZG93Rm9yQ2xpZW50TG9ja2VkKG1TZXNzaW9uLCBtQ2xpZW50LCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJXSU4gREVBVEg6ICIgKyB3aW4pOwogICAgICAgICAgICAgICAgICAgICBpZiAod2luICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERpc3BsYXlDb250ZW50IGRjID0gZ2V0RGlzcGxheUNvbnRlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW4ubUFjdGl2aXR5UmVjb3JkICE9IG51bGwgJiYgd2luLm1BY3Rpdml0eVJlY29yZC5maW5kTWFpbldpbmRvdygpID09IHdpbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XbVNlcnZpY2UubVRhc2tTbmFwc2hvdENvbnRyb2xsZXIub25BcHBEaWVkKHdpbi5tQWN0aXZpdHlSZWNvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgd2luLnJlbW92ZUlmUG9zc2libGUoc2hvdWxkS2VlcFZpc2libGVEZWFkQXBwV2luZG93KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgd2luLnJlbW92ZUlmUG9zc2libGUoKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSGFzU3VyZmFjZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIiEhISBMRUFLICEhISBXaW5kb3cgcmVtb3ZlZCBidXQgc3VyZmFjZSBzdGlsbCB2YWxpZC4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlLnRoaXMucmVtb3ZlSWZQb3NzaWJsZSgpOwpAQCAtMzEwMCwzMiArMjkyOCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB3aW5kb3cgaXMgdmlzaWJsZSBhbmQgYmVsb25ncyB0byBhIGRlYWQgYXBwIGFuZCBzaG91bGRuJ3QgYmUgcmVtb3ZlZCwKLSAgICAgKiBiZWNhdXNlIHdlIHdhbnQgdG8gcHJlc2VydmUgaXRzIGxvY2F0aW9uIG9uIHNjcmVlbiB0byBiZSByZS1hY3RpdmF0ZWQgbGF0ZXIgd2hlbiB0aGUgdXNlcgotICAgICAqIGludGVyYWN0cyB3aXRoIGl0LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRLZWVwVmlzaWJsZURlYWRBcHBXaW5kb3coKSB7Ci0gICAgICAgIGlmICghaXNWaXNpYmxlKCkgfHwgbUFjdGl2aXR5UmVjb3JkID09IG51bGwgfHwgIW1BY3Rpdml0eVJlY29yZC5pc0NsaWVudFZpc2libGUoKSkgewotICAgICAgICAgICAgLy8gTm90IGEgdmlzaWJsZSBhcHAgd2luZG93IG9yIHRoZSBhcHAgaXNuJ3QgZGVhZC4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQXR0cnMudG9rZW4gIT0gbUNsaWVudC5hc0JpbmRlcigpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgd2luZG93IHdhcyBhZGQgYnkgYSBjbGllbnQgdXNpbmcgYW5vdGhlciBjbGllbnQncyBhcHAgdG9rZW4uIFdlIGRvbid0IHdhbnQgdG8KLSAgICAgICAgICAgIC8vIGtlZXAgdGhlIGRlYWQgd2luZG93IGFyb3VuZCBmb3IgdGhpcyBjYXNlIHNpbmNlIHRoaXMgaXMgbWVhbnQgZm9yICdyZWFsJyBhcHBzLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1BdHRycy50eXBlID09IFRZUEVfQVBQTElDQVRJT05fU1RBUlRJTkcpIHsKLSAgICAgICAgICAgIC8vIFdlIGRvbid0IGtlZXAgc3RhcnRpbmcgd2luZG93cyBzaW5jZSB0aGV5IHdlcmUgYWRkZWQgYnkgdGhlIHdpbmRvdyBtYW5hZ2VyIGJlZm9yZQotICAgICAgICAgICAgLy8gdGhlIGFwcCBldmVuIGxhdW5jaGVkLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldFdpbmRvd0NvbmZpZ3VyYXRpb24oKS5rZWVwVmlzaWJsZURlYWRBcHBXaW5kb3dPblNjcmVlbigpOwotICAgIH0KLQogICAgIC8qKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHdpbmRvdyBkZXNpcmVzIGtleSBldmVudHMuICovCiAgICAgYm9vbGVhbiBjYW5SZWNlaXZlS2V5cygpIHsKICAgICAgICAgcmV0dXJuIGNhblJlY2VpdmVLZXlzKGZhbHNlIC8qIGZyb21Vc2VyVG91Y2ggKi8pOwpAQCAtMzk3Miw3ICszNzc0LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBub3RpZnlJbnNldHNDb250cm9sQ2hhbmdlZCgpIHsKICAgICAgICAgUHJvdG9Mb2cuZChXTV9ERUJVR19XSU5ET1dfSU5TRVRTLCAibm90aWZ5SW5zZXRzQ29udHJvbENoYW5nZWQgZm9yICVzICIsIHRoaXMpOwotICAgICAgICBpZiAobUFwcERpZWQgfHwgbVJlbW92ZWQpIHsKKyAgICAgICAgaWYgKG1SZW1vdmVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgSW5zZXRzU3RhdGVDb250cm9sbGVyIHN0YXRlQ29udHJvbGxlciA9CkBAIC00Mjc4LDcgKzQwODAsNiBAQAogICAgICAgICAgICAgcHcucHJpbnRsbihwcmVmaXggKyAibVRva2VuPSIgKyBtVG9rZW4pOwogICAgICAgICAgICAgaWYgKG1BY3Rpdml0eVJlY29yZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihwcmVmaXggKyAibUFjdGl2aXR5UmVjb3JkPSIgKyBtQWN0aXZpdHlSZWNvcmQpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCArICJtQXBwRGllZD0iICsgbUFwcERpZWQpOwogICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCArICJkcmF3blN0YXRlRXZhbHVhdGVkPSIgKyBnZXREcmF3blN0YXRlRXZhbHVhdGVkKCkpOwogICAgICAgICAgICAgICAgIHB3LnByaW50bG4ocHJlZml4ICsgIm1pZ2h0QWZmZWN0QWxsRHJhd249IiArIG1pZ2h0QWZmZWN0QWxsRHJhd24oKSk7CiAgICAgICAgICAgICB9CkBAIC00NDc4LDQ5ICs0Mjc5LDYgQEAKICAgICAgICAgcmV0dXJuIHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5pc0dvbmVGb3JMYXlvdXQoKTsKICAgICB9CiAKLSAgICB2b2lkIHNldFdpbGxSZXBsYWNlV2luZG93KGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBmb3IgKGludCBpID0gbUNoaWxkcmVuLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGF0ZSBjID0gbUNoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgIGMuc2V0V2lsbFJlcGxhY2VXaW5kb3coYW5pbWF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG1BdHRycy5wcml2YXRlRmxhZ3MgJiBQUklWQVRFX0ZMQUdfV0lMTF9OT1RfUkVQTEFDRV9PTl9SRUxBVU5DSCkgIT0gMAotICAgICAgICAgICAgICAgIHx8IG1BdHRycy50eXBlID09IFRZUEVfQVBQTElDQVRJT05fU1RBUlRJTkcpIHsKLSAgICAgICAgICAgIC8vIFdlIGRvbid0IHNldCByZXBsYWNpbmcgb24gc3RhcnRpbmcgd2luZG93cyBzaW5jZSB0aGV5IGFyZSBhZGRlZCBieSB3aW5kb3cgbWFuYWdlciBhbmQKLSAgICAgICAgICAgIC8vIG5vdCB0aGUgY2xpZW50IHNvIHdvbid0IGJlIHJlcGxhY2VkIGJ5IHRoZSBjbGllbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtV2lsbFJlcGxhY2VXaW5kb3cgPSB0cnVlOwotICAgICAgICBtUmVwbGFjZW1lbnRXaW5kb3cgPSBudWxsOwotICAgICAgICBtQW5pbWF0ZVJlcGxhY2luZ1dpbmRvdyA9IGFuaW1hdGU7Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhcldpbGxSZXBsYWNlV2luZG93KCkgewotICAgICAgICBtV2lsbFJlcGxhY2VXaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgbVJlcGxhY2VtZW50V2luZG93ID0gbnVsbDsKLSAgICAgICAgbUFuaW1hdGVSZXBsYWNpbmdXaW5kb3cgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKGludCBpID0gbUNoaWxkcmVuLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGF0ZSBjID0gbUNoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgIGMuY2xlYXJXaWxsUmVwbGFjZVdpbmRvdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiB3YWl0aW5nRm9yUmVwbGFjZW1lbnQoKSB7Ci0gICAgICAgIGlmIChtV2lsbFJlcGxhY2VXaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IG1DaGlsZHJlbi5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgZmluYWwgV2luZG93U3RhdGUgYyA9IG1DaGlsZHJlbi5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYy53YWl0aW5nRm9yUmVwbGFjZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICB2b2lkIHJlcXVlc3RVcGRhdGVXYWxscGFwZXJJZk5lZWRlZCgpIHsKICAgICAgICAgZmluYWwgRGlzcGxheUNvbnRlbnQgZGMgPSBnZXREaXNwbGF5Q29udGVudCgpOwogICAgICAgICBpZiAoZGMgIT0gbnVsbCAmJiAoKG1Jc1dhbGxwYXBlciAmJiAhbUxhc3RDb25maWdSZXBvcnRlZFRvQ2xpZW50KSB8fCBoYXNXYWxscGFwZXIoKSkpIHsKQEAgLTQ1NTEsNDMgKzQzMDksNiBAQAogICAgICAgICByZXR1cm4gd2luWTsKICAgICB9CiAKLSAgICAvLyBEdXJpbmcgYWN0aXZpdHkgcmVsYXVuY2ggZHVlIHRvIHJlc2l6ZSwgd2Ugc29tZXRpbWVzIHVzZSB3aW5kb3cgcmVwbGFjZW1lbnQKLSAgICAvLyBmb3Igb25seSBjaGlsZCB3aW5kb3dzIChhcyB0aGUgbWFpbiB3aW5kb3cgaXMgaGFuZGxlZCBieSB3aW5kb3cgcHJlc2VydmF0aW9uKQotICAgIC8vIGFuZCB0aGUgYmlnIHN1cmZhY2UuCi0gICAgLy8KLSAgICAvLyBUaG91Z2ggd2luZG93cyBvZiBUWVBFX0FQUExJQ0FUSU9OIG9yIFRZUEVfRFJBV05fQVBQTElDQVRJT04gKGFzIG9wcG9zZWQgdG8KLSAgICAvLyBUWVBFX0JBU0VfQVBQTElDQVRJT04pIGFyZSBub3QgY2hpbGRyZW4gaW4gdGhlIHNlbnNlIG9mIGFuIGF0dGFjaGVkIHdpbmRvdywKLSAgICAvLyB3ZSBhbHNvIHdhbnQgdG8gcmVwbGFjZSB0aGVtIGF0IHN1Y2ggcGhhc2VzLCBhcyB0aGV5IHdvbid0IGJlIGNvdmVyZWQgYnkgd2luZG93Ci0gICAgLy8gcHJlc2VydmF0aW9uLCBhbmQgaW4gZ2VuZXJhbCB3ZSBleHBlY3QgdGhlbSB0byByZXR1cm4gZm9sbG93aW5nIHJlbGF1bmNoLgotICAgIGJvb2xlYW4gc2hvdWxkQmVSZXBsYWNlZFdpdGhDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0NoaWxkV2luZG93IHx8IG1BdHRycy50eXBlID09IFRZUEVfQVBQTElDQVRJT04KLSAgICAgICAgICAgICAgICB8fCBtQXR0cnMudHlwZSA9PSBUWVBFX0RSQVdOX0FQUExJQ0FUSU9OOwotICAgIH0KLQotICAgIHZvaWQgc2V0V2lsbFJlcGxhY2VDaGlsZFdpbmRvd3MoKSB7Ci0gICAgICAgIGlmIChzaG91bGRCZVJlcGxhY2VkV2l0aENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgIHNldFdpbGxSZXBsYWNlV2luZG93KGZhbHNlIC8qIGFuaW1hdGUgKi8pOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSBtQ2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YXRlIGMgPSBtQ2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgYy5zZXRXaWxsUmVwbGFjZUNoaWxkV2luZG93cygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgV2luZG93U3RhdGUgZ2V0UmVwbGFjaW5nV2luZG93KCkgewotICAgICAgICBpZiAobUFuaW1hdGluZ0V4aXQgJiYgbVdpbGxSZXBsYWNlV2luZG93ICYmIG1BbmltYXRlUmVwbGFjaW5nV2luZG93KSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gbUNoaWxkcmVuLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBmaW5hbCBXaW5kb3dTdGF0ZSBjID0gbUNoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YXRlIHJlcGxhY2luZyA9IGMuZ2V0UmVwbGFjaW5nV2luZG93KCk7Ci0gICAgICAgICAgICBpZiAocmVwbGFjaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjaW5nOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQogICAgIGludCBnZXRSb3RhdGlvbkFuaW1hdGlvbkhpbnQoKSB7CiAgICAgICAgIGlmIChtQWN0aXZpdHlSZWNvcmQgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG1BY3Rpdml0eVJlY29yZC5tUm90YXRpb25BbmltYXRpb25IaW50OwpAQCAtNTA3NywxNCArNDc5OCwxMSBAQAogCiAgICAgYm9vbGVhbiBjbGVhckFuaW1hdGluZ0ZsYWdzKCkgewogICAgICAgICBib29sZWFuIGRpZFNvbWV0aGluZyA9IGZhbHNlOwotICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGNsZWFyIGl0IG91dCBmb3Igd2luZG93cyB0aGF0IGdldCByZXBsYWNlZCwgYmVjYXVzZSB0aGUKLSAgICAgICAgLy8gYW5pbWF0aW9uIGRlcGVuZHMgb24gdGhlIGZsYWcgdG8gcmVtb3ZlIHRoZSByZXBsYWNlZCB3aW5kb3cuCi0gICAgICAgIC8vCiAgICAgICAgIC8vIFdlIGFsc28gZG9uJ3QgY2xlYXIgdGhlIG1BbmltYXRpbmdFeGl0IGZsYWcgZm9yIHdpbmRvd3Mgd2hpY2ggaGF2ZSB0aGUKICAgICAgICAgLy8gbVJlbW92ZU9uRXhpdCBmbGFnLiBUaGlzIGluZGljYXRlcyBhbiBleHBsaWNpdCByZW1vdmUgcmVxdWVzdCBoYXMgYmVlbiBpc3N1ZWQKICAgICAgICAgLy8gYnkgdGhlIGNsaWVudC4gV2Ugc2hvdWxkIGxldCBhbmltYXRpb24gcHJvY2VlZCBhbmQgbm90IGNsZWFyIHRoaXMgZmxhZyBvcgogICAgICAgICAvLyB0aGV5IHdvbid0IGV2ZW50dWFsbHkgYmUgcmVtb3ZlZCBieSBXaW5kb3dTdGF0ZUFuaW1hdG9yI2ZpbmlzaEV4aXQuCi0gICAgICAgIGlmICghbVdpbGxSZXBsYWNlV2luZG93ICYmICFtUmVtb3ZlT25FeGl0KSB7CisgICAgICAgIGlmICghbVJlbW92ZU9uRXhpdCkgewogICAgICAgICAgICAgLy8gQ2xlYXIgbUFuaW1hdGluZyBmbGFnIHRvZ2V0aGVyIHdpdGggbUFuaW1hdGluZ0V4aXQuIFdoZW4gYW5pbWF0aW9uCiAgICAgICAgICAgICAvLyBjaGFuZ2VzIGZyb20gZXhpdGluZyB0byBlbnRlcmluZywgd2UgbmVlZCB0byBjbGVhciB0aGlzIGZsYWcgdW50aWwgdGhlCiAgICAgICAgICAgICAvLyBuZXcgYW5pbWF0aW9uIGdldHMgYXBwbGllZCwgc28gdGhhdCBpc0FuaW1hdGlvblN0YXJ0aW5nKCkgYmVjb21lcyB0cnVlCkBAIC01Mzk5LDcgKzUxMTcsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eS5uZWVkc1pCb29zdCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtV2lsbFJlcGxhY2VXaW5kb3c7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNTdGFydGluZ1dpbmRvd0Fzc29jaWF0ZWRUb1Rhc2soKSB7CkBAIC01NDA3LDEwICs1MTI1LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXBwbHlEaW1zKCkgewotICAgICAgICBpZiAoIW1BbmltYXRpbmdFeGl0ICYmIG1BcHBEaWVkKSB7Ci0gICAgICAgICAgICBtSXNEaW1taW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGdldERpbW1lcigpLmRpbUFib3ZlKGdldFN5bmNUcmFuc2FjdGlvbigpLCB0aGlzLCBERUZBVUxUX0RJTV9BTU9VTlRfREVBRF9XSU5ET1cpOwotICAgICAgICB9IGVsc2UgaWYgKCgobUF0dHJzLmZsYWdzICYgRkxBR19ESU1fQkVISU5EKSAhPSAwIHx8IHNob3VsZERyYXdCbHVyQmVoaW5kKCkpCisgICAgICAgIGlmICgoKG1BdHRycy5mbGFncyAmIEZMQUdfRElNX0JFSElORCkgIT0gMCB8fCBzaG91bGREcmF3Qmx1ckJlaGluZCgpKQogICAgICAgICAgICAgICAgICAgICYmIGlzVmlzaWJsZU5vdygpICYmICFtSGlkZGVuKSB7CiAgICAgICAgICAgICAvLyBPbmx5IHNob3cgdGhlIERpbW1lciB3aGVuIHRoZSBmb2xsb3dpbmcgaXMgc2F0aXNmaWVkOgogICAgICAgICAgICAgLy8gMS4gVGhlIHdpbmRvdyBoYXMgdGhlIGZsYWcgRkxBR19ESU1fQkVISU5EIG9yIGJsdXIgYmVoaW5kIGlzIHJlcXVlc3RlZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dTdGF0ZUFuaW1hdG9yLmphdmEgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1N0YXRlQW5pbWF0b3IuamF2YQppbmRleCBlODYyNWJjLi4zYWFjODE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1N0YXRlQW5pbWF0b3IuamF2YQorKysgYi9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1N0YXRlQW5pbWF0b3IuamF2YQpAQCAtNDQ5LDcgKzQ0OSw2IEBACiAgICAgICAgICAgICBpZiAocHJlcGFyZWQgJiYgbURyYXdTdGF0ZSA9PSBIQVNfRFJBV04pIHsKICAgICAgICAgICAgICAgICBpZiAobUxhc3RIaWRkZW4pIHsKICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VDb250cm9sbGVyLnNob3dSb2J1c3RseSh0KTsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1hdG9yLnJlcXVlc3RSZW1vdmFsT2ZSZXBsYWNlZFdpbmRvd3Modyk7CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0SGlkZGVuID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERpc3BsYXlDb250ZW50IGRpc3BsYXlDb250ZW50ID0gdy5nZXREaXNwbGF5Q29udGVudCgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRpc3BsYXlDb250ZW50LmdldExhc3RIYXNDb250ZW50KCkpIHsKQEAgLTUwNCwxMyArNTAzLDYgQEAKICAgICB9CiAKICAgICB2b2lkIGFwcGx5RW50ZXJBbmltYXRpb25Mb2NrZWQoKSB7Ci0gICAgICAgIC8vIElmIHdlIGFyZSB0aGUgbmV3IHBhcnQgb2YgYSB3aW5kb3cgcmVwbGFjZW1lbnQgdHJhbnNpdGlvbiBhbmQgd2UgaGF2ZSByZXF1ZXN0ZWQKLSAgICAgICAgLy8gbm90IHRvIGFuaW1hdGUsIHdlIGluc3RlYWQgd2FudCB0byBtYWtlIGl0IHNlYW1sZXNzLCBzbyB3ZSBkb24ndCB3YW50IHRvIGFwcGx5Ci0gICAgICAgIC8vIGFuIGVudGVyIHRyYW5zaXRpb24uCi0gICAgICAgIGlmIChtV2luLm1Ta2lwRW50ZXJBbmltYXRpb25Gb3JTZWFtbGVzc1JlcGxhY2VtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQogICAgICAgICBmaW5hbCBpbnQgdHJhbnNpdDsKICAgICAgICAgaWYgKG1FbnRlckFuaW1hdGlvblBlbmRpbmcpIHsKICAgICAgICAgICAgIG1FbnRlckFuaW1hdGlvblBlbmRpbmcgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93VG9rZW4uamF2YSBiL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93VG9rZW4uamF2YQppbmRleCBjNmI3ODk4Li4zMjc0ODNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Rva2VuLmphdmEKKysrIGIvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dUb2tlbi5qYXZhCkBAIC0zMTUsMTcgKzMxNSw2IEBACiAgICAgICAgIHJldHVybiBtQ2hpbGRyZW4uaXNFbXB0eSgpOwogICAgIH0KIAotICAgIFdpbmRvd1N0YXRlIGdldFJlcGxhY2luZ1dpbmRvdygpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IG1DaGlsZHJlbi5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgZmluYWwgV2luZG93U3RhdGUgd2luID0gbUNoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgIGZpbmFsIFdpbmRvd1N0YXRlIHJlcGxhY2luZyA9IHdpbi5nZXRSZXBsYWNpbmdXaW5kb3coKTsKLSAgICAgICAgICAgIGlmIChyZXBsYWNpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCiAgICAgLyoqIFJldHVybiB0cnVlIGlmIHRoaXMgdG9rZW4gaGFzIGEgd2luZG93IHRoYXQgd2FudHMgdGhlIHdhbGxwYXBlciBkaXNwbGF5ZWQgYmVoaW5kIGl0LiAqLwogICAgIGJvb2xlYW4gd2luZG93c0NhbkJlV2FsbHBhcGVyVGFyZ2V0KCkgewogICAgICAgICBmb3IgKGludCBqID0gbUNoaWxkcmVuLnNpemUoKSAtIDE7IGogPj0gMDsgai0tKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jb3JlL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfaW5wdXRfSW5wdXRNYW5hZ2VyU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jb3JlL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfaW5wdXRfSW5wdXRNYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggYjRlMmZiNi4uZGE0NGRhNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2lucHV0X0lucHV0TWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NvcmUvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9pbnB1dF9JbnB1dE1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMzA4LDYgKzMwOCw3IEBACiAgICAgdm9pZCBzZXRNb3Rpb25DbGFzc2lmaWVyRW5hYmxlZChib29sIGVuYWJsZWQpOwogICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IGdldEJsdWV0b290aEFkZHJlc3MoaW50MzJfdCBkZXZpY2VJZCk7CiAgICAgdm9pZCBzZXRTdHlsdXNCdXR0b25Nb3Rpb25FdmVudHNFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisgICAgRmxvYXRQb2ludCBnZXRNb3VzZUN1cnNvclBvc2l0aW9uKCk7CiAKICAgICAvKiAtLS0gSW5wdXRSZWFkZXJQb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gLS0tICovCiAKQEAgLTM2Niw3ICszNjcsNyBAQAogICAgIHZpcnR1YWwgUG9pbnRlckljb25TdHlsZSBnZXREZWZhdWx0UG9pbnRlckljb25JZCgpOwogICAgIHZpcnR1YWwgUG9pbnRlckljb25TdHlsZSBnZXREZWZhdWx0U3R5bHVzSWNvbklkKCk7CiAgICAgdmlydHVhbCBQb2ludGVySWNvblN0eWxlIGdldEN1c3RvbVBvaW50ZXJJY29uSWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChpbnQzMl90IGRpc3BsYXlJZCwgZmxvYXQgeFBvcywgZmxvYXQgeVBvcyk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9pbnRlckRpc3BsYXlJZENoYW5nZWQoaW50MzJfdCBkaXNwbGF5SWQsIGNvbnN0IEZsb2F0UG9pbnQmIHBvc2l0aW9uKTsKIAogICAgIC8qIC0tLSBJZiB0b3VjaCBtb2RlIGlzIGVuYWJsZWQgcGVyIGRpc3BsYXkgb3IgZ2xvYmFsIC0tLSAqLwogCkBAIC03MzAsMTEgKzczMSwxMSBAQAogICAgIHJldHVybiBjb250cm9sbGVyOwogfQogCi12b2lkIE5hdGl2ZUlucHV0TWFuYWdlcjo6b25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChpbnQzMl90IHBvaW50ZXJEaXNwbGF5SWQsIGZsb2F0IHhQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5UG9zKSB7Cit2b2lkIE5hdGl2ZUlucHV0TWFuYWdlcjo6b25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZChpbnQzMl90IHBvaW50ZXJEaXNwbGF5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwb3NpdGlvbikgewogICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7CiAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtU2VydmljZU9iaiwgZ1NlcnZpY2VDbGFzc0luZm8ub25Qb2ludGVyRGlzcGxheUlkQ2hhbmdlZCwgcG9pbnRlckRpc3BsYXlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhQb3MsIHlQb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24ueCwgcG9zaXRpb24ueSk7CiAgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJvblBvaW50ZXJEaXNwbGF5SWRDaGFuZ2VkIik7CiB9CiAKQEAgLTE2NTUsNiArMTY1NiwxNCBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihlbmFibGVkKTsKIH0KIAorRmxvYXRQb2ludCBOYXRpdmVJbnB1dE1hbmFnZXI6OmdldE1vdXNlQ3Vyc29yUG9zaXRpb24oKSB7CisgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICBjb25zdCBhdXRvIHBjID0gbUxvY2tlZC5wb2ludGVyQ29udHJvbGxlci5sb2NrKCk7CisgICAgaWYgKCFwYykgcmV0dXJuIHtBTU9USU9OX0VWRU5UX0lOVkFMSURfQ1VSU09SX1BPU0lUSU9OLCBBTU9USU9OX0VWRU5UX0lOVkFMSURfQ1VSU09SX1BPU0lUSU9OfTsKKworICAgIHJldHVybiBwYy0+Z2V0UG9zaXRpb24oKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgTmF0aXZlSW5wdXRNYW5hZ2VyKiBnZXROYXRpdmVJbnB1dE1hbmFnZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopIHsKQEAgLTI1NDcsNiArMjU1NiwxNSBAQAogICAgIGltLT5zZXRTdHlsdXNCdXR0b25Nb3Rpb25FdmVudHNFbmFibGVkKGVuYWJsZWQpOwogfQogCitzdGF0aWMgamZsb2F0QXJyYXkgbmF0aXZlR2V0TW91c2VDdXJzb3JQb3NpdGlvbihKTklFbnYqIGVudiwgam9iamVjdCBuYXRpdmVJbXBsT2JqKSB7CisgICAgTmF0aXZlSW5wdXRNYW5hZ2VyKiBpbSA9IGdldE5hdGl2ZUlucHV0TWFuYWdlcihlbnYsIG5hdGl2ZUltcGxPYmopOworICAgIGNvbnN0IGF1dG8gcCA9IGltLT5nZXRNb3VzZUN1cnNvclBvc2l0aW9uKCk7CisgICAgY29uc3Qgc3RkOjphcnJheTxmbG9hdCwgMj4gYXJyID0ge3twLngsIHAueX19OworICAgIGpmbG9hdEFycmF5IG91dEFyciA9IGVudi0+TmV3RmxvYXRBcnJheSgyKTsKKyAgICBlbnYtPlNldEZsb2F0QXJyYXlSZWdpb24ob3V0QXJyLCAwLCBhcnIuc2l6ZSgpLCBhcnIuZGF0YSgpKTsKKyAgICByZXR1cm4gb3V0QXJyOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBjb25zdCBKTklOYXRpdmVNZXRob2QgZ0lucHV0TWFuYWdlck1ldGhvZHNbXSA9IHsKQEAgLTI2NDAsNiArMjY1OCw3IEBACiAgICAgICAgIHsiZ2V0Qmx1ZXRvb3RoQWRkcmVzcyIsICIoSSlMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCopbmF0aXZlR2V0Qmx1ZXRvb3RoQWRkcmVzc30sCiAgICAgICAgIHsic2V0U3R5bHVzQnV0dG9uTW90aW9uRXZlbnRzRW5hYmxlZCIsICIoWilWIiwKICAgICAgICAgICh2b2lkKiluYXRpdmVTZXRTdHlsdXNCdXR0b25Nb3Rpb25FdmVudHNFbmFibGVkfSwKKyAgICAgICAgeyJnZXRNb3VzZUN1cnNvclBvc2l0aW9uIiwgIigpW0YiLCAodm9pZCopbmF0aXZlR2V0TW91c2VDdXJzb3JQb3NpdGlvbn0sCiB9OwogCiAjZGVmaW5lIEZJTkRfQ0xBU1ModmFyLCBjbGFzc05hbWUpIFwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NvcmUvam5pL2duc3MvR25zc0NvbmZpZ3VyYXRpb24uY3BwIGIvc2VydmljZXMvY29yZS9qbmkvZ25zcy9HbnNzQ29uZmlndXJhdGlvbi5jcHAKaW5kZXggMzY3NzY0MS4uYjU3ZTQ1MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY29yZS9qbmkvZ25zcy9HbnNzQ29uZmlndXJhdGlvbi5jcHAKKysrIGIvc2VydmljZXMvY29yZS9qbmkvZ25zcy9HbnNzQ29uZmlndXJhdGlvbi5jcHAKQEAgLTY3LDcgKzY3LDcgQEAKICAgICAgIDogbUlHbnNzQ29uZmlndXJhdGlvbihpR25zc0NvbmZpZ3VyYXRpb24pIHt9CiAKIGpvYmplY3QgR25zc0NvbmZpZ3VyYXRpb246OmdldFZlcnNpb24oSk5JRW52KiBlbnYpIHsKLSAgICByZXR1cm4gY3JlYXRlSGFsSW50ZXJmYWNlVmVyc2lvbkphdmFPYmplY3QoZW52LCAzLCAwKTsKKyAgICByZXR1cm4gY3JlYXRlSGFsSW50ZXJmYWNlVmVyc2lvbkphdmFPYmplY3QoZW52LCAzLCBtSUduc3NDb25maWd1cmF0aW9uLT5nZXRJbnRlcmZhY2VWZXJzaW9uKCkpOwogfQogCiBqYm9vbGVhbiBHbnNzQ29uZmlndXJhdGlvbjo6c2V0RW1lcmdlbmN5U3VwbFBkbihqaW50IGVuYWJsZSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvQ2xlYXJSZXF1ZXN0U2Vzc2lvbi5qYXZhIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvQ2xlYXJSZXF1ZXN0U2Vzc2lvbi5qYXZhCmluZGV4IDk0MjYwZTIwLi5lMDljMGEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9DbGVhclJlcXVlc3RTZXNzaW9uLmphdmEKKysrIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvQ2xlYXJSZXF1ZXN0U2Vzc2lvbi5qYXZhCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICBwcml2YXRlIHZvaWQgcmVzcG9uZFRvQ2xpZW50V2l0aFJlc3BvbnNlQW5kRmluaXNoKCkgewogICAgICAgICBMb2cuaShUQUcsICJyZXNwb25kVG9DbGllbnRXaXRoUmVzcG9uc2VBbmRGaW5pc2giKTsKICAgICAgICAgaWYgKGlzU2Vzc2lvbkNhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJNZXRyaWMuc2V0Q2hvc2VuUHJvdmlkZXJTdGF0dXMoCisgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldENob3NlblByb3ZpZGVyU3RhdHVzKAogICAgICAgICAgICAgICAgICAgICBQcm92aWRlclN0YXR1c0Zvck1ldHJpY3MuRklOQUxfU1VDQ0VTUy5nZXRNZXRyaWNDb2RlKCkpOwogICAgICAgICAgICAgbG9nQXBpQ2FsbChBcGlOYW1lLkNMRUFSX0NSRURFTlRJQUwsIC8qIGFwaVN0YXR1cyAqLwogICAgICAgICAgICAgICAgICAgICBBcGlTdGF0dXMuQ0xJRU5UX0NBTkNFTEVEKTsKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgICAgICAgICAgbG9nQXBpQ2FsbChBcGlOYW1lLkNMRUFSX0NSRURFTlRJQUwsIC8qIGFwaVN0YXR1cyAqLwogICAgICAgICAgICAgICAgICAgICBBcGlTdGF0dXMuU1VDQ0VTUyk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJNZXRyaWMuc2V0Q2hvc2VuUHJvdmlkZXJTdGF0dXMoCisgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldENob3NlblByb3ZpZGVyU3RhdHVzKAogICAgICAgICAgICAgICAgICAgICBQcm92aWRlclN0YXR1c0Zvck1ldHJpY3MuRklOQUxfRkFJTFVSRS5nZXRNZXRyaWNDb2RlKCkpOwogICAgICAgICAgICAgTG9nLmkoVEFHLCAiSXNzdWUgd2hpbGUgcHJvcGFnYXRpbmcgdGhlIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQiKTsKICAgICAgICAgICAgIGxvZ0FwaUNhbGwoQXBpTmFtZS5DTEVBUl9DUkVERU5USUFMLCAvKiBhcGlTdGF0dXMgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL0NyZWF0ZVJlcXVlc3RTZXNzaW9uLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9DcmVhdGVSZXF1ZXN0U2Vzc2lvbi5qYXZhCmluZGV4IDQ3YjhjN2QuLjRmODIzNWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL0NyZWF0ZVJlcXVlc3RTZXNzaW9uLmphdmEKKysrIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvQ3JlYXRlUmVxdWVzdFNlc3Npb24uamF2YQpAQCAtODMsNiArODMsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoVWlXaXRoUHJvdmlkZXJEYXRhKEFycmF5TGlzdDxQcm92aWRlckRhdGE+IHByb3ZpZGVyRGF0YUxpc3QpIHsKKyAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRVaUNhbGxTdGFydFRpbWVOYW5vc2Vjb25kcyhTeXN0ZW0ubmFub1RpbWUoKSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtQ2xpZW50Q2FsbGJhY2sub25QZW5kaW5nSW50ZW50KG1DcmVkZW50aWFsTWFuYWdlclVpLmNyZWF0ZVBlbmRpbmdJbnRlbnQoCiAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJbmZvLm5ld0NyZWF0ZVJlcXVlc3RJbmZvKApAQCAtOTAsNiArOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRBcHBJbmZvLmdldFBhY2thZ2VOYW1lKCkpLAogICAgICAgICAgICAgICAgICAgICBwcm92aWRlckRhdGFMaXN0KSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldFVpUmV0dXJuZWQoZmFsc2UpOwogICAgICAgICAgICAgcmVzcG9uZFRvQ2xpZW50V2l0aEVycm9yQW5kRmluaXNoKAogICAgICAgICAgICAgICAgICAgICBDcmVhdGVDcmVkZW50aWFsRXhjZXB0aW9uLlRZUEVfVU5LTk9XTiwKICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBpbnZva2Ugc2VsZWN0b3IiKTsKQEAgLTk5LDE0ICsxMDEsMTYgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkZpbmFsUmVzcG9uc2VSZWNlaXZlZChDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUsCiAgICAgICAgICAgICBATnVsbGFibGUgQ3JlYXRlQ3JlZGVudGlhbFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIG1DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuc2V0VWlSZXR1cm5lZCh0cnVlKTsKKyAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRVaUNhbGxFbmRUaW1lTmFub3NlY29uZHMoU3lzdGVtLm5hbm9UaW1lKCkpOwogICAgICAgICBMb2cuaShUQUcsICJvbkZpbmFsQ3JlZGVudGlhbFJlY2VpdmVkIGZyb206ICIgKyBjb21wb25lbnROYW1lLmZsYXR0ZW5Ub1N0cmluZygpKTsKICAgICAgICAgc2V0Q2hvc2VuTWV0cmljKGNvbXBvbmVudE5hbWUpOwogICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyTWV0cmljLnNldENob3NlblByb3ZpZGVyU3RhdHVzKAorICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRDaG9zZW5Qcm92aWRlclN0YXR1cygKICAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJTdGF0dXNGb3JNZXRyaWNzLkZJTkFMX1NVQ0NFU1MuZ2V0TWV0cmljQ29kZSgpKTsKICAgICAgICAgICAgIHJlc3BvbmRUb0NsaWVudFdpdGhSZXNwb25zZUFuZEZpbmlzaChyZXNwb25zZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJNZXRyaWMuc2V0Q2hvc2VuUHJvdmlkZXJTdGF0dXMoCisgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldENob3NlblByb3ZpZGVyU3RhdHVzKAogICAgICAgICAgICAgICAgICAgICBQcm92aWRlclN0YXR1c0Zvck1ldHJpY3MuRklOQUxfRkFJTFVSRS5nZXRNZXRyaWNDb2RlKCkpOwogICAgICAgICAgICAgcmVzcG9uZFRvQ2xpZW50V2l0aEVycm9yQW5kRmluaXNoKENyZWF0ZUNyZWRlbnRpYWxFeGNlcHRpb24uVFlQRV9OT19DUkVBVEVfT1BUSU9OUywKICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVzcG9uc2UiKTsKQEAgLTEzOCw2ICsxNDIsOCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc3BvbmRUb0NsaWVudFdpdGhSZXNwb25zZUFuZEZpbmlzaChDcmVhdGVDcmVkZW50aWFsUmVzcG9uc2UgcmVzcG9uc2UpIHsKICAgICAgICAgTG9nLmkoVEFHLCAicmVzcG9uZFRvQ2xpZW50V2l0aFJlc3BvbnNlQW5kRmluaXNoIik7CisgICAgICAgIC8vIFRPRE8gaW1tZWRpYXRlbHkgYWRkIGV4Y2VwdGlvbiBiaXQgdG8gY2hvc2VuIHByb3ZpZGVyIGFuZCBkbyBmaW5hbCBlbWl0cyBhY3Jvc3MgYWxsCisgICAgICAgIC8vIGluY2x1ZGluZyBzZXF1ZW5jZUNvdW50ZXIhCiAgICAgICAgIGlmIChtUmVxdWVzdFNlc3Npb25TdGF0dXMgPT0gUmVxdWVzdFNlc3Npb25TdGF0dXMuQ09NUExFVEUpIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlcXVlc3QgaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuIFRoaXMgaXMgc3RyYW5nZS4iKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE2Miw2ICsxNjgsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc3BvbmRUb0NsaWVudFdpdGhFcnJvckFuZEZpbmlzaChTdHJpbmcgZXJyb3JUeXBlLCBTdHJpbmcgZXJyb3JNc2cpIHsKICAgICAgICAgTG9nLmkoVEFHLCAicmVzcG9uZFRvQ2xpZW50V2l0aEVycm9yQW5kRmluaXNoIik7CisgICAgICAgIC8vIFRPRE8gYWRkIGV4Y2VwdGlvbiBiaXQKICAgICAgICAgaWYgKG1SZXF1ZXN0U2Vzc2lvblN0YXR1cyA9PSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5DT01QTEVURSkgewogICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVxdWVzdCBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4gVGhpcyBpcyBzdHJhbmdlLiIpOwogICAgICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvQ3JlZGVudGlhbE1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9DcmVkZW50aWFsTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAxMGQzZGMwLi44NWE0OGQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9DcmVkZW50aWFsTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9DcmVkZW50aWFsTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNDEsNiArNDEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY3JlZGVudGlhbHMuSUNyZWF0ZUNyZWRlbnRpYWxDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLmNyZWRlbnRpYWxzLklDcmVkZW50aWFsTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNyZWRlbnRpYWxzLklHZXRDcmVkZW50aWFsQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5jcmVkZW50aWFscy5JR2V0UGVuZGluZ0NyZWRlbnRpYWxDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLmNyZWRlbnRpYWxzLklTZXRFbmFibGVkUHJvdmlkZXJzQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5jcmVkZW50aWFscy5SZWdpc3RlckNyZWRlbnRpYWxEZXNjcmlwdGlvblJlcXVlc3Q7CiBpbXBvcnQgYW5kcm9pZC5jcmVkZW50aWFscy5VbnJlZ2lzdGVyQ3JlZGVudGlhbERlc2NyaXB0aW9uUmVxdWVzdDsKQEAgLTQzOCw2ICs0MzksMTcgQEAKICAgICAgICAgICAgIHJldHVybiBjYW5jZWxUcmFuc3BvcnQ7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIElDYW5jZWxsYXRpb25TaWduYWwgZXhlY3V0ZUdldFBlbmRpbmdDcmVkZW50aWFsKAorICAgICAgICAgICAgICAgIEdldENyZWRlbnRpYWxSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgSUdldFBlbmRpbmdDcmVkZW50aWFsQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKSB7CisgICAgICAgICAgICAvLyBUT0RPKGIvMjczMzA4ODk1KTogaW1wbGVtZW50CisKKyAgICAgICAgICAgIElDYW5jZWxsYXRpb25TaWduYWwgY2FuY2VsVHJhbnNwb3J0ID0gQ2FuY2VsbGF0aW9uU2lnbmFsLmNyZWF0ZVRyYW5zcG9ydCgpOworICAgICAgICAgICAgcmV0dXJuIGNhbmNlbFRyYW5zcG9ydDsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzR2V0Q3JlZGVudGlhbCgKICAgICAgICAgICAgICAgICBHZXRDcmVkZW50aWFsUmVxdWVzdCByZXF1ZXN0LAogICAgICAgICAgICAgICAgIElHZXRDcmVkZW50aWFsQ2FsbGJhY2sgY2FsbGJhY2ssCkBAIC01ODAsOSArNTkyLDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgZmluYWxpemVBbmRFbWl0SW5pdGlhbFBoYXNlTWV0cmljKFJlcXVlc3RTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgICAgIHZhciBpbml0TWV0cmljID0gc2Vzc2lvbi5tSW5pdGlhbFBoYXNlTWV0cmljOwotICAgICAgICAgICAgaW5pdE1ldHJpYy5zZXRDcmVkZW50aWFsU2VydmljZUJlZ2luUXVlcnlUaW1lTmFub3NlY29uZHMoU3lzdGVtLm5hbm9UaW1lKCkpOwotICAgICAgICAgICAgTWV0cmljVXRpbGl0aWVzLmxvZ0FwaUNhbGxlZChpbml0TWV0cmljKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmFyIGluaXRNZXRyaWMgPSBzZXNzaW9uLm1Jbml0aWFsUGhhc2VNZXRyaWM7CisgICAgICAgICAgICAgICAgaW5pdE1ldHJpYy5zZXRDcmVkZW50aWFsU2VydmljZUJlZ2luUXVlcnlUaW1lTmFub3NlY29uZHMoU3lzdGVtLm5hbm9UaW1lKCkpOworICAgICAgICAgICAgICAgIE1ldHJpY1V0aWxpdGllcy5sb2dBcGlDYWxsZWQoaW5pdE1ldHJpYyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIG1ldHJpYyBsb2dnaW5nOiAiICsgZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL0dldFJlcXVlc3RTZXNzaW9uLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9HZXRSZXF1ZXN0U2Vzc2lvbi5qYXZhCmluZGV4IDhlOTBjMDkuLjAwZmJiYmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL0dldFJlcXVlc3RTZXNzaW9uLmphdmEKKysrIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvR2V0UmVxdWVzdFNlc3Npb24uamF2YQpAQCAtODIsMTIgKzgyLDE0IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBsYXVuY2hVaVdpdGhQcm92aWRlckRhdGEoQXJyYXlMaXN0PFByb3ZpZGVyRGF0YT4gcHJvdmlkZXJEYXRhTGlzdCkgeworICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldFVpQ2FsbFN0YXJ0VGltZU5hbm9zZWNvbmRzKFN5c3RlbS5uYW5vVGltZSgpKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1DbGllbnRDYWxsYmFjay5vblBlbmRpbmdJbnRlbnQobUNyZWRlbnRpYWxNYW5hZ2VyVWkuY3JlYXRlUGVuZGluZ0ludGVudCgKICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdEluZm8ubmV3R2V0UmVxdWVzdEluZm8oCiAgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0SWQsIG1DbGllbnRSZXF1ZXN0LCBtQ2xpZW50QXBwSW5mby5nZXRQYWNrYWdlTmFtZSgpKSwKICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJEYXRhTGlzdCkpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRVaVJldHVybmVkKGZhbHNlKTsKICAgICAgICAgICAgIHJlc3BvbmRUb0NsaWVudFdpdGhFcnJvckFuZEZpbmlzaCgKICAgICAgICAgICAgICAgICAgICAgR2V0Q3JlZGVudGlhbEV4Y2VwdGlvbi5UWVBFX1VOS05PV04sICJVbmFibGUgdG8gaW5zdGFudGlhdGUgc2VsZWN0b3IiKTsKICAgICAgICAgfQpAQCAtOTYsMTQgKzk4LDE2IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25GaW5hbFJlc3BvbnNlUmVjZWl2ZWQoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lLAogICAgICAgICAgICAgQE51bGxhYmxlIEdldENyZWRlbnRpYWxSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldFVpUmV0dXJuZWQodHJ1ZSk7CisgICAgICAgIG1DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuc2V0VWlDYWxsRW5kVGltZU5hbm9zZWNvbmRzKFN5c3RlbS5uYW5vVGltZSgpKTsKICAgICAgICAgTG9nLmkoVEFHLCAib25GaW5hbENyZWRlbnRpYWxSZWNlaXZlZCBmcm9tOiAiICsgY29tcG9uZW50TmFtZS5mbGF0dGVuVG9TdHJpbmcoKSk7CiAgICAgICAgIHNldENob3Nlbk1ldHJpYyhjb21wb25lbnROYW1lKTsKICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaG9zZW5Qcm92aWRlck1ldHJpYy5zZXRDaG9zZW5Qcm92aWRlclN0YXR1cygKKyAgICAgICAgICAgIG1DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuc2V0Q2hvc2VuUHJvdmlkZXJTdGF0dXMoCiAgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyU3RhdHVzRm9yTWV0cmljcy5GSU5BTF9TVUNDRVNTLmdldE1ldHJpY0NvZGUoKSk7CiAgICAgICAgICAgICByZXNwb25kVG9DbGllbnRXaXRoUmVzcG9uc2VBbmRGaW5pc2gocmVzcG9uc2UpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyTWV0cmljLnNldENob3NlblByb3ZpZGVyU3RhdHVzKAorICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRDaG9zZW5Qcm92aWRlclN0YXR1cygKICAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJTdGF0dXNGb3JNZXRyaWNzLkZJTkFMX0ZBSUxVUkUuZ2V0TWV0cmljQ29kZSgpKTsKICAgICAgICAgICAgIHJlc3BvbmRUb0NsaWVudFdpdGhFcnJvckFuZEZpbmlzaChHZXRDcmVkZW50aWFsRXhjZXB0aW9uLlRZUEVfTk9fQ1JFREVOVElBTCwKICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcmVzcG9uc2UgZnJvbSBwcm92aWRlciIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvTWV0cmljVXRpbGl0aWVzLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9NZXRyaWNVdGlsaXRpZXMuamF2YQppbmRleCAxYjNlMzdhLi45OWYzYjNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9NZXRyaWNVdGlsaXRpZXMuamF2YQorKysgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9NZXRyaWNVdGlsaXRpZXMuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkFwaU5hbWU7CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmNyZWRlbnRpYWxzLm1ldHJpY3MuQXBpU3RhdHVzOwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkNhbmRpZGF0ZVBoYXNlTWV0cmljOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkNob3NlblByb3ZpZGVyTWV0cmljOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYzsKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY3JlZGVudGlhbHMubWV0cmljcy5Jbml0aWFsUGhhc2VNZXRyaWM7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtODEsMTkgKzgxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIG1vc3QgY29tbW9uIGxvZ2dpbmcgaGVscGVyLCBoYW5kbGVzIHRoZSBvdmVyYWxsIHN0YXR1cyBvZiB0aGUgQVBJIHJlcXVlc3Qgd2l0aCB0aGUKLSAgICAgKiBwcm92aWRlciBzdGF0dXMgYW5kIGxhdGVuY2llcy4gT3RoZXIgdmVyc2lvbnMgb2YgdGhpcyBtZXRob2QgbWF5IGJlIG1vcmUgdXNlZnVsIGRlcGVuZGluZwotICAgICAqIG9uIHRoZSBzaXR1YXRpb24sIGFzIHRoaXMgaXMgZ2VhcmVkIHRvd2FyZHMgdGhlIGxvZ2dpbmcgb2Yge0BsaW5rIFByb3ZpZGVyU2Vzc2lvbn0gdHlwZXMuCisgICAgICogQSBsb2dnaW5nIHV0aWxpdHkgdXNlZCBwcmltYXJpbHkgZm9yIHRoZSBjYW5kaWRhdGUgcGhhc2Ugb2YgdGhlIGN1cnJlbnQgbWV0cmljIHNldHVwLgogICAgICAqCi0gICAgICogQHBhcmFtIGFwaU5hbWUgICAgICAgICAgICAgIHRoZSBhcGkgdHlwZSB0byBsb2cKLSAgICAgKiBAcGFyYW0gYXBpU3RhdHVzICAgICAgICAgICAgdGhlIGFwaSBzdGF0dXMgdG8gbG9nCiAgICAgICogQHBhcmFtIHByb3ZpZGVycyAgICAgICAgICAgIGEgbWFwIHdpdGgga25vd24gcHJvdmlkZXJzCi0gICAgICogQHBhcmFtIGNhbGxpbmdVaWQgICAgICAgICAgIHRoZSBjYWxsaW5nIFVJRCBvZiB0aGUgY2xpZW50IGFwcAotICAgICAqIEBwYXJhbSBjaG9zZW5Qcm92aWRlck1ldHJpYyB0aGUgbWV0cmljIGRhdGEgdHlwZSBvZiB0aGUgZmluYWwgY2hvc2VuIHByb3ZpZGVyCisgICAgICogQHBhcmFtIGVtaXRTZXF1ZW5jZUlkICAgICAgIGFuIGVtaXR0ZWQgc2VxdWVuY2UgaWQgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nQXBpQ2FsbGVkKEFwaU5hbWUgYXBpTmFtZSwgQXBpU3RhdHVzIGFwaVN0YXR1cywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3ZpZGVyU2Vzc2lvbj4gcHJvdmlkZXJzLCBpbnQgY2FsbGluZ1VpZCwKLSAgICAgICAgICAgIENob3NlblByb3ZpZGVyTWV0cmljIGNob3NlblByb3ZpZGVyTWV0cmljKSB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvZ0FwaUNhbGxlZChNYXA8U3RyaW5nLCBQcm92aWRlclNlc3Npb24+IHByb3ZpZGVycywKKyAgICAgICAgICAgIGludCBlbWl0U2VxdWVuY2VJZCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgdmFyIHByb3ZpZGVyU2Vzc2lvbnMgPSBwcm92aWRlcnMudmFsdWVzKCk7CiAgICAgICAgICAgICBpbnQgcHJvdmlkZXJTaXplID0gcHJvdmlkZXJTZXNzaW9ucy5zaXplKCk7CkBAIC0xMDIsNyArOTYsNDIgQEAKICAgICAgICAgICAgIGludFtdIGNhbmRpZGF0ZVN0YXR1c0xpc3QgPSBuZXcgaW50W3Byb3ZpZGVyU2l6ZV07CiAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOwogICAgICAgICAgICAgZm9yICh2YXIgc2Vzc2lvbiA6IHByb3ZpZGVyU2Vzc2lvbnMpIHsKLSAgICAgICAgICAgICAgICBDYW5kaWRhdGVQaGFzZU1ldHJpYyBtZXRyaWMgPSBzZXNzaW9uLm1DYW5kaWRhdGVQcm92aWRlck1ldHJpYzsKKyAgICAgICAgICAgICAgICBDYW5kaWRhdGVQaGFzZU1ldHJpYyBtZXRyaWMgPSBzZXNzaW9uLm1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljOworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVVpZExpc3RbaW5kZXhdID0gbWV0cmljLmdldENhbmRpZGF0ZVVpZCgpOworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVF1ZXJ5Um91bmRUcmlwVGltZUxpc3RbaW5kZXhdID0gbWV0cmljLmdldFF1ZXJ5TGF0ZW5jeU1pY3Jvc2Vjb25kcygpOworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVN0YXR1c0xpc3RbaW5kZXhdID0gbWV0cmljLmdldFByb3ZpZGVyUXVlcnlTdGF0dXMoKTsKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETyBIYW5kbGUgdGhlIGVtaXQgaGVyZQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgbWV0cmljIGxvZ2dpbmc6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtb3N0IGNvbW1vbiBsb2dnaW5nIGhlbHBlciwgaGFuZGxlcyB0aGUgb3ZlcmFsbCBzdGF0dXMgb2YgdGhlIEFQSSByZXF1ZXN0IHdpdGggdGhlCisgICAgICogcHJvdmlkZXIgc3RhdHVzIGFuZCBsYXRlbmNpZXMuIE90aGVyIHZlcnNpb25zIG9mIHRoaXMgbWV0aG9kIG1heSBiZSBtb3JlIHVzZWZ1bCBkZXBlbmRpbmcKKyAgICAgKiBvbiB0aGUgc2l0dWF0aW9uLCBhcyB0aGlzIGlzIGdlYXJlZCB0b3dhcmRzIHRoZSBsb2dnaW5nIG9mIHtAbGluayBQcm92aWRlclNlc3Npb259IHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGFwaU5hbWUgICAgICAgICAgICAgIHRoZSBhcGkgdHlwZSB0byBsb2cKKyAgICAgKiBAcGFyYW0gYXBpU3RhdHVzICAgICAgICAgICAgdGhlIGFwaSBzdGF0dXMgdG8gbG9nCisgICAgICogQHBhcmFtIHByb3ZpZGVycyAgICAgICAgICAgIGEgbWFwIHdpdGgga25vd24gcHJvdmlkZXJzCisgICAgICogQHBhcmFtIGNhbGxpbmdVaWQgICAgICAgICAgIHRoZSBjYWxsaW5nIFVJRCBvZiB0aGUgY2xpZW50IGFwcAorICAgICAqIEBwYXJhbSBjaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMgdGhlIG1ldHJpYyBkYXRhIHR5cGUgb2YgdGhlIGZpbmFsIGNob3NlbiBwcm92aWRlcgorICAgICAqIFRPRE8gcmVtb3ZlIHNvb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbG9nQXBpQ2FsbGVkKEFwaU5hbWUgYXBpTmFtZSwgQXBpU3RhdHVzIGFwaVN0YXR1cywKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3ZpZGVyU2Vzc2lvbj4gcHJvdmlkZXJzLCBpbnQgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgIENob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYyBjaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBwcm92aWRlclNlc3Npb25zID0gcHJvdmlkZXJzLnZhbHVlcygpOworICAgICAgICAgICAgaW50IHByb3ZpZGVyU2l6ZSA9IHByb3ZpZGVyU2Vzc2lvbnMuc2l6ZSgpOworICAgICAgICAgICAgaW50W10gY2FuZGlkYXRlVWlkTGlzdCA9IG5ldyBpbnRbcHJvdmlkZXJTaXplXTsKKyAgICAgICAgICAgIGludFtdIGNhbmRpZGF0ZVF1ZXJ5Um91bmRUcmlwVGltZUxpc3QgPSBuZXcgaW50W3Byb3ZpZGVyU2l6ZV07CisgICAgICAgICAgICBpbnRbXSBjYW5kaWRhdGVTdGF0dXNMaXN0ID0gbmV3IGludFtwcm92aWRlclNpemVdOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvciAodmFyIHNlc3Npb24gOiBwcm92aWRlclNlc3Npb25zKSB7CisgICAgICAgICAgICAgICAgQ2FuZGlkYXRlUGhhc2VNZXRyaWMgbWV0cmljID0gc2Vzc2lvbi5tQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYzsKICAgICAgICAgICAgICAgICBjYW5kaWRhdGVVaWRMaXN0W2luZGV4XSA9IG1ldHJpYy5nZXRDYW5kaWRhdGVVaWQoKTsKICAgICAgICAgICAgICAgICBjYW5kaWRhdGVRdWVyeVJvdW5kVHJpcFRpbWVMaXN0W2luZGV4XSA9IG1ldHJpYy5nZXRRdWVyeUxhdGVuY3lNaWNyb3NlY29uZHMoKTsKICAgICAgICAgICAgICAgICBjYW5kaWRhdGVTdGF0dXNMaXN0W2luZGV4XSA9IG1ldHJpYy5nZXRQcm92aWRlclF1ZXJ5U3RhdHVzKCk7CkBAIC0xMTYsMTIgKzE0NSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAvKiByZXBlYXRlZF9jYW5kaWRhdGVfcHJvdmlkZXJfcm91bmRfdHJpcF90aW1lX3F1ZXJ5X21pY3Jvc2Vjb25kcyAqLwogICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVRdWVyeVJvdW5kVHJpcFRpbWVMaXN0LAogICAgICAgICAgICAgICAgICAgICAvKiByZXBlYXRlZF9jYW5kaWRhdGVfcHJvdmlkZXJfc3RhdHVzICovIGNhbmRpZGF0ZVN0YXR1c0xpc3QsCi0gICAgICAgICAgICAgICAgICAgIC8qIGNob3Nlbl9wcm92aWRlcl91aWQgKi8gY2hvc2VuUHJvdmlkZXJNZXRyaWMuZ2V0Q2hvc2VuVWlkKCksCisgICAgICAgICAgICAgICAgICAgIC8qIGNob3Nlbl9wcm92aWRlcl91aWQgKi8gY2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLmdldENob3NlblVpZCgpLAogICAgICAgICAgICAgICAgICAgICAvKiBjaG9zZW5fcHJvdmlkZXJfcm91bmRfdHJpcF90aW1lX292ZXJhbGxfbWljcm9zZWNvbmRzICovCi0gICAgICAgICAgICAgICAgICAgIGNob3NlblByb3ZpZGVyTWV0cmljLmdldEVudGlyZVByb3ZpZGVyTGF0ZW5jeU1pY3Jvc2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICBjaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuZ2V0RW50aXJlUHJvdmlkZXJMYXRlbmN5TWljcm9zZWNvbmRzKCksCiAgICAgICAgICAgICAgICAgICAgIC8qIGNob3Nlbl9wcm92aWRlcl9maW5hbF9waGFzZV9taWNyb3NlY29uZHMgKGJhY2t3YXJkcyBjb21wYXQgb25seSkgKi8KICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9JTlRfMzIsCi0gICAgICAgICAgICAgICAgICAgIC8qIGNob3Nlbl9wcm92aWRlcl9zdGF0dXMgKi8gY2hvc2VuUHJvdmlkZXJNZXRyaWMuZ2V0Q2hvc2VuUHJvdmlkZXJTdGF0dXMoKSk7CisgICAgICAgICAgICAgICAgICAgIC8qIGNob3Nlbl9wcm92aWRlcl9zdGF0dXMgKi8gY2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENob3NlblByb3ZpZGVyU3RhdHVzKCkpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgbWV0cmljIGxvZ2dpbmc6ICIgKyBlKTsKICAgICAgICAgfQpAQCAtMTMyLDYgKzE2Miw3IEBACiAgICAgICogY29udGFpbiBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG90aGVyIG9wdGlvbmFsIHBhcmFtZXRlcnMuCiAgICAgICoKICAgICAgKiBUT0RPKGIvMjcxMTM1MDQ4KSAtIGdpdmVuIHNwYWNlIHJlcXVpcmVtZW50cywgdGhpcyBtYXkgYmUgYSBnb29kIGNhbmRpZGF0ZSBmb3IgYW5vdGhlciBhdG9tCisgICAgICogVE9ETyBpbW1lZGlhdGVseSByZW1vdmUgYW5kIGNhcnJ5IG92ZXIgVE9ETyB0byBuZXcgbG9nIGZvciB0aGlzIHNldHVwCiAgICAgICoKICAgICAgKiBAcGFyYW0gYXBpTmFtZSAgICB0aGUgYXBpIG5hbWUgdG8gbG9nCiAgICAgICogQHBhcmFtIGFwaVN0YXR1cyAgdGhlIHN0YXR1cyB0byBsb2cKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyQ2xlYXJTZXNzaW9uLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlckNsZWFyU2Vzc2lvbi5qYXZhCmluZGV4IGFiMjlhY2MuLmI4NmRhYmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyQ2xlYXJTZXNzaW9uLmphdmEKKysrIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvUHJvdmlkZXJDbGVhclNlc3Npb24uamF2YQpAQCAtMzMsNyArMzMsNyBAQAogICoKICAqIEBoaWRlCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyAgUHJvdmlkZXJDbGVhclNlc3Npb24gZXh0ZW5kcyBQcm92aWRlclNlc3Npb248Q2xlYXJDcmVkZW50aWFsU3RhdGVSZXF1ZXN0LAorcHVibGljIGZpbmFsIGNsYXNzIFByb3ZpZGVyQ2xlYXJTZXNzaW9uIGV4dGVuZHMgUHJvdmlkZXJTZXNzaW9uPENsZWFyQ3JlZGVudGlhbFN0YXRlUmVxdWVzdCwKICAgICAgICAgVm9pZD4KICAgICAgICAgaW1wbGVtZW50cwogICAgICAgICBSZW1vdGVDcmVkZW50aWFsU2VydmljZS5Qcm92aWRlckNhbGxiYWNrczxWb2lkPiB7CkBAIC00Miw3ICs0Miw4IEBACiAgICAgcHJpdmF0ZSBDbGVhckNyZWRlbnRpYWxTdGF0ZUV4Y2VwdGlvbiBtUHJvdmlkZXJFeGNlcHRpb247CiAKICAgICAvKiogQ3JlYXRlcyBhIG5ldyBwcm92aWRlciBzZXNzaW9uIHRvIGJlIHVzZWQgYnkgdGhlIHJlcXVlc3Qgc2Vzc2lvbi4gKi8KLSAgICBATnVsbGFibGUgcHVibGljIHN0YXRpYyBQcm92aWRlckNsZWFyU2Vzc2lvbiBjcmVhdGVOZXdTZXNzaW9uKAorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBzdGF0aWMgUHJvdmlkZXJDbGVhclNlc3Npb24gY3JlYXRlTmV3U2Vzc2lvbigKICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgIEBVc2VySWRJbnQgaW50IHVzZXJJZCwKICAgICAgICAgICAgIENyZWRlbnRpYWxQcm92aWRlckluZm8gcHJvdmlkZXJJbmZvLApAQCAtNTMsNyArNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJSZXF1ZXN0U2Vzc2lvbi5tQ2xpZW50UmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyUmVxdWVzdFNlc3Npb24ubUNsaWVudEFwcEluZm8pOwogICAgICAgICByZXR1cm4gbmV3IFByb3ZpZGVyQ2xlYXJTZXNzaW9uKGNvbnRleHQsIHByb3ZpZGVySW5mbywgY2xlYXJSZXF1ZXN0U2Vzc2lvbiwgdXNlcklkLAotICAgICAgICAgICAgICAgICAgICByZW1vdGVDcmVkZW50aWFsU2VydmljZSwgcHJvdmlkZXJSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICByZW1vdGVDcmVkZW50aWFsU2VydmljZSwgcHJvdmlkZXJSZXF1ZXN0KTsKICAgICB9CiAKICAgICBATnVsbGFibGUKQEAgLTkwLDYgKzkxLDcgQEAKICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIENsZWFyQ3JlZGVudGlhbFN0YXRlRXhjZXB0aW9uKSB7CiAgICAgICAgICAgICBtUHJvdmlkZXJFeGNlcHRpb24gPSAoQ2xlYXJDcmVkZW50aWFsU3RhdGVFeGNlcHRpb24pIGV4Y2VwdGlvbjsKICAgICAgICAgfQorICAgICAgICBjYXB0dXJlQ2FuZGlkYXRlRmFpbHVyZSgpOwogICAgICAgICB1cGRhdGVTdGF0dXNBbmRJbnZva2VDYWxsYmFjayh0b1N0YXR1cyhlcnJvckNvZGUpKTsKICAgICB9CiAKQEAgLTEyMCw3ICsxMjIsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVNlc3Npb24oKSB7CiAgICAgICAgIGlmIChtUmVtb3RlQ3JlZGVudGlhbFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbmRpZGF0ZVByb3ZpZGVyTWV0cmljLnNldFN0YXJ0UXVlcnlUaW1lTmFub3NlY29uZHMoU3lzdGVtLm5hbm9UaW1lKCkpOworICAgICAgICAgICAgc3RhcnRDYW5kaWRhdGVNZXRyaWNzKCk7CiAgICAgICAgICAgICBtUmVtb3RlQ3JlZGVudGlhbFNlcnZpY2Uub25DbGVhckNyZWRlbnRpYWxTdGF0ZShtUHJvdmlkZXJSZXF1ZXN0LCB0aGlzKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyQ3JlYXRlU2Vzc2lvbi5qYXZhIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvUHJvdmlkZXJDcmVhdGVTZXNzaW9uLmphdmEKaW5kZXggOGM5YzZjZi4uYmJiYjE1NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvUHJvdmlkZXJDcmVhdGVTZXNzaW9uLmphdmEKKysrIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvUHJvdmlkZXJDcmVhdGVTZXNzaW9uLmphdmEKQEAgLTQwLDYgKzQwLDggQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkVudHJ5RW51bTsKKwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC02NSw3ICs2Nyw4IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlclJlc3BvbnNlRGF0YUhhbmRsZXIgbVByb3ZpZGVyUmVzcG9uc2VEYXRhSGFuZGxlcjsKIAogICAgIC8qKiBDcmVhdGVzIGEgbmV3IHByb3ZpZGVyIHNlc3Npb24gdG8gYmUgdXNlZCBieSB0aGUgcmVxdWVzdCBzZXNzaW9uLiAqLwotICAgIEBOdWxsYWJsZSBwdWJsaWMgc3RhdGljIFByb3ZpZGVyQ3JlYXRlU2Vzc2lvbiBjcmVhdGVOZXdTZXNzaW9uKAorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBzdGF0aWMgUHJvdmlkZXJDcmVhdGVTZXNzaW9uIGNyZWF0ZU5ld1Nlc3Npb24oCiAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICBAVXNlcklkSW50IGludCB1c2VySWQsCiAgICAgICAgICAgICBDcmVkZW50aWFsUHJvdmlkZXJJbmZvIHByb3ZpZGVySW5mbywKQEAgLTE1NSw2ICsxNTgsNyBAQAogICAgICAgICAgICAgLy8gU3RvcmUgcXVlcnkgcGhhc2UgZXhjZXB0aW9uIGZvciBhZ2dyZWdhdGlvbiB3aXRoIGZpbmFsIHJlc3BvbnNlCiAgICAgICAgICAgICBtUHJvdmlkZXJFeGNlcHRpb24gPSAoQ3JlYXRlQ3JlZGVudGlhbEV4Y2VwdGlvbikgZXhjZXB0aW9uOwogICAgICAgICB9CisgICAgICAgIGNhcHR1cmVDYW5kaWRhdGVGYWlsdXJlKCk7CiAgICAgICAgIHVwZGF0ZVN0YXR1c0FuZEludm9rZUNhbGxiYWNrKHRvU3RhdHVzKGVycm9yQ29kZSkpOwogICAgIH0KIApAQCAtMTc1LDE0ICsxNzksMzIgQEAKICAgICAgICAgbVByb3ZpZGVyUmVzcG9uc2VEYXRhSGFuZGxlci5hZGRSZXNwb25zZUNvbnRlbnQocmVzcG9uc2UuZ2V0Q3JlYXRlRW50cmllcygpLAogICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFJlbW90ZUNyZWF0ZUVudHJ5KCkpOwogICAgICAgICBpZiAobVByb3ZpZGVyUmVzcG9uc2VEYXRhSGFuZGxlci5pc0VtcHR5UmVzcG9uc2UocmVzcG9uc2UpKSB7CisgICAgICAgICAgICBnYXRoZUNhbmRpZGF0ZUVudHJ5TWV0cmljcyhyZXNwb25zZSk7CiAgICAgICAgICAgICB1cGRhdGVTdGF0dXNBbmRJbnZva2VDYWxsYmFjayhTdGF0dXMuRU1QVFlfUkVTUE9OU0UpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2F0aGVDYW5kaWRhdGVFbnRyeU1ldHJpY3MocmVzcG9uc2UpOwogICAgICAgICAgICAgdXBkYXRlU3RhdHVzQW5kSW52b2tlQ2FsbGJhY2soU3RhdHVzLlNBVkVfRU5UUklFU19SRUNFSVZFRCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZ2F0aGVDYW5kaWRhdGVFbnRyeU1ldHJpY3MoQmVnaW5DcmVhdGVDcmVkZW50aWFsUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBjcmVhdGVFbnRyaWVzID0gcmVzcG9uc2UuZ2V0Q3JlYXRlRW50cmllcygpOworICAgICAgICAgICAgaW50IG51bUNyZWF0ZUVudHJpZXMgPSBjcmVhdGVFbnRyaWVzID09IG51bGwgPyAwIDogY3JlYXRlRW50cmllcy5zaXplKCk7CisgICAgICAgICAgICAvLyBUT0RPIGNvbmZpcm0gaG93IHRvIGdldCB0eXBlcyBmcm9tIHNsaWNlCisgICAgICAgICAgICBpZiAobnVtQ3JlYXRlRW50cmllcyA+IDApIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVFbnRyaWVzLmZvckVhY2goYyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuYWRkRW50cnkoRW50cnlFbnVtLkNSRURFTlRJQUxfRU5UUlkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLnNldE51bUVudHJpZXNUb3RhbChudW1DcmVhdGVFbnRyaWVzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIG1ldHJpYyBsb2dnaW5nOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBAT3ZlcnJpZGUKLSAgICBATnVsbGFibGUgcHJvdGVjdGVkIENyZWF0ZUNyZWRlbnRpYWxQcm92aWRlckRhdGEgcHJlcGFyZVVpRGF0YSgpCisgICAgQE51bGxhYmxlCisgICAgcHJvdGVjdGVkIENyZWF0ZUNyZWRlbnRpYWxQcm92aWRlckRhdGEgcHJlcGFyZVVpRGF0YSgpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgTG9nLmkoVEFHLCAiSW4gcHJlcGFyZVVpRGF0YSIpOwogICAgICAgICBpZiAoIVByb3ZpZGVyU2Vzc2lvbi5pc1VpSW52b2tpbmdTdGF0dXMoZ2V0U3RhdHVzKCkpKSB7CkBAIC0yMjYsNyArMjQ4LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VTZXNzaW9uKCkgewogICAgICAgICBpZiAobVJlbW90ZUNyZWRlbnRpYWxTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYW5kaWRhdGVQcm92aWRlck1ldHJpYy5zZXRTdGFydFF1ZXJ5VGltZU5hbm9zZWNvbmRzKFN5c3RlbS5uYW5vVGltZSgpKTsKKyAgICAgICAgICAgIHN0YXJ0Q2FuZGlkYXRlTWV0cmljcygpOwogICAgICAgICAgICAgbVJlbW90ZUNyZWRlbnRpYWxTZXJ2aWNlLm9uQ3JlYXRlQ3JlZGVudGlhbChtUHJvdmlkZXJSZXF1ZXN0LCB0aGlzKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI5OCwxMiArMzIwLDE0IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBQcm92aWRlclJlc3BvbnNlRGF0YUhhbmRsZXIgewotICAgICAgICBATnVsbGFibGUgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1FeHBlY3RlZFJlbW90ZUVudHJ5UHJvdmlkZXJTZXJ2aWNlOworICAgICAgICBATnVsbGFibGUKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1FeHBlY3RlZFJlbW90ZUVudHJ5UHJvdmlkZXJTZXJ2aWNlOwogCiAgICAgICAgIEBOb25OdWxsCiAgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUGFpcjxDcmVhdGVFbnRyeSwgRW50cnk+PiBtVWlDcmVhdGVFbnRyaWVzID0gbmV3IEhhc2hNYXA8PigpOwogCi0gICAgICAgIEBOdWxsYWJsZSBwcml2YXRlIFBhaXI8U3RyaW5nLCBQYWlyPFJlbW90ZUVudHJ5LCBFbnRyeT4+IG1VaVJlbW90ZUVudHJ5ID0gbnVsbDsKKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHByaXZhdGUgUGFpcjxTdHJpbmcsIFBhaXI8UmVtb3RlRW50cnksIEVudHJ5Pj4gbVVpUmVtb3RlRW50cnkgPSBudWxsOwogCiAgICAgICAgIFByb3ZpZGVyUmVzcG9uc2VEYXRhSGFuZGxlcihATnVsbGFibGUgQ29tcG9uZW50TmFtZSBleHBlY3RlZFJlbW90ZUVudHJ5UHJvdmlkZXJTZXJ2aWNlKSB7CiAgICAgICAgICAgICBtRXhwZWN0ZWRSZW1vdGVFbnRyeVByb3ZpZGVyU2VydmljZSA9IGV4cGVjdGVkUmVtb3RlRW50cnlQcm92aWRlclNlcnZpY2U7CkBAIC0zMTYsNiArMzQwLDcgQEAKICAgICAgICAgICAgICAgICBzZXRSZW1vdGVFbnRyeShyZW1vdGVFbnRyeSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBhZGRDcmVhdGVFbnRyeShDcmVhdGVFbnRyeSBjcmVhdGVFbnRyeSkgewogICAgICAgICAgICAgU3RyaW5nIGlkID0gZ2VuZXJhdGVVbmlxdWVJZCgpOwogICAgICAgICAgICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnkoU0FWRV9FTlRSWV9LRVksCkBAIC0zNjYsNiArMzkxLDcgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlSZXNwb25zZSgpIHsKICAgICAgICAgICAgIHJldHVybiBtVWlDcmVhdGVFbnRyaWVzLmlzRW1wdHkoKSAmJiBtVWlSZW1vdGVFbnRyeSA9PSBudWxsOwogICAgICAgICB9CisKICAgICAgICAgQE51bGxhYmxlCiAgICAgICAgIHB1YmxpYyBSZW1vdGVFbnRyeSBnZXRSZW1vdGVFbnRyeShTdHJpbmcgZW50cnlLZXkpIHsKICAgICAgICAgICAgIHJldHVybiBtVWlSZW1vdGVFbnRyeSA9PSBudWxsIHx8IG1VaVJlbW90ZUVudHJ5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlckdldFNlc3Npb24uamF2YSBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyR2V0U2Vzc2lvbi5qYXZhCmluZGV4IDk1NWI3MjEuLmJmMWRiMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyR2V0U2Vzc2lvbi5qYXZhCisrKyBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1Byb3ZpZGVyR2V0U2Vzc2lvbi5qYXZhCkBAIC00Myw2ICs0Myw4IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY3JlZGVudGlhbHMubWV0cmljcy5FbnRyeUVudW07CisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNjEsMTMgKzYzLDEzIEBACiAgICAgICAgIFJlbW90ZUNyZWRlbnRpYWxTZXJ2aWNlLlByb3ZpZGVyQ2FsbGJhY2tzPEJlZ2luR2V0Q3JlZGVudGlhbFJlc3BvbnNlPiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQcm92aWRlckdldFNlc3Npb24iOwogICAgIC8vIEtleSB0byBiZSB1c2VkIGFzIHRoZSBlbnRyeSBrZXkgZm9yIGFuIGFjdGlvbiBlbnRyeQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5UUllfS0VZID0gImFjdGlvbl9rZXkiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTlRSWV9LRVkgPSAiYWN0aW9uX2tleSI7CiAgICAgLy8gS2V5IHRvIGJlIHVzZWQgYXMgdGhlIGVudHJ5IGtleSBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIGVudHJ5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhFTlRJQ0FUSU9OX0FDVElPTl9FTlRSWV9LRVkgPSAiYXV0aGVudGljYXRpb25fYWN0aW9uX2tleSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSEVOVElDQVRJT05fQUNUSU9OX0VOVFJZX0tFWSA9ICJhdXRoZW50aWNhdGlvbl9hY3Rpb25fa2V5IjsKICAgICAvLyBLZXkgdG8gYmUgdXNlZCBhcyBhbiBlbnRyeSBrZXkgZm9yIGEgcmVtb3RlIGVudHJ5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9FTlRSWV9LRVkgPSAicmVtb3RlX2VudHJ5X2tleSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0VOVFJZX0tFWSA9ICJyZW1vdGVfZW50cnlfa2V5IjsKICAgICAvLyBLZXkgdG8gYmUgdXNlZCBhcyBhbiBlbnRyeSBrZXkgZm9yIGEgY3JlZGVudGlhbCBlbnRyeQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVERU5USUFMX0VOVFJZX0tFWSA9ICJjcmVkZW50aWFsX2tleSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFREVOVElBTF9FTlRSWV9LRVkgPSAiY3JlZGVudGlhbF9rZXkiOwogCiAgICAgQE5vbk51bGwKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENyZWRlbnRpYWxPcHRpb24+IG1CZWdpbkdldE9wdGlvblRvQ3JlZGVudGlhbE9wdGlvbk1hcDsKQEAgLTgyLDcgKzg0LDggQEAKICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyUmVzcG9uc2VEYXRhSGFuZGxlciBtUHJvdmlkZXJSZXNwb25zZURhdGFIYW5kbGVyOwogCiAgICAgLyoqIENyZWF0ZXMgYSBuZXcgcHJvdmlkZXIgc2Vzc2lvbiB0byBiZSB1c2VkIGJ5IHRoZSByZXF1ZXN0IHNlc3Npb24uICovCi0gICAgQE51bGxhYmxlIHB1YmxpYyBzdGF0aWMgUHJvdmlkZXJHZXRTZXNzaW9uIGNyZWF0ZU5ld1Nlc3Npb24oCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIHN0YXRpYyBQcm92aWRlckdldFNlc3Npb24gY3JlYXRlTmV3U2Vzc2lvbigKICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgIEBVc2VySWRJbnQgaW50IHVzZXJJZCwKICAgICAgICAgICAgIENyZWRlbnRpYWxQcm92aWRlckluZm8gcHJvdmlkZXJJbmZvLApAQCAtMTEzLDYgKzExNiw3IEBACiAgICAgICAgIExvZy5pKFRBRywgIlVuYWJsZSB0byBjcmVhdGUgcHJvdmlkZXIgc2Vzc2lvbiIpOwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBCZWdpbkdldENyZWRlbnRpYWxSZXF1ZXN0IGNvbnN0cnVjdFF1ZXJ5UGhhc2VSZXF1ZXN0KAogICAgICAgICAgICAgYW5kcm9pZC5jcmVkZW50aWFscy5HZXRDcmVkZW50aWFsUmVxdWVzdCBmaWx0ZXJlZFJlcXVlc3QsCiAgICAgICAgICAgICBDYWxsaW5nQXBwSW5mbyBjYWxsaW5nQXBwSW5mbywKQEAgLTE2OSw3ICsxNzMsNyBAQAogICAgICAgICAgICAgQ2FsbGluZ0FwcEluZm8gY2FsbGluZ0FwcEluZm8sCiAgICAgICAgICAgICBNYXA8U3RyaW5nLCBDcmVkZW50aWFsT3B0aW9uPiBiZWdpbkdldE9wdGlvblRvQ3JlZGVudGlhbE9wdGlvbk1hcCwKICAgICAgICAgICAgIFN0cmluZyBoeWJyaWRTZXJ2aWNlKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGJlZ2luR2V0UmVxdWVzdCwgY2FsbGJhY2tzLCBpbmZvLmdldENvbXBvbmVudE5hbWUoKSAsCisgICAgICAgIHN1cGVyKGNvbnRleHQsIGJlZ2luR2V0UmVxdWVzdCwgY2FsbGJhY2tzLCBpbmZvLmdldENvbXBvbmVudE5hbWUoKSwKICAgICAgICAgICAgICAgICB1c2VySWQsIHJlbW90ZUNyZWRlbnRpYWxTZXJ2aWNlKTsKICAgICAgICAgbUNvbXBsZXRlUmVxdWVzdCA9IGNvbXBsZXRlR2V0UmVxdWVzdDsKICAgICAgICAgbUNhbGxpbmdBcHBJbmZvID0gY2FsbGluZ0FwcEluZm87CkBAIC0xOTEsNiArMTk1LDcgQEAKICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEdldENyZWRlbnRpYWxFeGNlcHRpb24pIHsKICAgICAgICAgICAgIG1Qcm92aWRlckV4Y2VwdGlvbiA9IChHZXRDcmVkZW50aWFsRXhjZXB0aW9uKSBleGNlcHRpb247CiAgICAgICAgIH0KKyAgICAgICAgY2FwdHVyZUNhbmRpZGF0ZUZhaWx1cmUoKTsKICAgICAgICAgdXBkYXRlU3RhdHVzQW5kSW52b2tlQ2FsbGJhY2sodG9TdGF0dXMoZXJyb3JDb2RlKSk7CiAgICAgfQogCkBAIC0yNjksMTMgKzI3NCwxNCBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVNlc3Npb24oKSB7CiAgICAgICAgIGlmIChtUmVtb3RlQ3JlZGVudGlhbFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbmRpZGF0ZVByb3ZpZGVyTWV0cmljLnNldFN0YXJ0UXVlcnlUaW1lTmFub3NlY29uZHMoU3lzdGVtLm5hbm9UaW1lKCkpOworICAgICAgICAgICAgc3RhcnRDYW5kaWRhdGVNZXRyaWNzKCk7CiAgICAgICAgICAgICBtUmVtb3RlQ3JlZGVudGlhbFNlcnZpY2Uub25CZWdpbkdldENyZWRlbnRpYWwobVByb3ZpZGVyUmVxdWVzdCwgdGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUgLy8gQ2FsbCBmcm9tIHJlcXVlc3Qgc2Vzc2lvbiB0byBkYXRhIHRvIGJlIHNob3duIG9uIHRoZSBVSQotICAgIEBOdWxsYWJsZSBwcm90ZWN0ZWQgR2V0Q3JlZGVudGlhbFByb3ZpZGVyRGF0YSBwcmVwYXJlVWlEYXRhKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgQE51bGxhYmxlCisgICAgcHJvdGVjdGVkIEdldENyZWRlbnRpYWxQcm92aWRlckRhdGEgcHJlcGFyZVVpRGF0YSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewogICAgICAgICBMb2cuaShUQUcsICJJbiBwcmVwYXJlVWlEYXRhIik7CiAgICAgICAgIGlmICghUHJvdmlkZXJTZXNzaW9uLmlzVWlJbnZva2luZ1N0YXR1cyhnZXRTdGF0dXMoKSkpIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgIkluIHByZXBhcmVVaURhdGEgLSBwcm92aWRlciBkb2VzIG5vdCB3YW50IHRvIHNob3cgVUk6ICIKQEAgLTM4Miw2ICszODgsNyBAQAogICAgICAgICBHZXRDcmVkZW50aWFsRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG1heWJlR2V0UGVuZGluZ0ludGVudEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICBwcm92aWRlclBlbmRpbmdJbnRlbnRSZXNwb25zZSk7CiAgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVE9ETyAoYi8yNzExMzUwNDgpLCBmb3IgQXV0aGVudGljYXRpb25FbnRyeSBjYWxsYmFjayBzZWxlY3Rpb24sIHNldCBlcnJvcgogICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2tXaXRoRXJyb3IoZXhjZXB0aW9uLmdldFR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGNvbnRlbnQgcmVjZWl2ZWQgaXMgaW4gdGhlIGZvcm0gb2YgYW4gZXhjZXB0aW9uIHdoaWNoIGVuZHMgdGhlIGZsb3cuCkBAIC00MjcsMTMgKzQzNCwzOSBAQAogICAgIHByaXZhdGUgdm9pZCBvblNldEluaXRpYWxSZW1vdGVSZXNwb25zZShCZWdpbkdldENyZWRlbnRpYWxSZXNwb25zZSByZXNwb25zZSkgewogICAgICAgICBtUHJvdmlkZXJSZXNwb25zZSA9IHJlc3BvbnNlOwogICAgICAgICBhZGRUb0luaXRpYWxSZW1vdGVSZXNwb25zZShyZXNwb25zZSwgLyppc0luaXRpYWxSZXNwb25zZT0qL3RydWUpOworICAgICAgICAvLyBMb2cgdGhlIGRhdGEuCiAgICAgICAgIGlmIChtUHJvdmlkZXJSZXNwb25zZURhdGFIYW5kbGVyLmlzRW1wdHlSZXNwb25zZShyZXNwb25zZSkpIHsKICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0FuZEludm9rZUNhbGxiYWNrKFN0YXR1cy5FTVBUWV9SRVNQT05TRSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgZ2F0aGVyQ2FuZGlkYXRlRW50cnlNZXRyaWNzKHJlc3BvbnNlKTsKICAgICAgICAgdXBkYXRlU3RhdHVzQW5kSW52b2tlQ2FsbGJhY2soU3RhdHVzLkNSRURFTlRJQUxTX1JFQ0VJVkVEKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZ2F0aGVyQ2FuZGlkYXRlRW50cnlNZXRyaWNzKEJlZ2luR2V0Q3JlZGVudGlhbFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgbnVtQ3JlZEVudHJpZXMgPSByZXNwb25zZS5nZXRDcmVkZW50aWFsRW50cmllcygpLnNpemUoKTsKKyAgICAgICAgICAgIGludCBudW1BY3Rpb25FbnRyaWVzID0gcmVzcG9uc2UuZ2V0QWN0aW9ucygpLnNpemUoKTsKKyAgICAgICAgICAgIGludCBudW1BdXRoRW50cmllcyA9IHJlc3BvbnNlLmdldEF1dGhlbnRpY2F0aW9uQWN0aW9ucygpLnNpemUoKTsKKyAgICAgICAgICAgIC8vIFRPRE8gaW1tZWRpYXRlbHkgYWRkIHJlbW90ZSBlbnRyaWVzCisgICAgICAgICAgICAvLyBUT0RPIGltbWVkaWF0ZWx5IGNvbmZpcm0gaG93IHRvIGdldCB0eXBlcyBmcm9tIHNsaWNlIHRvIGdldCB1bmlxdWUgdHlwZSBjb3VudCB2aWEKKyAgICAgICAgICAgIC8vICBkZWR1cGUKKyAgICAgICAgICAgIHJlc3BvbnNlLmdldENyZWRlbnRpYWxFbnRyaWVzKCkuZm9yRWFjaChjIC0+CisgICAgICAgICAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLmFkZEVudHJ5KEVudHJ5RW51bS5DUkVERU5USUFMX0VOVFJZKSk7CisgICAgICAgICAgICByZXNwb25zZS5nZXRBY3Rpb25zKCkuZm9yRWFjaChjIC0+CisgICAgICAgICAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLmFkZEVudHJ5KEVudHJ5RW51bS5BQ1RJT05fRU5UUlkpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLmdldEF1dGhlbnRpY2F0aW9uQWN0aW9ucygpLmZvckVhY2goYyAtPgorICAgICAgICAgICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5hZGRFbnRyeShFbnRyeUVudW0uQVVUSEVOVElDQVRJT05fRU5UUlkpKTsKKyAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLnNldE51bUVudHJpZXNUb3RhbChudW1DcmVkRW50cmllcyArIG51bUF1dGhFbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICsgbnVtQWN0aW9uRW50cmllcyk7CisgICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRDcmVkZW50aWFsRW50cnlDb3VudChudW1DcmVkRW50cmllcyk7CisgICAgICAgICAgICBtQ2FuZGlkYXRlUGhhc2VQZXJQcm92aWRlck1ldHJpYy5zZXRBY3Rpb25FbnRyeUNvdW50KG51bUFjdGlvbkVudHJpZXMpOworICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0QXV0aGVudGljYXRpb25FbnRyeUNvdW50KG51bUF1dGhFbnRyaWVzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIG1ldHJpYyBsb2dnaW5nOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBXaGVuIGFuIGludmFsaWQgc3RhdGUgb2NjdXJzLCBlLmcuIGVudHJ5IG1pc21hdGNoIG9yIG5vIHJlc3BvbnNlIGZyb20gcHJvdmlkZXIsCiAgICAgICogd2Ugc2VuZCBiYWNrIGEgVFlQRV9OT19DUkVERU5USUFMIGVycm9yIGFzIHRvIHRoZSBkZXZlbG9wZXIuCkBAIC00NjEsMTEgKzQ5NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU1RBVFVTX1VOTE9DS0VEX0JVVF9FTVBUWV9MRVNTX1JFQ0VOVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlLnNlY29uZC5nZXRTdGF0dXMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBBdXRoZW50aWNhdGlvbkVudHJ5LlNUQVRVU19VTkxPQ0tFRF9CVVRfRU1QVFlfTU9TVF9SRUNFTlQKLSAgICAgICAgKTsKKyAgICAgICAgICAgICAgICApOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgUHJvdmlkZXJSZXNwb25zZURhdGFIYW5kbGVyIHsKLSAgICAgICAgQE51bGxhYmxlIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TmFtZSBtRXhwZWN0ZWRSZW1vdGVFbnRyeVByb3ZpZGVyU2VydmljZTsKKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TmFtZSBtRXhwZWN0ZWRSZW1vdGVFbnRyeVByb3ZpZGVyU2VydmljZTsKICAgICAgICAgQE5vbk51bGwKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBQYWlyPENyZWRlbnRpYWxFbnRyeSwgRW50cnk+PiBtVWlDcmVkZW50aWFsRW50cmllcyA9CiAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8PigpOwpAQCAtNDc1LDcgKzUwOSw4IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUGFpcjxBY3Rpb24sIEF1dGhlbnRpY2F0aW9uRW50cnk+PiBtVWlBdXRoZW50aWNhdGlvbkVudHJpZXMgPQogICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPD4oKTsKIAotICAgICAgICBATnVsbGFibGUgcHJpdmF0ZSBQYWlyPFN0cmluZywgUGFpcjxSZW1vdGVFbnRyeSwgRW50cnk+PiBtVWlSZW1vdGVFbnRyeSA9IG51bGw7CisgICAgICAgIEBOdWxsYWJsZQorICAgICAgICBwcml2YXRlIFBhaXI8U3RyaW5nLCBQYWlyPFJlbW90ZUVudHJ5LCBFbnRyeT4+IG1VaVJlbW90ZUVudHJ5ID0gbnVsbDsKIAogICAgICAgICBQcm92aWRlclJlc3BvbnNlRGF0YUhhbmRsZXIoQE51bGxhYmxlIENvbXBvbmVudE5hbWUgZXhwZWN0ZWRSZW1vdGVFbnRyeVByb3ZpZGVyU2VydmljZSkgewogICAgICAgICAgICAgbUV4cGVjdGVkUmVtb3RlRW50cnlQcm92aWRlclNlcnZpY2UgPSBleHBlY3RlZFJlbW90ZUVudHJ5UHJvdmlkZXJTZXJ2aWNlOwpAQCAtNDk5LDYgKzUzNCw3IEBACiAgICAgICAgICAgICAgICAgc2V0UmVtb3RlRW50cnkocmVtb3RlRW50cnkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgYWRkQ3JlZGVudGlhbEVudHJ5KENyZWRlbnRpYWxFbnRyeSBjcmVkZW50aWFsRW50cnkpIHsKICAgICAgICAgICAgIFN0cmluZyBpZCA9IGdlbmVyYXRlVW5pcXVlSWQoKTsKICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KENSRURFTlRJQUxfRU5UUllfS0VZLApAQCAtNTQ5LDcgKzU4NSw2IEBACiAgICAgICAgIH0KIAogCi0KICAgICAgICAgcHVibGljIEdldENyZWRlbnRpYWxQcm92aWRlckRhdGEgdG9HZXRDcmVkZW50aWFsUHJvdmlkZXJEYXRhKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBHZXRDcmVkZW50aWFsUHJvdmlkZXJEYXRhLkJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmZsYXR0ZW5Ub1N0cmluZygpKS5zZXRBY3Rpb25DaGlwcyhwcmVwYXJlQWN0aW9uRW50cmllcygpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvUHJvdmlkZXJTZXNzaW9uLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlclNlc3Npb24uamF2YQppbmRleCAwM2UyYTMyLi5mYWE5MWRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlclNlc3Npb24uamF2YQorKysgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9Qcm92aWRlclNlc3Npb24uamF2YQpAQCAtMzIsMTIgKzMyLDE0IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkNhbmRpZGF0ZVBoYXNlTWV0cmljOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkluaXRpYWxQaGFzZU1ldHJpYzsKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY3JlZGVudGlhbHMubWV0cmljcy5Qcm92aWRlclN0YXR1c0Zvck1ldHJpY3M7CiAKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAogLyoqCiAgKiBQcm92aWRlciBzZXNzaW9uIHN0b3JpbmcgdGhlIHN0YXRlIG9mIHByb3ZpZGVyIHJlc3BvbnNlIGFuZCB1aSBlbnRyaWVzLgorICoKICAqIEBwYXJhbSA8VD4gVGhlIHJlcXVlc3QgdG8gYmUgc2VudCB0byB0aGUgcHJvdmlkZXIKICAqIEBwYXJhbSA8Uj4gVGhlIHJlc3BvbnNlIHRvIGJlIGV4cGVjdGVkIGZyb20gdGhlIHByb3ZpZGVyCiAgKi8KQEAgLTQ2LDIxICs0OCwzNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQcm92aWRlclNlc3Npb24iOwogCi0gICAgQE5vbk51bGwgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgQE5vbk51bGwgcHJvdGVjdGVkIGZpbmFsIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudE5hbWU7Ci0gICAgQE51bGxhYmxlIHByb3RlY3RlZCBmaW5hbCBDcmVkZW50aWFsUHJvdmlkZXJJbmZvIG1Qcm92aWRlckluZm87Ci0gICAgQE51bGxhYmxlIHByb3RlY3RlZCBmaW5hbCBSZW1vdGVDcmVkZW50aWFsU2VydmljZSBtUmVtb3RlQ3JlZGVudGlhbFNlcnZpY2U7Ci0gICAgQE5vbk51bGwgcHJvdGVjdGVkIGZpbmFsIGludCBtVXNlcklkOwotICAgIEBOb25OdWxsIHByb3RlY3RlZCBTdGF0dXMgbVN0YXR1cyA9IFN0YXR1cy5OT1RfU1RBUlRFRDsKLSAgICBATnVsbGFibGUgcHJvdGVjdGVkIGZpbmFsIFByb3ZpZGVySW50ZXJuYWxDYWxsYmFjayBtQ2FsbGJhY2tzOwotICAgIEBOdWxsYWJsZSBwcm90ZWN0ZWQgQ3JlZGVudGlhbCBtRmluYWxDcmVkZW50aWFsUmVzcG9uc2U7Ci0gICAgQE51bGxhYmxlIHByb3RlY3RlZCBJQ2FuY2VsbGF0aW9uU2lnbmFsIG1Qcm92aWRlckNhbmNlbGxhdGlvblNpZ25hbDsKLSAgICBATm9uTnVsbCBwcm90ZWN0ZWQgZmluYWwgVCBtUHJvdmlkZXJSZXF1ZXN0OwotICAgIEBOdWxsYWJsZSBwcm90ZWN0ZWQgUiBtUHJvdmlkZXJSZXNwb25zZTsKLSAgICBATm9uTnVsbCBwcm90ZWN0ZWQgQm9vbGVhbiBtUHJvdmlkZXJSZXNwb25zZVNldCA9IGZhbHNlOworICAgIEBOb25OdWxsCisgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgQE5vbk51bGwKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50TmFtZTsKKyAgICBATnVsbGFibGUKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ3JlZGVudGlhbFByb3ZpZGVySW5mbyBtUHJvdmlkZXJJbmZvOworICAgIEBOdWxsYWJsZQorICAgIHByb3RlY3RlZCBmaW5hbCBSZW1vdGVDcmVkZW50aWFsU2VydmljZSBtUmVtb3RlQ3JlZGVudGlhbFNlcnZpY2U7CisgICAgQE5vbk51bGwKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IG1Vc2VySWQ7CisgICAgQE5vbk51bGwKKyAgICBwcm90ZWN0ZWQgU3RhdHVzIG1TdGF0dXMgPSBTdGF0dXMuTk9UX1NUQVJURUQ7CisgICAgQE51bGxhYmxlCisgICAgcHJvdGVjdGVkIGZpbmFsIFByb3ZpZGVySW50ZXJuYWxDYWxsYmFjayBtQ2FsbGJhY2tzOworICAgIEBOdWxsYWJsZQorICAgIHByb3RlY3RlZCBDcmVkZW50aWFsIG1GaW5hbENyZWRlbnRpYWxSZXNwb25zZTsKKyAgICBATnVsbGFibGUKKyAgICBwcm90ZWN0ZWQgSUNhbmNlbGxhdGlvblNpZ25hbCBtUHJvdmlkZXJDYW5jZWxsYXRpb25TaWduYWw7CisgICAgQE5vbk51bGwKKyAgICBwcm90ZWN0ZWQgZmluYWwgVCBtUHJvdmlkZXJSZXF1ZXN0OworICAgIEBOdWxsYWJsZQorICAgIHByb3RlY3RlZCBSIG1Qcm92aWRlclJlc3BvbnNlOworICAgIEBOb25OdWxsCisgICAgcHJvdGVjdGVkIEJvb2xlYW4gbVByb3ZpZGVyUmVzcG9uc2VTZXQgPSBmYWxzZTsKICAgICAvLyBTcGVjaWZpYyBjYW5kaWRhdGUgcHJvdmlkZXIgbWV0cmljIGZvciB0aGUgcHJvdmlkZXIgdGhpcyBzZXNzaW9uIGhhbmRsZXMKLSAgICBATnVsbGFibGUgcHJvdGVjdGVkIENhbmRpZGF0ZVBoYXNlTWV0cmljIG1DYW5kaWRhdGVQcm92aWRlck1ldHJpYzsKLSAgICBATm9uTnVsbCBwcml2YXRlIGludCBtUHJvdmlkZXJTZXNzaW9uVWlkOworICAgIEBOb25OdWxsCisgICAgcHJvdGVjdGVkIGZpbmFsIENhbmRpZGF0ZVBoYXNlTWV0cmljIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljID0KKyAgICAgICAgICAgIG5ldyBDYW5kaWRhdGVQaGFzZU1ldHJpYygpOworICAgIEBOb25OdWxsCisgICAgcHJpdmF0ZSBpbnQgbVByb3ZpZGVyU2Vzc2lvblVpZDsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RhdHVzIHJlZmxlY3RzIHRoYXQgdGhlIHByb3ZpZGVyIHN0YXRlIGlzIHJlYWR5IHRvIGJlIHNob3duCkBAIC0xMDAsNiArMTE3LDcgQEAKICAgICAgKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYW55IGNsYXNzIHRoYXQgd2lzaGVzIHRvIGdldCBhIGNhbGxiYWNrIHdoZW4gYSBwYXJ0aWN1bGFyCiAgICAgICogcHJvdmlkZXIgc2Vzc2lvbidzIHN0YXR1cyBjaGFuZ2VzLiBUeXBpY2FsbHksIGltcGxlbWVudGVkIGJ5IHRoZSB7QGxpbmsgUmVxdWVzdFNlc3Npb259CiAgICAgICogY2xhc3MuCisgICAgICoKICAgICAgKiBAcGFyYW0gPFY+IHRoZSB0eXBlIG9mIHRoZSBmaW5hbCByZXNwb25zZSBleHBlY3RlZAogICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgUHJvdmlkZXJJbnRlcm5hbENhbGxiYWNrPFY+IHsKQEAgLTEyNyw3ICsxNDUsNiBAQAogICAgICAgICBtVXNlcklkID0gdXNlcklkOwogICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7CiAgICAgICAgIG1SZW1vdGVDcmVkZW50aWFsU2VydmljZSA9IHJlbW90ZUNyZWRlbnRpYWxTZXJ2aWNlOwotICAgICAgICBtQ2FuZGlkYXRlUHJvdmlkZXJNZXRyaWMgPSBuZXcgQ2FuZGlkYXRlUGhhc2VNZXRyaWMoKTsKICAgICAgICAgbVByb3ZpZGVyU2Vzc2lvblVpZCA9IE1ldHJpY1V0aWxpdGllcy5nZXRQYWNrYWdlVWlkKG1Db250ZXh0LCBtQ29tcG9uZW50TmFtZSk7CiAgICAgfQogCkBAIC0xNTgsNyArMTc1LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgQ3JlZGVudGlhbCBnZXRGaW5hbENyZWRlbnRpYWxSZXNwb25zZSgpIHsKLSAgICAgICAgcmV0dXJuICBtRmluYWxDcmVkZW50aWFsUmVzcG9uc2U7CisgICAgICAgIHJldHVybiBtRmluYWxDcmVkZW50aWFsUmVzcG9uc2U7CiAgICAgfQogCiAgICAgLyoqIFByb3BhZ2F0ZXMgY2FuY2VsbGF0aW9uIHNpZ25hbCB0byB0aGUgcmVtb3RlIHByb3ZpZGVyIHNlcnZpY2UuICovCkBAIC0xOTIsNyArMjA5LDEzIEBACiAgICAgICAgIHJldHVybiBtUmVtb3RlQ3JlZGVudGlhbFNlcnZpY2U7CiAgICAgfQogCi0gICAgLyoqIFVwZGF0ZXMgdGhlIHN0YXR1cyAuKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjYXB0dXJlQ2FuZGlkYXRlRmFpbHVyZSgpIHsKKyAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0SGFzRXhjZXB0aW9uKHRydWUpOworICAgICAgICAvLyBUT0RPKGIvMjcxMTM1MDQ4KSAtIHRoaXMgaXMgYSB0cnVlIGV4Y2VwdGlvbiwgYnV0IHdoYXQgYWJvdXQgdGhlIGVtcHR5IGNhc2U/CisgICAgICAgIC8vIEFkZCBtb3JlIG51YW5jZSBpbiBuZXh0IGl0ZXJhdGlvbi4KKyAgICB9CisKKyAgICAvKiogVXBkYXRlcyB0aGUgc3RhdHVzIC4gKi8KICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXNBbmRJbnZva2VDYWxsYmFjayhATm9uTnVsbCBTdGF0dXMgc3RhdHVzKSB7CiAgICAgICAgIHNldFN0YXR1cyhzdGF0dXMpOwogICAgICAgICB1cGRhdGVDYW5kaWRhdGVNZXRyaWMoc3RhdHVzKTsKQEAgLTIwMCwxNSArMjIzLDM3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhbmRpZGF0ZU1ldHJpYyhTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIG1DYW5kaWRhdGVQcm92aWRlck1ldHJpYy5zZXRDYW5kaWRhdGVVaWQobVByb3ZpZGVyU2Vzc2lvblVpZCk7Ci0gICAgICAgIG1DYW5kaWRhdGVQcm92aWRlck1ldHJpYwotICAgICAgICAgICAgICAgIC5zZXRRdWVyeUZpbmlzaFRpbWVOYW5vc2Vjb25kcyhTeXN0ZW0ubmFub1RpbWUoKSk7Ci0gICAgICAgIGlmIChpc1Rlcm1pbmF0aW5nU3RhdHVzKHN0YXR1cykpIHsKLSAgICAgICAgICAgIG1DYW5kaWRhdGVQcm92aWRlck1ldHJpYy5zZXRQcm92aWRlclF1ZXJ5U3RhdHVzKFByb3ZpZGVyU3RhdHVzRm9yTWV0cmljcy5RVUVSWV9GQUlMVVJFCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXRyaWNDb2RlKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGlzQ29tcGxldGlvblN0YXR1cyhzdGF0dXMpKSB7Ci0gICAgICAgICAgICBtQ2FuZGlkYXRlUHJvdmlkZXJNZXRyaWMuc2V0UHJvdmlkZXJRdWVyeVN0YXR1cyhQcm92aWRlclN0YXR1c0Zvck1ldHJpY3MuUVVFUllfU1VDQ0VTUwotICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0cmljQ29kZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLnNldENhbmRpZGF0ZVVpZChtUHJvdmlkZXJTZXNzaW9uVWlkKTsKKyAgICAgICAgICAgIC8vIFRPRE8gaW1tZWRpYXRlbHkgdXBkYXRlIHRoZSBjYW5kaWRhdGUgcGhhc2UgaGVyZSB0byBoYXZlIG1vcmUgbmV3IGRhdGEKKyAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljCisgICAgICAgICAgICAgICAgICAgIC5zZXRRdWVyeUZpbmlzaFRpbWVOYW5vc2Vjb25kcyhTeXN0ZW0ubmFub1RpbWUoKSk7CisgICAgICAgICAgICBpZiAoaXNUZXJtaW5hdGluZ1N0YXR1cyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0UXVlcnlSZXR1cm5lZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0UHJvdmlkZXJRdWVyeVN0YXR1cygKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyU3RhdHVzRm9yTWV0cmljcy5RVUVSWV9GQUlMVVJFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRyaWNDb2RlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc0NvbXBsZXRpb25TdGF0dXMoc3RhdHVzKSkgeworICAgICAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLnNldFF1ZXJ5UmV0dXJuZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0UHJvdmlkZXJRdWVyeVN0YXR1cygKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyU3RhdHVzRm9yTWV0cmljcy5RVUVSWV9TVUNDRVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRyaWNDb2RlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgbWV0cmljIGxvZ2dpbmc6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbW1vbiBtZXRob2QgdG8gdHJhbnNmZXIgbWV0cmljcyBmcm9tIHRoZSBpbml0aWFsIHBoYXNlIHRvIHRoZSBjYW5kaWRhdGUgcGhhc2UgcGVyIHByb3ZpZGVyCisgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRDYW5kaWRhdGVNZXRyaWNzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5pdGlhbFBoYXNlTWV0cmljIGluaXRNZXRyaWMgPSAoKFJlcXVlc3RTZXNzaW9uKSBtQ2FsbGJhY2tzKS5tSW5pdGlhbFBoYXNlTWV0cmljOworICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0U2Vzc2lvbklkKGluaXRNZXRyaWMuZ2V0U2Vzc2lvbklkKCkpOworICAgICAgICAgICAgbUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMuc2V0U2VydmljZUJlZ2FuVGltZU5hbm9zZWNvbmRzKAorICAgICAgICAgICAgICAgICAgICBpbml0TWV0cmljLmdldENyZWRlbnRpYWxTZXJ2aWNlU3RhcnRlZFRpbWVOYW5vc2Vjb25kcygpKTsKKyAgICAgICAgICAgIG1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljLnNldFN0YXJ0UXVlcnlUaW1lTmFub3NlY29uZHMoU3lzdGVtLm5hbm9UaW1lKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgbWV0cmljIGxvZ2dpbmc6ICIgKyBlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjI4LDcgKzI3Myw4IEBACiAgICAgfQogCiAgICAgLyoqIFVwZGF0ZSB0aGUgcmVzcG9uc2Ugc3RhdGUgc3RvcmVkIHdpdGggdGhlIHByb3ZpZGVyIHNlc3Npb24uICovCi0gICAgQE51bGxhYmxlIHByb3RlY3RlZCBSIGdldFByb3ZpZGVyUmVzcG9uc2UoKSB7CisgICAgQE51bGxhYmxlCisgICAgcHJvdGVjdGVkIFIgZ2V0UHJvdmlkZXJSZXNwb25zZSgpIHsKICAgICAgICAgcmV0dXJuIG1Qcm92aWRlclJlc3BvbnNlOwogICAgIH0KIApAQCAtMjY1LDE1ICszMTEsMjAgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8qKiBTaG91bGQgYmUgb3ZlcnJpZGRlbiB0byBwcmVwYXJlLCBhbmQgc3RvcmVzIHN0YXRlIGZvciB7QGxpbmsgUHJvdmlkZXJEYXRhfSB0byBiZQotICAgICAqIHNob3duIG9uIHRoZSBVSS4gKi8KLSAgICBATnVsbGFibGUgcHJvdGVjdGVkIGFic3RyYWN0IFByb3ZpZGVyRGF0YSBwcmVwYXJlVWlEYXRhKCk7CisgICAgLyoqCisgICAgICogU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8gcHJlcGFyZSwgYW5kIHN0b3JlcyBzdGF0ZSBmb3Ige0BsaW5rIFByb3ZpZGVyRGF0YX0gdG8gYmUKKyAgICAgKiBzaG93biBvbiB0aGUgVUkuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFByb3ZpZGVyRGF0YSBwcmVwYXJlVWlEYXRhKCk7CiAKICAgICAvKiogU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8gaGFuZGxlIHRoZSBzZWxlY3RlZCBlbnRyeSBmcm9tIHRoZSBVSS4gKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvblVpRW50cnlTZWxlY3RlZChTdHJpbmcgZW50cnlUeXBlLCBTdHJpbmcgZW50cnlJZCwKICAgICAgICAgICAgIFByb3ZpZGVyUGVuZGluZ0ludGVudFJlc3BvbnNlIHByb3ZpZGVyUGVuZGluZ0ludGVudFJlc3BvbnNlKTsKIAotICAgIC8qKiBTaG91bGQgYmUgb3ZlcnJpZGRlbiB0byBpbnZva2UgdGhlIHByb3ZpZGVyIGF0IGEgZGVmaW5lZCBsb2NhdGlvbi4gSGVscGZ1bCBmb3IKLSAgICAgKiBzaXR1YXRpb25zIHN1Y2ggYXMgbWV0cmljIGdlbmVyYXRpb24uICovCisgICAgLyoqCisgICAgICogU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8gaW52b2tlIHRoZSBwcm92aWRlciBhdCBhIGRlZmluZWQgbG9jYXRpb24uIEhlbHBmdWwgZm9yCisgICAgICogc2l0dWF0aW9ucyBzdWNoIGFzIG1ldHJpYyBnZW5lcmF0aW9uLgorICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGludm9rZVNlc3Npb24oKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1JlcXVlc3RTZXNzaW9uLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9SZXF1ZXN0U2Vzc2lvbi5qYXZhCmluZGV4IGVkZGRiYTAuLjNhYzEwYzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL1JlcXVlc3RTZXNzaW9uLmphdmEKKysrIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvUmVxdWVzdFNlc3Npb24uamF2YQpAQCAtMzYsMTIgKzM2LDE1IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY3JlZGVudGlhbHMubWV0cmljcy5BcGlOYW1lOwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkFwaVN0YXR1czsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY3JlZGVudGlhbHMubWV0cmljcy5DYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljOwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkNhbmRpZGF0ZVBoYXNlTWV0cmljOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkNob3NlblByb3ZpZGVyTWV0cmljOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzLkNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY3JlZGVudGlhbHMubWV0cmljcy5FbnRyeUVudW07CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmNyZWRlbnRpYWxzLm1ldHJpY3MuSW5pdGlhbFBoYXNlTWV0cmljOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKQEAgLTc1LDggKzc4LDE2IEBACiAgICAgcHJvdGVjdGVkIGZpbmFsIENhbmNlbGxhdGlvblNpZ25hbCBtQ2FuY2VsbGF0aW9uU2lnbmFsOwogCiAgICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsIFByb3ZpZGVyU2Vzc2lvbj4gbVByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICBwcm90ZWN0ZWQgQ2hvc2VuUHJvdmlkZXJNZXRyaWMgbUNob3NlblByb3ZpZGVyTWV0cmljID0gbmV3IENob3NlblByb3ZpZGVyTWV0cmljKCk7Ci0gICAgcHJvdGVjdGVkIEluaXRpYWxQaGFzZU1ldHJpYyBtSW5pdGlhbFBoYXNlTWV0cmljID0gbmV3IEluaXRpYWxQaGFzZU1ldHJpYygpOworICAgIHByb3RlY3RlZCBmaW5hbCBJbml0aWFsUGhhc2VNZXRyaWMgbUluaXRpYWxQaGFzZU1ldHJpYyA9IG5ldyBJbml0aWFsUGhhc2VNZXRyaWMoKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljCisgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljID0gbmV3IENob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYygpOworCisgICAgLy8gVE9ETyhiLzI3MTEzNTA0OCkgLSBHcm91cCBtZXRyaWNzIHVzZWQgaW4gYSBzY29wZSB0b2dldGhlciwgc3VjaCBhcyBoZXJlIGluIFJlcXVlc3RTZXNzaW9uCisgICAgLy8gVE9ETyhiLzI3MTEzNTA0OCkgLSBSZXBsYWNlIHRoaXMgd2l0aCBhIG5ldyBhdG9tIHBlciBlYWNoIGJyb3dzaW5nIGVtaXQgKFY0KQorICAgIEBOb25OdWxsCisgICAgcHJvdGVjdGVkIExpc3Q8Q2FuZGlkYXRlQnJvd3NpbmdQaGFzZU1ldHJpYz4gbUNhbmRpZGF0ZUJyb3dzaW5nUGhhc2VNZXRyaWMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAvLyBBcyBlbWl0cyBvY2N1ciBpbiBzZXF1ZW50aWFsIG9yZGVyLCBpbmNyZW1lbnQgdGhpcyBjb3VudGVyIGFuZCB1dGlsaXplCisgICAgcHJvdGVjdGVkIGludCBtU2VxdWVuY2VDb3VudGVyID0gMDsKICAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG1IeWJyaWRTZXJ2aWNlOwogCiAgICAgQE5vbk51bGwKQEAgLTExMiw5ICsxMjMsMTcgQEAKICAgICAgICAgICAgICAgICBtVXNlcklkLCB0aGlzKTsKICAgICAgICAgbUh5YnJpZFNlcnZpY2UgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICBSLnN0cmluZy5jb25maWdfZGVmYXVsdENyZWRlbnRpYWxNYW5hZ2VySHlicmlkU2VydmljZSk7Ci0gICAgICAgIG1Jbml0aWFsUGhhc2VNZXRyaWMuc2V0Q3JlZGVudGlhbFNlcnZpY2VTdGFydGVkVGltZU5hbm9zZWNvbmRzKHRpbWVzdGFtcFN0YXJ0ZWQpOwotICAgICAgICBtSW5pdGlhbFBoYXNlTWV0cmljLnNldFNlc3Npb25JZChtUmVxdWVzdElkLmhhc2hDb2RlKCkpOwotICAgICAgICBtSW5pdGlhbFBoYXNlTWV0cmljLnNldENhbGxlclVpZChtQ2FsbGluZ1VpZCk7CisgICAgICAgIGluaXRpYWxQaGFzZU1ldHJpY1NldHVwKHRpbWVzdGFtcFN0YXJ0ZWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsUGhhc2VNZXRyaWNTZXR1cChsb25nIHRpbWVzdGFtcFN0YXJ0ZWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Jbml0aWFsUGhhc2VNZXRyaWMuc2V0Q3JlZGVudGlhbFNlcnZpY2VTdGFydGVkVGltZU5hbm9zZWNvbmRzKHRpbWVzdGFtcFN0YXJ0ZWQpOworICAgICAgICAgICAgbUluaXRpYWxQaGFzZU1ldHJpYy5zZXRTZXNzaW9uSWQobVJlcXVlc3RJZC5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgIG1Jbml0aWFsUGhhc2VNZXRyaWMuc2V0Q2FsbGVyVWlkKG1DYWxsaW5nVWlkKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuZXhwZWN0ZWQgZXJyb3IgZHVyaW5nIG1ldHJpYyBsb2dnaW5nOiAiICsgZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgYWJzdHJhY3QgUHJvdmlkZXJTZXNzaW9uIGluaXRpYXRlUHJvdmlkZXJTZXNzaW9uKENyZWRlbnRpYWxQcm92aWRlckluZm8gcHJvdmlkZXJJbmZvLApAQCAtMTUyLDEwICsxNzEsMjYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBMb2cuaShUQUcsICJQcm92aWRlciBzZXNzaW9uIGZvdW5kIik7CisgICAgICAgIGxvZ0Jyb3dzaW5nUGhhc2VQZXJTZWxlY3Qoc2VsZWN0aW9uLCBwcm92aWRlclNlc3Npb24pOwogICAgICAgICBwcm92aWRlclNlc3Npb24ub25VaUVudHJ5U2VsZWN0ZWQoc2VsZWN0aW9uLmdldEVudHJ5S2V5KCksCiAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmdldEVudHJ5U3Via2V5KCksIHNlbGVjdGlvbi5nZXRQZW5kaW5nSW50ZW50UHJvdmlkZXJSZXNwb25zZSgpKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgbG9nQnJvd3NpbmdQaGFzZVBlclNlbGVjdChVc2VyU2VsZWN0aW9uRGlhbG9nUmVzdWx0IHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFByb3ZpZGVyU2Vzc2lvbiBwcm92aWRlclNlc3Npb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENhbmRpZGF0ZUJyb3dzaW5nUGhhc2VNZXRyaWMgYnJvd3NpbmdQaGFzZU1ldHJpYyA9IG5ldyBDYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljKCk7CisgICAgICAgICAgICBicm93c2luZ1BoYXNlTWV0cmljLnNldFNlc3Npb25JZCh0aGlzLm1Jbml0aWFsUGhhc2VNZXRyaWMuZ2V0U2Vzc2lvbklkKCkpOworICAgICAgICAgICAgYnJvd3NpbmdQaGFzZU1ldHJpYy5zZXRFbnRyeUVudW0oCisgICAgICAgICAgICAgICAgICAgIEVudHJ5RW51bS5nZXRNZXRyaWNDb2RlRnJvbVN0cmluZyhzZWxlY3Rpb24uZ2V0RW50cnlLZXkoKSkpOworICAgICAgICAgICAgYnJvd3NpbmdQaGFzZU1ldHJpYy5zZXRQcm92aWRlclVpZChwcm92aWRlclNlc3Npb24ubUNhbmRpZGF0ZVBoYXNlUGVyUHJvdmlkZXJNZXRyaWMKKyAgICAgICAgICAgICAgICAgICAgLmdldENhbmRpZGF0ZVVpZCgpKTsKKyAgICAgICAgICAgIHRoaXMubUNhbmRpZGF0ZUJyb3dzaW5nUGhhc2VNZXRyaWMuYWRkKG5ldyBDYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgbWV0cmljIGxvZ2dpbmc6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaFNlc3Npb24oYm9vbGVhbiBwcm9wYWdhdGVDYW5jZWxsYXRpb24pIHsKICAgICAgICAgTG9nLmkoVEFHLCAiZmluaXNoaW5nIHNlc3Npb24iKTsKICAgICAgICAgaWYgKHByb3BhZ2F0ZUNhbmNlbGxhdGlvbikgewpAQCAtMTc2LDcgKzIxMSwxNCBAQAogCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9nQXBpQ2FsbChBcGlOYW1lIGFwaU5hbWUsIEFwaVN0YXR1cyBhcGlTdGF0dXMpIHsKICAgICAgICAgbG9nQXBpQ2FsbGVkKGFwaU5hbWUsIGFwaVN0YXR1cywgbVByb3ZpZGVycywgbUNhbGxpbmdVaWQsCi0gICAgICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyTWV0cmljKTsKKyAgICAgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2dBcGlDYWxsKENob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYyBmaW5hbFBoYXNlTWV0cmljLAorICAgICAgICAgICAgTGlzdDxDYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljPiBicm93c2luZ1BoYXNlTWV0cmljcykgeworICAgICAgICAvLyBUT0RPIChiLzI3MDQwMzU0OSkgLSB0aGlzIGJyb3dzaW5nIHBoYXNlIG9iamVjdCBpcyBmaW5lIGJ1dCBhbHNvIGhhdmUgYSBuZXcgZW1pdAorICAgICAgICAvLyBGb3IgdGhlIHJldHVybmVkIHR5cGVzIGJ5IGF1dGhlbnRpY2F0aW9uIGVudHJpZXMgLSBpLmUuIGEgQ2FuZGlkYXRlUGhhc2UgRHVyaW5nIEJyb3dzZQorICAgICAgICAvLyBUT0RPIGNhbGwgTWV0cmljVXRpbGl0aWVzIHdpdGggbmV3IHNldHVwCiAgICAgfQogCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZXNzaW9uQ2FuY2VsbGVkKCkgewpAQCAtMjAzLDYgKzI0NSw3IEBACiAgICAgICAgIExvZy5pKFRBRywgIkluIGdldFByb3ZpZGVyRGF0YUFuZEluaXRpYXRlVWkgcHJvdmlkZXJzIHNpemU6ICIgKyBtUHJvdmlkZXJzLnNpemUoKSk7CiAKICAgICAgICAgaWYgKGlzU2Vzc2lvbkNhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICBNZXRyaWNVdGlsaXRpZXMubG9nQXBpQ2FsbGVkKG1Qcm92aWRlcnMsICsrbVNlcXVlbmNlQ291bnRlcik7CiAgICAgICAgICAgICBmaW5pc2hTZXNzaW9uKC8qcHJvcGFnYXRlQ2FuY2VsbGF0aW9uPSovdHJ1ZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTIxOCwxMSArMjYxLDggQEAKICAgICAgICAgfQogICAgICAgICBpZiAoIXByb3ZpZGVyRGF0YUxpc3QuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJwcm92aWRlciBsaXN0IG5vdCBlbXB0eSBhYm91dCB0byBpbml0aWF0ZSB1aSIpOwotICAgICAgICAgICAgaWYgKGlzU2Vzc2lvbkNhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiSW4gZ2V0UHJvdmlkZXJEYXRhQW5kSW5pdGlhdGVVaSBidXQgc2Vzc2lvbiBoYXMgYmVlbiBjYW5jZWxsZWQiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGF1bmNoVWlXaXRoUHJvdmlkZXJEYXRhKHByb3ZpZGVyRGF0YUxpc3QpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgTWV0cmljVXRpbGl0aWVzLmxvZ0FwaUNhbGxlZChtUHJvdmlkZXJzLCArK21TZXF1ZW5jZUNvdW50ZXIpOworICAgICAgICAgICAgbGF1bmNoVWlXaXRoUHJvdmlkZXJEYXRhKHByb3ZpZGVyRGF0YUxpc3QpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMzIsMTIgKzI3MiwyNyBAQAogICAgICAqIEBwYXJhbSBjb21wb25lbnROYW1lIHRoZSBjb21wb25lbnROYW1lIHRvIGFzc29jaWF0ZSB3aXRoIGEgcHJvdmlkZXIKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDaG9zZW5NZXRyaWMoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7Ci0gICAgICAgIENhbmRpZGF0ZVBoYXNlTWV0cmljIG1ldHJpYyA9IHRoaXMubVByb3ZpZGVycy5nZXQoY29tcG9uZW50TmFtZS5mbGF0dGVuVG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgICAubUNhbmRpZGF0ZVByb3ZpZGVyTWV0cmljOwotICAgICAgICBtQ2hvc2VuUHJvdmlkZXJNZXRyaWMuc2V0Q2hvc2VuVWlkKG1ldHJpYy5nZXRDYW5kaWRhdGVVaWQoKSk7Ci0gICAgICAgIG1DaG9zZW5Qcm92aWRlck1ldHJpYy5zZXRGaW5hbEZpbmlzaFRpbWVOYW5vc2Vjb25kcyhTeXN0ZW0ubmFub1RpbWUoKSk7Ci0gICAgICAgIG1DaG9zZW5Qcm92aWRlck1ldHJpYy5zZXRRdWVyeVBoYXNlTGF0ZW5jeU1pY3Jvc2Vjb25kcygKLSAgICAgICAgICAgICAgICBtZXRyaWMuZ2V0UXVlcnlMYXRlbmN5TWljcm9zZWNvbmRzKCkpOwotICAgICAgICBtQ2hvc2VuUHJvdmlkZXJNZXRyaWMuc2V0UXVlcnlTdGFydFRpbWVOYW5vc2Vjb25kcyhtZXRyaWMuZ2V0U3RhcnRRdWVyeVRpbWVOYW5vc2Vjb25kcygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENhbmRpZGF0ZVBoYXNlTWV0cmljIG1ldHJpYyA9IHRoaXMubVByb3ZpZGVycy5nZXQoY29tcG9uZW50TmFtZS5mbGF0dGVuVG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgLm1DYW5kaWRhdGVQaGFzZVBlclByb3ZpZGVyTWV0cmljOworCisgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldFNlc3Npb25JZChtZXRyaWMuZ2V0U2Vzc2lvbklkKCkpOworICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRDaG9zZW5VaWQobWV0cmljLmdldENhbmRpZGF0ZVVpZCgpKTsKKworICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRRdWVyeVBoYXNlTGF0ZW5jeU1pY3Jvc2Vjb25kcygKKyAgICAgICAgICAgICAgICAgICAgbWV0cmljLmdldFF1ZXJ5TGF0ZW5jeU1pY3Jvc2Vjb25kcygpKTsKKworICAgICAgICAgICAgbUNob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5zZXRTZXJ2aWNlQmVnYW5UaW1lTmFub3NlY29uZHMoCisgICAgICAgICAgICAgICAgICAgIG1ldHJpYy5nZXRTZXJ2aWNlQmVnYW5UaW1lTmFub3NlY29uZHMoKSk7CisgICAgICAgICAgICBtQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljLnNldFF1ZXJ5U3RhcnRUaW1lTmFub3NlY29uZHMoCisgICAgICAgICAgICAgICAgICAgIG1ldHJpYy5nZXRTdGFydFF1ZXJ5VGltZU5hbm9zZWNvbmRzKCkpOworCisgICAgICAgICAgICAvLyBUT0RPIGltbWVkaWF0ZWx5IHVwZGF0ZSB3aXRoIHRoZSBlbnRyeSBjb3VudCBudW1iZXJzIGZyb20gdGhlIGNhbmRpZGF0ZSBtZXRyaWNzCisgICAgICAgICAgICAvLyBUT0RPIGltbWVkaWF0ZWx5IGFkZCB0aGUgZXhjZXB0aW9uIGJpdCBmb3IgY2FuZGlkYXRlcyBhbmQgcHJvdmlkZXJzCisKKyAgICAgICAgICAgIG1DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuc2V0RmluYWxGaW5pc2hUaW1lTmFub3NlY29uZHMoU3lzdGVtLm5hbm9UaW1lKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgbWV0cmljIGxvZ2dpbmc6ICIgKyBlKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL21ldHJpY3MvQ2FuZGlkYXRlQnJvd3NpbmdQaGFzZU1ldHJpYy5qYXZhIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvbWV0cmljcy9DYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljLmphdmEKaW5kZXggMzdlYzhmMC4uMGUxZTAzODkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL21ldHJpY3MvQ2FuZGlkYXRlQnJvd3NpbmdQaGFzZU1ldHJpYy5qYXZhCisrKyBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL21ldHJpY3MvQ2FuZGlkYXRlQnJvd3NpbmdQaGFzZU1ldHJpYy5qYXZhCkBAIC0xNywyMyArMTcsMjIgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmNyZWRlbnRpYWxzLm1ldHJpY3M7CiAKIC8qKgotICogQSBwYXJ0IG9mIHRoZSBDYW5kaWRhdGUgUGhhc2UsIGJ1dCBlbWl0dGVkIGFsb25nc2lkZSB7QGxpbmsgQ2hvc2VuUHJvdmlkZXJNZXRyaWN9LiBUaGUgdXNlciBpcwotICogc2hvd24gdmFyaW91cyBlbnRyaWVzIGZyb20gdGhlIHByb3ZpZGVyIHJlc3BvbnNlcywgYW5kIG1heSBzZWxlY3RpdmVseSBicm93c2UgdGhyb3VnaCBtYW55Ci0gKiBlbnRyaWVzLiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBpbml0aWFsIHNldCBvZiBicm93c2luZyBpcyBmb3IgYSBwcm92aWRlciB0aGF0IGlzIHVsdGltYXRlbHkKLSAqIG5vdCBjaG9zZW4uIFRoaXMgbWV0cmljIHdpbGwgYmUgZ2F0aGVyZWQgUEVSIGJyb3dzaW5nIGNsaWNrLCBhbmQgYWdncmVnYXRlZCwgc28gdGhhdCB3ZSBjYW4KLSAqIHVuZGVyc3RhbmQgd2hlcmUgdXNlciBpbnRlcmFjdGlvbiBpcyBtb3JlIGN1bWJlcnNvbWUsIGluZm9ybWluZyB1cyBmb3IgZnV0dXJlIGltcHJvdmVtZW50cy4gVGhpcwotICogY2FuIG9ubHkgYmUgY29tcGxldGUgd2hlbiB0aGUgYnJvd3NpbmcgaXMgZmluaXNoZWQsIGVuZGluZyBpbiBhIGZpbmFsIHVzZXIgY2hvaWNlLCBvciBwb3NzaWJseQotICogYSBjYW5jZWxsYXRpb24uIFRodXMsIHRoaXMgd2lsbCBiZSBjb2xsZWN0ZWQgYW5kIGVtaXR0ZWQgaW4gdGhlIGZpbmFsIHBoYXNlLCB0aG91Z2ggY29sbGVjdGlvbgotICogd2lsbCBiZWdpbiBpbiB0aGUgY2FuZGlkYXRlIHBoYXNlIHdoZW4gdGhlIHVzZXIgYmVnaW5zIGJyb3dzaW5nIG9wdGlvbnMuCisgKiBBIHBhcnQgb2YgdGhlIENhbmRpZGF0ZSBQaGFzZSwgYnV0IGVtaXR0ZWQgYWxvbmdzaWRlIHtAbGluayBDaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWN9LgorICogVGhlIHVzZXIgaXMgc2hvd24gdmFyaW91cyBlbnRyaWVzIGZyb20gdGhlIHByb3ZpZGVyIHJlc3BvbnNlcywgYW5kIG1heSBzZWxlY3RpdmVseSBicm93c2UgdGhyb3VnaAorICogbWFueSBlbnRyaWVzLiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBpbml0aWFsIHNldCBvZiBicm93c2luZyBpcyBmb3IgYSBwcm92aWRlciB0aGF0IGlzCisgKiB1bHRpbWF0ZWx5IG5vdCBjaG9zZW4uIFRoaXMgbWV0cmljIHdpbGwgYmUgZ2F0aGVyZWQgUEVSIGJyb3dzaW5nIGNsaWNrLCBhbmQgYWdncmVnYXRlZCwgc28gdGhhdAorICogd2UgY2FuIHVuZGVyc3RhbmQgd2hlcmUgdXNlciBpbnRlcmFjdGlvbiBpcyBtb3JlIGN1bWJlcnNvbWUsIGluZm9ybWluZyB1cyBmb3IgZnV0dXJlCisgKiBpbXByb3ZlbWVudHMuIFRoaXMgY2FuIG9ubHkgYmUgY29tcGxldGUgd2hlbiB0aGUgYnJvd3NpbmcgaXMgZmluaXNoZWQsIGVuZGluZyBpbiBhIGZpbmFsIHVzZXIKKyAqIGNob2ljZSwgb3IgcG9zc2libHkgYSBjYW5jZWxsYXRpb24uIFRodXMsIHRoaXMgd2lsbCBiZSBjb2xsZWN0ZWQgYW5kIGVtaXR0ZWQgaW4gdGhlIGZpbmFsIHBoYXNlLAorICogdGhvdWdoIGNvbGxlY3Rpb24gd2lsbCBiZWdpbiBpbiB0aGUgY2FuZGlkYXRlIHBoYXNlIHdoZW4gdGhlIHVzZXIgYmVnaW5zIGJyb3dzaW5nIG9wdGlvbnMuCiAgKi8KIHB1YmxpYyBjbGFzcyBDYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljIHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2FuZGlkYXRlU2VsZWN0aW9uUGhhc2VNZXRyaWMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVFVRU5DRV9JRCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW5kaWRhdGVCcm93c2luZ1BoYXNlTWV0cmljIjsKICAgICAvLyBUaGUgc2Vzc2lvbiBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIEFQSSBDYWxsIHRoaXMgY2FuZGlkYXRlIHByb3ZpZGVyIGlzIGEgcGFydCBvZiwgZGVmYXVsdCAtMQogICAgIHByaXZhdGUgaW50IG1TZXNzaW9uSWQgPSAtMTsKLSAgICAvLyBUaGUgRW50cnlFbnVtIHRoYXQgd2FzIHByZXNzZWQsIGRlZmF1bHRzIHRvIC0xIChUT0RPIGltbWVkaWF0ZWx5LCBnZW5lcmF0ZSBlbnRyeSBlbnVtKS4KLSAgICBwcml2YXRlIGludCBtRW50cnlFbnVtID0gLTE7CisgICAgLy8gVGhlIEVudHJ5RW51bSB0aGF0IHdhcyBwcmVzc2VkLCBkZWZhdWx0cyB0byAtMQorICAgIHByaXZhdGUgaW50IG1FbnRyeUVudW0gPSBFbnRyeUVudW0uVU5LTk9XTi5nZXRNZXRyaWNDb2RlKCk7CiAgICAgLy8gVGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlc3MsIGRlZmF1bHRzIHRvIC0xCiAgICAgcHJpdmF0ZSBpbnQgbVByb3ZpZGVyVWlkID0gLTE7CiAKQEAgLTQ3LDEyICs0Niw2IEBACiAgICAgICAgIHJldHVybiBtU2Vzc2lvbklkOwogICAgIH0KIAotICAgIC8qIC0tIFRoZSBzZXF1ZW5jZSBJRCAtLSAqLwotCi0gICAgcHVibGljIGludCBnZXRTZXF1ZW5jZUlkKCkgewotICAgICAgICByZXR1cm4gU0VRVUVOQ0VfSUQ7Ci0gICAgfQotCiAgICAgLyogLS0gVGhlIEVudHJ5IG9mIHRoaXMgdGFwIC0tICovCiAKICAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeUVudW0oaW50IGVudHJ5RW51bSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvbWV0cmljcy9DYW5kaWRhdGVQaGFzZU1ldHJpYy5qYXZhIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvbWV0cmljcy9DYW5kaWRhdGVQaGFzZU1ldHJpYy5qYXZhCmluZGV4IDFjN2ZiNjkuLmYwMGM3ZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL21ldHJpY3MvQ2FuZGlkYXRlUGhhc2VNZXRyaWMuamF2YQorKysgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9tZXRyaWNzL0NhbmRpZGF0ZVBoYXNlTWV0cmljLmphdmEKQEAgLTIwLDYgKzIwLDkgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5NZXRyaWNVdGlsaXRpZXM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiAvKioKICAqIFRoZSBjZW50cmFsIGNhbmRpZGF0ZSBwcm92aWRlciBtZXRyaWMgb2JqZWN0IHRoYXQgbWltaWNzIG91ciBkZWZpbmVkIG1ldHJpYyBzZXR1cC4KICAqIFNvbWUgdHlwZXMgYXJlIHJlZHVuZGFudCBhY3Jvc3MgdGhlc2UgbWV0cmljIGNvbGxlY3RvcnMsIGJ1dCB0aGF0IGhhcyBkZWJ1ZyB1c2UtY2FzZXMgYXMKQEAgLTMwLDEwICszMyw4IEBACiBwdWJsaWMgY2xhc3MgQ2FuZGlkYXRlUGhhc2VNZXRyaWMgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW5kaWRhdGVQcm92aWRlck1ldHJpYyI7Ci0gICAgLy8gU2luY2UgdGhpcyB3aWxsIGFsd2F5cyBiZSB0aGUgc2Vjb25kIGluIHRoZSBzcGxpdCBzZXF1ZW5jZSwgdGhpcyBpcyBzdGF0aWNhbGx5IDIKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9JRCA9IDI7Ci0gICAgLy8gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIGVtaXQgb2YgdGhlIEFQSSBjYWxsLCBkZWZhdWx0IC0xLCBlcXVhbCBmb3IgYWxsIGNhbmRpZGF0ZXMKLSAgICBwcml2YXRlIGludCBtU2VxdWVuY2VJZCA9IC0xOworICAgIC8vIFRoZSBzZXNzaW9uIGlkIG9mIHRoaXMgcHJvdmlkZXIsIGRlZmF1bHQgc2V0IHRvIC0xCisgICAgcHJpdmF0ZSBpbnQgbVNlc3Npb25JZCA9IC0xOwogICAgIC8vIEluZGljYXRlcyBpZiB0aGlzIHByb3ZpZGVyIHJldHVybmVkIGZyb20gdGhlIHF1ZXJ5IHBoYXNlLCBkZWZhdWx0IGZhbHNlCiAgICAgcHJpdmF0ZSBib29sZWFuIG1RdWVyeVJldHVybmVkID0gZmFsc2U7CiAKQEAgLTY4LDYgKzY5LDggQEAKICAgICBwcml2YXRlIGludCBtUmVtb3RlRW50cnlDb3VudCA9IC0xOwogICAgIC8vIFRoZSBjb3VudCBvZiBhdXRoZW50aWNhdGlvbiBlbnRyaWVzIGZyb20gdGhpcyBwcm92aWRlciwgZGVmYXVsdHMgdG8gLTEKICAgICBwcml2YXRlIGludCBtQXV0aGVudGljYXRpb25FbnRyeUNvdW50ID0gLTE7CisgICAgLy8gR2F0aGVyZWQgdG8gcGFzcyBvbiB0byBjaG9zZW4gcHJvdmlkZXIgd2hlbiByZXF1aXJlZAorICAgIHByaXZhdGUgTGlzdDxFbnRyeUVudW0+IG1BdmFpbGFibGVFbnRyaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICBwdWJsaWMgQ2FuZGlkYXRlUGhhc2VNZXRyaWMoKSB7CiAgICAgfQpAQCAtMTUwLDE4ICsxNTMsMTMgQEAKICAgICB9CiAKICAgICAvKiAtLS0tLS0tLS0tLS0tLSBTZXNzaW9uIElkIC0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25JZChpbnQgc2Vzc2lvbklkKSB7CisgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgfQorCiAgICAgcHVibGljIGludCBnZXRTZXNzaW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiBTRVNTSU9OX0lEOwotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tIFNlcXVlbmNlIElkIC0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcXVlbmNlSWQoaW50IHNlcXVlbmNlSWQpIHsKLSAgICAgICAgbVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U2VxdWVuY2VJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXF1ZW5jZUlkOworICAgICAgICByZXR1cm4gbVNlc3Npb25JZDsKICAgICB9CiAKICAgICAvKiAtLS0tLS0tLS0tLS0tLSBRdWVyeSBSZXR1cm5lZCBTdGF0dXMgLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjQzLDQgKzI0MSwyOCBAQAogICAgIHB1YmxpYyBpbnQgZ2V0QXV0aGVudGljYXRpb25FbnRyeUNvdW50KCkgewogICAgICAgICByZXR1cm4gbUF1dGhlbnRpY2F0aW9uRW50cnlDb3VudDsKICAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLSBUaGUgRW50cmllcyBHYXRoZXJlZCAtLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgYWRkaW5nIGFuIGVudHJ5IHJlY29yZCB0byB0aGlzIG1ldHJpYyBjb2xsZWN0b3IsIHdoaWNoIGNhbiB0aGVuIGJlIHByb3BhZ2F0ZWQgdG8KKyAgICAgKiB0aGUgZmluYWwgcGhhc2UgdG8gcmV0YWluIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGF2YWlsYWJsZSB0byB0aGUgY2FuZGlkYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGUgdGhlIGVudHJ5IGVudW0gY29sbGVjdGVkIGJ5IHRoZSBjYW5kaWRhdGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWV0cmljCisgICAgICogICAgICAgICAgY29sbGVjdG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRW50cnkoRW50cnlFbnVtIGUpIHsKKyAgICAgICAgdGhpcy5tQXZhaWxhYmxlRW50cmllcy5hZGQoZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNhZmVseSBjb3BpZWQgbGlzdCBvZiB0aGUgZW50cmllcyBjYXB0dXJlZCBieSB0aGlzIG1ldHJpYyBjb2xsZWN0b3IgYXNzb2NpYXRlZAorICAgICAqIHdpdGggYSBwYXJ0aWN1bGFyIGNhbmRpZGF0ZSBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZ1bGwgY29sbGVjdGlvbiBvZiBlbnRyaWVzIGVuY291bnRlcmVkIGJ5IHRoZSBjYW5kaWRhdGUgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBtZXRyaWMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxFbnRyeUVudW0+IGdldEF2YWlsYWJsZUVudHJpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4odGhpcy5tQXZhaWxhYmxlRW50cmllcyk7IC8vIG5vIGFsaWFzIGNvcHkKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9tZXRyaWNzL0Nob3NlblByb3ZpZGVyTWV0cmljLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9tZXRyaWNzL0Nob3NlblByb3ZpZGVyRmluYWxQaGFzZU1ldHJpYy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL21ldHJpY3MvQ2hvc2VuUHJvdmlkZXJNZXRyaWMuamF2YQpyZW5hbWUgdG8gc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvbWV0cmljcy9DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuamF2YQppbmRleCAxYTYxMDkxLi4zMmZlMjA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9tZXRyaWNzL0Nob3NlblByb3ZpZGVyTWV0cmljLmphdmEKKysrIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvbWV0cmljcy9DaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMuamF2YQpAQCAtMjEsMTYgKzIxLDIyIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmNyZWRlbnRpYWxzLk1ldHJpY1V0aWxpdGllczsKIAogLyoqCi0gKiBUaGUgY2VudHJhbCBjaG9zZW4gcHJvdmlkZXIgbWV0cmljIG9iamVjdCB0aGF0IG1pbWljcyBvdXIgZGVmaW5lZCBtZXRyaWMgc2V0dXAuCisgKiBUaGUgY2VudHJhbCBjaG9zZW4gcHJvdmlkZXIgbWV0cmljIG9iamVjdCB0aGF0IG1pbWljcyBvdXIgZGVmaW5lZCBtZXRyaWMgc2V0dXAuIFRoaXMgaXMgdXNlZAorICogaW4gdGhlIGZpbmFsIHBoYXNlIG9mIHRoZSBmbG93IGFuZCBlbWl0cyBmaW5hbCBzdGF0dXMgbWV0cmljcy4KICAqIFNvbWUgdHlwZXMgYXJlIHJlZHVuZGFudCBhY3Jvc3MgdGhlc2UgbWV0cmljIGNvbGxlY3RvcnMsIGJ1dCB0aGF0IGhhcyBkZWJ1ZyB1c2UtY2FzZXMgYXMKICAqIHRoZXNlIGRhdGEtdHlwZXMgYXJlIGF2YWlsYWJsZSBhdCBkaWZmZXJlbnQgbW9tZW50cyBvZiB0aGUgZmxvdyAoYW5kIHR5cGljYWxseSwgb25lIGNhbiBmZWVkCiAgKiBpbnRvIHRoZSBuZXh0KS4KICAqIFRPRE8oYi8yNzA0MDM1NDkpIC0gaXRlcmF0ZSBvbiB0aGlzIGluIFYzKworICogVE9ETyhJbW1lZGlhdGVseSkgLSBmaW5hbGl6ZSBWMyBvbmx5IHR5cGVzCiAgKi8KLXB1YmxpYyBjbGFzcyBDaG9zZW5Qcm92aWRlck1ldHJpYyB7CitwdWJsaWMgY2xhc3MgQ2hvc2VuUHJvdmlkZXJGaW5hbFBoYXNlTWV0cmljIHsKIAotICAgIC8vIFRPRE8oYi8yNzA0MDM1NDkpIC0gYXBwbGllcyBlbHNld2hlcmUsIGxpa2VseSByZW1vdmVkIG9yIHJlcGxhY2VkIHdpdGggYSBjb3VudC1pbmRleCAoMSwyLDMpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDaG9zZW5Qcm92aWRlck1ldHJpYyI7CisgICAgLy8gVE9ETyhiLzI3MDQwMzU0OSkgLSBhcHBsaWVzIGVsc2V3aGVyZSwgbGlrZWx5IHJlbW92ZWQgb3IgcmVwbGFjZWQgdy8gc29tZSBoYXNoZWQvY291bnQgaW5kZXgKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNob3NlbkZpbmFsUGhhc2VNZXRyaWMiOworICAgIC8vIFRoZSBzZXNzaW9uIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFQSSBjYWxsLCB1c2VkIHRvIHVuaXRlIHNwbGl0IGVtaXRzCisgICAgcHJpdmF0ZSBsb25nIG1TZXNzaW9uSWQgPSAtMTsKKyAgICAvLyBSZXZlYWxzIGlmIHRoZSBVSSB3YXMgcmV0dXJuZWQsIGZhbHNlIGJ5IGRlZmF1bHQKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVpUmV0dXJuZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGludCBtQ2hvc2VuVWlkID0gLTE7CiAKICAgICAvLyBMYXRlbmN5IGZpZ3VyZXMgdHlwaWNhbGx5IGZlZCBpbiBmcm9tIHByaW9yIENhbmRpZGF0ZVByb3ZpZGVyTWV0cmljCkBAIC0zOSwxNiArNDUsMjkgQEAKICAgICBwcml2YXRlIGludCBtUXVlcnlQaGFzZUxhdGVuY3lNaWNyb3NlY29uZHMgPSAtMTsKIAogICAgIC8vIFRpbWVzdGFtcHMga2VwdCBpbiByYXcgbmFub3NlY29uZHMuIEV4cGVjdGVkIHRvIGJlIGNvbnZlcnRlZCB0byBtaWNyb3NlY29uZHMgZnJvbSB1c2luZwotICAgIC8vIHJlZmVyZW5jZSAnbVNlcnZpY2VCZWdhblRpbWVOYW5vc2Vjb25kcycgZHVyaW5nIG1ldHJpYyBsb2cgcG9pbnQuCisgICAgLy8gcmVmZXJlbmNlICdtU2VydmljZUJlZ2FuVGltZU5hbm9zZWNvbmRzJyBkdXJpbmcgbWV0cmljIGxvZyBwb2ludAogCisgICAgLy8gS2VwdCBmb3IgbG9jYWwgcmVmZXJlbmNlIHB1cnBvc2VzLCB0aGUgaW5pdGlhbCB0aW1lc3RhbXAgb2YgdGhlIHNlcnZpY2UgY2FsbGVkIHBhc3NlZCBpbgogICAgIHByaXZhdGUgbG9uZyBtU2VydmljZUJlZ2FuVGltZU5hbm9zZWNvbmRzID0gLTE7CisgICAgLy8gVGhlIGZpcnN0IHF1ZXJ5IHRpbWVzdGFtcCwgd2hpY2ggdXBvbiBlbWl0IGlzIG5vcm1hbGl6ZWQgdG8gbWljcm9zZWNvbmRzIHVzaW5nIHRoZSByZWZlcmVuY2UKKyAgICAvLyBzdGFydCB0aW1lc3RhbXAKICAgICBwcml2YXRlIGxvbmcgbVF1ZXJ5U3RhcnRUaW1lTmFub3NlY29uZHMgPSAtMTsKKyAgICAvLyBUaGUgVUkgY2FsbCB0aW1lc3RhbXAsIHdoaWNoIHVwb24gZW1pdCB3aWxsIGJlIG5vcm1hbGl6ZWQgdG8gbWljcm9zZWNvbmRzIHVzaW5nIHJlZmVyZW5jZQogICAgIHByaXZhdGUgbG9uZyBtVWlDYWxsU3RhcnRUaW1lTmFub3NlY29uZHMgPSAtMTsKKyAgICAvLyBUaGUgVUkgcmV0dXJuIHRpbWVzdGFtcCwgd2hpY2ggdXBvbiBlbWl0IHdpbGwgYmUgbm9ybWFsaXplZCB0byBtaWNyb3NlY29uZHMgdXNpbmcgcmVmZXJlbmNlCiAgICAgcHJpdmF0ZSBsb25nIG1VaUNhbGxFbmRUaW1lTmFub3NlY29uZHMgPSAtMTsKKyAgICAvLyBUaGUgZmluYWwgZmluaXNoIHRpbWVzdGFtcCwgd2hpY2ggdXBvbiBlbWl0IHdpbGwgYmUgbm9ybWFsaXplZCB0byBtaWNyb3NlY29uZHMgd2l0aCByZWZlcmVuY2UKICAgICBwcml2YXRlIGxvbmcgbUZpbmFsRmluaXNoVGltZU5hbm9zZWNvbmRzID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgbUNob3NlblByb3ZpZGVyU3RhdHVzID0gLTE7CisgICAgLy8gVGhlIHN0YXR1cyBvZiB0aGlzIHByb3ZpZGVyIGFmdGVyIHNlbGVjdGlvbgogCi0gICAgcHVibGljIENob3NlblByb3ZpZGVyTWV0cmljKCkgeworICAgIC8vIE90aGVyIEdlbmVyYWwgSW5mb3JtYXRpb24sIHN1Y2ggYXMgZmluYWwgYXBpIHN0YXR1cywgcHJvdmlkZXIgc3RhdHVzLCBlbnRyeSBpbmZvLCBldGMuLi4KKworICAgIHByaXZhdGUgaW50IG1DaG9zZW5Qcm92aWRlclN0YXR1cyA9IC0xOworICAgIC8vIFRPRE8gYWRkIHJlbWFpbmluZyBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBBdG9tIDsgc3BlY2lmaWNhbGx5LCBtaWdyYXRlIHRoZSBjYW5kaWRhdGUKKyAgICAvLyBFbnRyeSBpbmZvcm1hdGlvbiwgYW5kIHN0b3JlIGZpbmFsIHN0YXR1cyBoZXJlCisKKworICAgIHB1YmxpYyBDaG9zZW5Qcm92aWRlckZpbmFsUGhhc2VNZXRyaWMoKSB7CiAgICAgfQogCiAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBVSUQgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjAwLDQgKzIxOSwyNCBAQAogICAgIHB1YmxpYyB2b2lkIHNldENob3NlblByb3ZpZGVyU3RhdHVzKGludCBjaG9zZW5Qcm92aWRlclN0YXR1cykgewogICAgICAgICBtQ2hvc2VuUHJvdmlkZXJTdGF0dXMgPSBjaG9zZW5Qcm92aWRlclN0YXR1czsKICAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLSBTZXNzaW9uIElEIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWQobG9uZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTZXNzaW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvbklkOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tIFVJIFJldHVybmVkIFN1Y2Nlc3NmdWxseSAtLS0tLS0tLS0tLS0tLSAqLworCisgICAgcHVibGljIHZvaWQgc2V0VWlSZXR1cm5lZChib29sZWFuIHVpUmV0dXJuZWQpIHsKKyAgICAgICAgbVVpUmV0dXJuZWQgPSB1aVJldHVybmVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVWlSZXR1cm5lZCgpIHsKKyAgICAgICAgcmV0dXJuIG1VaVJldHVybmVkOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL21ldHJpY3MvRW50cnlFbnVtLmphdmEgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9tZXRyaWNzL0VudHJ5RW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNDAzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9tZXRyaWNzL0VudHJ5RW51bS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5tZXRyaWNzOworCitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuRnJhbWV3b3JrU3RhdHNMb2cuQ1JFREVOVElBTF9NQU5BR0VSX0FQSV9DQUxMRURfX0FQSV9OQU1FX19BUElfTkFNRV9DTEVBUl9DUkVERU5USUFMOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkZyYW1ld29ya1N0YXRzTG9nLkNSRURFTlRJQUxfTUFOQUdFUl9BUElfQ0FMTEVEX19BUElfTkFNRV9fQVBJX05BTUVfQ1JFQVRFX0NSRURFTlRJQUw7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuRnJhbWV3b3JrU3RhdHNMb2cuQ1JFREVOVElBTF9NQU5BR0VSX0FQSV9DQUxMRURfX0FQSV9OQU1FX19BUElfTkFNRV9HRVRfQ1JFREVOVElBTDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5GcmFtZXdvcmtTdGF0c0xvZy5DUkVERU5USUFMX01BTkFHRVJfQVBJX0NBTExFRF9fQVBJX05BTUVfX0FQSV9OQU1FX0lTX0VOQUJMRURfQ1JFREVOVElBTF9QUk9WSURFUl9TRVJWSUNFOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkZyYW1ld29ya1N0YXRzTG9nLkNSRURFTlRJQUxfTUFOQUdFUl9BUElfQ0FMTEVEX19BUElfTkFNRV9fQVBJX05BTUVfVU5LTk9XTjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmNyZWRlbnRpYWxzLlByb3ZpZGVyR2V0U2Vzc2lvbi5BQ1RJT05fRU5UUllfS0VZOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIuY3JlZGVudGlhbHMuUHJvdmlkZXJHZXRTZXNzaW9uLkFVVEhFTlRJQ0FUSU9OX0FDVElPTl9FTlRSWV9LRVk7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5Qcm92aWRlckdldFNlc3Npb24uQ1JFREVOVElBTF9FTlRSWV9LRVk7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5jcmVkZW50aWFscy5Qcm92aWRlckdldFNlc3Npb24uUkVNT1RFX0VOVFJZX0tFWTsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGVudW0gRW50cnlFbnVtIHsKKyAgICAvLyBUT0RPIGltbWVkaWF0ZWx5LCB1cGRhdGUgd2l0aCBidWlsdCBlbnRyaWVzCisgICAgVU5LTk9XTihDUkVERU5USUFMX01BTkFHRVJfQVBJX0NBTExFRF9fQVBJX05BTUVfX0FQSV9OQU1FX1VOS05PV04pLAorICAgIEFDVElPTl9FTlRSWShDUkVERU5USUFMX01BTkFHRVJfQVBJX0NBTExFRF9fQVBJX05BTUVfX0FQSV9OQU1FX0dFVF9DUkVERU5USUFMKSwKKyAgICBDUkVERU5USUFMX0VOVFJZKENSRURFTlRJQUxfTUFOQUdFUl9BUElfQ0FMTEVEX19BUElfTkFNRV9fQVBJX05BTUVfQ1JFQVRFX0NSRURFTlRJQUwpLAorICAgIFJFTU9URV9FTlRSWShDUkVERU5USUFMX01BTkFHRVJfQVBJX0NBTExFRF9fQVBJX05BTUVfX0FQSV9OQU1FX0NMRUFSX0NSRURFTlRJQUwpLAorICAgIEFVVEhFTlRJQ0FUSU9OX0VOVFJZKAorICAgICAgICAgICAgQ1JFREVOVElBTF9NQU5BR0VSX0FQSV9DQUxMRURfX0FQSV9OQU1FX19BUElfTkFNRV9JU19FTkFCTEVEX0NSRURFTlRJQUxfUFJPVklERVJfU0VSVklDRQorICAgICk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkVudHJ5RW51bSI7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtSW5uZXJNZXRyaWNDb2RlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc0tleVRvRW50cnlDb2RlID0gTWFwLm9mRW50cmllcygKKyAgICAgICAgICAgIG5ldyBBYnN0cmFjdE1hcC5TaW1wbGVFbnRyeTw+KEFDVElPTl9FTlRSWV9LRVksCisgICAgICAgICAgICAgICAgICAgIEFDVElPTl9FTlRSWS5tSW5uZXJNZXRyaWNDb2RlKSwKKyAgICAgICAgICAgIG5ldyBBYnN0cmFjdE1hcC5TaW1wbGVFbnRyeTw+KEFVVEhFTlRJQ0FUSU9OX0FDVElPTl9FTlRSWV9LRVksCisgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OX0VOVFJZLm1Jbm5lck1ldHJpY0NvZGUpLAorICAgICAgICAgICAgbmV3IEFic3RyYWN0TWFwLlNpbXBsZUVudHJ5PD4oUkVNT1RFX0VOVFJZX0tFWSwKKyAgICAgICAgICAgICAgICAgICAgUkVNT1RFX0VOVFJZLm1Jbm5lck1ldHJpY0NvZGUpLAorICAgICAgICAgICAgbmV3IEFic3RyYWN0TWFwLlNpbXBsZUVudHJ5PD4oQ1JFREVOVElBTF9FTlRSWV9LRVksCisgICAgICAgICAgICAgICAgICAgIENSRURFTlRJQUxfRU5UUlkubUlubmVyTWV0cmljQ29kZSkKKyAgICApOworCisgICAgRW50cnlFbnVtKGludCBpbm5lck1ldHJpY0NvZGUpIHsKKyAgICAgICAgdGhpcy5tSW5uZXJNZXRyaWNDb2RlID0gaW5uZXJNZXRyaWNDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVzIHRoZSBXZXN0LXdvcmxkIHZlcnNpb24gb2YgdGhlIG1ldHJpYyBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBhIGNvZGUgY29ycmVzcG9uZGluZyB0byB0aGUgd2VzdCB3b3JsZCBtZXRyaWMgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWV0cmljQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubUlubmVyTWV0cmljQ29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIHN0cmluZyBrZXkgdHlwZSBrbm93biB0byB0aGUgZnJhbWV3b3JrLCB0aGlzIHJldHVybnMgdGhlIGtub3duIG1ldHJpYyBjb2RlIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoYXQgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZ0tleSBhIHN0cmluZyBrZXkgdHlwZSBmb3IgYSBwYXJ0aWN1bGFyIGVudHJ5CisgICAgICogQHJldHVybiB0aGUgbWV0cmljIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW51bQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE1ldHJpY0NvZGVGcm9tU3RyaW5nKFN0cmluZyBzdHJpbmdLZXkpIHsKKyAgICAgICAgaWYgKCFzS2V5VG9FbnRyeUNvZGUuY29udGFpbnNLZXkoc3RyaW5nS2V5KSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiQXR0ZW1wdGVkIHRvIHVzZSBhbiB1bnN1cHBvcnRlZCBzdHJpbmcga2V5IGVudHJ5IHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOLm1Jbm5lck1ldHJpY0NvZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNLZXlUb0VudHJ5Q29kZS5nZXQoc3RyaW5nS2V5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9tZXRyaWNzL0luaXRpYWxQaGFzZU1ldHJpYy5qYXZhIGIvc2VydmljZXMvY3JlZGVudGlhbHMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY3JlZGVudGlhbHMvbWV0cmljcy9Jbml0aWFsUGhhc2VNZXRyaWMuamF2YQppbmRleCAzMWM2ZjZmLi5hNzM0OTVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jcmVkZW50aWFscy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jcmVkZW50aWFscy9tZXRyaWNzL0luaXRpYWxQaGFzZU1ldHJpYy5qYXZhCisrKyBiL3NlcnZpY2VzL2NyZWRlbnRpYWxzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NyZWRlbnRpYWxzL21ldHJpY3MvSW5pdGlhbFBoYXNlTWV0cmljLmphdmEKQEAgLTI0LDE2ICsyNCwxNCBAQAogICogVE9ETyhiLzI3MDQwMzU0OSkgLSBpdGVyYXRlIG9uIHRoaXMgaW4gVjMrCiAgKi8KIHB1YmxpYyBjbGFzcyBJbml0aWFsUGhhc2VNZXRyaWMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUHJlQ2FuZGlkYXRlTWV0cmljIjsKLSAgICAvLyBBIHNlcXVlbmNlIGlkIHRvIG9yZGVyIHVuaXRlZCBlbWl0cywgZHVlIHRvIHNwbGl0LCB0aGlzIHdpbGwgc3RhdGljYWxseSBhbHdheXMgYmUgMQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUVVFTkNFX0lEID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkluaXRpYWxQaGFzZU1ldHJpYyI7CiAKICAgICAvLyBUaGUgYXBpIGJlaW5nIGNhbGxlZCwgZGVmYXVsdCBzZXQgdG8gdW5rbm93bgogICAgIHByaXZhdGUgaW50IG1BcGlOYW1lID0gQXBpTmFtZS5VTktOT1dOLmdldE1ldHJpY0NvZGUoKTsKICAgICAvLyBUaGUgY2FsbGVyIHVpZCBvZiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiwgZGVmYXVsdCB0byAtMQogICAgIHByaXZhdGUgaW50IG1DYWxsZXJVaWQgPSAtMTsKICAgICAvLyBUaGUgc2Vzc2lvbiBpZCB0byB1bml0ZSBtdWx0aXBsZSBhdG9tIGVtaXRzLCBkZWZhdWx0IHRvIC0xCi0gICAgcHJpdmF0ZSBsb25nIG1TZXNzaW9uSWQgPSAtMTsKKyAgICBwcml2YXRlIGludCBtU2Vzc2lvbklkID0gLTE7CiAgICAgcHJpdmF0ZSBpbnQgbUNvdW50UmVxdWVzdENsYXNzVHlwZSA9IC0xOwogCiAgICAgLy8gUmF3IHRpbWVzdGFtcHMgaW4gbmFub3NlY29uZHMsICp0aGUgb25seSogb25lIGxvZ2dlZCBhcyBzdWNoIChpLmUuIDY0IGJpdHMpIHNpbmNlIGl0IGlzIGEKQEAgLTEwMCwxNSArOTgsMTQgQEAKIAogICAgIC8qIC0tLS0tLSBTZXNzaW9uSWQgLS0tLS0tICovCiAKLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWQobG9uZyBzZXNzaW9uSWQpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWQoaW50IHNlc3Npb25JZCkgewogICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KIAotICAgIHB1YmxpYyBsb25nIGdldFNlc3Npb25JZCgpIHsKKyAgICBwdWJsaWMgaW50IGdldFNlc3Npb25JZCgpIHsKICAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CiAgICAgfQogCi0KICAgICAvKiAtLS0tLS0gQ291bnQgUmVxdWVzdCBDbGFzcyBUeXBlcyAtLS0tLS0gKi8KIAogICAgIHB1YmxpYyB2b2lkIHNldENvdW50UmVxdWVzdENsYXNzVHlwZShpbnQgY291bnRSZXF1ZXN0Q2xhc3NUeXBlKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9kZXZpY2Vwb2xpY3kvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlcG9saWN5L0RldmljZVBvbGljeUVuZ2luZS5qYXZhIGIvc2VydmljZXMvZGV2aWNlcG9saWN5L2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXBvbGljeS9EZXZpY2VQb2xpY3lFbmdpbmUuamF2YQppbmRleCBjN2Y5OTUyLi43ZWViNTFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9kZXZpY2Vwb2xpY3kvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlcG9saWN5L0RldmljZVBvbGljeUVuZ2luZS5qYXZhCisrKyBiL3NlcnZpY2VzL2RldmljZXBvbGljeS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2Vwb2xpY3kvRGV2aWNlUG9saWN5RW5naW5lLmphdmEKQEAgLTE2LDE3ICsxNiwxOSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2Vwb2xpY3k7CiAKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uUG9saWN5VXBkYXRlUmVzdWx0LlJFU1VMVF9GQUlMVVJFX0NPTkZMSUNUSU5HX0FETUlOX1BPTElDWTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uUG9saWN5VXBkYXRlUmVzdWx0LlJFU1VMVF9QT0xJQ1lfQ0xFQVJFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uUG9saWN5VXBkYXRlUmVzdWx0LlJFU1VMVF9TVUNDRVNTOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5Qb2xpY3lVcGRhdGVSZWNlaXZlci5FWFRSQV9QT0xJQ1lfVEFSR0VUX1VTRVJfSUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlBvbGljeVVwZGF0ZVJlY2VpdmVyLkVYVFJBX1BPTElDWV9VUERBVEVfUkVTVUxUX0tFWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uUG9saWN5VXBkYXRlUmVzdWx0LlJFU1VMVF9GQUlMVVJFX0NPTkZMSUNUSU5HX0FETUlOX1BPTElDWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uUG9saWN5VXBkYXRlUmVzdWx0LlJFU1VMVF9GQUlMVVJFX0hBUkRXQVJFX0xJTUlUQVRJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlBvbGljeVVwZGF0ZVJlc3VsdC5SRVNVTFRfUE9MSUNZX0NMRUFSRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLlBvbGljeVVwZGF0ZVJlc3VsdC5SRVNVTFRfUE9MSUNZX1NFVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlVzZXJQcm9wZXJ0aWVzLklOSEVSSVRfREVWSUNFX1BPTElDWV9GUk9NX1BBUkVOVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuTkFNRVNQQUNFX0RFVklDRV9QT0xJQ1lfTUFOQUdFUjsKIAogaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeUlkZW50aWZpZXJzOwogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5U3RhdGU7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uUG9saWN5S2V5OwpAQCAtNDYsNiArNDgsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlVzZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0b21pY0ZpbGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CkBAIC03OSw2ICs4MiwxMCBAQAogZmluYWwgY2xhc3MgRGV2aWNlUG9saWN5RW5naW5lIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZXZpY2VQb2xpY3lFbmdpbmUiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFTExVTEFSXzJHX1VTRVJfUkVTVFJJQ1RJT05fSUQgPQorICAgICAgICAgICAgRGV2aWNlUG9saWN5SWRlbnRpZmllcnMuZ2V0SWRlbnRpZmllckZvclVzZXJSZXN0cmljdGlvbigKKyAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXIuRElTQUxMT1dfQ0VMTFVMQVJfMkcpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9DT0VYSVNURU5DRV9GTEFHID0gImVuYWJsZV9jb2V4aXN0ZW5jZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX0VOQUJMRV9DT0VYSVNURU5DRV9GTEFHID0gdHJ1ZTsKIApAQCAtMTY3LDcgKzE3NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNpbmdBZG1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeURlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB3ZSdyZSBhbHdheXMgc2VuZGluZyB0aGlzIGZvciBub3csIHNob3VsZCBwcm9wZXJseSBoYW5kbGUgZXJyb3JzLgotICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5RW5mb3JjZWQgPyBSRVNVTFRfU1VDQ0VTUyA6IFJFU1VMVF9GQUlMVVJFX0NPTkZMSUNUSU5HX0FETUlOX1BPTElDWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeUVuZm9yY2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUkVTVUxUX1BPTElDWV9TRVQgOiBSRVNVTFRfRkFJTFVSRV9DT05GTElDVElOR19BRE1JTl9QT0xJQ1ksCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQpOwogICAgICAgICAgICAgfQogCkBAIC0zNzksNiArMzg3LDE1IEBACiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwodmFsdWUpOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIC8vIFRPRE8oYi8yNzA5OTk1NjcpOiBNb3ZlIGVycm9yIGhhbmRsaW5nIGZvciBESVNBTExPV19DRUxMVUxBUl8yRyBpbnRvIHRoZSBjb2RlCisgICAgICAgICAgICAvLyAgdGhhdCBob25vcnMgdGhlIHJlc3RyaWN0aW9uIG9uY2UgdGhlcmUncyBhbiBBUEkgYXZhaWxhYmxlCisgICAgICAgICAgICBpZiAoY2hlY2tGb3IyZ0ZhaWx1cmUocG9saWN5RGVmaW5pdGlvbiwgZW5mb3JjaW5nQWRtaW4pKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGNhcGFiaWxpdGllcyByZXF1aXJlZCB0byBkaXNhYmxlIDJnLiBOb3Qgc2V0dGluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGdsb2JhbCBwb2xpY3kgc3RhdGUuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBQb2xpY3lTdGF0ZTxWPiBnbG9iYWxQb2xpY3lTdGF0ZSA9IGdldEdsb2JhbFBvbGljeVN0YXRlTG9ja2VkKHBvbGljeURlZmluaXRpb24pOwogCiAgICAgICAgICAgICBib29sZWFuIHBvbGljeUNoYW5nZWQgPSBnbG9iYWxQb2xpY3lTdGF0ZS5hZGRQb2xpY3koZW5mb3JjaW5nQWRtaW4sIHZhbHVlKTsKQEAgLTQwMCw3ICs0MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZW5mb3JjaW5nQWRtaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2UncmUgYWx3YXlzIHNlbmRpbmcgdGhpcyBmb3Igbm93LCBzaG91bGQgcHJvcGVybHkgaGFuZGxlIGVycm9ycy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeUFwcGxpZWQgPyBSRVNVTFRfU1VDQ0VTUyA6IFJFU1VMVF9GQUlMVVJFX0NPTkZMSUNUSU5HX0FETUlOX1BPTElDWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeUFwcGxpZWQgPyBSRVNVTFRfUE9MSUNZX1NFVCA6IFJFU1VMVF9GQUlMVVJFX0NPTkZMSUNUSU5HX0FETUlOX1BPTElDWSwKICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUuVVNFUl9BTEwpOwogICAgICAgICAgICAgfQogCkBAIC03OTIsNyArODA5LDcgQEAKICAgICAgICAgICAgIGludCByZXN1bHQgPSBPYmplY3RzLmVxdWFscygKICAgICAgICAgICAgICAgICAgICAgcG9saWN5U3RhdGUuZ2V0UG9saWNpZXNTZXRCeUFkbWlucygpLmdldChhZG1pbiksCiAgICAgICAgICAgICAgICAgICAgIHBvbGljeVN0YXRlLmdldEN1cnJlbnRSZXNvbHZlZFBvbGljeSgpKQotICAgICAgICAgICAgICAgICAgICA/IFJFU1VMVF9TVUNDRVNTIDogUkVTVUxUX0ZBSUxVUkVfQ09ORkxJQ1RJTkdfQURNSU5fUE9MSUNZOworICAgICAgICAgICAgICAgICAgICA/IFJFU1VMVF9QT0xJQ1lfU0VUIDogUkVTVUxUX0ZBSUxVUkVfQ09ORkxJQ1RJTkdfQURNSU5fUE9MSUNZOwogICAgICAgICAgICAgbWF5YmVTZW5kT25Qb2xpY3lDaGFuZ2VkKAogICAgICAgICAgICAgICAgICAgICBhZG1pbiwgcG9saWN5RGVmaW5pdGlvbiwgcmVzdWx0LCB1c2VySWQpOwogICAgICAgICB9CkBAIC0xMTYxLDYgKzExNzgsMzYgQEAKICAgICAgICAgICAgICAgICBERUZBVUxUX0VOQUJMRV9DT0VYSVNURU5DRV9GTEFHKTsKICAgICB9CiAKKyAgICBwcml2YXRlIDxWPiBib29sZWFuIGNoZWNrRm9yMmdGYWlsdXJlKEBOb25OdWxsIFBvbGljeURlZmluaXRpb248Vj4gcG9saWN5RGVmaW5pdGlvbiwKKyAgICAgICAgICAgIEBOb25OdWxsIEVuZm9yY2luZ0FkbWluIGVuZm9yY2luZ0FkbWluKSB7CisgICAgICAgIGlmICghcG9saWN5RGVmaW5pdGlvbi5nZXRQb2xpY3lLZXkoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgIENFTExVTEFSXzJHX1VTRVJfUkVTVFJJQ1RJT05fSUQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzQ2FwYWJpbGl0eVN1cHBvcnRlZDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzQ2FwYWJpbGl0eVN1cHBvcnRlZCA9IG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuY2xhc3MpLmlzUmFkaW9JbnRlcmZhY2VDYXBhYmlsaXR5U3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLkNBUEFCSUxJVFlfVVNFU19BTExPV0VEX05FVFdPUktfVFlQRVNfQklUTUFTSyk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpc1JhZGlvSW50ZXJmYWNlQ2FwYWJpbGl0eVN1cHBvcnRlZCBjYW4gdGhyb3cgaWYgdGhlcmUgaXMgbm8gVGVsZXBob255CisgICAgICAgICAgICAvLyBzZXJ2aWNlIGluaXRpYWxpemVkLgorICAgICAgICAgICAgaXNDYXBhYmlsaXR5U3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzQ2FwYWJpbGl0eVN1cHBvcnRlZCkgeworICAgICAgICAgICAgc2VuZFBvbGljeVJlc3VsdFRvQWRtaW4oCisgICAgICAgICAgICAgICAgICAgIGVuZm9yY2luZ0FkbWluLAorICAgICAgICAgICAgICAgICAgICBwb2xpY3lEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICBSRVNVTFRfRkFJTFVSRV9IQVJEV0FSRV9MSU1JVEFUSU9OLAorICAgICAgICAgICAgICAgICAgICBVc2VySGFuZGxlLlVTRVJfQUxMKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgRGV2aWNlUG9saWNpZXNSZWFkZXJXcml0ZXIgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX1BPTElDSUVTX1hNTCA9ICJkZXZpY2VfcG9saWN5X3N0YXRlLnhtbCI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTE9DQUxfUE9MSUNZX0VOVFJZID0gImxvY2FsLXBvbGljeS1lbnRyeSI7CkBAIC0xMzE1LDggKzEzNjIsOCBAQAogICAgICAgICAgICAgaWYgKGFkbWluc1BvbGljeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUxvY2FsUG9saWNpZXMuZ2V0KHVzZXJJZCkucHV0KHBvbGljeUtleSwgYWRtaW5zUG9saWN5KTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgcGFyc2luZyBmaWxlLCAiICsgcG9saWN5S2V5ICsgImRvZXNuJ3QgaGF2ZSBhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBZG1pbnNQb2xpY3kuIik7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgZmlsZSwgIiArIHBvbGljeUtleSArICJkb2Vzbid0IGhhdmUgYW4gIiArICJBZG1pbnNQb2xpY3kuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTMyNyw4ICsxMzc0LDggQEAKICAgICAgICAgICAgIGlmIChhZG1pbnNQb2xpY3kgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1HbG9iYWxQb2xpY2llcy5wdXQocG9saWN5S2V5LCBhZG1pbnNQb2xpY3kpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBwYXJzaW5nIGZpbGUsICIgKyBwb2xpY3lLZXkgKyAiZG9lc24ndCBoYXZlIGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFkbWluc1BvbGljeS4iKTsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBmaWxlLCAiICsgcG9saWN5S2V5ICsgImRvZXNuJ3QgaGF2ZSBhbiAiICsgIkFkbWluc1BvbGljeS4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9kZXZpY2Vwb2xpY3kvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlcG9saWN5L0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9kZXZpY2Vwb2xpY3kvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlcG9saWN5L0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggNmNkOWYxYy4uMzIxOTI0YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvZGV2aWNlcG9saWN5L2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXBvbGljeS9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2RldmljZXBvbGljeS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2Vwb2xpY3kvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtOTUsNiArOTUsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VBZG1pblJlY2VpdmVyLkVYVFJBX1RSQU5TRkVSX09XTkVSU0hJUF9BRE1JTl9FWFRSQVNfQlVORExFOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lJZGVudGlmaWVycy5BVVRPX1RJTUVaT05FX1BPTElDWTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5BQ1RJT05fQ0hFQ0tfUE9MSUNZX0NPTVBMSUFOQ0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuQUNUSU9OX0RFVklDRV9GSU5BTkNJTkdfU1RBVEVfQ0hBTkdFRDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlci5BQ1RJT05fREVWSUNFX1BPTElDWV9SRVNPVVJDRV9VUERBVEVEOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyLkFDVElPTl9NQU5BR0VEX1BST0ZJTEVfUFJPVklTSU9ORUQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIuQUNUSU9OX1BST1ZJU0lPTl9NQU5BR0VEX0RFVklDRTsKQEAgLTMyMjQsNyArMzIyNSw3IEBACiAgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFkpOwogICAgICAgICBCdW5kbGUgb3B0aW9ucyA9IG5ldyBCcm9hZGNhc3RPcHRpb25zKCkKICAgICAgICAgICAgICAgICAuc2V0RGVsaXZlcnlHcm91cFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFTElWRVJZX0dST1VQX1BPTElDWV9NT1NUX1JFQ0VOVCkKLSAgICAgICAgICAgICAgICAuc2V0RGVmZXJVbnRpbEFjdGl2ZSh0cnVlKQorICAgICAgICAgICAgICAgIC5zZXREZWZlcnJhbFBvbGljeShCcm9hZGNhc3RPcHRpb25zLkRFRkVSUkFMX1BPTElDWV9VTlRJTF9BQ1RJVkUpCiAgICAgICAgICAgICAgICAgLnRvQnVuZGxlKCk7CiAgICAgICAgIG1JbmplY3Rvci5iaW5kZXJXaXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoKCkgLT4KICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0QXNVc2VyKGludGVudCwgbmV3IFVzZXJIYW5kbGUodXNlckhhbmRsZSksIG51bGwsIG9wdGlvbnMpKTsKQEAgLTE1NDQwLDcgKzE1NDQxLDggQEAKICAgICAgICAgICAgIFNsb2dmLmkoTE9HX1RBRywgIlNlbmRpbmcgJXMgYnJvYWRjYXN0IHRvIG1hbmlmZXN0IHJlY2VpdmVycy4iLCBpbnRlbnQuZ2V0QWN0aW9uKCkpOwogICAgICAgICAgICAgYnJvYWRjYXN0SW50ZW50VG9Dcm9zc1Byb2ZpbGVNYW5pZmVzdFJlY2VpdmVycygKICAgICAgICAgICAgICAgICAgICAgaW50ZW50LCBwYXJlbnRIYW5kbGUsIHJlcXVpcmVzUGVybWlzc2lvbik7Ci0gICAgICAgICAgICBicm9hZGNhc3RJbnRlbnRUb0RldmljZVBvbGljeU1hbmFnZXJSb2xlSG9sZGVyKGludGVudCwgcGFyZW50SGFuZGxlKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdEV4cGxpY2l0SW50ZW50VG9Sb2xlSG9sZGVyKAorICAgICAgICAgICAgICAgICAgICBpbnRlbnQsIFJvbGVNYW5hZ2VyLlJPTEVfREVWSUNFX1BPTElDWV9NQU5BR0VNRU5ULCBwYXJlbnRIYW5kbGUpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0xNTQ4MSwzNiArMTU0ODMsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdEludGVudFRvRGV2aWNlUG9saWN5TWFuYWdlclJvbGVIb2xkZXIoCi0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCwgVXNlckhhbmRsZSB1c2VySGFuZGxlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdXNlcklkID0gdXNlckhhbmRsZS5nZXRJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXREZXZpY2VQb2xpY3lNYW5hZ2VtZW50Um9sZUhvbGRlclBhY2thZ2VOYW1lKG1Db250ZXh0KTsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgcGFja2FnZUludGVudCA9IG5ldyBJbnRlbnQoaW50ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhY2thZ2UocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVzb2x2ZUluZm8+IHJlY2VpdmVycyA9IG1JUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRSZWNlaXZlcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzb2x2ZWRUeXBlPSAqLyBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgU1RPQ0tfUE1fRkxBR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQpLmdldExpc3QoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVjZWl2ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoUmVzb2x2ZUluZm8gcmVjZWl2ZXIgOiByZWNlaXZlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGNvbXBvbmVudEludGVudCA9IG5ldyBJbnRlbnQocGFja2FnZUludGVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50KHJlY2VpdmVyLmdldENvbXBvbmVudEluZm8oKS5nZXRDb21wb25lbnROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX0lOQ0xVREVfQkFDS0dST1VORCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3RBc1VzZXIoY29tcG9uZW50SW50ZW50LCB1c2VySGFuZGxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBTbG9nZi53KExPR19UQUcsICJDYW5ub3QgZ2V0IGxpc3Qgb2YgYnJvYWRjYXN0IHJlY2VpdmVycyBmb3IgJXMgYmVjYXVzZTogJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRBY3Rpb24oKSwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwYWNrYWdlIHtAY29kZSBwYWNrYWdlTmFtZX0gaGFzIHRoZSB7QGNvZGUgTU9ESUZZX1FVSUVUX01PREV9CiAgICAgICAgICAqIHBlcm1pc3Npb24gZ3JhbnRlZCBmb3IgdGhlIHVzZXIge0Bjb2RlIHVzZXJJZH0uCkBAIC0yMDcxOCw3ICsyMDY5MCw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgbWF5YmVJbnN0YWxsRGV2aWNlUG9saWN5TWFuYWdlbWVudFJvbGVIb2xkZXJJblVzZXIoaW50IHRhcmdldFVzZXJJZCkgewogICAgICAgICBTdHJpbmcgZGV2aWNlUG9saWN5TWFuYWdlclJvbGVIb2xkZXJQYWNrYWdlTmFtZSA9Ci0gICAgICAgICAgICAgICAgZ2V0RGV2aWNlUG9saWN5TWFuYWdlbWVudFJvbGVIb2xkZXJQYWNrYWdlTmFtZShtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgZ2V0Um9sZUhvbGRlclBhY2thZ2VOYW1lKG1Db250ZXh0LCBSb2xlTWFuYWdlci5ST0xFX0RFVklDRV9QT0xJQ1lfTUFOQUdFTUVOVCk7CiAgICAgICAgIGlmIChkZXZpY2VQb2xpY3lNYW5hZ2VyUm9sZUhvbGRlclBhY2thZ2VOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIFNsb2dmLmQoTE9HX1RBRywgIk5vIGRldmljZSBwb2xpY3kgbWFuYWdlbWVudCByb2xlIGhvbGRlciBzcGVjaWZpZWQuIik7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0yMDc0NCwxNCArMjA3MTYsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIElmIG11bHRpcGxlIHBhY2thZ2VzIGhvbGQgdGhlIHJvbGUsIHJldHVybnMgdGhlIGZpcnN0IHBhY2thZ2UgaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Um9sZUhvbGRlclBhY2thZ2VOYW1lKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFJvbGVIb2xkZXJQYWNrYWdlTmFtZU9uVXNlcihjb250ZXh0LCByb2xlLCBQcm9jZXNzLm15VXNlckhhbmRsZSgpKTsKKyAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBnZXREZXZpY2VQb2xpY3lNYW5hZ2VtZW50Um9sZUhvbGRlclBhY2thZ2VOYW1lKENvbnRleHQgY29udGV4dCkgeworICAgIC8qKgorICAgICAqIElmIG11bHRpcGxlIHBhY2thZ2VzIGhvbGQgdGhlIHJvbGUsIHJldHVybnMgdGhlIGZpcnN0IHBhY2thZ2UgaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Um9sZUhvbGRlclBhY2thZ2VOYW1lT25Vc2VyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJvbGUsIFVzZXJIYW5kbGUgdXNlcikgewogICAgICAgICBSb2xlTWFuYWdlciByb2xlTWFuYWdlciA9IGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShSb2xlTWFuYWdlci5jbGFzcyk7CiAKICAgICAgICAgLy8gQ2FsbGluZyBpZGVudGl0eSBuZWVkcyB0byBiZSBjbGVhcmVkIGFzIHRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gdGhlIHBlcm1pc3Npb25zIGNoZWNrcy4KICAgICAgICAgcmV0dXJuIG1JbmplY3Rvci5iaW5kZXJXaXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoKCkgLT4gewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJvbGVIb2xkZXJzID0KLSAgICAgICAgICAgICAgICAgICAgcm9sZU1hbmFnZXIuZ2V0Um9sZUhvbGRlcnMoUm9sZU1hbmFnZXIuUk9MRV9ERVZJQ0VfUE9MSUNZX01BTkFHRU1FTlQpOworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJvbGVIb2xkZXJzID0gcm9sZU1hbmFnZXIuZ2V0Um9sZUhvbGRlcnNBc1VzZXIocm9sZSwgdXNlcik7CiAgICAgICAgICAgICBpZiAocm9sZUhvbGRlcnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CkBAIC0yMDc2Miw3ICsyMDc0NCw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2FsbGVyRGV2aWNlUG9saWN5TWFuYWdlbWVudFJvbGVIb2xkZXIoQ2FsbGVySWRlbnRpdHkgY2FsbGVyKSB7CiAgICAgICAgIGludCBjYWxsZXJVaWQgPSBjYWxsZXIuZ2V0VWlkKCk7CiAgICAgICAgIFN0cmluZyBkZXZpY2VQb2xpY3lNYW5hZ2VtZW50Um9sZUhvbGRlclBhY2thZ2VOYW1lID0KLSAgICAgICAgICAgICAgICBnZXREZXZpY2VQb2xpY3lNYW5hZ2VtZW50Um9sZUhvbGRlclBhY2thZ2VOYW1lKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBnZXRSb2xlSG9sZGVyUGFja2FnZU5hbWUobUNvbnRleHQsIFJvbGVNYW5hZ2VyLlJPTEVfREVWSUNFX1BPTElDWV9NQU5BR0VNRU5UKTsKICAgICAgICAgaW50IHJvbGVIb2xkZXJVaWQgPSBtSW5qZWN0b3IuZ2V0UGFja2FnZU1hbmFnZXJJbnRlcm5hbCgpLmdldFBhY2thZ2VVaWQoCiAgICAgICAgICAgICAgICAgZGV2aWNlUG9saWN5TWFuYWdlbWVudFJvbGVIb2xkZXJQYWNrYWdlTmFtZSwgMCwgY2FsbGVyLmdldFVzZXJJZCgpKTsKIApAQCAtMjE4MzAsMTUgKzIxODEyLDIzIEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlcigpIHsKLSAgICAgICAgICAgIG1SbS5hZGRPblJvbGVIb2xkZXJzQ2hhbmdlZExpc3RlbmVyQXNVc2VyKG1FeGVjdXRvciwgdGhpcywgVXNlckhhbmRsZS5TWVNURU0pOworICAgICAgICAgICAgbVJtLmFkZE9uUm9sZUhvbGRlcnNDaGFuZ2VkTGlzdGVuZXJBc1VzZXIobUV4ZWN1dG9yLCB0aGlzLCBVc2VySGFuZGxlLkFMTCk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25Sb2xlSG9sZGVyc0NoYW5nZWQoQE5vbk51bGwgU3RyaW5nIHJvbGVOYW1lLCBATm9uTnVsbCBVc2VySGFuZGxlIHVzZXIpIHsKLSAgICAgICAgICAgIGlmICghUm9sZU1hbmFnZXIuUk9MRV9ERVZJQ0VfUE9MSUNZX01BTkFHRU1FTlQuZXF1YWxzKHJvbGVOYW1lKSkgeworICAgICAgICAgICAgaWYgKFJvbGVNYW5hZ2VyLlJPTEVfREVWSUNFX1BPTElDWV9NQU5BR0VNRU5ULmVxdWFscyhyb2xlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVEZXZpY2VQb2xpY3lNYW5hZ2VtZW50Um9sZUNoYW5nZSh1c2VyKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbmV3Um9sZUhvbGRlciA9IGdldFJvbGVIb2xkZXIoKTsKKyAgICAgICAgICAgIGlmIChSb2xlTWFuYWdlci5ST0xFX0ZJTkFOQ0VEX0RFVklDRV9LSU9TSy5lcXVhbHMocm9sZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRmluYW5jZWREZXZpY2VLaW9za1JvbGVDaGFuZ2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlRGV2aWNlUG9saWN5TWFuYWdlbWVudFJvbGVDaGFuZ2UoVXNlckhhbmRsZSB1c2VyKSB7CisgICAgICAgICAgICBTdHJpbmcgbmV3Um9sZUhvbGRlciA9IGdldERldmljZU1hbmFnZW1lbnRSb2xlSG9sZGVyKHVzZXIpOwogICAgICAgICAgICAgaWYgKGlzRGVmYXVsdFJvbGVIb2xkZXIobmV3Um9sZUhvbGRlcikpIHsKICAgICAgICAgICAgICAgICBTbG9nZi5pKExPR19UQUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAib25Sb2xlSG9sZGVyc0NoYW5nZWQ6IERlZmF1bHQgcm9sZSBob2xkZXIgaXMgc2V0LCByZXR1cm5pbmcgZWFybHkiKTsKQEAgLTIxODczLDkgKzIxODYzLDQ0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRSb2xlSG9sZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIERldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLnRoaXMuZ2V0RGV2aWNlUG9saWN5TWFuYWdlbWVudFJvbGVIb2xkZXJQYWNrYWdlTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQpOworICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlRmluYW5jZWREZXZpY2VLaW9za1JvbGVDaGFuZ2UoKSB7CisgICAgICAgICAgICBpZiAoIWlzRGV2aWNlUG9saWN5RW5naW5lRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2xvZy5pKExPR19UQUcsICJIYW5kbGluZyBhY3Rpb24gIiArIEFDVElPTl9ERVZJQ0VfRklOQU5DSU5HX1NUQVRFX0NIQU5HRUQpOworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX0RFVklDRV9GSU5BTkNJTkdfU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgICAgICBtSW5qZWN0b3IuYmluZGVyV2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KCgpIC0+IHsKKyAgICAgICAgICAgICAgICBmb3IgKFVzZXJJbmZvIHVzZXJJbmZvIDogbVVzZXJNYW5hZ2VyLmdldFVzZXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgVXNlckhhbmRsZSB1c2VyID0gdXNlckluZm8uZ2V0VXNlckhhbmRsZSgpOworICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RFeHBsaWNpdEludGVudFRvUm9sZUhvbGRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQsIFJvbGVNYW5hZ2VyLlJPTEVfU1lTVEVNX1NVUEVSVklTSU9OLCB1c2VyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0RXhwbGljaXRJbnRlbnRUb1JvbGVIb2xkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LCBSb2xlTWFuYWdlci5ST0xFX0RFVklDRV9QT0xJQ1lfTUFOQUdFTUVOVCwgdXNlcik7CisgICAgICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0RGV2aWNlT3JQcm9maWxlT3duZXJBZG1pbkxvY2tlZCh1c2VyLmdldElkZW50aWZpZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZG1pbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUHJvZmlsZU93bmVyT2ZPcmdhbml6YXRpb25Pd25lZERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbi5pbmZvLmdldENvbXBvbmVudCgpLCB1c2VyLmdldElkZW50aWZpZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNEZXZpY2VPd25lcihhZG1pbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKGlzUHJvZmlsZU93bmVyKGFkbWluLmluZm8uZ2V0Q29tcG9uZW50KCksIHVzZXIuZ2V0SWRlbnRpZmllcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFkbWluLmdldFVzZXJIYW5kbGUoKS5pc1N5c3RlbSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2VuZCB0aGUgYnJvYWRjYXN0IHR3aWNlIGlmIHRoZSBEUEMgaXMgdGhlIHNhbWUgcGFja2FnZSBhcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gRE1SSAorICAgICAgICAgICAgICAgICAgICBpZiAoYWRtaW4uaW5mby5nZXRQYWNrYWdlTmFtZSgpLmVxdWFscyhnZXREZXZpY2VNYW5hZ2VtZW50Um9sZUhvbGRlcih1c2VyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdEV4cGxpY2l0SW50ZW50VG9QYWNrYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudCwgYWRtaW4uaW5mby5nZXRQYWNrYWdlTmFtZSgpLCBhZG1pbi5nZXRVc2VySGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGV2aWNlTWFuYWdlbWVudFJvbGVIb2xkZXIoVXNlckhhbmRsZSB1c2VyKSB7CisgICAgICAgICAgICByZXR1cm4gRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UudGhpcy5nZXRSb2xlSG9sZGVyUGFja2FnZU5hbWVPblVzZXIoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCBSb2xlTWFuYWdlci5ST0xFX0RFVklDRV9QT0xJQ1lfTUFOQUdFTUVOVCwgdXNlcik7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0Um9sZUhvbGRlcihTdHJpbmcgcGFja2FnZU5hbWUpIHsKQEAgLTIxOTM1LDYgKzIxOTYwLDQwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RXhwbGljaXRJbnRlbnRUb1JvbGVIb2xkZXIoCisgICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBTdHJpbmcgcm9sZSwgVXNlckhhbmRsZSB1c2VySGFuZGxlKSB7CisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFJvbGVIb2xkZXJQYWNrYWdlTmFtZU9uVXNlcihtQ29udGV4dCwgcm9sZSwgdXNlckhhbmRsZSk7CisgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJvYWRjYXN0RXhwbGljaXRJbnRlbnRUb1BhY2thZ2UoaW50ZW50LCBwYWNrYWdlTmFtZSwgdXNlckhhbmRsZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdEV4cGxpY2l0SW50ZW50VG9QYWNrYWdlKAorICAgICAgICAgICAgSW50ZW50IGludGVudCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBVc2VySGFuZGxlIHVzZXJIYW5kbGUpIHsKKyAgICAgICAgaW50IHVzZXJJZCA9IHVzZXJIYW5kbGUuZ2V0SWRlbnRpZmllcigpOworICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEludGVudCBwYWNrYWdlSW50ZW50ID0gbmV3IEludGVudChpbnRlbnQpCisgICAgICAgICAgICAgICAgLnNldFBhY2thZ2UocGFja2FnZU5hbWUpOworICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiByZWNlaXZlcnMgPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLnF1ZXJ5QnJvYWRjYXN0UmVjZWl2ZXJzQXNVc2VyKAorICAgICAgICAgICAgICAgIHBhY2thZ2VJbnRlbnQsCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuUmVzb2x2ZUluZm9GbGFncy5vZihQYWNrYWdlTWFuYWdlci5HRVRfUkVDRUlWRVJTKSwKKyAgICAgICAgICAgICAgICB1c2VySWQpOworICAgICAgICBpZiAocmVjZWl2ZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgU2xvZy5pKExPR19UQUcsICJGb3VuZCBubyByZWNlaXZlcnMgdG8gaGFuZGxlIGludGVudCAiICsgaW50ZW50CisgICAgICAgICAgICAgICAgICAgICsgIiBpbiBwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSZXNvbHZlSW5mbyByZWNlaXZlciA6IHJlY2VpdmVycykgeworICAgICAgICAgICAgSW50ZW50IGNvbXBvbmVudEludGVudCA9IG5ldyBJbnRlbnQocGFja2FnZUludGVudCkKKyAgICAgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudChyZWNlaXZlci5nZXRDb21wb25lbnRJbmZvKCkuZ2V0Q29tcG9uZW50TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfSU5DTFVERV9CQUNLR1JPVU5EKTsKKyAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3RBc1VzZXIoY29tcG9uZW50SW50ZW50LCB1c2VySGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0PFVzZXJIYW5kbGU+IGdldFBvbGljeU1hbmFnZWRQcm9maWxlcyhATm9uTnVsbCBVc2VySGFuZGxlIHVzZXIpIHsKICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0NhbGxBdXRob3JpemF0aW9uKGhhc0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSHN1bUJvb3RVc2VySW5pdGlhbGl6ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0hzdW1Cb290VXNlckluaXRpYWxpemVyLmphdmEKaW5kZXggNTAxMTNmZS4uYjg5NTgxMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSHN1bUJvb3RVc2VySW5pdGlhbGl6ZXIuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ic3VtQm9vdFVzZXJJbml0aWFsaXplci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Vc2VySWRJbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlVzZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTI3LDYgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5TWFuYWdlclNlcnZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VNYW5hZ2VyU2VydmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uVXNlck1hbmFnZXJJbnRlcm5hbDsKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIudXRpbHMuU2xvZ2Y7CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLnV0aWxzLlRpbWluZ3NUcmFjZUFuZFNsb2c7CkBAIC00MSw2ICs0Myw3IEBACiAKICAgICBwcml2YXRlIGZpbmFsIFVzZXJNYW5hZ2VySW50ZXJuYWwgbVVtaTsKICAgICBwcml2YXRlIGZpbmFsIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UgbUFtczsKKyAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2VNYW5hZ2VyU2VydmljZSBtUG1zOwogICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CiAKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRPYnNlcnZlciBtRGV2aWNlUHJvdmlzaW9uZWRPYnNlcnZlciA9CkBAIC02MywyMCArNjYsMjMgQEAKIAogICAgIC8qKiBTdGF0aWMgZmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGEge0BsaW5rIEhzdW1Cb290VXNlckluaXRpYWxpemVyfSBpbnN0YW5jZS4gKi8KICAgICBwdWJsaWMgc3RhdGljIEBOdWxsYWJsZSBIc3VtQm9vdFVzZXJJbml0aWFsaXplciBjcmVhdGVJbnN0YW5jZShBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIGFtLAotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciwgYm9vbGVhbiBzaG91bGRBbHdheXNIYXZlTWFpblVzZXIpIHsKKyAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyU2VydmljZSBwbXMsIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIsCisgICAgICAgICAgICBib29sZWFuIHNob3VsZEFsd2F5c0hhdmVNYWluVXNlcikgewogCiAgICAgICAgIGlmICghVXNlck1hbmFnZXIuaXNIZWFkbGVzc1N5c3RlbVVzZXJNb2RlKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuZXcgSHN1bUJvb3RVc2VySW5pdGlhbGl6ZXIoCiAgICAgICAgICAgICAgICAgTG9jYWxTZXJ2aWNlcy5nZXRTZXJ2aWNlKFVzZXJNYW5hZ2VySW50ZXJuYWwuY2xhc3MpLAotICAgICAgICAgICAgICAgIGFtLCBjb250ZW50UmVzb2x2ZXIsIHNob3VsZEFsd2F5c0hhdmVNYWluVXNlcik7CisgICAgICAgICAgICAgICAgYW0sIHBtcywgY29udGVudFJlc29sdmVyLCBzaG91bGRBbHdheXNIYXZlTWFpblVzZXIpOwogICAgIH0KIAogICAgIHByaXZhdGUgSHN1bUJvb3RVc2VySW5pdGlhbGl6ZXIoVXNlck1hbmFnZXJJbnRlcm5hbCB1bWksIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UgYW0sCi0gICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyLCBib29sZWFuIHNob3VsZEFsd2F5c0hhdmVNYWluVXNlcikgeworICAgICAgICAgICAgUGFja2FnZU1hbmFnZXJTZXJ2aWNlIHBtcywgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciwKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkQWx3YXlzSGF2ZU1haW5Vc2VyKSB7CiAgICAgICAgIG1VbWkgPSB1bWk7CiAgICAgICAgIG1BbXMgPSBhbTsKKyAgICAgICAgbVBtcyA9IHBtczsKICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRlbnRSZXNvbHZlcjsKICAgICAgICAgbVNob3VsZEFsd2F5c0hhdmVNYWluVXNlciA9IHNob3VsZEFsd2F5c0hhdmVNYWluVXNlcjsKICAgICB9CkBAIC0xMzEsNyArMTM3LDggQEAKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgdC50cmFjZUJlZ2luKCJnZXRCb290VXNlciIpOwotICAgICAgICAgICAgZmluYWwgaW50IGJvb3RVc2VyID0gbVVtaS5nZXRCb290VXNlcigpOworICAgICAgICAgICAgZmluYWwgaW50IGJvb3RVc2VyID0gbVVtaS5nZXRCb290VXNlcigvKiB3YWl0VW50aWxTZXQ9ICovIG1QbXMKKyAgICAgICAgICAgICAgICAgICAgLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9BVVRPTU9USVZFLCAvKiB2ZXJzaW9uPSAqLzApKTsKICAgICAgICAgICAgIHQudHJhY2VFbmQoKTsKICAgICAgICAgICAgIHQudHJhY2VCZWdpbigic3dpdGNoVG9Cb290VXNlci0iICsgYm9vdFVzZXIpOwogICAgICAgICAgICAgc3dpdGNoVG9Cb290VXNlcihib290VXNlcik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCmluZGV4IDRjMzE2NDUuLmI5MzM1MDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCkBAIC0xNzkzLDYgKzE3OTMsMTAgQEAKICAgICAgICAgfQogICAgICAgICB0LnRyYWNlRW5kKCk7CiAKKyAgICAgICAgdC50cmFjZUJlZ2luKCJTdGFydEFwcEhpYmVybmF0aW9uU2VydmljZSIpOworICAgICAgICBtU3lzdGVtU2VydmljZU1hbmFnZXIuc3RhcnRTZXJ2aWNlKEFQUF9ISUJFUk5BVElPTl9TRVJWSUNFX0NMQVNTKTsKKyAgICAgICAgdC50cmFjZUVuZCgpOworCiAgICAgICAgIHQudHJhY2VCZWdpbigiQXJ0TWFuYWdlckxvY2FsIik7CiAgICAgICAgIERleE9wdEhlbHBlci5pbml0aWFsaXplQXJ0TWFuYWdlckxvY2FsKGNvbnRleHQsIG1QYWNrYWdlTWFuYWdlclNlcnZpY2UpOwogICAgICAgICB0LnRyYWNlRW5kKCk7CkBAIC0yMzE2LDEwICsyMzIwLDYgQEAKICAgICAgICAgICAgIG1TeXN0ZW1TZXJ2aWNlTWFuYWdlci5zdGFydFNlcnZpY2UoVk9JQ0VfUkVDT0dOSVRJT05fTUFOQUdFUl9TRVJWSUNFX0NMQVNTKTsKICAgICAgICAgICAgIHQudHJhY2VFbmQoKTsKIAotICAgICAgICAgICAgdC50cmFjZUJlZ2luKCJTdGFydEFwcEhpYmVybmF0aW9uU2VydmljZSIpOwotICAgICAgICAgICAgbVN5c3RlbVNlcnZpY2VNYW5hZ2VyLnN0YXJ0U2VydmljZShBUFBfSElCRVJOQVRJT05fU0VSVklDRV9DTEFTUyk7Ci0gICAgICAgICAgICB0LnRyYWNlRW5kKCk7Ci0KICAgICAgICAgICAgIGlmIChHZXN0dXJlTGF1bmNoZXJTZXJ2aWNlLmlzR2VzdHVyZUxhdW5jaGVyRW5hYmxlZChjb250ZXh0LmdldFJlc291cmNlcygpKSkgewogICAgICAgICAgICAgICAgIHQudHJhY2VCZWdpbigiU3RhcnRHZXN0dXJlTGF1bmNoZXIiKTsKICAgICAgICAgICAgICAgICBtU3lzdGVtU2VydmljZU1hbmFnZXIuc3RhcnRTZXJ2aWNlKEdlc3R1cmVMYXVuY2hlclNlcnZpY2UuY2xhc3MpOwpAQCAtMjcyMSw3ICsyNzIxLDcgQEAKICAgICAgICAgLy8gb24gaXQgaW4gdGhlaXIgc2V0dXAsIGJ1dCBsaWtlbHkgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciBMb2NrU2V0dGluZ3NTZXJ2aWNlIGlzIHJlYWR5LgogICAgICAgICBmaW5hbCBIc3VtQm9vdFVzZXJJbml0aWFsaXplciBoc3VtQm9vdFVzZXJJbml0aWFsaXplciA9CiAgICAgICAgICAgICAgICAgSHN1bUJvb3RVc2VySW5pdGlhbGl6ZXIuY3JlYXRlSW5zdGFuY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlNYW5hZ2VyU2VydmljZSwgbUNvbnRlbnRSZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLCBtUGFja2FnZU1hbmFnZXJTZXJ2aWNlLCBtQ29udGVudFJlc29sdmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfaXNNYWluVXNlclBlcm1hbmVudEFkbWluKSk7CiAgICAgICAgIGlmIChoc3VtQm9vdFVzZXJJbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgICAgICB0LnRyYWNlQmVnaW4oIkhzdW1Cb290VXNlckluaXRpYWxpemVyLmluaXQiKTsKQEAgLTMwMjEsOCArMzAyMSw3IEBACiAgICAgICAgICAgICBtU3lzdGVtU2VydmljZU1hbmFnZXIuc3RhcnRCb290UGhhc2UodCwgU3lzdGVtU2VydmljZS5QSEFTRV9USElSRF9QQVJUWV9BUFBTX0NBTl9TVEFSVCk7CiAgICAgICAgICAgICB0LnRyYWNlRW5kKCk7CiAKLSAgICAgICAgICAgIGlmIChoc3VtQm9vdFVzZXJJbml0aWFsaXplciAhPSBudWxsICYmICFpc0F1dG9tb3RpdmUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMjYxOTI0ODI2KTogcmVtb3ZlIGlzQXV0b21vdGl2ZSBjaGVjayBvbmNlIHRoZSB3b3JrZmxvdyBpcyBmaW5hbGl6ZWQKKyAgICAgICAgICAgIGlmIChoc3VtQm9vdFVzZXJJbml0aWFsaXplciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdC50cmFjZUJlZ2luKCJIc3VtQm9vdFVzZXJJbml0aWFsaXplci5zeXN0ZW1SdW5uaW5nIik7CiAgICAgICAgICAgICAgICAgaHN1bUJvb3RVc2VySW5pdGlhbGl6ZXIuc3lzdGVtUnVubmluZyh0KTsKICAgICAgICAgICAgICAgICB0LnRyYWNlRW5kKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9JbnB1dE1ldGhvZFN5c3RlbVNlcnZlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvRGVmYXVsdEltZVZpc2liaWxpdHlBcHBsaWVyVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvSW5wdXRNZXRob2RTeXN0ZW1TZXJ2ZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2lucHV0bWV0aG9kL0RlZmF1bHRJbWVWaXNpYmlsaXR5QXBwbGllclRlc3QuamF2YQppbmRleCA3ZTQ0MDQ5Li43ZDRmODdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9JbnB1dE1ldGhvZFN5c3RlbVNlcnZlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvaW5wdXRtZXRob2QvRGVmYXVsdEltZVZpc2liaWxpdHlBcHBsaWVyVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL0lucHV0TWV0aG9kU3lzdGVtU2VydmVyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9pbnB1dG1ldGhvZC9EZWZhdWx0SW1lVmlzaWJpbGl0eUFwcGxpZXJUZXN0LmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmlucHV0bWV0aG9kOwogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLklucHV0TWV0aG9kU2VydmljZS5JTUVfQUNUSVZFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9TVEFURV9BTFdBWVNfVklTSUJMRTsKIAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC5pbnB1dG1ldGhvZC5Tb2Z0SW5wdXRTaG93SGlkZVJlYXNvbi5ISURFX1NPRlRfSU5QVVQ7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLmlucHV0bWV0aG9kLlNvZnRJbnB1dFNob3dIaWRlUmVhc29uLlNIT1dfU09GVF9JTlBVVDsKQEAgLTM1LDExICszNiwxNiBAQAogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIAogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogCiBpbXBvcnQgYW5kcm9pZHgudGVzdC5leHQuanVuaXQucnVubmVycy5BbmRyb2lkSlVuaXQ0OwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuaW5wdXRtZXRob2QuSW5wdXRCaW5kUmVzdWx0OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmlucHV0bWV0aG9kLlN0YXJ0SW5wdXRGbGFnczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5pbnB1dG1ldGhvZC5TdGFydElucHV0UmVhc29uOworCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC02MCw4ICs2Niw4IEBACiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICAgIG1WaXNpYmlsaXR5QXBwbGllciA9CiAgICAgICAgICAgICAgICAgKERlZmF1bHRJbWVWaXNpYmlsaXR5QXBwbGllcikgbUlucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuZ2V0VmlzaWJpbGl0eUFwcGxpZXIoKTsKLSAgICAgICAgbUlucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UubUN1ckZvY3VzZWRXaW5kb3dDbGllbnQgPSBtb2NrKAotICAgICAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuQ2xpZW50U3RhdGUuY2xhc3MpOworICAgICAgICBtSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5zZXRBdHRhY2hlZENsaWVudEZvclRlc3RpbmcoCisgICAgICAgICAgICAgICAgbW9jayhJbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLkNsaWVudFN0YXRlLmNsYXNzKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTExOSw0ICsxMjUsMzggQEAKICAgICAgICAgbVZpc2liaWxpdHlBcHBsaWVyLmFwcGx5SW1lVmlzaWJpbGl0eShtV2luZG93VG9rZW4sIG51bGwsIFNUQVRFX1NIT1dfSU1FX0lNUExJQ0lUKTsKICAgICAgICAgdmVyaWZ5U2hvd1NvZnRJbnB1dCh0cnVlLCB0cnVlLCBJbnB1dE1ldGhvZE1hbmFnZXIuU0hPV19JTVBMSUNJVCk7CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbHlJbWVWaXNpYmlsaXR5X2hpZGVJbWVGcm9tVGFyZ2V0T25TZWNvbmRhcnlEaXNwbGF5KCkgeworICAgICAgICAvLyBJbml0IGEgSU1FIHRhcmdldCBjbGllbnQgb24gdGhlIHNlY29uZGFyeSBkaXNwbGF5IHRvIHNob3cgSU1FLgorICAgICAgICBtSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobU1vY2tJbnB1dE1ldGhvZENsaWVudCwgbU1vY2tSZW1vdGVJbnB1dENvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgMTAgLyogc2VsZlJlcG9ydGVkRGlzcGxheUlkICovKTsKKyAgICAgICAgbUlucHV0TWV0aG9kTWFuYWdlclNlcnZpY2Uuc2V0QXR0YWNoZWRDbGllbnRGb3JUZXN0aW5nKG51bGwpOworICAgICAgICBzdGFydElucHV0T3JXaW5kb3dHYWluZWRGb2N1cyhtV2luZG93VG9rZW4sIFNPRlRfSU5QVVRfU1RBVEVfQUxXQVlTX1ZJU0lCTEUpOworCisgICAgICAgIHN5bmNocm9uaXplZCAoSW1mTG9jay5jbGFzcykgeworICAgICAgICAgICAgZmluYWwgaW50IGRpc3BsYXlJZFRvU2hvd0ltZSA9IG1JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmdldERpc3BsYXlJZFRvU2hvd0ltZUxvY2tlZCgpOworICAgICAgICAgICAgLy8gVmVyaWZ5IGhpZGVJbWUgd2lsbCBhcHBseSB0aGUgZXhwZWN0ZWQgZGlzcGxheUlkIHdoZW4gdGhlIGRlZmF1bHQgSU1FCisgICAgICAgICAgICAvLyB2aXNpYmlsaXR5IGFwcGxpZXIgYXBwIFNUQVRFX0hJREVfSU1FLgorICAgICAgICAgICAgbVZpc2liaWxpdHlBcHBsaWVyLmFwcGx5SW1lVmlzaWJpbGl0eShtV2luZG93VG9rZW4sIG51bGwsIFNUQVRFX0hJREVfSU1FKTsKKyAgICAgICAgICAgIHZlcmlmeShtSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5tV2luZG93TWFuYWdlckludGVybmFsKS5oaWRlSW1lKAorICAgICAgICAgICAgICAgICAgICBlcShtV2luZG93VG9rZW4pLCBlcShkaXNwbGF5SWRUb1Nob3dJbWUpLCBlcShudWxsKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIElucHV0QmluZFJlc3VsdCBzdGFydElucHV0T3JXaW5kb3dHYWluZWRGb2N1cyhJQmluZGVyIHdpbmRvd1Rva2VuLCBpbnQgc29mdElucHV0TW9kZSkgeworICAgICAgICByZXR1cm4gbUlucHV0TWV0aG9kTWFuYWdlclNlcnZpY2Uuc3RhcnRJbnB1dE9yV2luZG93R2FpbmVkRm9jdXMoCisgICAgICAgICAgICAgICAgU3RhcnRJbnB1dFJlYXNvbi5XSU5ET1dfRk9DVVNfR0FJTiAvKiBzdGFydElucHV0UmVhc29uICovLAorICAgICAgICAgICAgICAgIG1Nb2NrSW5wdXRNZXRob2RDbGllbnQgLyogY2xpZW50ICovLAorICAgICAgICAgICAgICAgIHdpbmRvd1Rva2VuIC8qIHdpbmRvd1Rva2VuICovLAorICAgICAgICAgICAgICAgIFN0YXJ0SW5wdXRGbGFncy5WSUVXX0hBU19GT0NVUyB8IFN0YXJ0SW5wdXRGbGFncy5JU19URVhUX0VESVRPUiwKKyAgICAgICAgICAgICAgICBzb2Z0SW5wdXRNb2RlIC8qIHNvZnRJbnB1dE1vZGUgKi8sCisgICAgICAgICAgICAgICAgMCAvKiB3aW5kb3dGbGFncyAqLywKKyAgICAgICAgICAgICAgICBtRWRpdG9ySW5mbyAvKiBlZGl0b3JJbmZvICovLAorICAgICAgICAgICAgICAgIG1Nb2NrUmVtb3RlSW5wdXRDb25uZWN0aW9uIC8qIGlucHV0Q29ubmVjdGlvbiAqLywKKyAgICAgICAgICAgICAgICBtTW9ja1JlbW90ZUFjY2Vzc2liaWxpdHlJbnB1dENvbm5lY3Rpb24gLyogcmVtb3RlQWNjZXNzaWJpbGl0eUlucHV0Q29ubmVjdGlvbiAqLywKKyAgICAgICAgICAgICAgICBtVGFyZ2V0U2RrVmVyc2lvbiAvKiB1bnZlcmlmaWVkVGFyZ2V0U2RrVmVyc2lvbiAqLywKKyAgICAgICAgICAgICAgICBtQ2FsbGluZ1VzZXJJZCAvKiB1c2VySWQgKi8sCisgICAgICAgICAgICAgICAgbU1vY2tJbWVPbkJhY2tJbnZva2VkRGlzcGF0Y2hlciAvKiBpbWVEaXNwYXRjaGVyICovKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZC5icCBiL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkLmJwCmluZGV4IDI4OTQzOTUuLjI0ZTM4MGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkLmJwCkBAIC0zMiw5ICszMiw5IEBACiB9CiAKIGFuZHJvaWRfdGVzdF9oZWxwZXJfYXBwIHsKLSAgICBuYW1lOiAiRnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfaW5zdGFsbF91c2VzX3Nka19yMTAwMCIsCisgICAgbmFtZTogIkZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzX2luc3RhbGxfdXNlc19zZGtfcjEwMDAwIiwKICAgICBkZWZhdWx0czogWyJGcmFtZXdvcmtzU2VydmljZXNUZXN0c19hcGtzX2RlZmF1bHRzIl0sCi0gICAgbWFuaWZlc3Q6ICJBbmRyb2lkTWFuaWZlc3QtcjEwMDAueG1sIiwKKyAgICBtYW5pZmVzdDogIkFuZHJvaWRNYW5pZmVzdC1yMTAwMDAueG1sIiwKIH0KIAogYW5kcm9pZF90ZXN0X2hlbHBlcl9hcHAgewpAQCAtNDQsOSArNDQsOSBAQAogfQogCiBhbmRyb2lkX3Rlc3RfaGVscGVyX2FwcCB7Ci0gICAgbmFtZTogIkZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzX2luc3RhbGxfdXNlc19zZGtfcjBfczEwMDAiLAorICAgIG5hbWU6ICJGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3IwX3MxMDAwMCIsCiAgICAgZGVmYXVsdHM6IFsiRnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfYXBrc19kZWZhdWx0cyJdLAotICAgIG1hbmlmZXN0OiAiQW5kcm9pZE1hbmlmZXN0LXIwLXMxMDAwLnhtbCIsCisgICAgbWFuaWZlc3Q6ICJBbmRyb2lkTWFuaWZlc3QtcjAtczEwMDAwLnhtbCIsCiB9CiAKIGFuZHJvaWRfdGVzdF9oZWxwZXJfYXBwIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjAtczEwMDAueG1sIGIvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWRNYW5pZmVzdC1yMC1zMTAwMDAueG1sCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIHNlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjAtczEwMDAueG1sCnJlbmFtZSB0byBzZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZE1hbmlmZXN0LXIwLXMxMDAwMC54bWwKaW5kZXggMjU3NDNiOC4uMzgzZTYwYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWRNYW5pZmVzdC1yMC1zMTAwMC54bWwKKysrIGIvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWRNYW5pZmVzdC1yMC1zMTAwMDAueG1sCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNCIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyOSI+CiAgICAgICAgIDwhLS0gVGhpcyBmYWlscyBiZWNhdXNlIDMxIGlzIG5vdCB2ZXJzaW9uIDUgLS0+CiAgICAgICAgIDxleHRlbnNpb24tc2RrIGFuZHJvaWQ6c2RrVmVyc2lvbj0iMzAiIGFuZHJvaWQ6bWluRXh0ZW5zaW9uVmVyc2lvbj0iMCIgLz4KLSAgICAgICAgPGV4dGVuc2lvbi1zZGsgYW5kcm9pZDpzZGtWZXJzaW9uPSIzMSIgYW5kcm9pZDptaW5FeHRlbnNpb25WZXJzaW9uPSIxMDAwIiAvPgorICAgICAgICA8ZXh0ZW5zaW9uLXNkayBhbmRyb2lkOnNka1ZlcnNpb249IjMxIiBhbmRyb2lkOm1pbkV4dGVuc2lvblZlcnNpb249IjEwMDAwIiAvPgogICAgIDwvdXNlcy1zZGs+CiAKICAgICA8YXBwbGljYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZE1hbmlmZXN0LXIxMDAwLnhtbCBiL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjEwMDAwLnhtbApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZE1hbmlmZXN0LXIxMDAwLnhtbApyZW5hbWUgdG8gc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWRNYW5pZmVzdC1yMTAwMDAueG1sCmluZGV4IDliZjkyNTQuLmZlN2EyMTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjEwMDAueG1sCisrKyBiL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL2Fwa3MvaW5zdGFsbF91c2VzX3Nkay9BbmRyb2lkTWFuaWZlc3QtcjEwMDAwLnhtbApAQCAtMTgsNyArMTgsNyBAQAogCiAgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNCIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyOSI+CiAgICAgICAgIDwhLS0gVGhpcyB3aWxsIGZhaWwgdG8gaW5zdGFsbCwgYmVjYXVzZSBtaW5FeHRlbnNpb25WZXJzaW9uIGlzIG5vdCBtZXQgLS0+Ci0gICAgICAgIDxleHRlbnNpb24tc2RrIGFuZHJvaWQ6c2RrVmVyc2lvbj0iMzAiIGFuZHJvaWQ6bWluRXh0ZW5zaW9uVmVyc2lvbj0iMTAwMCIgLz4KKyAgICAgICAgPGV4dGVuc2lvbi1zZGsgYW5kcm9pZDpzZGtWZXJzaW9uPSIzMCIgYW5kcm9pZDptaW5FeHRlbnNpb25WZXJzaW9uPSIxMDAwMCIgLz4KICAgICA8L3VzZXMtc2RrPgogCiAgICAgPGFwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvc2VydmVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9zZXJ2ZXIvQW5kcm9pZC5icAppbmRleCBlNzExY2FiLi4xMTQ2MjcxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9zZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9zZXJ2ZXIvQW5kcm9pZC5icApAQCAtMTI3LDEwICsxMjcsMTAgQEAKICAgICAgICAgIjpGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3EwIiwKICAgICAgICAgIjpGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3EwX3IwIiwKICAgICAgICAgIjpGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3IwIiwKLSAgICAgICAgIjpGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3IxMDAwIiwKKyAgICAgICAgIjpGcmFtZXdvcmtzU2VydmljZXNUZXN0c19pbnN0YWxsX3VzZXNfc2RrX3IxMDAwMCIsCiAgICAgICAgICI6RnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfaW5zdGFsbF91c2VzX3Nka19yX25vbmUiLAogICAgICAgICAiOkZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzX2luc3RhbGxfdXNlc19zZGtfcjBfczAiLAotICAgICAgICAiOkZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzX2luc3RhbGxfdXNlc19zZGtfcjBfczEwMDAiLAorICAgICAgICAiOkZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzX2luc3RhbGxfdXNlc19zZGtfcjBfczEwMDAwIiwKICAgICAgICAgIjpGcmFtZXdvcmtzU2VydmljZXNUZXN0c19rZXlzZXRfcGVybWRlZl9zYV91bm9uZSIsCiAgICAgICAgICI6RnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHNfa2V5c2V0X3Blcm11c2Vfc2FfdWFfdWIiLAogICAgICAgICAiOkZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzX2tleXNldF9wZXJtdXNlX3NiX3VhX3ViIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL3NlcnZlci9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BhcnNpbmcvUGFja2FnZVBhcnNlckxlZ2FjeUNvcmVUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9zZXJ2ZXIvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9wYXJzaW5nL1BhY2thZ2VQYXJzZXJMZWdhY3lDb3JlVGVzdC5qYXZhCmluZGV4IGViZjMwOWYuLjkwNmNjODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL1BhY2thZ2VNYW5hZ2VyU2VydmljZVRlc3RzL3NlcnZlci9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BtL3BhcnNpbmcvUGFja2FnZVBhcnNlckxlZ2FjeUNvcmVUZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvc2VydmVyL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vcGFyc2luZy9QYWNrYWdlUGFyc2VyTGVnYWN5Q29yZVRlc3QuamF2YQpAQCAtNTc1LDEwICs1NzUsMTAgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1pbkV4dFZlcnMuZ2V0KDMxLCAtMSkpOwogCiAgICAgICAgIE1hcDxQYWlyPFN0cmluZywgSW50ZWdlcj4sIEludGVnZXI+IGFwcFRvRXJyb3IgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGFwcFRvRXJyb3IucHV0KFBhaXIuY3JlYXRlKCJpbnN0YWxsX3VzZXNfc2RrLmFwa19yMTAwMCIsIFIucmF3Lmluc3RhbGxfdXNlc19zZGtfcjEwMDApLAorICAgICAgICBhcHBUb0Vycm9yLnB1dChQYWlyLmNyZWF0ZSgiaW5zdGFsbF91c2VzX3Nkay5hcGtfcjEwMDAwIiwgUi5yYXcuaW5zdGFsbF91c2VzX3Nka19yMTAwMDApLAogICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX0ZBSUxFRF9PTERFUl9TREspOwogICAgICAgICBhcHBUb0Vycm9yLnB1dCgKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiaW5zdGFsbF91c2VzX3Nkay5hcGtfcjBfczEwMDAiLCBSLnJhdy5pbnN0YWxsX3VzZXNfc2RrX3IwX3MxMDAwKSwKKyAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiaW5zdGFsbF91c2VzX3Nkay5hcGtfcjBfczEwMDAwIiwgUi5yYXcuaW5zdGFsbF91c2VzX3Nka19yMF9zMTAwMDApLAogICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfRkFJTEVEX09MREVSX1NESyk7CiAKICAgICAgICAgYXBwVG9FcnJvci5wdXQoUGFpci5jcmVhdGUoImluc3RhbGxfdXNlc19zZGsuYXBrX3EwIiwgUi5yYXcuaW5zdGFsbF91c2VzX3Nka19xMCksCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZUlkbGVDb250cm9sbGVyVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VJZGxlQ29udHJvbGxlclRlc3QuamF2YQppbmRleCA1Mzc3ZWU3Li4zYTQ3YjQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZUlkbGVDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlSWRsZUNvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTUwLDcgKzUwLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OwotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUJvb2xlYW47CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55SW50OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUxvbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55U3RyaW5nOwpAQCAtNjI0LDggKzYyMyw3IEBACiAKICAgICAgICAgbURldmljZUlkbGVDb250cm9sbGVyLmJlY29tZUluYWN0aXZlSWZBcHByb3ByaWF0ZUxvY2tlZCgpOwogICAgICAgICB2ZXJpZnlTdGF0ZUNvbmRpdGlvbnMoU1RBVEVfSU5BQ1RJVkUpOwotICAgICAgICB2ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyKQotICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuSU5BQ1RJVkVfVElNRU9VVCksIGVxKGZhbHNlKSk7CisgICAgICAgIHZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIpLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5JTkFDVElWRV9USU1FT1VUKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTY0Myw4ICs2NDEsNyBAQAogCiAgICAgICAgIG1EZXZpY2VJZGxlQ29udHJvbGxlci5iZWNvbWVJbmFjdGl2ZUlmQXBwcm9wcmlhdGVMb2NrZWQoKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX0lOQUNUSVZFKTsKLSAgICAgICAgdmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlcikKLSAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChlcShtQ29uc3RhbnRzLklOQUNUSVZFX1RJTUVPVVQpLCBlcShmYWxzZSkpOworICAgICAgICB2ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyKS5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuSU5BQ1RJVkVfVElNRU9VVCkpOwogICAgICAgICAvLyBUaGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24gZG9lc24ndCByZXF1aXJlIGEgbW90aW9uIHNlbnNvciB0byBwcm9jZWVkIHdpdGggaWRsaW5nLgogICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSB0aGUgY2FzZSBvbiBUVnMgb3Igb3RoZXIgc3VjaCBkZXZpY2VzLiBXZSBzaG91bGQgc2V0IGFuIGFsYXJtIHRvIG1vdmUKICAgICAgICAgLy8gZm9yd2FyZCBpZiB0aGUgbW90aW9uIHNlbnNvciBpcyBtaXNzaW5nIGluIHRoaXMgY2FzZS4KQEAgLTY2OSw4ICs2NjYsNyBAQAogCiAgICAgICAgIG1EZXZpY2VJZGxlQ29udHJvbGxlci5iZWNvbWVJbmFjdGl2ZUlmQXBwcm9wcmlhdGVMb2NrZWQoKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX0lOQUNUSVZFKTsKLSAgICAgICAgdmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlcikKLSAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChlcShtQ29uc3RhbnRzLklOQUNUSVZFX1RJTUVPVVQpLCBlcShmYWxzZSkpOworICAgICAgICB2ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyKS5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuSU5BQ1RJVkVfVElNRU9VVCkpOwogICAgICAgICAvLyBUaGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgYSBtb3Rpb24gc2Vuc29yIHRvIHByb2NlZWQgd2l0aCBpZGxpbmcsCiAgICAgICAgIC8vIHNvIHdlIHNob3VsZCBuZXZlciBzZXQgYW4gYWxhcm0gdG8gbW92ZSBmb3J3YXJkIGlmIHRoZSBtb3Rpb24gc2Vuc29yIGlzCiAgICAgICAgIC8vIG1pc3NpbmcgaW4gdGhpcyBjYXNlLgpAQCAtNjk5LDcgKzY5NSw3IEBACiAgICAgICAgIG1EZXZpY2VJZGxlQ29udHJvbGxlci5iZWNvbWVJbmFjdGl2ZUlmQXBwcm9wcmlhdGVMb2NrZWQoKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX0lOQUNUSVZFKTsKICAgICAgICAgaW5PcmRlci52ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyKQotICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKHRpbWVVbnRpbEFsYXJtICsgbUNvbnN0YW50cy5JTkFDVElWRV9USU1FT1VUKSwgZXEoZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChlcSh0aW1lVW50aWxBbGFybSArIG1Db25zdGFudHMuSU5BQ1RJVkVfVElNRU9VVCkpOwogCiAgICAgICAgIGVudGVyRGVlcFN0YXRlKFNUQVRFX0FDVElWRSk7CiAgICAgICAgIHNldFF1aWNrRG96ZUVuYWJsZWQodHJ1ZSk7CkBAIC03MDksNyArNzA1LDcgQEAKICAgICAgICAgbURldmljZUlkbGVDb250cm9sbGVyLmJlY29tZUluYWN0aXZlSWZBcHByb3ByaWF0ZUxvY2tlZCgpOwogICAgICAgICB2ZXJpZnlTdGF0ZUNvbmRpdGlvbnMoU1RBVEVfUVVJQ0tfRE9aRV9ERUxBWSk7CiAgICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlcikuc2NoZWR1bGVBbGFybUxvY2tlZCgKLSAgICAgICAgICAgICAgICBlcSh0aW1lVW50aWxBbGFybSArIG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKSwgZXEoZmFsc2UpKTsKKyAgICAgICAgICAgICAgICBlcSh0aW1lVW50aWxBbGFybSArIG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTczNiw1OSArNzMyLDU2IEBACiAgICAgICAgIHNldFNjcmVlbk9uKGZhbHNlKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX1FVSUNLX0RPWkVfREVMQVkpOwogICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIpCi0gICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQpLCBlcShmYWxzZSkpOworICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKSk7CiAKICAgICAgICAgZW50ZXJEZWVwU3RhdGUoU1RBVEVfSU5BQ1RJVkUpOwogICAgICAgICBzZXRRdWlja0RvemVFbmFibGVkKHRydWUpOwogICAgICAgICB2ZXJpZnlTdGF0ZUNvbmRpdGlvbnMoU1RBVEVfUVVJQ0tfRE9aRV9ERUxBWSk7CiAgICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlcikKLSAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChlcShtQ29uc3RhbnRzLlFVSUNLX0RPWkVfREVMQVlfVElNRU9VVCksIGVxKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQpKTsKIAogICAgICAgICBlbnRlckRlZXBTdGF0ZShTVEFURV9JRExFX1BFTkRJTkcpOwogICAgICAgICBzZXRRdWlja0RvemVFbmFibGVkKHRydWUpOwogICAgICAgICB2ZXJpZnlTdGF0ZUNvbmRpdGlvbnMoU1RBVEVfUVVJQ0tfRE9aRV9ERUxBWSk7CiAgICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlcikKLSAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChlcShtQ29uc3RhbnRzLlFVSUNLX0RPWkVfREVMQVlfVElNRU9VVCksIGVxKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQpKTsKIAogICAgICAgICBlbnRlckRlZXBTdGF0ZShTVEFURV9TRU5TSU5HKTsKICAgICAgICAgc2V0UXVpY2tEb3plRW5hYmxlZCh0cnVlKTsKICAgICAgICAgdmVyaWZ5U3RhdGVDb25kaXRpb25zKFNUQVRFX1FVSUNLX0RPWkVfREVMQVkpOwogICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIpCi0gICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQpLCBlcShmYWxzZSkpOworICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGVxKG1Db25zdGFudHMuUVVJQ0tfRE9aRV9ERUxBWV9USU1FT1VUKSk7CiAKICAgICAgICAgZW50ZXJEZWVwU3RhdGUoU1RBVEVfTE9DQVRJTkcpOwogICAgICAgICBzZXRRdWlja0RvemVFbmFibGVkKHRydWUpOwogICAgICAgICB2ZXJpZnlTdGF0ZUNvbmRpdGlvbnMoU1RBVEVfUVVJQ0tfRE9aRV9ERUxBWSk7CiAgICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlcikKLSAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChlcShtQ29uc3RhbnRzLlFVSUNLX0RPWkVfREVMQVlfVElNRU9VVCksIGVxKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoZXEobUNvbnN0YW50cy5RVUlDS19ET1pFX0RFTEFZX1RJTUVPVVQpKTsKIAogICAgICAgICAvLyBJRExFIHNob3VsZCBzdGF5IGFzIElETEUuCiAgICAgICAgIGVudGVyRGVlcFN0YXRlKFNUQVRFX0lETEUpOwogICAgICAgICAvLyBDbGVhciBvdXQgYW55IGFsYXJtIHNldHRpbmcgZnJvbSB0aGUgb3JkZXIgYmVmb3JlIGNoZWNraW5nIGZvciB0aGlzIHNlY3Rpb24uCi0gICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlciwgYXRMZWFzdE9uY2UoKSkKLSAgICAgICAgICAgICAgICAuc2NoZWR1bGVBbGFybUxvY2tlZChhbnlMb25nKCksIGFueUJvb2xlYW4oKSk7CisgICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlciwgYXRMZWFzdE9uY2UoKSkuc2NoZWR1bGVBbGFybUxvY2tlZChhbnlMb25nKCkpOwogICAgICAgICBzZXRRdWlja0RvemVFbmFibGVkKHRydWUpOwogICAgICAgICB2ZXJpZnlTdGF0ZUNvbmRpdGlvbnMoU1RBVEVfSURMRSk7Ci0gICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlciwgbmV2ZXIoKSkuc2NoZWR1bGVBbGFybUxvY2tlZChhbnlMb25nKCksIGFueUJvb2xlYW4oKSk7CisgICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlciwgbmV2ZXIoKSkuc2NoZWR1bGVBbGFybUxvY2tlZChhbnlMb25nKCkpOwogCiAgICAgICAgIC8vIElETEVfTUFJTlRFTkFOQ0Ugc2hvdWxkIHN0YXkgYXMgSURMRV9NQUlOVEVOQU5DRS4KICAgICAgICAgZW50ZXJEZWVwU3RhdGUoU1RBVEVfSURMRV9NQUlOVEVOQU5DRSk7CiAgICAgICAgIC8vIENsZWFyIG91dCBhbnkgYWxhcm0gc2V0dGluZyBmcm9tIHRoZSBvcmRlciBiZWZvcmUgY2hlY2tpbmcgZm9yIHRoaXMgc2VjdGlvbi4KLSAgICAgICAgaW5PcmRlci52ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyLCBhdExlYXN0T25jZSgpKQotICAgICAgICAgICAgICAgIC5zY2hlZHVsZUFsYXJtTG9ja2VkKGFueUxvbmcoKSwgYW55Qm9vbGVhbigpKTsKKyAgICAgICAgaW5PcmRlci52ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyLCBhdExlYXN0T25jZSgpKS5zY2hlZHVsZUFsYXJtTG9ja2VkKGFueUxvbmcoKSk7CiAgICAgICAgIHNldFF1aWNrRG96ZUVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIHZlcmlmeVN0YXRlQ29uZGl0aW9ucyhTVEFURV9JRExFX01BSU5URU5BTkNFKTsKLSAgICAgICAgaW5PcmRlci52ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyLCBuZXZlcigpKS5zY2hlZHVsZUFsYXJtTG9ja2VkKGFueUxvbmcoKSwgYW55Qm9vbGVhbigpKTsKKyAgICAgICAgaW5PcmRlci52ZXJpZnkobURldmljZUlkbGVDb250cm9sbGVyLCBuZXZlcigpKS5zY2hlZHVsZUFsYXJtTG9ja2VkKGFueUxvbmcoKSk7CiAKICAgICAgICAgLy8gU3RhdGUgaXMgYWxyZWFkeSBRVUlDS19ET1pFX0RFTEFZLiBObyB3b3JrIHNob3VsZCBiZSBkb25lLgogICAgICAgICBlbnRlckRlZXBTdGF0ZShTVEFURV9RVUlDS19ET1pFX0RFTEFZKTsKICAgICAgICAgLy8gQ2xlYXIgb3V0IGFueSBhbGFybSBzZXR0aW5nIGZyb20gdGhlIG9yZGVyIGJlZm9yZSBjaGVja2luZyBmb3IgdGhpcyBzZWN0aW9uLgotICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIsIGF0TGVhc3RPbmNlKCkpCi0gICAgICAgICAgICAgICAgLnNjaGVkdWxlQWxhcm1Mb2NrZWQoYW55TG9uZygpLCBhbnlCb29sZWFuKCkpOworICAgICAgICBpbk9yZGVyLnZlcmlmeShtRGV2aWNlSWRsZUNvbnRyb2xsZXIsIGF0TGVhc3RPbmNlKCkpLnNjaGVkdWxlQWxhcm1Mb2NrZWQoYW55TG9uZygpKTsKICAgICAgICAgc2V0UXVpY2tEb3plRW5hYmxlZCh0cnVlKTsKICAgICAgICAgbURldmljZUlkbGVDb250cm9sbGVyLmJlY29tZUluYWN0aXZlSWZBcHByb3ByaWF0ZUxvY2tlZCgpOwogICAgICAgICB2ZXJpZnlTdGF0ZUNvbmRpdGlvbnMoU1RBVEVfUVVJQ0tfRE9aRV9ERUxBWSk7Ci0gICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlciwgbmV2ZXIoKSkuc2NoZWR1bGVBbGFybUxvY2tlZChhbnlMb25nKCksIGFueUJvb2xlYW4oKSk7CisgICAgICAgIGluT3JkZXIudmVyaWZ5KG1EZXZpY2VJZGxlQ29udHJvbGxlciwgbmV2ZXIoKSkuc2NoZWR1bGVBbGFybUxvY2tlZChhbnlMb25nKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNjg1LDE3ICsyNjc4LDEyIEBACiAgICAgICAgIGlmIChyZXQgPT0gbURldmljZUlkbGVDb250cm9sbGVyLlNFVF9JRExFX0ZBQ1RPUl9SRVNVTFRfT0spIHsKICAgICAgICAgICAgIGVudGVyRGVlcFN0YXRlKFNUQVRFX0lETEUpOwogICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgICAgIGxvbmcgYWxhcm0gPSBtRGV2aWNlSWRsZUNvbnRyb2xsZXIuZ2V0TmV4dEFsYXJtVGltZSgpOwogICAgICAgICAgICAgbURldmljZUlkbGVDb250cm9sbGVyLnNldElkbGVTdGFydFRpbWVGb3JUZXN0KAogICAgICAgICAgICAgICAgICAgICBub3cgLSAobG9uZykgKG1Db25zdGFudHMuSURMRV9USU1FT1VUICogMC42KSk7Ci0gICAgICAgICAgICBsb25nIG5ld0FsYXJtID0gbURldmljZUlkbGVDb250cm9sbGVyLmdldE5leHRBbGFybVRpbWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIm1haW50ZW5hbmNlIG5vdCByZXNjaGVkdWxlIElETEVfVElNRU9VVCAqIDAuNiIsCi0gICAgICAgICAgICAgICAgICAgIG5ld0FsYXJtID09IGFsYXJtKTsKKyAgICAgICAgICAgIHZlcmlmeVN0YXRlQ29uZGl0aW9ucyhTVEFURV9JRExFKTsKICAgICAgICAgICAgIG1EZXZpY2VJZGxlQ29udHJvbGxlci5zZXRJZGxlU3RhcnRUaW1lRm9yVGVzdCgKICAgICAgICAgICAgICAgICAgICAgbm93IC0gKGxvbmcpIChtQ29uc3RhbnRzLklETEVfVElNRU9VVCAqIDEuMikpOwotICAgICAgICAgICAgbmV3QWxhcm0gPSBtRGV2aWNlSWRsZUNvbnRyb2xsZXIuZ2V0TmV4dEFsYXJtVGltZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgibWFpbnRlbmFuY2Ugbm90IHJlc2NoZWR1bGUgSURMRV9USU1FT1VUICogMS4yIiwKLSAgICAgICAgICAgICAgICAgICAgKG5ld0FsYXJtIC0gbm93KSA8IG1pbnV0ZUluTWlsbGlzKTsKKyAgICAgICAgICAgIHZlcmlmeVN0YXRlQ29uZGl0aW9ucyhTVEFURV9JRExFX01BSU5URU5BTkNFKTsKICAgICAgICAgICAgIG1EZXZpY2VJZGxlQ29udHJvbGxlci5yZXNldFByZUlkbGVUaW1lb3V0TW9kZSgpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9SZXNjdWVQYXJ0eVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvUmVzY3VlUGFydHlUZXN0LmphdmEKaW5kZXggODM0NDFiZi4uMWE3NTE3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9SZXNjdWVQYXJ0eVRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL1Jlc2N1ZVBhcnR5VGVzdC5qYXZhCkBAIC02OCw2ICs2OCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIC8qKgogICogVGVzdCBSZXNjdWVQYXJ0eS4KQEAgLTk0LDYgKzk1LDkgQEAKICAgICAgICAgICAgICJwZXJzaXN0LmRldmljZV9jb25maWcuY29uZmlndXJhdGlvbi5kaXNhYmxlX3Jlc2N1ZV9wYXJ0eSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRElTQUJMRV9GQUNUT1JZX1JFU0VUX0ZMQUcgPQogICAgICAgICAgICAgInBlcnNpc3QuZGV2aWNlX2NvbmZpZy5jb25maWd1cmF0aW9uLmRpc2FibGVfcmVzY3VlX3BhcnR5X2ZhY3RvcnlfcmVzZXQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0xBU1RfRkFDVE9SWV9SRVNFVF9USU1FX01TID0gInBlcnNpc3Quc3lzLmxhc3RfZmFjdG9yeV9yZXNldCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1RUTElOR19EVVJBVElPTl9NSU4gPSAxMDsKIAogICAgIHByaXZhdGUgTW9ja2l0b1Nlc3Npb24gbVNlc3Npb247CiAgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtU3lzdGVtU2V0dGluZ3NNYXA7CkBAIC00NTksNiArNDYzLDUzIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyb3R0bGluZ09uQm9vdEZhaWx1cmVzKCkgeworICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldChSZXNjdWVQYXJ0eS5QUk9QX0FUVEVNUFRJTkdfUkVCT09ULCBCb29sZWFuLnRvU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgYmVmb3JlVGltZW91dCA9IG5vdyAtIFRpbWVVbml0Lk1JTlVURVMudG9NaWxsaXMoVEhST1RUTElOR19EVVJBVElPTl9NSU4gLSAxKTsKKyAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoUFJPUF9MQVNUX0ZBQ1RPUllfUkVTRVRfVElNRV9NUywgTG9uZy50b1N0cmluZyhiZWZvcmVUaW1lb3V0KSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IExFVkVMX0ZBQ1RPUllfUkVTRVQ7IGkrKykgeworICAgICAgICAgICAgbm90ZUJvb3QoaSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RmFsc2UoUmVzY3VlUGFydHkuaXNBdHRlbXB0aW5nRmFjdG9yeVJlc2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocm90dGxpbmdPbkFwcENyYXNoKCkgeworICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldChSZXNjdWVQYXJ0eS5QUk9QX0FUVEVNUFRJTkdfUkVCT09ULCBCb29sZWFuLnRvU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgYmVmb3JlVGltZW91dCA9IG5vdyAtIFRpbWVVbml0Lk1JTlVURVMudG9NaWxsaXMoVEhST1RUTElOR19EVVJBVElPTl9NSU4gLSAxKTsKKyAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoUFJPUF9MQVNUX0ZBQ1RPUllfUkVTRVRfVElNRV9NUywgTG9uZy50b1N0cmluZyhiZWZvcmVUaW1lb3V0KSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IExFVkVMX0ZBQ1RPUllfUkVTRVQ7IGkrKykgeworICAgICAgICAgICAgbm90ZUFwcENyYXNoKGkgKyAxLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRGYWxzZShSZXNjdWVQYXJ0eS5pc0F0dGVtcHRpbmdGYWN0b3J5UmVzZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90VGhyb3R0bGluZ0FmdGVyVGltZW91dE9uQm9vdEZhaWx1cmVzKCkgeworICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldChSZXNjdWVQYXJ0eS5QUk9QX0FUVEVNUFRJTkdfUkVCT09ULCBCb29sZWFuLnRvU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgYWZ0ZXJUaW1lb3V0ID0gbm93IC0gVGltZVVuaXQuTUlOVVRFUy50b01pbGxpcyhUSFJPVFRMSU5HX0RVUkFUSU9OX01JTiArIDEpOworICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldChQUk9QX0xBU1RfRkFDVE9SWV9SRVNFVF9USU1FX01TLCBMb25nLnRvU3RyaW5nKGFmdGVyVGltZW91dCkpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBMRVZFTF9GQUNUT1JZX1JFU0VUOyBpKyspIHsKKyAgICAgICAgICAgIG5vdGVCb290KGkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoUmVzY3VlUGFydHkuaXNBdHRlbXB0aW5nRmFjdG9yeVJlc2V0KCkpOworICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RUaHJvdHRsaW5nQWZ0ZXJUaW1lb3V0T25BcHBDcmFzaCgpIHsKKyAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoUmVzY3VlUGFydHkuUFJPUF9BVFRFTVBUSU5HX1JFQk9PVCwgQm9vbGVhbi50b1N0cmluZyhmYWxzZSkpOworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBsb25nIGFmdGVyVGltZW91dCA9IG5vdyAtIFRpbWVVbml0Lk1JTlVURVMudG9NaWxsaXMoVEhST1RUTElOR19EVVJBVElPTl9NSU4gKyAxKTsKKyAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoUFJPUF9MQVNUX0ZBQ1RPUllfUkVTRVRfVElNRV9NUywgTG9uZy50b1N0cmluZyhhZnRlclRpbWVvdXQpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gTEVWRUxfRkFDVE9SWV9SRVNFVDsgaSsrKSB7CisgICAgICAgICAgICBub3RlQXBwQ3Jhc2goaSArIDEsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoUmVzY3VlUGFydHkuaXNBdHRlbXB0aW5nRmFjdG9yeVJlc2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZVJlc2N1ZVBhcnR5UmVzZXRzKCkgewogICAgICAgICBkb1JldHVybih0cnVlKS53aGVuKCgpIC0+IFNldHRpbmdzVG9Qcm9wZXJ0aWVzTWFwcGVyLmlzTmF0aXZlRmxhZ3NSZXNldFBlcmZvcm1lZCgpKTsKICAgICAgICAgZG9SZXR1cm4oRkFLRV9SRVNFVF9OQVRJVkVfTkFNRVNQQUNFUykud2hlbigKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvYWxhcm0vQWxhcm1NYW5hZ2VyU2VydmljZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvYWxhcm0vQWxhcm1NYW5hZ2VyU2VydmljZVRlc3QuamF2YQppbmRleCBiMzk1ZjQyLi4xNzQxNDExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2FsYXJtL0FsYXJtTWFuYWdlclNlcnZpY2VUZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbGFybS9BbGFybU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCkBAIC0yOCw3ICsyOCw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlci5GTEFHX1dBS0VfRlJPTV9JRExFOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXIuUlRDOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXIuUlRDX1dBS0VVUDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyLlNDSEVEVUxFX0VYQUNUX0FMQVJNX0RFTklFRF9CWV9ERUZBVUxUOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXIuV0lORE9XX0VYQUNUOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXIuV0lORE9XX0hFVVJJU1RJQzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5hcHAuQXBwT3BzTWFuYWdlci5NT0RFX0FMTE9XRUQ7CkBAIC0xMjYsNyArMTI1LDYgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5JQWxhcm1NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuY29tcGF0LkNvbXBhdENoYW5nZXM7Ci1pbXBvcnQgYW5kcm9pZC5hcHAucm9sZS5Sb2xlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC50YXJlLkVjb25vbXlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLnVzYWdlLlVzYWdlU3RhdHNNYW5hZ2VySW50ZXJuYWw7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKQEAgLTEzNCw3ICsxMzIsNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlBlcm1pc3Npb25DaGVja2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlckludGVybmFsOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJhdHRlcnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwpAQCAtMTkyLDcgKzE4OSw2IEBACiBpbXBvcnQgb3JnLm1vY2tpdG8uc3R1YmJpbmcuQW5zd2VyOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTI0Niw4ICsyNDIsNiBAQAogICAgIEBNb2NrCiAgICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlckludGVybmFsIG1QYWNrYWdlTWFuYWdlckludGVybmFsOwogICAgIEBNb2NrCi0gICAgcHJpdmF0ZSBSb2xlTWFuYWdlciBtUm9sZU1hbmFnZXI7Ci0gICAgQE1vY2sKICAgICBwcml2YXRlIEFwcFN0YXRlVHJhY2tlckltcGwgbUFwcFN0YXRlVHJhY2tlcjsKICAgICBATW9jawogICAgIHByaXZhdGUgQWxhcm1NYW5hZ2VyU2VydmljZS5DbG9ja1JlY2VpdmVyIG1DbG9ja1JlY2VpdmVyOwpAQCAtMzkzLDExICszODcsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoQ29udGVudE9ic2VydmVyIG9ic2VydmVyLCBVcmkgdXJpKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHZvaWQgcmVnaXN0ZXJEZXZpY2VDb25maWdMaXN0ZW5lcihEZXZpY2VDb25maWcuT25Qcm9wZXJ0aWVzQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgICAgICAvLyBEbyBub3RoaW5nLgogICAgICAgICAgICAgLy8gVGhlIHRlc3RzIGJlY29tZSBmbGFreSB3aXRoIGFuIGVycm9yIG1lc3NhZ2Ugb2YKQEAgLTQ4NCwxMCArNDczLDEyIEBACiAgICAgICAgIGRvUmV0dXJuKFBlcm1pc3Npb25DaGVja2VyLlBFUk1JU1NJT05fSEFSRF9ERU5JRUQpLndoZW4oCiAgICAgICAgICAgICAgICAgKCkgLT4gUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yUHJlZmxpZ2h0KGFueSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgZXEoTWFuaWZlc3QucGVybWlzc2lvbi5VU0VfRVhBQ1RfQUxBUk0pLCBhbnlJbnQoKSwgYW55SW50KCksIGFueVN0cmluZygpKSk7CisgICAgICAgIGRvUmV0dXJuKFBlcm1pc3Npb25DaGVja2VyLlBFUk1JU1NJT05fSEFSRF9ERU5JRUQpLndoZW4oCisgICAgICAgICAgICAgICAgKCkgLT4gUGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yUHJlZmxpZ2h0KGFueSgpLCBlcShTQ0hFRFVMRV9FWEFDVF9BTEFSTSksCisgICAgICAgICAgICAgICAgICAgICAgICBhbnlJbnQoKSwgYW55SW50KCksIGFueVN0cmluZygpKSk7CiAKICAgICAgICAgd2hlbihtTW9ja0NvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFQUF9PUFNfU0VSVklDRSkpLnRoZW5SZXR1cm4obUFwcE9wc01hbmFnZXIpOwogICAgICAgICB3aGVuKG1Nb2NrQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKEJhdHRlcnlNYW5hZ2VyLmNsYXNzKSkudGhlblJldHVybihtQmF0dGVyeU1hbmFnZXIpOwotICAgICAgICB3aGVuKG1Nb2NrQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKFJvbGVNYW5hZ2VyLmNsYXNzKSkudGhlblJldHVybihtUm9sZU1hbmFnZXIpOwogCiAgICAgICAgIHJlZ2lzdGVyQXBwSWRzKG5ldyBTdHJpbmdbXXtURVNUX0NBTExJTkdfUEFDS0FHRX0sCiAgICAgICAgICAgICAgICAgbmV3IEludGVnZXJbXXtVc2VySGFuZGxlLmdldEFwcElkKFRFU1RfQ0FMTElOR19VSUQpfSk7CkBAIC0xMzAzLDcgKzEyOTQsOCBAQAogICAgICAgICBmaW5hbCBCcm9hZGNhc3RPcHRpb25zIGFjdHVhbE9wdGlvbnMgPSBuZXcgQnJvYWRjYXN0T3B0aW9ucyhhY3R1YWxPcHRpb25zQnVuZGxlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJyb2FkY2FzdE9wdGlvbnMuREVMSVZFUllfR1JPVVBfUE9MSUNZX01PU1RfUkVDRU5ULAogICAgICAgICAgICAgICAgIGFjdHVhbE9wdGlvbnMuZ2V0RGVsaXZlcnlHcm91cFBvbGljeSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY3R1YWxPcHRpb25zLmlzRGVmZXJVbnRpbEFjdGl2ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJyb2FkY2FzdE9wdGlvbnMuREVGRVJSQUxfUE9MSUNZX1VOVElMX0FDVElWRSwKKyAgICAgICAgICAgICAgICBhY3R1YWxPcHRpb25zLmdldERlZmVycmFsUG9saWN5KCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMTgwLDQwICsyMTcyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgaGFzU2NoZWR1bGVFeGFjdEFsYXJtQmluZGVyQ2FsbE5vdERlbnlMaXN0ZWQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7Ci0KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0RFRkFVTFQpOwotICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOwotCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKLQotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOwotCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9JR05PUkVEKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBoYXNTY2hlZHVsZUV4YWN0QWxhcm1CaW5kZXJDYWxsRGVueUxpc3RlZCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKLQotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgdHJ1ZSwgTU9ERV9FUlJPUkVEKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7Ci0KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIHRydWUsIE1PREVfREVGQVVMVCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOwotCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCB0cnVlLCBNT0RFX0lHTk9SRUQpOwotICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKLQotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgdHJ1ZSwgTU9ERV9BTExPV0VEKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgbW9ja0NoYW5nZUVuYWJsZWQobG9uZyBjaGFuZ2VJZCwgYm9vbGVhbiBlbmFibGVkKSB7CiAgICAgICAgIGRvUmV0dXJuKGVuYWJsZWQpLndoZW4oKCkgLT4gQ29tcGF0Q2hhbmdlcy5pc0NoYW5nZUVuYWJsZWQoZXEoY2hhbmdlSWQpLCBhbnlTdHJpbmcoKSwKICAgICAgICAgICAgICAgICBhbnkoVXNlckhhbmRsZS5jbGFzcykpKTsKQEAgLTIyMjEsMTYgKzIxNzksNjIgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGhhc1NjaGVkdWxlRXhhY3RBbGFybUJpbmRlckNhbGxOb3REZWNsYXJlZCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIGhhc1NjaGVkdWxlRXhhY3RBbGFybUJpbmRlckNhbGwoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5TQ0hFRFVMRV9FWEFDVF9BTEFSTV9ERU5JRURfQllfREVGQVVMVCwgdHJ1ZSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaGFzU2NoZWR1bGVFeGFjdEFsYXJtQmluZGVyQ2FsbE5vdERlbnlMaXN0ZWRQcmVUKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOwogCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSwgZmFsc2UsIE1PREVfREVGQVVMVCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfREVGQVVMVCk7CisgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5oYXNTY2hlZHVsZUV4YWN0QWxhcm0oVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VU0VSKSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOwogICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKIAotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0lHTk9SRUQpOworICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhc1NjaGVkdWxlRXhhY3RBbGFybUJpbmRlckNhbGxEZW55TGlzdGVkUHJlVCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIHRydWUsIE1PREVfRVJST1JFRCk7CiAgICAgICAgIGFzc2VydEZhbHNlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOwogCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSwgdHJ1ZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCB0cnVlLCBNT0RFX0RFRkFVTFQpOworICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIHRydWUsIE1PREVfSUdOT1JFRCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgdHJ1ZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhhc1NjaGVkdWxlRXhhY3RBbGFybUJpbmRlckNhbGxOb3REZWNsYXJlZFByZVQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVChmYWxzZSwgZmFsc2UsIE1PREVfREVGQVVMVCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1CaW5kZXIuaGFzU2NoZWR1bGVFeGFjdEFsYXJtKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVVNFUikpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQoZmFsc2UsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKGZhbHNlLCB0cnVlLCBNT0RFX0FMTE9XRUQpOwogICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmhhc1NjaGVkdWxlRXhhY3RBbGFybShURVNUX0NBTExJTkdfUEFDS0FHRSwgVEVTVF9DQUxMSU5HX1VTRVIpKTsKICAgICB9CiAKQEAgLTIyMzksNjEgKzIyNDMsOTQgQEAKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgZmFsc2UpOwogCiAgICAgICAgIC8vIGNhblNjaGVkdWxlRXhhY3RBbGFybXMgc2hvdWxkIGJlIHRydWUgcmVnYXJkbGVzcyBvZiBhbnkgcGVybWlzc2lvbiBzdGF0ZS4KLSAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZSh0cnVlKTsKKyAgICAgICAgLy8gQm90aCBTRUEgYW5kIFVFQSBhcmUgZGVuaWVkIGluIHNldFVwLgogICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOwogCiAgICAgICAgIG1vY2tVc2VFeGFjdEFsYXJtU3RhdGUoZmFsc2UpOwogICAgICAgICBhc3NlcnRUcnVlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOwogCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSwgdHJ1ZSwgTU9ERV9ERUZBVUxUKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmNhblNjaGVkdWxlRXhhY3RBbGFybXMoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKTsKLQotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSk7CiAgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjYW5TY2hlZHVsZUV4YWN0QWxhcm1zQmluZGVyQ2FsbCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIGNhblNjaGVkdWxlRXhhY3RBbGFybXNCaW5kZXJDYWxsUHJlVCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICAvLyBQb2xpY3kgcGVybWlzc2lvbiBpcyBkZW5pZWQgaW4gc2V0VXAoKS4KICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5FTkFCTEVfVVNFX0VYQUNUX0FMQVJNLCB0cnVlKTsKIAogICAgICAgICAvLyBObyBwZXJtaXNzaW9uLCBubyBleGVtcHRpb24uCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCB0cnVlLCBNT0RFX0RFRkFVTFQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIHRydWUsIE1PREVfREVGQVVMVCk7CiAgICAgICAgIGFzc2VydEZhbHNlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOwogCiAgICAgICAgIC8vIE5vIHBlcm1pc3Npb24sIG5vIGV4ZW1wdGlvbi4KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOwogICAgICAgICBhc3NlcnRGYWxzZShtQmluZGVyLmNhblNjaGVkdWxlRXhhY3RBbGFybXMoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKTsKIAogICAgICAgICAvLyBQb2xpY3kgcGVybWlzc2lvbiBvbmx5LCBubyBleGVtcHRpb24uCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKICAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZSh0cnVlKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmNhblNjaGVkdWxlRXhhY3RBbGFybXMoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKTsKIAogICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKGZhbHNlKTsKIAogICAgICAgICAvLyBVc2VyIHBlcm1pc3Npb24gb25seSwgbm8gZXhlbXB0aW9uLgotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfREVGQVVMVCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfREVGQVVMVCk7CiAgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CiAKICAgICAgICAgLy8gVXNlciBwZXJtaXNzaW9uIG9ubHksIG5vIGV4ZW1wdGlvbi4KLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIHRydWUsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgdHJ1ZSwgTU9ERV9BTExPV0VEKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmNhblNjaGVkdWxlRXhhY3RBbGFybXMoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKTsKIAogICAgICAgICAvLyBObyBwZXJtaXNzaW9uLCBleGVtcHRpb24uCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKICAgICAgICAgd2hlbihtRGV2aWNlSWRsZUludGVybmFsLmlzQXBwT25XaGl0ZWxpc3QoVEVTVF9DQUxMSU5HX1VJRCkpLnRoZW5SZXR1cm4odHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CiAKICAgICAgICAgLy8gTm8gcGVybWlzc2lvbiwgZXhlbXB0aW9uLgotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CiAgICAgICAgIHdoZW4obURldmljZUlkbGVJbnRlcm5hbC5pc0FwcE9uV2hpdGVsaXN0KFRFU1RfQ0FMTElOR19VSUQpKS50aGVuUmV0dXJuKGZhbHNlKTsKICAgICAgICAgZG9SZXR1cm4odHJ1ZSkud2hlbigoKSAtPiBVc2VySGFuZGxlLmlzQ29yZShURVNUX0NBTExJTkdfVUlEKSk7CiAgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CiAKICAgICAgICAgLy8gQm90aCBwZXJtaXNzaW9ucyBhbmQgZXhlbXB0aW9uLgotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIG1vY2tVc2VFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYW5TY2hlZHVsZUV4YWN0QWxhcm1zQmluZGVyQ2FsbCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAvLyBCb3RoIHBlcm1pc3Npb25zIGFyZSBkZW5pZWQgaW4gc2V0VXAoKS4KKyAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5FTkFCTEVfVVNFX0VYQUNUX0FMQVJNLCB0cnVlKTsKKyAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlNDSEVEVUxFX0VYQUNUX0FMQVJNX0RFTklFRF9CWV9ERUZBVUxULCB0cnVlKTsKKworICAgICAgICAvLyBObyBwZXJtaXNzaW9uLCBubyBleGVtcHRpb24uCisgICAgICAgIGFzc2VydEZhbHNlKG1CaW5kZXIuY2FuU2NoZWR1bGVFeGFjdEFsYXJtcyhURVNUX0NBTExJTkdfUEFDS0FHRSkpOworCisgICAgICAgIC8vIFBvbGljeSBwZXJtaXNzaW9uIG9ubHksIG5vIGV4ZW1wdGlvbi4KKyAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZSh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmNhblNjaGVkdWxlRXhhY3RBbGFybXMoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKTsKKworICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKGZhbHNlKTsKKworICAgICAgICAvLyBVc2VyIHBlcm1pc3Npb24gb25seSwgbm8gZXhlbXB0aW9uLgorICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CisKKyAgICAgICAgLy8gTm8gcGVybWlzc2lvbiwgZXhlbXB0aW9uLgorICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UpOworICAgICAgICB3aGVuKG1EZXZpY2VJZGxlSW50ZXJuYWwuaXNBcHBPbldoaXRlbGlzdChURVNUX0NBTExJTkdfVUlEKSkudGhlblJldHVybih0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQmluZGVyLmNhblNjaGVkdWxlRXhhY3RBbGFybXMoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKTsKKworICAgICAgICAvLyBObyBwZXJtaXNzaW9uLCBjb3JlIHVpZCBleGVtcHRpb24uCisgICAgICAgIHdoZW4obURldmljZUlkbGVJbnRlcm5hbC5pc0FwcE9uV2hpdGVsaXN0KFRFU1RfQ0FMTElOR19VSUQpKS50aGVuUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgZG9SZXR1cm4odHJ1ZSkud2hlbigoKSAtPiBVc2VySGFuZGxlLmlzQ29yZShURVNUX0NBTExJTkdfVUlEKSk7CisgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CisKKyAgICAgICAgLy8gQm90aCBwZXJtaXNzaW9ucyBhbmQgY29yZSB1aWQgZXhlbXB0aW9uLgorICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CiAgICAgICAgIG1vY2tVc2VFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUobUJpbmRlci5jYW5TY2hlZHVsZUV4YWN0QWxhcm1zKFRFU1RfQ0FMTElOR19QQUNLQUdFKSk7CiAgICAgfQpAQCAtMjQwMyw4ICsyNDQwLDkgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGFsYXJtQ2xvY2tCaW5kZXJDYWxsV2l0aFNFQVBlcm1pc3Npb24oKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5TQ0hFRFVMRV9FWEFDVF9BTEFSTV9ERU5JRURfQllfREVGQVVMVCwgdHJ1ZSk7CiAKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CiAKICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBhbGFybVBpID0gZ2V0TmV3TW9ja1BlbmRpbmdJbnRlbnQoKTsKICAgICAgICAgZmluYWwgQWxhcm1NYW5hZ2VyLkFsYXJtQ2xvY2tJbmZvIGFsYXJtQ2xvY2sgPSBtb2NrKEFsYXJtTWFuYWdlci5BbGFybUNsb2NrSW5mby5jbGFzcyk7CkBAIC0yNDMwLDkgKzI0NjgsMTAgQEAKICAgICBwdWJsaWMgdm9pZCBhbGFybUNsb2NrQmluZGVyQ2FsbFdpdGhVRUFQZXJtaXNzaW9uKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOwogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuRU5BQkxFX1VTRV9FWEFDVF9BTEFSTSwgdHJ1ZSk7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5TQ0hFRFVMRV9FWEFDVF9BTEFSTV9ERU5JRURfQllfREVGQVVMVCwgdHJ1ZSk7CiAKICAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZSh0cnVlKTsKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKGZhbHNlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKGZhbHNlKTsKIAogICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGFsYXJtUGkgPSBnZXROZXdNb2NrUGVuZGluZ0ludGVudCgpOwogICAgICAgICBmaW5hbCBBbGFybU1hbmFnZXIuQWxhcm1DbG9ja0luZm8gYWxhcm1DbG9jayA9IG1vY2soQWxhcm1NYW5hZ2VyLkFsYXJtQ2xvY2tJbmZvLmNsYXNzKTsKQEAgLTI0NTQsNyArMjQ5Myw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhURU1QT1JBUllfQUxMT1dMSVNUX1RZUEVfRk9SRUdST1VORF9TRVJWSUNFX0FMTE9XRUQsIHR5cGUpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoYm9vbGVhbiBkZWNsYXJlZCwgYm9vbGVhbiBkZW55TGlzdCwgaW50IG1vZGUpIHsKKyAgICBwcml2YXRlIHZvaWQgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVChib29sZWFuIGRlY2xhcmVkLCBib29sZWFuIGRlbnlMaXN0LCBpbnQgbW9kZSkgewogICAgICAgICBTdHJpbmdbXSByZXF1ZXN0ZXJzID0gZGVjbGFyZWQgPyBuZXcgU3RyaW5nW117VEVTVF9DQUxMSU5HX1BBQ0tBR0V9IDogRW1wdHlBcnJheS5TVFJJTkc7CiAgICAgICAgIHdoZW4obVBlcm1pc3Npb25NYW5hZ2VySW50ZXJuYWwuZ2V0QXBwT3BQZXJtaXNzaW9uUGFja2FnZXMoU0NIRURVTEVfRVhBQ1RfQUxBUk0pKQogICAgICAgICAgICAgICAgIC50aGVuUmV0dXJuKHJlcXVlc3RlcnMpOwpAQCAtMjQ2OSw2ICsyNTA4LDIwIEBACiAgICAgICAgICAgICAgICAgVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKS50aGVuUmV0dXJuKG1vZGUpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoYm9vbGVhbiBncmFudGVkKSB7CisgICAgICAgIFN0cmluZ1tdIHJlcXVlc3RlcnMgPSBncmFudGVkID8gbmV3IFN0cmluZ1tde1RFU1RfQ0FMTElOR19QQUNLQUdFfSA6IEVtcHR5QXJyYXkuU1RSSU5HOworICAgICAgICB3aGVuKG1QZXJtaXNzaW9uTWFuYWdlckludGVybmFsLmdldEFwcE9wUGVybWlzc2lvblBhY2thZ2VzKFNDSEVEVUxFX0VYQUNUX0FMQVJNKSkKKyAgICAgICAgICAgICAgICAudGhlblJldHVybihyZXF1ZXN0ZXJzKTsKKyAgICAgICAgbVNlcnZpY2UucmVmcmVzaEV4YWN0QWxhcm1DYW5kaWRhdGVzKCk7CisKKyAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IGdyYW50ZWQgPyBQZXJtaXNzaW9uQ2hlY2tlci5QRVJNSVNTSU9OX0dSQU5URUQKKyAgICAgICAgICAgICAgICA6IFBlcm1pc3Npb25DaGVja2VyLlBFUk1JU1NJT05fSEFSRF9ERU5JRUQ7CisgICAgICAgIGRvUmV0dXJuKHJlc3VsdCkud2hlbigKKyAgICAgICAgICAgICAgICAoKSAtPiBQZXJtaXNzaW9uQ2hlY2tlci5jaGVja1Blcm1pc3Npb25Gb3JQcmVmbGlnaHQoZXEobU1vY2tDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxKFNDSEVEVUxFX0VYQUNUX0FMQVJNKSwgYW55SW50KCksIGVxKFRFU1RfQ0FMTElOR19VSUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXEoVEVTVF9DQUxMSU5HX1BBQ0tBR0UpKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIG1vY2tVc2VFeGFjdEFsYXJtU3RhdGUoYm9vbGVhbiBncmFudGVkKSB7CiAgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSBncmFudGVkID8gUGVybWlzc2lvbkNoZWNrZXIuUEVSTUlTU0lPTl9HUkFOVEVECiAgICAgICAgICAgICAgICAgOiBQZXJtaXNzaW9uQ2hlY2tlci5QRVJNSVNTSU9OX0hBUkRfREVOSUVEOwpAQCAtMjQ4Miw3ICsyNTM1LDcgQEAKICAgICBwdWJsaWMgdm9pZCBhbGFybUNsb2NrQmluZGVyQ2FsbFdpdGhvdXRQZXJtaXNzaW9uKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOwogCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKICAgICAgICAgd2hlbihtRGV2aWNlSWRsZUludGVybmFsLmlzQXBwT25XaGl0ZWxpc3QoYW55SW50KCkpKS50aGVuUmV0dXJuKHRydWUpOwogCiAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgYWxhcm1QaSA9IGdldE5ld01vY2tQZW5kaW5nSW50ZW50KCk7CkBAIC0yNTAzLDggKzI1NTYsOSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgZXhhY3RCaW5kZXJDYWxsV2l0aFNFQVBlcm1pc3Npb24oKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5TQ0hFRFVMRV9FWEFDVF9BTEFSTV9ERU5JRURfQllfREVGQVVMVCwgdHJ1ZSk7CiAKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CiAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgYWxhcm1QaSA9IGdldE5ld01vY2tQZW5kaW5nSW50ZW50KCk7CiAgICAgICAgIG1CaW5kZXIuc2V0KFRFU1RfQ0FMTElOR19QQUNLQUdFLCBFTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwgMTIzNCwgV0lORE9XX0VYQUNULCAwLAogICAgICAgICAgICAgICAgIDAsIGFsYXJtUGksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwpAQCAtMjUyOCw5ICsyNTgyLDEwIEBACiAgICAgcHVibGljIHZvaWQgZXhhY3RCaW5kZXJDYWxsV2l0aFVFQVBlcm1pc3Npb24oKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5FTkFCTEVfVVNFX0VYQUNUX0FMQVJNLCB0cnVlKTsKKyAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlNDSEVEVUxFX0VYQUNUX0FMQVJNX0RFTklFRF9CWV9ERUZBVUxULCB0cnVlKTsKIAogICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKHRydWUpOwotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UpOwogICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGFsYXJtUGkgPSBnZXROZXdNb2NrUGVuZGluZ0ludGVudCgpOwogICAgICAgICBtQmluZGVyLnNldChURVNUX0NBTExJTkdfUEFDS0FHRSwgRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIDEyMzQsIFdJTkRPV19FWEFDVCwgMCwKICAgICAgICAgICAgICAgICAwLCBhbGFybVBpLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKQEAgLTI1NTQsNyArMjYwOSw3IEBACiAgICAgcHVibGljIHZvaWQgZXhhY3RCaW5kZXJDYWxsV2l0aEFsbG93bGlzdCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKICAgICAgICAgLy8gSWYgcGVybWlzc2lvbiBpcyBkZW5pZWQsIG9ubHkgdGhlbiBhbGxvd2xpc3Qgd2lsbCBiZSBjaGVja2VkLgotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CiAgICAgICAgIHdoZW4obURldmljZUlkbGVJbnRlcm5hbC5pc0FwcE9uV2hpdGVsaXN0KGFueUludCgpKSkudGhlblJldHVybih0cnVlKTsKIAogICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGFsYXJtUGkgPSBnZXROZXdNb2NrUGVuZGluZ0ludGVudCgpOwpAQCAtMjU3NCw3ICsyNjI5LDcgQEAKICAgICBwdWJsaWMgdm9pZCBleGFjdEFsbG93V2hpbGVJZGxlQmluZGVyQ2FsbFdpdGhTRUFQZXJtaXNzaW9uKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOwogCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBhbGFybVBpID0gZ2V0TmV3TW9ja1BlbmRpbmdJbnRlbnQoKTsKICAgICAgICAgbUJpbmRlci5zZXQoVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIEVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCAxMjM0LCBXSU5ET1dfRVhBQ1QsIDAsCiAgICAgICAgICAgICAgICAgRkxBR19BTExPV19XSElMRV9JRExFLCBhbGFybVBpLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKQEAgLTI2MDAsNyArMjY1NSw3IEBACiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5FTkFCTEVfVVNFX0VYQUNUX0FMQVJNLCB0cnVlKTsKIAogICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKHRydWUpOwotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUoZmFsc2UsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKGZhbHNlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBhbGFybVBpID0gZ2V0TmV3TW9ja1BlbmRpbmdJbnRlbnQoKTsKICAgICAgICAgbUJpbmRlci5zZXQoVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIEVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCAxMjM0LCBXSU5ET1dfRVhBQ1QsIDAsCiAgICAgICAgICAgICAgICAgRkxBR19BTExPV19XSElMRV9JRExFLCBhbGFybVBpLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKQEAgLTI2MjQsNyArMjY3OSw3IEBACiAgICAgcHVibGljIHZvaWQgZXhhY3RBbGxvd1doaWxlSWRsZUJpbmRlckNhbGxXaXRoQWxsb3dsaXN0KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOwogICAgICAgICAvLyBJZiBwZXJtaXNzaW9uIGlzIGRlbmllZCwgb25seSB0aGVuIGFsbG93bGlzdCB3aWxsIGJlIGNoZWNrZWQuCi0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKICAgICAgICAgd2hlbihtRGV2aWNlSWRsZUludGVybmFsLmlzQXBwT25XaGl0ZWxpc3QoYW55SW50KCkpKS50aGVuUmV0dXJuKHRydWUpOwogCiAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgYWxhcm1QaSA9IGdldE5ld01vY2tQZW5kaW5nSW50ZW50KCk7CkBAIC0yNjUwLDcgKzI3MDUsNyBAQAogICAgIHB1YmxpYyB2b2lkIGV4YWN0QmluZGVyQ2FsbHNXaXRob3V0UGVybWlzc2lvbldpdGhvdXRBbGxvd2xpc3QoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CiAKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOwogICAgICAgICB3aGVuKG1EZXZpY2VJZGxlSW50ZXJuYWwuaXNBcHBPbldoaXRlbGlzdChhbnlJbnQoKSkpLnRoZW5SZXR1cm4oZmFsc2UpOwogCiAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgYWxhcm1QaSA9IGdldE5ld01vY2tQZW5kaW5nSW50ZW50KCk7CkBAIC0yNzAwLDcgKzI3NTUsNyBAQAogICAgIHB1YmxpYyB2b2lkIGJpbmRlckNhbGxXaXRoVXNlckFsbG93bGlzdCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCB0cnVlKTsKIAotICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfRVJST1JFRCk7CiAgICAgICAgIHdoZW4obURldmljZUlkbGVJbnRlcm5hbC5pc0FwcE9uV2hpdGVsaXN0KGFueUludCgpKSkudGhlblJldHVybih0cnVlKTsKICAgICAgICAgd2hlbihtQXBwU3RhdGVUcmFja2VyLmlzVWlkUG93ZXJTYXZlVXNlckV4ZW1wdChURVNUX0NBTExJTkdfVUlEKSkudGhlblJldHVybih0cnVlKTsKIApAQCAtMzAyNSw3ICszMDgwLDcgQEAKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgdHJ1ZSk7CiAKICAgICAgICAgbVNlcnZpY2UubUxhc3RPcFNjaGVkdWxlRXhhY3RBbGFybS5wdXQoVEVTVF9DQUxMSU5HX1VJRCwgTU9ERV9BTExPV0VEKTsKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOwogCiAgICAgICAgIG1JQXBwT3BzQ2FsbGJhY2sub3BDaGFuZ2VkKE9QX1NDSEVEVUxFX0VYQUNUX0FMQVJNLCBURVNUX0NBTExJTkdfVUlELCBURVNUX0NBTExJTkdfUEFDS0FHRSk7CiAgICAgICAgIGFzc2VydEFuZEhhbmRsZU1lc3NhZ2VTeW5jKFJFTU9WRV9FWEFDVF9BTEFSTVMpOwpAQCAtMzAzOCw3ICszMDkzLDcgQEAKICAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoQWxhcm1NYW5hZ2VyLlJFUVVJUkVfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTiwgZmFsc2UpOwogCiAgICAgICAgIG1TZXJ2aWNlLm1MYXN0T3BTY2hlZHVsZUV4YWN0QWxhcm0ucHV0KFRFU1RfQ0FMTElOR19VSUQsIE1PREVfQUxMT1dFRCk7Ci0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKIAogICAgICAgICBtSUFwcE9wc0NhbGxiYWNrLm9wQ2hhbmdlZChPUF9TQ0hFRFVMRV9FWEFDVF9BTEFSTSwgVEVTVF9DQUxMSU5HX1VJRCwgVEVTVF9DQUxMSU5HX1BBQ0tBR0UpOwogCkBAIC0zMDUxLDcgKzMxMDYsNyBAQAogICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuUkVRVUlSRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OLCBmYWxzZSk7CiAKICAgICAgICAgbVNlcnZpY2UubUxhc3RPcFNjaGVkdWxlRXhhY3RBbGFybS5wdXQoVEVTVF9DQUxMSU5HX1VJRCwgTU9ERV9FUlJPUkVEKTsKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIHRydWUsIE1PREVfREVGQVVMVCk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgdHJ1ZSwgTU9ERV9ERUZBVUxUKTsKIAogICAgICAgICBtSUFwcE9wc0NhbGxiYWNrLm9wQ2hhbmdlZChPUF9TQ0hFRFVMRV9FWEFDVF9BTEFSTSwgVEVTVF9DQUxMSU5HX1VJRCwgVEVTVF9DQUxMSU5HX1BBQ0tBR0UpOwogCkBAIC0zMDY3LDcgKzMxMjIsNyBAQAogICAgICAgICB3aGVuKG1BY3Rpdml0eU1hbmFnZXJJbnRlcm5hbC5nZXRCb290VGltZVRlbXBBbGxvd0xpc3REdXJhdGlvbigpKS50aGVuUmV0dXJuKGR1cmF0aW9uTXMpOwogCiAgICAgICAgIG1TZXJ2aWNlLm1MYXN0T3BTY2hlZHVsZUV4YWN0QWxhcm0ucHV0KFRFU1RfQ0FMTElOR19VSUQsIE1PREVfRVJST1JFRCk7Ci0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9BTExPV0VEKTsKICAgICAgICAgbUlBcHBPcHNDYWxsYmFjay5vcENoYW5nZWQoT1BfU0NIRURVTEVfRVhBQ1RfQUxBUk0sIFRFU1RfQ0FMTElOR19VSUQsIFRFU1RfQ0FMTElOR19QQUNLQUdFKTsKIAogICAgICAgICBmaW5hbCBBcmd1bWVudENhcHRvcjxJbnRlbnQ+IGludGVudENhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKEludGVudC5jbGFzcyk7CkBAIC0zMzI3LDcgKzMzODIsNyBAQAogICAgICAgICAgICAgICAgIC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfUkVQTEFDSU5HLCB0cnVlKTsKIAogICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKGZhbHNlKTsKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOwogICAgICAgICBtUGFja2FnZUNoYW5nZXNSZWNlaXZlci5vblJlY2VpdmUobU1vY2tDb250ZXh0LCBwYWNrYWdlUmVwbGFjZWRJbnRlbnQpOwogICAgICAgICBhc3NlcnRBbmRIYW5kbGVNZXNzYWdlU3luYyhDSEVDS19FWEFDVF9BTEFSTV9QRVJNSVNTSU9OX09OX1VQREFURSk7CiAKQEAgLTMzMzUsNyArMzM5MCw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyg1LCBtU2VydmljZS5tQWxhcm1TdG9yZS5zaXplKCkpOwogCiAgICAgICAgIG1vY2tVc2VFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7Ci0gICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZSh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKICAgICAgICAgbVBhY2thZ2VDaGFuZ2VzUmVjZWl2ZXIub25SZWNlaXZlKG1Nb2NrQ29udGV4dCwgcGFja2FnZVJlcGxhY2VkSW50ZW50KTsKICAgICAgICAgYXNzZXJ0QW5kSGFuZGxlTWVzc2FnZVN5bmMoQ0hFQ0tfRVhBQ1RfQUxBUk1fUEVSTUlTU0lPTl9PTl9VUERBVEUpOwogCkBAIC0zMzQzLDcgKzMzOTgsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbVNlcnZpY2UubUFsYXJtU3RvcmUuc2l6ZSgpKTsKIAogICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKGZhbHNlKTsKLSAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0VSUk9SRUQpOwogICAgICAgICBtUGFja2FnZUNoYW5nZXNSZWNlaXZlci5vblJlY2VpdmUobU1vY2tDb250ZXh0LCBwYWNrYWdlUmVwbGFjZWRJbnRlbnQpOwogICAgICAgICBhc3NlcnRBbmRIYW5kbGVNZXNzYWdlU3luYyhDSEVDS19FWEFDVF9BTEFSTV9QRVJNSVNTSU9OX09OX1VQREFURSk7CiAKQEAgLTMzNjIsNTUgKzM0MTcsNiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgaXNTY2hlZHVsZUV4YWN0QWxhcm1BbGxvd2VkQnlEZWZhdWx0KCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZTEgPSAicHJpdiI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlMiA9ICJzaWduZWQiOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZTMgPSAibm9ybWFsIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2U0ID0gIndlbGxiZWluZyI7Ci0gICAgICAgIGZpbmFsIGludCB1aWQxID0gMTI5NDsKLSAgICAgICAgZmluYWwgaW50IHVpZDIgPSA4MzIxOwotICAgICAgICBmaW5hbCBpbnQgdWlkMyA9IDM0MTI7Ci0gICAgICAgIGZpbmFsIGludCB1aWQ0ID0gNDU5MTsKLQotICAgICAgICB3aGVuKG1QYWNrYWdlTWFuYWdlckludGVybmFsLmlzVWlkUHJpdmlsZWdlZCh1aWQxKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtUGFja2FnZU1hbmFnZXJJbnRlcm5hbC5pc1VpZFByaXZpbGVnZWQodWlkMikpLnRoZW5SZXR1cm4oZmFsc2UpOwotICAgICAgICB3aGVuKG1QYWNrYWdlTWFuYWdlckludGVybmFsLmlzVWlkUHJpdmlsZWdlZCh1aWQzKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obVBhY2thZ2VNYW5hZ2VySW50ZXJuYWwuaXNVaWRQcml2aWxlZ2VkKHVpZDQpKS50aGVuUmV0dXJuKGZhbHNlKTsKLQotICAgICAgICB3aGVuKG1QYWNrYWdlTWFuYWdlckludGVybmFsLmlzUGxhdGZvcm1TaWduZWQocGFja2FnZTEpKS50aGVuUmV0dXJuKGZhbHNlKTsKLSAgICAgICAgd2hlbihtUGFja2FnZU1hbmFnZXJJbnRlcm5hbC5pc1BsYXRmb3JtU2lnbmVkKHBhY2thZ2UyKSkudGhlblJldHVybih0cnVlKTsKLSAgICAgICAgd2hlbihtUGFja2FnZU1hbmFnZXJJbnRlcm5hbC5pc1BsYXRmb3JtU2lnbmVkKHBhY2thZ2UzKSkudGhlblJldHVybihmYWxzZSk7Ci0gICAgICAgIHdoZW4obVBhY2thZ2VNYW5hZ2VySW50ZXJuYWwuaXNQbGF0Zm9ybVNpZ25lZChwYWNrYWdlNCkpLnRoZW5SZXR1cm4oZmFsc2UpOwotCi0gICAgICAgIHdoZW4obVJvbGVNYW5hZ2VyLmdldFJvbGVIb2xkZXJzKFJvbGVNYW5hZ2VyLlJPTEVfU1lTVEVNX1dFTExCRUlORykpLnRoZW5SZXR1cm4oCi0gICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChwYWNrYWdlNCkpOwotCi0gICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKFNDSEVEVUxFX0VYQUNUX0FMQVJNX0RFTklFRF9CWV9ERUZBVUxULCBmYWxzZSk7Ci0gICAgICAgIG1TZXJ2aWNlLm1Db25zdGFudHMuRVhBQ1RfQUxBUk1fREVOWV9MSVNUID0gbmV3IEFycmF5U2V0PD4obmV3IFN0cmluZ1tdewotICAgICAgICAgICAgICAgIHBhY2thZ2UxLAotICAgICAgICAgICAgICAgIHBhY2thZ2UzLAotICAgICAgICB9KTsKLQotICAgICAgICAvLyBEZW55IGxpc3RlZCBwYWNrYWdlcyB3aWxsIGJlIGZhbHNlLgotICAgICAgICBhc3NlcnRGYWxzZShtU2VydmljZS5pc1NjaGVkdWxlRXhhY3RBbGFybUFsbG93ZWRCeURlZmF1bHQocGFja2FnZTEsIHVpZDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtU2VydmljZS5pc1NjaGVkdWxlRXhhY3RBbGFybUFsbG93ZWRCeURlZmF1bHQocGFja2FnZTIsIHVpZDIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobVNlcnZpY2UuaXNTY2hlZHVsZUV4YWN0QWxhcm1BbGxvd2VkQnlEZWZhdWx0KHBhY2thZ2UzLCB1aWQzKSk7Ci0gICAgICAgIGFzc2VydFRydWUobVNlcnZpY2UuaXNTY2hlZHVsZUV4YWN0QWxhcm1BbGxvd2VkQnlEZWZhdWx0KHBhY2thZ2U0LCB1aWQ0KSk7Ci0KLSAgICAgICAgbW9ja0NoYW5nZUVuYWJsZWQoU0NIRURVTEVfRVhBQ1RfQUxBUk1fREVOSUVEX0JZX0RFRkFVTFQsIHRydWUpOwotICAgICAgICBtU2VydmljZS5tQ29uc3RhbnRzLkVYQUNUX0FMQVJNX0RFTllfTElTVCA9IG5ldyBBcnJheVNldDw+KG5ldyBTdHJpbmdbXXsKLSAgICAgICAgICAgICAgICBwYWNrYWdlMSwKLSAgICAgICAgICAgICAgICBwYWNrYWdlMywKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gRGVueSBsaXN0IGRvZXNuJ3QgbWF0dGVyIG5vdywgb25seSBleGVtcHRpb25zIHNob3VsZCBiZSB0cnVlLgotICAgICAgICBhc3NlcnRUcnVlKG1TZXJ2aWNlLmlzU2NoZWR1bGVFeGFjdEFsYXJtQWxsb3dlZEJ5RGVmYXVsdChwYWNrYWdlMSwgdWlkMSkpOwotICAgICAgICBhc3NlcnRUcnVlKG1TZXJ2aWNlLmlzU2NoZWR1bGVFeGFjdEFsYXJtQWxsb3dlZEJ5RGVmYXVsdChwYWNrYWdlMiwgdWlkMikpOwotICAgICAgICBhc3NlcnRGYWxzZShtU2VydmljZS5pc1NjaGVkdWxlRXhhY3RBbGFybUFsbG93ZWRCeURlZmF1bHQocGFja2FnZTMsIHVpZDMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtU2VydmljZS5pc1NjaGVkdWxlRXhhY3RBbGFybUFsbG93ZWRCeURlZmF1bHQocGFja2FnZTQsIHVpZDQpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGFsYXJtU2NoZWR1bGVkQXRvbVB1c2hlZCgpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHBpID0gZ2V0TmV3TW9ja1BlbmRpbmdJbnRlbnQoKTsKQEAgLTM1MDksNyArMzUxNSw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBoYXNVc2VFeGFjdEFsYXJtUGVybWlzc2lvbigpIHsKKyAgICBwdWJsaWMgdm9pZCBoYXNVc2VFeGFjdEFsYXJtSW50ZXJuYWwoKSB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5FTkFCTEVfVVNFX0VYQUNUX0FMQVJNLCB0cnVlKTsKIAogICAgICAgICBtb2NrVXNlRXhhY3RBbGFybVN0YXRlKHRydWUpOwpAQCAtMzUyMCw3ICszNTI2LDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGhhc1VzZUV4YWN0QWxhcm1QZXJtaXNzaW9uQ2hhbmdlRGlzYWJsZWQoKSB7CisgICAgcHVibGljIHZvaWQgaGFzVXNlRXhhY3RBbGFybUludGVybmFsQ2hhbmdlRGlzYWJsZWQoKSB7CiAgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5FTkFCTEVfVVNFX0VYQUNUX0FMQVJNLCBmYWxzZSk7CiAKICAgICAgICAgbW9ja1VzZUV4YWN0QWxhcm1TdGF0ZSh0cnVlKTsKQEAgLTM1MzEsNiArMzUzNyw0OSBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaGFzU2NoZWR1bGVFeGFjdEFsYXJtSW50ZXJuYWwoKSB7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuU0NIRURVTEVfRVhBQ1RfQUxBUk1fREVOSUVEX0JZX0RFRkFVTFQsIHRydWUpOworCisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZShmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmhhc1NjaGVkdWxlRXhhY3RBbGFybUludGVybmFsKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVUlEKSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKG1TZXJ2aWNlLmhhc1NjaGVkdWxlRXhhY3RBbGFybUludGVybmFsKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVUlEKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBoYXNTY2hlZHVsZUV4YWN0QWxhcm1JbnRlcm5hbFByZVQoKSB7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIHRydWUpOworICAgICAgICBtb2NrQ2hhbmdlRW5hYmxlZChBbGFybU1hbmFnZXIuU0NIRURVTEVfRVhBQ1RfQUxBUk1fREVOSUVEX0JZX0RFRkFVTFQsIGZhbHNlKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIHRydWUsIE1PREVfREVGQVVMVCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmhhc1NjaGVkdWxlRXhhY3RBbGFybUludGVybmFsKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVUlEKSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVChmYWxzZSwgZmFsc2UsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmhhc1NjaGVkdWxlRXhhY3RBbGFybUludGVybmFsKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVUlEKSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVNlcnZpY2UuaGFzU2NoZWR1bGVFeGFjdEFsYXJtSW50ZXJuYWwoVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VSUQpKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGVQcmVUKHRydWUsIGZhbHNlLCBNT0RFX0FMTE9XRUQpOworICAgICAgICBhc3NlcnRUcnVlKG1TZXJ2aWNlLmhhc1NjaGVkdWxlRXhhY3RBbGFybUludGVybmFsKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVUlEKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBoYXNTY2hlZHVsZUV4YWN0QWxhcm1JbnRlcm5hbFByZVMoKSB7CisgICAgICAgIG1vY2tDaGFuZ2VFbmFibGVkKEFsYXJtTWFuYWdlci5SRVFVSVJFX0VYQUNUX0FMQVJNX1BFUk1JU1NJT04sIGZhbHNlKTsKKworICAgICAgICBtb2NrU2NoZWR1bGVFeGFjdEFsYXJtU3RhdGUodHJ1ZSk7CisgICAgICAgIG1vY2tTY2hlZHVsZUV4YWN0QWxhcm1TdGF0ZVByZVQodHJ1ZSwgZmFsc2UsIE1PREVfQUxMT1dFRCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmhhc1NjaGVkdWxlRXhhY3RBbGFybUludGVybmFsKFRFU1RfQ0FMTElOR19QQUNLQUdFLCBURVNUX0NBTExJTkdfVUlEKSk7CisKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlKGZhbHNlKTsKKyAgICAgICAgbW9ja1NjaGVkdWxlRXhhY3RBbGFybVN0YXRlUHJlVCh0cnVlLCBmYWxzZSwgTU9ERV9FUlJPUkVEKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVNlcnZpY2UuaGFzU2NoZWR1bGVFeGFjdEFsYXJtSW50ZXJuYWwoVEVTVF9DQUxMSU5HX1BBQ0tBR0UsIFRFU1RfQ0FMTElOR19VSUQpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlbXBvcmFyeVF1b3RhUmVzZXJ2ZV9oYXNRdW90YSgpIHsKICAgICAgICAgZmluYWwgaW50IHF1b3RhVG9GaWxsID0gNTsKICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2UxID0gInBhY2thZ2UxIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQXBwbGljYXRpb25FeGl0SW5mb1Rlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQXBwbGljYXRpb25FeGl0SW5mb1Rlc3QuamF2YQppbmRleCA5MjYzYmZmLi5kNTYyMjljIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FwcGxpY2F0aW9uRXhpdEluZm9UZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BcHBsaWNhdGlvbkV4aXRJbmZvVGVzdC5qYXZhCkBAIC05ODksOSArOTg5LDE2IEBACiAgICAgcHJpdmF0ZSBQcm9jZXNzUmVjb3JkIG1ha2VQcm9jZXNzUmVjb3JkKGludCBwaWQsIGludCB1aWQsIGludCBwYWNrYWdlVWlkLCBJbnRlZ2VyIGRlZmluaW5nVWlkLAogICAgICAgICAgICAgaW50IGNvbm5lY3Rpb25Hcm91cCwgaW50IHByb2NTdGF0ZSwgbG9uZyBwc3MsIGxvbmcgcnNzLAogICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3NOYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG1ha2VQcm9jZXNzUmVjb3JkKHBpZCwgdWlkLCBwYWNrYWdlVWlkLCBkZWZpbmluZ1VpZCwgY29ubmVjdGlvbkdyb3VwLAorICAgICAgICAgICAgICAgIHByb2NTdGF0ZSwgcHNzLCByc3MsIHByb2Nlc3NOYW1lLCBwYWNrYWdlTmFtZSwgbUFtcyk7CisgICAgfQorCisgICAgc3RhdGljIFByb2Nlc3NSZWNvcmQgbWFrZVByb2Nlc3NSZWNvcmQoaW50IHBpZCwgaW50IHVpZCwgaW50IHBhY2thZ2VVaWQsIEludGVnZXIgZGVmaW5pbmdVaWQsCisgICAgICAgICAgICBpbnQgY29ubmVjdGlvbkdyb3VwLCBpbnQgcHJvY1N0YXRlLCBsb25nIHBzcywgbG9uZyByc3MsCisgICAgICAgICAgICBTdHJpbmcgcHJvY2Vzc05hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgQWN0aXZpdHlNYW5hZ2VyU2VydmljZSBhbXMpIHsKICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFpID0gbmV3IEFwcGxpY2F0aW9uSW5mbygpOwogICAgICAgICBhaS5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICBQcm9jZXNzUmVjb3JkIGFwcCA9IG5ldyBQcm9jZXNzUmVjb3JkKG1BbXMsIGFpLCBwcm9jZXNzTmFtZSwgdWlkKTsKKyAgICAgICAgUHJvY2Vzc1JlY29yZCBhcHAgPSBuZXcgUHJvY2Vzc1JlY29yZChhbXMsIGFpLCBwcm9jZXNzTmFtZSwgdWlkKTsKICAgICAgICAgYXBwLnNldFBpZChwaWQpOwogICAgICAgICBhcHAuaW5mby51aWQgPSBwYWNrYWdlVWlkOwogICAgICAgICBpZiAoZGVmaW5pbmdVaWQgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Ccm9hZGNhc3RSZWNvcmRUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2FtL0Jyb2FkY2FzdFJlY29yZFRlc3QuamF2YQppbmRleCAwMWUyNzY4Li4yYjZmMjE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2FtL0Jyb2FkY2FzdFJlY29yZFRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2FtL0Jyb2FkY2FzdFJlY29yZFRlc3QuamF2YQpAQCAtMjUsNiArMjUsOCBAQAogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQnJvYWRjYXN0Q29uc3RhbnRzLkRFRkVSX0JPT1RfQ09NUExFVEVEX0JST0FEQ0FTVF9CQUNLR1JPVU5EX1JFU1RSSUNURURfT05MWTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJyb2FkY2FzdENvbnN0YW50cy5ERUZFUl9CT09UX0NPTVBMRVRFRF9CUk9BRENBU1RfTk9ORTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJyb2FkY2FzdFJlY29yZC5jYWxjdWxhdGVCbG9ja2VkVW50aWxUZXJtaW5hbENvdW50OworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQnJvYWRjYXN0UmVjb3JkLmNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5hbS5Ccm9hZGNhc3RSZWNvcmQuY2FsY3VsYXRlVXJnZW50OwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQnJvYWRjYXN0UmVjb3JkLmlzUmVjZWl2ZXJFcXVhbHM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKQEAgLTM4LDYgKzQwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJJbnRlcm5hbDsKIGltcG9ydCBhbmRyb2lkLmFwcC5CYWNrZ3JvdW5kU3RhcnRQcml2aWxlZ2VzOwogaW1wb3J0IGFuZHJvaWQuYXBwLkJyb2FkY2FzdE9wdGlvbnM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LklJbnRlbnRSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKQEAgLTU1LDYgKzU4LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQnJvYWRjYXN0RGlzcGF0Y2hlci5EZWZlcnJlZEJvb3RDb21wbGV0ZWRCcm9hZGNhc3RQZXJVc2VyOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NrOwpAQCAtODYsNiArOTAsMTUgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQUNLQUdFX0xJU1QgPSBuZXcgU3RyaW5nW10ge1BBQ0tBR0UxLCBQQUNLQUdFMiwgUEFDS0FHRTMsCiAgICAgICAgICAgICBQQUNLQUdFNH07CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lTVEVNX1VJRCA9IGFuZHJvaWQub3MuUHJvY2Vzcy5TWVNURU1fVUlEOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfVUlEID0gYW5kcm9pZC5vcy5Qcm9jZXNzLkZJUlNUX0FQUExJQ0FUSU9OX1VJRDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJyb2FkY2FzdE9wdGlvbnMgT1BUX0RFRkFVTFQgPSBCcm9hZGNhc3RPcHRpb25zLm1ha2VCYXNpYygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJyb2FkY2FzdE9wdGlvbnMgT1BUX05PTkUgPSBCcm9hZGNhc3RPcHRpb25zLm1ha2VCYXNpYygpCisgICAgICAgICAgICAuc2V0RGVmZXJyYWxQb2xpY3koQnJvYWRjYXN0T3B0aW9ucy5ERUZFUlJBTF9QT0xJQ1lfTk9ORSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnJvYWRjYXN0T3B0aW9ucyBPUFRfVU5USUxfQUNUSVZFID0gQnJvYWRjYXN0T3B0aW9ucy5tYWtlQmFzaWMoKQorICAgICAgICAgICAgLnNldERlZmVycmFsUG9saWN5KEJyb2FkY2FzdE9wdGlvbnMuREVGRVJSQUxfUE9MSUNZX1VOVElMX0FDVElWRSk7CisKICAgICBATW9jayBBY3Rpdml0eU1hbmFnZXJJbnRlcm5hbCBtQWN0aXZpdHlNYW5hZ2VySW50ZXJuYWw7CiAgICAgQE1vY2sgQnJvYWRjYXN0UXVldWUgbVF1ZXVlOwogICAgIEBNb2NrIFByb2Nlc3NSZWNvcmQgbVByb2Nlc3M7CkBAIC0yMTMsNiArMjI2LDc1IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsY3VsYXRlVXJnZW50KCkgeworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50Rm9yZWdyb3VuZCA9IG5ldyBJbnRlbnQoKQorICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9GT1JFR1JPVU5EKTsKKworICAgICAgICBhc3NlcnRGYWxzZShjYWxjdWxhdGVVcmdlbnQoaW50ZW50LCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoY2FsY3VsYXRlVXJnZW50KGludGVudEZvcmVncm91bmQsIG51bGwpKTsKKworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBCcm9hZGNhc3RPcHRpb25zIG9wdHMgPSBCcm9hZGNhc3RPcHRpb25zLm1ha2VCYXNpYygpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlVXJnZW50KGludGVudCwgb3B0cykpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIEJyb2FkY2FzdE9wdGlvbnMgb3B0cyA9IEJyb2FkY2FzdE9wdGlvbnMubWFrZUJhc2ljKCk7CisgICAgICAgICAgICBvcHRzLnNldEludGVyYWN0aXZlKHRydWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYWxjdWxhdGVVcmdlbnQoaW50ZW50LCBvcHRzKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgQnJvYWRjYXN0T3B0aW9ucyBvcHRzID0gQnJvYWRjYXN0T3B0aW9ucy5tYWtlQmFzaWMoKTsKKyAgICAgICAgICAgIG9wdHMuc2V0QWxhcm1Ccm9hZGNhc3QodHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNhbGN1bGF0ZVVyZ2VudChpbnRlbnQsIG9wdHMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmVfQXBwKCkgeworICAgICAgICAvLyBWZXJpZnkgbm9uLXVyZ2VudCBiZWhhdmlvcgorICAgICAgICBhc3NlcnRGYWxzZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKEFQUF9VSUQsIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKEFQUF9VSUQsIE9QVF9ERUZBVUxULCBudWxsLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShBUFBfVUlELCBPUFRfTk9ORSwgbnVsbCwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShBUFBfVUlELCBPUFRfVU5USUxfQUNUSVZFLCBudWxsLCBmYWxzZSwgZmFsc2UpKTsKKworICAgICAgICAvLyBWZXJpZnkgdXJnZW50IGJlaGF2aW9yCisgICAgICAgIGFzc2VydEZhbHNlKGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoQVBQX1VJRCwgbnVsbCwgbnVsbCwgZmFsc2UsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShBUFBfVUlELCBPUFRfREVGQVVMVCwgbnVsbCwgZmFsc2UsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShBUFBfVUlELCBPUFRfTk9ORSwgbnVsbCwgZmFsc2UsIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKEFQUF9VSUQsIE9QVF9VTlRJTF9BQ1RJVkUsIG51bGwsIGZhbHNlLCB0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZV9TeXN0ZW0oKSB7CisgICAgICAgIEJyb2FkY2FzdFJlY29yZC5DT1JFX0RFRkVSX1VOVElMX0FDVElWRSA9IHRydWU7CisKKyAgICAgICAgLy8gVmVyaWZ5IG5vbi11cmdlbnQgYmVoYXZpb3IKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKFNZU1RFTV9VSUQsIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoU1lTVEVNX1VJRCwgT1BUX0RFRkFVTFQsIG51bGwsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKFNZU1RFTV9VSUQsIE9QVF9OT05FLCBudWxsLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKFNZU1RFTV9VSUQsIE9QVF9VTlRJTF9BQ1RJVkUsIG51bGwsIGZhbHNlLCBmYWxzZSkpOworCisgICAgICAgIC8vIFZlcmlmeSB1cmdlbnQgYmVoYXZpb3IKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShTWVNURU1fVUlELCBudWxsLCBudWxsLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRGYWxzZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKFNZU1RFTV9VSUQsIE9QVF9ERUZBVUxULCBudWxsLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRGYWxzZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKFNZU1RFTV9VSUQsIE9QVF9OT05FLCBudWxsLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoU1lTVEVNX1VJRCwgT1BUX1VOVElMX0FDVElWRSwgbnVsbCwgZmFsc2UsIHRydWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlX092ZXJyaWRlcygpIHsKKyAgICAgICAgZmluYWwgSUludGVudFJlY2VpdmVyIHJlc3VsdFRvID0gbmV3IElJbnRlbnRSZWNlaXZlci5EZWZhdWx0KCk7CisKKyAgICAgICAgLy8gT3JkZXJlZCBicm9hZGNhc3RzIG5ldmVyIGRlZmVycmVkOyByZXF1ZXN0ZWQgb3B0aW9uIGlzIGlnbm9yZWQKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2FsY3VsYXRlRGVmZXJVbnRpbEFjdGl2ZShBUFBfVUlELCBPUFRfVU5USUxfQUNUSVZFLCBudWxsLCB0cnVlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShjYWxjdWxhdGVEZWZlclVudGlsQWN0aXZlKEFQUF9VSUQsIE9QVF9VTlRJTF9BQ1RJVkUsIHJlc3VsdFRvLCB0cnVlLCBmYWxzZSkpOworCisgICAgICAgIC8vIFVub3JkZXJlZCB3aXRoIHJlc3VsdCBpcyBhbHdheXMgZGVmZXJyZWQ7IHJlcXVlc3RlZCBvcHRpb24gaXMgaWdub3JlZAorICAgICAgICBhc3NlcnRUcnVlKGNhbGN1bGF0ZURlZmVyVW50aWxBY3RpdmUoQVBQX1VJRCwgT1BUX05PTkUsIHJlc3VsdFRvLCBmYWxzZSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhbnVwRGlzYWJsZWRQYWNrYWdlUmVjZWl2ZXJzKCkgewogICAgICAgICBmaW5hbCBpbnQgdXNlcjAgPSBVc2VySGFuZGxlLlVTRVJfU1lTVEVNOwogICAgICAgICBmaW5hbCBpbnQgdXNlcjEgPSB1c2VyMCArIDE7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2FtL1NlcnZpY2VUaW1lb3V0VGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9TZXJ2aWNlVGltZW91dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDFiMDY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9TZXJ2aWNlVGltZW91dFRlc3QuamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmFtOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5QUk9DRVNTX1NUQVRFX1NFUlZJQ0U7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmFtLkFwcGxpY2F0aW9uRXhpdEluZm9UZXN0Lm1ha2VQcm9jZXNzUmVjb3JkOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueVN0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5lcTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5hZnRlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5jbGVhckludm9jYXRpb25zOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLmRvTm90aGluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5kb1JldHVybjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnNweTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by50aW1lb3V0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLklBcHBsaWNhdGlvblRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLmFwcC51c2FnZS5Vc2FnZVN0YXRzTWFuYWdlckludGVybmFsOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlckludGVybmFsOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5wbGF0Zm9ybS5hcHAuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuRHJvcEJveE1hbmFnZXJJbnRlcm5hbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuTG9jYWxTZXJ2aWNlczsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5JbmplY3RvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQXBwbGljYXRpb25FeGl0SW5mb1Rlc3QuU2VydmljZVRocmVhZFJ1bGU7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFwcG9wLkFwcE9wc1NlcnZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLkFjdGl2aXR5VGFza01hbmFnZXJTZXJ2aWNlOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3IgdGhlIHNlcnZpY2UgdGltZW91dC4KKyAqCisgKiBCdWlsZC9JbnN0YWxsL1J1bjoKKyAqICBhdGVzdCBTZXJ2aWNlVGltZW91dFRlc3QKKyAqLworQFByZXN1Ym1pdAorcHVibGljIGZpbmFsIGNsYXNzIFNlcnZpY2VUaW1lb3V0VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFNlcnZpY2VUaW1lb3V0VGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1NFUlZJQ0VfVElNRU9VVCA9IDIwMDA7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBTZXJ2aWNlVGhyZWFkUnVsZSBtU2VydmljZVRocmVhZFJ1bGUgPSBuZXcgU2VydmljZVRocmVhZFJ1bGUoKTsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBIYW5kbGVyVGhyZWFkIG1IYW5kbGVyVGhyZWFkOworCisgICAgQE1vY2sKKyAgICBwcml2YXRlIEFwcE9wc1NlcnZpY2UgbUFwcE9wc1NlcnZpY2U7CisgICAgQE1vY2sKKyAgICBwcml2YXRlIERyb3BCb3hNYW5hZ2VySW50ZXJuYWwgbURyb3BCb3hNYW5hZ2VySW50OworICAgIEBNb2NrCisgICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlckludGVybmFsIG1QYWNrYWdlTWFuYWdlckludDsKKyAgICBATW9jaworICAgIHByaXZhdGUgVXNhZ2VTdGF0c01hbmFnZXJJbnRlcm5hbCBtVXNhZ2VTdGF0c01hbmFnZXJJbnQ7CisKKyAgICBwcml2YXRlIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UgbUFtczsKKyAgICBwcml2YXRlIFByb2Nlc3NMaXN0IG1Qcm9jZXNzTGlzdDsKKyAgICBwcml2YXRlIEFjdGl2ZVNlcnZpY2VzIG1BY3RpdmVTZXJ2aWNlczsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCisgICAgICAgIG1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworCisgICAgICAgIG1IYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoVEFHKTsKKyAgICAgICAgbUhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbVByb2Nlc3NMaXN0ID0gc3B5KG5ldyBQcm9jZXNzTGlzdCgpKTsKKworICAgICAgICBMb2NhbFNlcnZpY2VzLnJlbW92ZVNlcnZpY2VGb3JUZXN0KERyb3BCb3hNYW5hZ2VySW50ZXJuYWwuY2xhc3MpOworICAgICAgICBMb2NhbFNlcnZpY2VzLmFkZFNlcnZpY2UoRHJvcEJveE1hbmFnZXJJbnRlcm5hbC5jbGFzcywgbURyb3BCb3hNYW5hZ2VySW50KTsKKyAgICAgICAgTG9jYWxTZXJ2aWNlcy5yZW1vdmVTZXJ2aWNlRm9yVGVzdChQYWNrYWdlTWFuYWdlckludGVybmFsLmNsYXNzKTsKKyAgICAgICAgTG9jYWxTZXJ2aWNlcy5hZGRTZXJ2aWNlKFBhY2thZ2VNYW5hZ2VySW50ZXJuYWwuY2xhc3MsIG1QYWNrYWdlTWFuYWdlckludCk7CisgICAgICAgIGRvUmV0dXJuKG5ldyBDb21wb25lbnROYW1lKCIiLCAiIikpLndoZW4obVBhY2thZ2VNYW5hZ2VySW50KS5nZXRTeXN0ZW1VaVNlcnZpY2VDb21wb25lbnQoKTsKKworICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIHJlYWxBbXMgPSBuZXcgQWN0aXZpdHlNYW5hZ2VyU2VydmljZSgKKyAgICAgICAgICAgICAgICBuZXcgVGVzdEluamVjdG9yKG1Db250ZXh0KSwgbVNlcnZpY2VUaHJlYWRSdWxlLmdldFRocmVhZCgpKTsKKyAgICAgICAgcmVhbEFtcy5tQWN0aXZpdHlUYXNrTWFuYWdlciA9IG5ldyBBY3Rpdml0eVRhc2tNYW5hZ2VyU2VydmljZShtQ29udGV4dCk7CisgICAgICAgIHJlYWxBbXMubUFjdGl2aXR5VGFza01hbmFnZXIuaW5pdGlhbGl6ZShudWxsLCBudWxsLCBtQ29udGV4dC5nZXRNYWluTG9vcGVyKCkpOworICAgICAgICByZWFsQW1zLm1BdG1JbnRlcm5hbCA9IHNweShyZWFsQW1zLm1BY3Rpdml0eVRhc2tNYW5hZ2VyLmdldEF0bUludGVybmFsKCkpOworICAgICAgICByZWFsQW1zLm1Pb21BZGp1c3Rlci5tQ2FjaGVkQXBwT3B0aW1pemVyID0gc3B5KHJlYWxBbXMubU9vbUFkanVzdGVyLm1DYWNoZWRBcHBPcHRpbWl6ZXIpOworICAgICAgICByZWFsQW1zLm1QYWNrYWdlTWFuYWdlckludCA9IG1QYWNrYWdlTWFuYWdlckludDsKKyAgICAgICAgcmVhbEFtcy5tVXNhZ2VTdGF0c1NlcnZpY2UgPSBtVXNhZ2VTdGF0c01hbmFnZXJJbnQ7CisgICAgICAgIHJlYWxBbXMubVByb2Nlc3Nlc1JlYWR5ID0gdHJ1ZTsKKyAgICAgICAgcmVhbEFtcy5tQ29uc3RhbnRzLlNFUlZJQ0VfVElNRU9VVCA9IERFRkFVTFRfU0VSVklDRV9USU1FT1VUOworICAgICAgICByZWFsQW1zLm1Db25zdGFudHMuU0VSVklDRV9CQUNLR1JPVU5EX1RJTUVPVVQgPSBERUZBVUxUX1NFUlZJQ0VfVElNRU9VVDsKKyAgICAgICAgbUFtcyA9IHNweShyZWFsQW1zKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2NhbFNlcnZpY2VzLnJlbW92ZVNlcnZpY2VGb3JUZXN0KERyb3BCb3hNYW5hZ2VySW50ZXJuYWwuY2xhc3MpOworICAgICAgICBMb2NhbFNlcnZpY2VzLnJlbW92ZVNlcnZpY2VGb3JUZXN0KFBhY2thZ2VNYW5hZ2VySW50ZXJuYWwuY2xhc3MpOworICAgICAgICBtSGFuZGxlclRocmVhZC5xdWl0KCk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkd1YXJkZWRCeSIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVRpbWVvdXRBbmRQcm9jZXNzS2lsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgcGlkID0gMTIzNDU7CisgICAgICAgIGZpbmFsIGludCB1aWQgPSAxMDEyMzsKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAiY29tLmV4YW1wbGUuZm9vIjsKKyAgICAgICAgZmluYWwgUHJvY2Vzc1JlY29yZCBhcHAgPSBtYWtlUHJvY2Vzc1JlY29yZCgKKyAgICAgICAgICAgICAgICBwaWQsICAgICAgICAgICAgICAgICAgIC8vIHBpZAorICAgICAgICAgICAgICAgIHVpZCwgICAgICAgICAgICAgICAgICAgLy8gdWlkCisgICAgICAgICAgICAgICAgdWlkLCAgICAgICAgICAgICAgICAgICAvLyBwYWNrYWdlVWlkCisgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAvLyBkZWZpbmluZ1VpZAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLy8gY29ubmVjdGlvbkdyb3VwCisgICAgICAgICAgICAgICAgUFJPQ0VTU19TVEFURV9TRVJWSUNFLCAvLyBwcm9jc3RhdGUKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8vIHBzcworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLy8gcnNzCisgICAgICAgICAgICAgICAgbmFtZSwgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzTmFtZQorICAgICAgICAgICAgICAgIG5hbWUsICAgICAgICAgICAgICAgICAgLy8gcGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICBtQW1zKTsKKyAgICAgICAgYXBwLm1ha2VBY3RpdmUobW9jayhJQXBwbGljYXRpb25UaHJlYWQuY2xhc3MpLCBtQW1zLm1Qcm9jZXNzU3RhdHMpOworICAgICAgICBtUHJvY2Vzc0xpc3QudXBkYXRlTHJ1UHJvY2Vzc0xvY2tlZChhcHAsIGZhbHNlLCBudWxsKTsKKworICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBmaW5hbCBTZXJ2aWNlUmVjb3JkIHNyID0gc3B5KFNlcnZpY2VSZWNvcmQubmV3RW1wdHlJbnN0YW5jZUZvclRlc3QobUFtcykpOworICAgICAgICBkb05vdGhpbmcoKS53aGVuKHNyKS5kdW1wKGFueSgpLCBhbnlTdHJpbmcoKSk7CisgICAgICAgIHNyLnN0YXJ0UmVxdWVzdGVkID0gdHJ1ZTsKKyAgICAgICAgc3IuZXhlY3V0aW5nU3RhcnQgPSBub3c7CisKKyAgICAgICAgYXBwLm1TZXJ2aWNlcy5zdGFydEV4ZWN1dGluZ1NlcnZpY2Uoc3IpOworICAgICAgICBtQWN0aXZlU2VydmljZXMuc2NoZWR1bGVTZXJ2aWNlVGltZW91dExvY2tlZChhcHApOworCisgICAgICAgIHZlcmlmeShtQWN0aXZlU2VydmljZXMsIHRpbWVvdXQoREVGQVVMVF9TRVJWSUNFX1RJTUVPVVQgKiAyKS50aW1lcygxKSkKKyAgICAgICAgICAgICAgICAuc2VydmljZVRpbWVvdXQoZXEoYXBwKSk7CisKKyAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtQWN0aXZlU2VydmljZXMpOworCisgICAgICAgIGFwcC5tU2VydmljZXMuc3RhcnRFeGVjdXRpbmdTZXJ2aWNlKHNyKTsKKyAgICAgICAgbUFjdGl2ZVNlcnZpY2VzLnNjaGVkdWxlU2VydmljZVRpbWVvdXRMb2NrZWQoYXBwKTsKKworICAgICAgICBhcHAua2lsbExvY2tlZChUQUcsIDQyLCBmYWxzZSk7CisgICAgICAgIG1BbXMucmVtb3ZlTHJ1UHJvY2Vzc0xvY2tlZChhcHApOworCisgICAgICAgIHZlcmlmeShtQWN0aXZlU2VydmljZXMsIGFmdGVyKERFRkFVTFRfU0VSVklDRV9USU1FT1VUICogNCkKKyAgICAgICAgICAgICAgICAudGltZXMoMSkpLnNlcnZpY2VUaW1lb3V0KGVxKGFwcCkpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVGVzdEluamVjdG9yIGV4dGVuZHMgSW5qZWN0b3IgeworICAgICAgICBUZXN0SW5qZWN0b3IoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQXBwT3BzU2VydmljZSBnZXRBcHBPcHNTZXJ2aWNlKEZpbGUgcmVjZW50QWNjZXNzZXNGaWxlLCBGaWxlIHN0b3JhZ2VGaWxlLAorICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAgICAgcmV0dXJuIG1BcHBPcHNTZXJ2aWNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBIYW5kbGVyIGdldFVpSGFuZGxlcihBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIHNlcnZpY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGFuZGxlclRocmVhZC5nZXRUaHJlYWRIYW5kbGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFByb2Nlc3NMaXN0IGdldFByb2Nlc3NMaXN0KEFjdGl2aXR5TWFuYWdlclNlcnZpY2Ugc2VydmljZSkgeworICAgICAgICAgICAgcmV0dXJuIG1Qcm9jZXNzTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWN0aXZlU2VydmljZXMgZ2V0QWN0aXZlU2VydmljZXMoQWN0aXZpdHlNYW5hZ2VyU2VydmljZSBzZXJ2aWNlKSB7CisgICAgICAgICAgICBpZiAobUFjdGl2ZVNlcnZpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlU2VydmljZXMgPSBzcHkobmV3IEFjdGl2ZVNlcnZpY2VzKHNlcnZpY2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQWN0aXZlU2VydmljZXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9Kb2JTY2hlZHVsZXJTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9qb2IvSm9iU2NoZWR1bGVyU2VydmljZVRlc3QuamF2YQppbmRleCA4YjQyMGEzLi5lMDU2NDE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2pvYi9Kb2JTY2hlZHVsZXJTZXJ2aWNlVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvam9iL0pvYlNjaGVkdWxlclNlcnZpY2VUZXN0LmphdmEKQEAgLTUwLDYgKzUwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iSW5mbzsKIGltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iUGFyYW1ldGVyczsKIGltcG9ydCBhbmRyb2lkLmFwcC5qb2IuSm9iU2NoZWR1bGVyOworaW1wb3J0IGFuZHJvaWQuYXBwLmpvYi5Kb2JXb3JrSXRlbTsKIGltcG9ydCBhbmRyb2lkLmFwcC51c2FnZS5Vc2FnZVN0YXRzTWFuYWdlckludGVybmFsOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtOTEsNiArOTIsNyBAQAogCiBwdWJsaWMgY2xhc3MgSm9iU2NoZWR1bGVyU2VydmljZVRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBKb2JTY2hlZHVsZXJTZXJ2aWNlVGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfVUlEID0gMTAxMjM7CiAKICAgICBwcml2YXRlIEpvYlNjaGVkdWxlclNlcnZpY2UgbVNlcnZpY2U7CiAKQEAgLTE3Nyw2ICsxNzksOSBAQAogICAgICAgICBpZiAobU1vY2tpbmdTZXNzaW9uICE9IG51bGwpIHsKICAgICAgICAgICAgIG1Nb2NraW5nU2Vzc2lvbi5maW5pc2hNb2NraW5nKCk7CiAgICAgICAgIH0KKyAgICAgICAgbVNlcnZpY2UuY2FuY2VsSm9ic0ZvclVpZChURVNUX1VJRCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICBKb2JQYXJhbWV0ZXJzLlNUT1BfUkVBU09OX1VOREVGSU5FRCwgSm9iUGFyYW1ldGVycy5JTlRFUk5BTF9TVE9QX1JFQVNPTl9VTktOT1dOLAorICAgICAgICAgICAgICAgICJ0ZXN0IGNsZWFudXAiKTsKICAgICB9CiAKICAgICBwcml2YXRlIENsb2NrIGdldEFkdmFuY2VkQ2xvY2soQ2xvY2sgY2xvY2ssIGxvbmcgaW5jcmVtZW50TXMpIHsKQEAgLTI1Nyw5ICsyNjIsOSBAQAogICAgICAgICBDb25uZWN0aXZpdHlDb250cm9sbGVyIGNvbm5lY3Rpdml0eUNvbnRyb2xsZXIgPSBtU2VydmljZS5nZXRDb25uZWN0aXZpdHlDb250cm9sbGVyKCk7CiAgICAgICAgIHNweU9uKGNvbm5lY3Rpdml0eUNvbnRyb2xsZXIpOwogICAgICAgICBtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfTUlOX0dVQVJBTlRFRV9NUyA9IDEwICogTUlOVVRFX0lOX01JTExJUzsKLSAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SID0gMS41ZjsKLSAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUyA9IEhPVVJfSU5fTUlMTElTOwotICAgICAgICBtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUyA9IDYgKiBIT1VSX0lOX01JTExJUzsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SID0gMS41ZjsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUyA9IEhPVVJfSU5fTUlMTElTOworICAgICAgICBtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUyA9IDYgKiBIT1VSX0lOX01JTExJUzsKIAogICAgICAgICBhc3NlcnRFcXVhbHMobVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9FSl9HVUFSQU5URUVfTVMsCiAgICAgICAgICAgICAgICAgbVNlcnZpY2UuZ2V0TWluSm9iRXhlY3V0aW9uR3VhcmFudGVlTXMoZWpNYXgpKTsKQEAgLTI3OSwyNiArMjg0LDI2IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfTUlOX0dVQVJBTlRFRV9NUywKICAgICAgICAgICAgICAgICBtU2VydmljZS5nZXRNaW5Kb2JFeGVjdXRpb25HdWFyYW50ZWVNcyhqb2JVSURUKSk7CiAgICAgICAgIGdyYW50UnVuVXNlckluaXRpYXRlZEpvYnNQZXJtaXNzaW9uKHRydWUpOyAvLyBXaXRoIHBlcm1pc3Npb24KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCisgICAgICAgIGFzc2VydEVxdWFscyhtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmdldE1pbkpvYkV4ZWN1dGlvbkd1YXJhbnRlZU1zKGpvYlVJRFQpKTsKICAgICAgICAgZG9SZXR1cm4oQ29ubmVjdGl2aXR5Q29udHJvbGxlci5VTktOT1dOX1RJTUUpCiAgICAgICAgICAgICAgICAgLndoZW4oY29ubmVjdGl2aXR5Q29udHJvbGxlcikuZ2V0RXN0aW1hdGVkVHJhbnNmZXJUaW1lTXMoYW55KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUywKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCiAgICAgICAgICAgICAgICAgbVNlcnZpY2UuZ2V0TWluSm9iRXhlY3V0aW9uR3VhcmFudGVlTXMoam9iVUlEVCkpOwotICAgICAgICBkb1JldHVybihtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TIC8gMikKKyAgICAgICAgZG9SZXR1cm4obVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUyAvIDIpCiAgICAgICAgICAgICAgICAgLndoZW4oY29ubmVjdGl2aXR5Q29udHJvbGxlcikuZ2V0RXN0aW1hdGVkVHJhbnNmZXJUaW1lTXMoYW55KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUywKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9NSU5fVUlfREFUQV9UUkFOU0ZFUl9HVUFSQU5URUVfTVMsCiAgICAgICAgICAgICAgICAgbVNlcnZpY2UuZ2V0TWluSm9iRXhlY3V0aW9uR3VhcmFudGVlTXMoam9iVUlEVCkpOwotICAgICAgICBkb1JldHVybihtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TICogMikKKyAgICAgICAgZG9SZXR1cm4obVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX01JTl9VSV9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9NUyAqIDIpCiAgICAgICAgICAgICAgICAgLndoZW4oY29ubmVjdGl2aXR5Q29udHJvbGxlcikuZ2V0RXN0aW1hdGVkVHJhbnNmZXJUaW1lTXMoYW55KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgKGxvbmcpIChtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TCisgICAgICAgICAgICAgICAgKGxvbmcpIChtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX01TCiAgICAgICAgICAgICAgICAgICAgICAgICAqIDIgKiBtU2VydmljZS5tQ29uc3RhbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5SVU5USU1FX01JTl9VU0VSX0lOSVRJQVRFRF9EQVRBX1RSQU5TRkVSX0dVQVJBTlRFRV9CVUZGRVJfRkFDVE9SKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlJVTlRJTUVfTUlOX1VJX0RBVEFfVFJBTlNGRVJfR1VBUkFOVEVFX0JVRkZFUl9GQUNUT1IpLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmdldE1pbkpvYkV4ZWN1dGlvbkd1YXJhbnRlZU1zKGpvYlVJRFQpKTsKLSAgICAgICAgZG9SZXR1cm4obVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMgKiAyKQorICAgICAgICBkb1JldHVybihtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUyAqIDIpCiAgICAgICAgICAgICAgICAgLndoZW4oY29ubmVjdGl2aXR5Q29udHJvbGxlcikuZ2V0RXN0aW1hdGVkVHJhbnNmZXJUaW1lTXMoYW55KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobVNlcnZpY2UubUNvbnN0YW50cy5SVU5USU1FX1VTRVJfSU5JVElBVEVEX0RBVEFfVFJBTlNGRVJfTElNSVRfTVMsCisgICAgICAgIGFzc2VydEVxdWFscyhtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfVUlfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUywKICAgICAgICAgICAgICAgICBtU2VydmljZS5nZXRNaW5Kb2JFeGVjdXRpb25HdWFyYW50ZWVNcyhqb2JVSURUKSk7CiAgICAgfQogCkBAIC0zMjAsNyArMzI1LDcgQEAKICAgICAgICAgICAgICAgICAud2hlbihxdW90YUNvbnRyb2xsZXIpLmdldE1heEpvYkV4ZWN1dGlvblRpbWVNc0xvY2tlZChhbnkoKSk7CiAKICAgICAgICAgZ3JhbnRSdW5Vc2VySW5pdGlhdGVkSm9ic1Blcm1pc3Npb24odHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtU2VydmljZS5tQ29uc3RhbnRzLlJVTlRJTUVfVVNFUl9JTklUSUFURURfREFUQV9UUkFOU0ZFUl9MSU1JVF9NUywKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9VSV9EQVRBX1RSQU5TRkVSX0xJTUlUX01TLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmdldE1heEpvYkV4ZWN1dGlvblRpbWVNcyhqb2JVSURUKSk7CiAgICAgICAgIGdyYW50UnVuVXNlckluaXRpYXRlZEpvYnNQZXJtaXNzaW9uKGZhbHNlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1TZXJ2aWNlLm1Db25zdGFudHMuUlVOVElNRV9GUkVFX1FVT1RBX01BWF9MSU1JVF9NUywKQEAgLTExNzAsNyArMTE3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGkgPCAzMDAgPyBKb2JTY2hlZHVsZXIuUkVTVUxUX1NVQ0NFU1MgOiBKb2JTY2hlZHVsZXIuUkVTVUxUX0ZBSUxVUkU7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdvdCB1bmV4cGVjdGVkIHJlc3VsdCBmb3Igc2NoZWR1bGUgIyIgKyAoaSArIDEpLAogICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2NoZWR1bGVBc1BhY2thZ2Uoam9iLCBudWxsLCAxMDEyMywgbnVsbCwgMCwgIkpTU1Rlc3QiLCAiIikpOworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zY2hlZHVsZUFzUGFja2FnZShqb2IsIG51bGwsIFRFU1RfVUlELCBudWxsLCAwLCAiSlNTVGVzdCIsICIiKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExOTEsNyArMTE5Niw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyArK2kpIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiR290IHVuZXhwZWN0ZWQgcmVzdWx0IGZvciBzY2hlZHVsZSAjIiArIChpICsgMSksCiAgICAgICAgICAgICAgICAgICAgIEpvYlNjaGVkdWxlci5SRVNVTFRfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2NoZWR1bGVBc1BhY2thZ2Uoam9iLCBudWxsLCAxMDEyMywgbnVsbCwgMCwgIkpTU1Rlc3QiLCAiIikpOworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zY2hlZHVsZUFzUGFja2FnZShqb2IsIG51bGwsIFRFU1RfVUlELCBudWxsLCAwLCAiSlNTVGVzdCIsICIiKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyMTIsNyArMTIxNyw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyArK2kpIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiR290IHVuZXhwZWN0ZWQgcmVzdWx0IGZvciBzY2hlZHVsZSAjIiArIChpICsgMSksCiAgICAgICAgICAgICAgICAgICAgIEpvYlNjaGVkdWxlci5SRVNVTFRfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2NoZWR1bGVBc1BhY2thZ2Uoam9iLCBudWxsLCAxMDEyMywgInByb3hpZWQucGFja2FnZSIsIDAsICJKU1NUZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2NoZWR1bGVBc1BhY2thZ2Uoam9iLCBudWxsLCBURVNUX1VJRCwgInByb3hpZWQucGFja2FnZSIsIDAsICJKU1NUZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIikpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTIzNiwxMSArMTI0MSw2MyBAQAogICAgICAgICAgICAgICAgICAgICBpIDwgMzAwID8gSm9iU2NoZWR1bGVyLlJFU1VMVF9TVUNDRVNTIDogSm9iU2NoZWR1bGVyLlJFU1VMVF9GQUlMVVJFOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHb3QgdW5leHBlY3RlZCByZXN1bHQgZm9yIHNjaGVkdWxlICMiICsgKGkgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNjaGVkdWxlQXNQYWNrYWdlKGpvYiwgbnVsbCwgMTAxMjMsIGpvYi5nZXRTZXJ2aWNlKCkuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2NoZWR1bGVBc1BhY2thZ2Uoam9iLCBudWxsLCBURVNUX1VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2IuZ2V0U2VydmljZSgpLmdldFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIkpTU1Rlc3QiLCAiIikpOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgbnVtYmVyIG9mIHBlcnNpc3RlZCBKb2JXb3JrSXRlbXMgaXMgY2FwcGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVkdWxlTGltaXRpbmdfSm9iV29ya0l0ZW1zX05vbnBlcnNpc3RlZCgpIHsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5NQVhfTlVNX1BFUlNJU1RFRF9KT0JfV09SS19JVEVNUyA9IDUwMDsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5FTkFCTEVfQVBJX1FVT1RBUyA9IGZhbHNlOworICAgICAgICBtU2VydmljZS5tQ29uc3RhbnRzLkFQSV9RVU9UQV9TQ0hFRFVMRV9USFJPV19FWENFUFRJT04gPSBmYWxzZTsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5BUElfUVVPVEFfU0NIRURVTEVfUkVUVVJOX0ZBSUxVUkVfUkVTVUxUID0gZmFsc2U7CisgICAgICAgIG1TZXJ2aWNlLnVwZGF0ZVF1b3RhVHJhY2tlcigpOworCisgICAgICAgIGZpbmFsIEpvYkluZm8gam9iID0gY3JlYXRlSm9iSW5mbygpLnNldFBlcnNpc3RlZChmYWxzZSkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgSm9iV29ya0l0ZW0gaXRlbSA9IG5ldyBKb2JXb3JrSXRlbS5CdWlsZGVyKCkuYnVpbGQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiR290IHVuZXhwZWN0ZWQgcmVzdWx0IGZvciBzY2hlZHVsZSAjIiArIChpICsgMSksCisgICAgICAgICAgICAgICAgICAgIEpvYlNjaGVkdWxlci5SRVNVTFRfU1VDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2NoZWR1bGVBc1BhY2thZ2Uoam9iLCBpdGVtLCBURVNUX1VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2IuZ2V0U2VydmljZSgpLmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIkpTU1Rlc3QiLCAiIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgbnVtYmVyIG9mIHBlcnNpc3RlZCBKb2JXb3JrSXRlbXMgaXMgY2FwcGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVkdWxlTGltaXRpbmdfSm9iV29ya0l0ZW1zX1BlcnNpc3RlZCgpIHsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5NQVhfTlVNX1BFUlNJU1RFRF9KT0JfV09SS19JVEVNUyA9IDUwMDsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5FTkFCTEVfQVBJX1FVT1RBUyA9IGZhbHNlOworICAgICAgICBtU2VydmljZS5tQ29uc3RhbnRzLkFQSV9RVU9UQV9TQ0hFRFVMRV9USFJPV19FWENFUFRJT04gPSBmYWxzZTsKKyAgICAgICAgbVNlcnZpY2UubUNvbnN0YW50cy5BUElfUVVPVEFfU0NIRURVTEVfUkVUVVJOX0ZBSUxVUkVfUkVTVUxUID0gZmFsc2U7CisgICAgICAgIG1TZXJ2aWNlLnVwZGF0ZVF1b3RhVHJhY2tlcigpOworCisgICAgICAgIGZpbmFsIEpvYkluZm8gam9iID0gY3JlYXRlSm9iSW5mbygpLnNldFBlcnNpc3RlZCh0cnVlKS5idWlsZCgpOworICAgICAgICBmaW5hbCBKb2JXb3JrSXRlbSBpdGVtID0gbmV3IEpvYldvcmtJdGVtLkJ1aWxkZXIoKS5idWlsZCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdvdCB1bmV4cGVjdGVkIHJlc3VsdCBmb3Igc2NoZWR1bGUgIyIgKyAoaSArIDEpLAorICAgICAgICAgICAgICAgICAgICBKb2JTY2hlZHVsZXIuUkVTVUxUX1NVQ0NFU1MsCisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNjaGVkdWxlQXNQYWNrYWdlKGpvYiwgaXRlbSwgVEVTVF9VSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iLmdldFNlcnZpY2UoKS5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICJKU1NUZXN0IiwgIiIpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc2NoZWR1bGVBc1BhY2thZ2Uoam9iLCBpdGVtLCBURVNUX1VJRCwgam9iLmdldFNlcnZpY2UoKS5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAwLCAiSlNTVGVzdCIsICIiKTsKKyAgICAgICAgICAgIGZhaWwoIkFkZGVkIG1vcmUgaXRlbXMgdGhhbiBhbGxvd2VkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgLy8gU3VjY2VzcworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIFRlc3RzIHRoYXQgam9icyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBwZW5kaW5nIGxpc3QgaWYgdGhlIHVzZXIgc3RvcHMgdGhlIGFwcC4gKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VyU3RvcFJlbW92ZXNQZW5kaW5nKCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9nbnNzL0duc3NNZWFzdXJlbWVudHNQcm92aWRlclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vZ25zcy9HbnNzTWVhc3VyZW1lbnRzUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5ZGZlOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vZ25zcy9HbnNzTWVhc3VyZW1lbnRzUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbi5nbnNzOworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55Qm9vbGVhbjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlJbnQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9SZXR1cm47CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZXE7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubmV2ZXI7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uc3B5OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR25zc01lYXN1cmVtZW50UmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklHbnNzTWVhc3VyZW1lbnRzTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXJJbnRlcm5hbDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLnV0aWwuaWRlbnRpdHkuQ2FsbGVySWRlbnRpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdDQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuTG9jYWxTZXJ2aWNlczsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb24uZ25zcy5oYWwuRmFrZUduc3NIYWw7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uLmduc3MuaGFsLkduc3NOYXRpdmU7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uLmluamVjdG9yLkZha2VVc2VySW5mb0hlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb24uaW5qZWN0b3IuSW5qZWN0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uLmluamVjdG9yLlRlc3RJbmplY3RvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitAUHJlc3VibWl0CitAU21hbGxUZXN0CitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEduc3NNZWFzdXJlbWVudHNQcm92aWRlclRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDVVJSRU5UX1VTRVIgPSBGYWtlVXNlckluZm9IZWxwZXIuREVGQVVMVF9VU0VSSUQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FsbGVySWRlbnRpdHkgSURFTlRJVFkgPSBDYWxsZXJJZGVudGl0eS5mb3JUZXN0KENVUlJFTlRfVVNFUiwgMTAwMCwKKyAgICAgICAgICAgICJteXBhY2thZ2UiLCAiYXR0cmlidXRpb24iLCAibGlzdGVuZXIiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHbnNzQ29uZmlndXJhdGlvbi5IYWxJbnRlcmZhY2VWZXJzaW9uIEhJRExfVjJfMSA9CisgICAgICAgICAgICBuZXcgR25zc0NvbmZpZ3VyYXRpb24uSGFsSW50ZXJmYWNlVmVyc2lvbigKKyAgICAgICAgICAgICAgICAgICAgMiwgMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR25zc0NvbmZpZ3VyYXRpb24uSGFsSW50ZXJmYWNlVmVyc2lvbiBBSURMX1YzID0KKyAgICAgICAgICAgIG5ldyBHbnNzQ29uZmlndXJhdGlvbi5IYWxJbnRlcmZhY2VWZXJzaW9uKAorICAgICAgICAgICAgICAgICAgICBHbnNzQ29uZmlndXJhdGlvbi5IYWxJbnRlcmZhY2VWZXJzaW9uLkFJRExfSU5URVJGQUNFLCAzKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHbnNzTWVhc3VyZW1lbnRSZXF1ZXN0IEFDVElWRV9SRVFVRVNUID0KKyAgICAgICAgICAgIG5ldyBHbnNzTWVhc3VyZW1lbnRSZXF1ZXN0LkJ1aWxkZXIoKS5idWlsZCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEduc3NNZWFzdXJlbWVudFJlcXVlc3QgUEFTU0lWRV9SRVFVRVNUID0KKyAgICAgICAgICAgIG5ldyBHbnNzTWVhc3VyZW1lbnRSZXF1ZXN0LkJ1aWxkZXIoKS5zZXRJbnRlcnZhbE1pbGxpcygKKyAgICAgICAgICAgICAgICAgICAgR25zc01lYXN1cmVtZW50UmVxdWVzdC5QQVNTSVZFX0lOVEVSVkFMKS5idWlsZCgpOworICAgIHByaXZhdGUgQE1vY2sgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEBNb2NrIExvY2F0aW9uTWFuYWdlckludGVybmFsIG1JbnRlcm5hbDsKKyAgICBwcml2YXRlIEBNb2NrIEduc3NDb25maWd1cmF0aW9uIG1Nb2NrQ29uZmlndXJhdGlvbjsKKyAgICBwcml2YXRlIEBNb2NrIEduc3NOYXRpdmUuR2VvZmVuY2VDYWxsYmFja3MgbUdlb2ZlbmNlQ2FsbGJhY2tzOworICAgIHByaXZhdGUgQE1vY2sgSUduc3NNZWFzdXJlbWVudHNMaXN0ZW5lciBtTGlzdGVuZXIxOworICAgIHByaXZhdGUgQE1vY2sgSUduc3NNZWFzdXJlbWVudHNMaXN0ZW5lciBtTGlzdGVuZXIyOworICAgIHByaXZhdGUgQE1vY2sgSUJpbmRlciBtQmluZGVyMTsKKyAgICBwcml2YXRlIEBNb2NrIElCaW5kZXIgbUJpbmRlcjI7CisKKyAgICBwcml2YXRlIEduc3NOYXRpdmUgbUduc3NOYXRpdmU7CisKKyAgICBwcml2YXRlIEduc3NNZWFzdXJlbWVudHNQcm92aWRlciBtVGVzdFByb3ZpZGVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworCisgICAgICAgIGRvUmV0dXJuKG1CaW5kZXIxKS53aGVuKG1MaXN0ZW5lcjEpLmFzQmluZGVyKCk7CisgICAgICAgIGRvUmV0dXJuKG1CaW5kZXIyKS53aGVuKG1MaXN0ZW5lcjIpLmFzQmluZGVyKCk7CisgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4obUludGVybmFsKS5pc1Byb3ZpZGVyRW5hYmxlZEZvclVzZXIoZXEoTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUiksCisgICAgICAgICAgICAgICAgYW55SW50KCkpOworICAgICAgICBMb2NhbFNlcnZpY2VzLmFkZFNlcnZpY2UoTG9jYXRpb25NYW5hZ2VySW50ZXJuYWwuY2xhc3MsIG1JbnRlcm5hbCk7CisgICAgICAgIEZha2VHbnNzSGFsIGZha2VHbnNzSGFsID0gbmV3IEZha2VHbnNzSGFsKCk7CisgICAgICAgIEduc3NOYXRpdmUuc2V0R25zc0hhbEZvclRlc3QoZmFrZUduc3NIYWwpOworICAgICAgICBJbmplY3RvciBpbmplY3RvciA9IG5ldyBUZXN0SW5qZWN0b3IobUNvbnRleHQpOworICAgICAgICBtR25zc05hdGl2ZSA9IHNweShPYmplY3RzLnJlcXVpcmVOb25OdWxsKAorICAgICAgICAgICAgICAgIEduc3NOYXRpdmUuY3JlYXRlKGluamVjdG9yLCBtTW9ja0NvbmZpZ3VyYXRpb24pKSk7CisgICAgICAgIG1HbnNzTmF0aXZlLnNldEdlb2ZlbmNlQ2FsbGJhY2tzKG1HZW9mZW5jZUNhbGxiYWNrcyk7CisgICAgICAgIG1UZXN0UHJvdmlkZXIgPSBuZXcgR25zc01lYXN1cmVtZW50c1Byb3ZpZGVyKGluamVjdG9yLCBtR25zc05hdGl2ZSk7CisgICAgICAgIG1HbnNzTmF0aXZlLnJlZ2lzdGVyKCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIExvY2FsU2VydmljZXMucmVtb3ZlU2VydmljZUZvclRlc3QoTG9jYXRpb25NYW5hZ2VySW50ZXJuYWwuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZExpc3RlbmVyX2FjdGl2ZSgpIHsKKyAgICAgICAgLy8gYWRkIHRoZSBhY3RpdmUgcmVxdWVzdAorICAgICAgICBtVGVzdFByb3ZpZGVyLmFkZExpc3RlbmVyKEFDVElWRV9SRVFVRVNULCBJREVOVElUWSwgbUxpc3RlbmVyMSk7CisgICAgICAgIHZlcmlmeShtR25zc05hdGl2ZSwgdGltZXMoMSkpLnN0YXJ0TWVhc3VyZW1lbnRDb2xsZWN0aW9uKAorICAgICAgICAgICAgICAgIGVxKEFDVElWRV9SRVFVRVNULmlzRnVsbFRyYWNraW5nKCkpLAorICAgICAgICAgICAgICAgIGVxKEFDVElWRV9SRVFVRVNULmlzQ29ycmVsYXRpb25WZWN0b3JPdXRwdXRzRW5hYmxlZCgpKSwKKyAgICAgICAgICAgICAgICBlcShBQ1RJVkVfUkVRVUVTVC5nZXRJbnRlcnZhbE1pbGxpcygpKSk7CisKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSBhY3RpdmUgcmVxdWVzdAorICAgICAgICBtVGVzdFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKG1MaXN0ZW5lcjEpOworICAgICAgICB2ZXJpZnkobUduc3NOYXRpdmUsIHRpbWVzKDEpKS5zdG9wTWVhc3VyZW1lbnRDb2xsZWN0aW9uKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTGlzdGVuZXJfcGFzc2l2ZSgpIHsKKyAgICAgICAgLy8gYWRkIHRoZSBwYXNzaXZlIHJlcXVlc3QKKyAgICAgICAgbVRlc3RQcm92aWRlci5hZGRMaXN0ZW5lcihQQVNTSVZFX1JFUVVFU1QsIElERU5USVRZLCBtTGlzdGVuZXIxKTsKKyAgICAgICAgdmVyaWZ5KG1HbnNzTmF0aXZlLCBuZXZlcigpKS5zdGFydE1lYXN1cmVtZW50Q29sbGVjdGlvbihhbnlCb29sZWFuKCksIGFueUJvb2xlYW4oKSwKKyAgICAgICAgICAgICAgICBhbnlJbnQoKSk7CisKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSBwYXNzaXZlIHJlcXVlc3QKKyAgICAgICAgbVRlc3RQcm92aWRlci5yZW1vdmVMaXN0ZW5lcihtTGlzdGVuZXIxKTsKKyAgICAgICAgdmVyaWZ5KG1HbnNzTmF0aXZlLCB0aW1lcygxKSkuc3RvcE1lYXN1cmVtZW50Q29sbGVjdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcmVnaXN0ZXJfYWlkbFYzUGx1cygpIHsKKyAgICAgICAgZG9SZXR1cm4oQUlETF9WMykud2hlbihtTW9ja0NvbmZpZ3VyYXRpb24pLmdldEhhbEludGVyZmFjZVZlcnNpb24oKTsKKworICAgICAgICAvLyBhZGQgdGhlIHBhc3NpdmUgcmVxdWVzdAorICAgICAgICBtVGVzdFByb3ZpZGVyLmFkZExpc3RlbmVyKFBBU1NJVkVfUkVRVUVTVCwgSURFTlRJVFksIG1MaXN0ZW5lcjEpOworICAgICAgICB2ZXJpZnkobUduc3NOYXRpdmUsIG5ldmVyKCkpLnN0YXJ0TWVhc3VyZW1lbnRDb2xsZWN0aW9uKGFueUJvb2xlYW4oKSwgYW55Qm9vbGVhbigpLAorICAgICAgICAgICAgICAgIGFueUludCgpKTsKKworICAgICAgICAvLyBhZGQgdGhlIGFjdGl2ZSByZXF1ZXN0LCByZXJlZ2lzdGVyIHdpdGggdGhlIGFjdGl2ZSByZXF1ZXN0CisgICAgICAgIG1UZXN0UHJvdmlkZXIuYWRkTGlzdGVuZXIoQUNUSVZFX1JFUVVFU1QsIElERU5USVRZLCBtTGlzdGVuZXIyKTsKKyAgICAgICAgdmVyaWZ5KG1HbnNzTmF0aXZlLCBuZXZlcigpKS5zdG9wTWVhc3VyZW1lbnRDb2xsZWN0aW9uKCk7CisgICAgICAgIHZlcmlmeShtR25zc05hdGl2ZSwgdGltZXMoMSkpLnN0YXJ0TWVhc3VyZW1lbnRDb2xsZWN0aW9uKAorICAgICAgICAgICAgICAgIGVxKEFDVElWRV9SRVFVRVNULmlzRnVsbFRyYWNraW5nKCkpLAorICAgICAgICAgICAgICAgIGVxKEFDVElWRV9SRVFVRVNULmlzQ29ycmVsYXRpb25WZWN0b3JPdXRwdXRzRW5hYmxlZCgpKSwKKyAgICAgICAgICAgICAgICBlcShBQ1RJVkVfUkVRVUVTVC5nZXRJbnRlcnZhbE1pbGxpcygpKSk7CisKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSBhY3RpdmUgcmVxdWVzdCwgcmVyZWdpc3RlciB3aXRoIHRoZSBwYXNzaXZlIHJlcXVlc3QKKyAgICAgICAgbVRlc3RQcm92aWRlci5yZW1vdmVMaXN0ZW5lcihtTGlzdGVuZXIyKTsKKyAgICAgICAgdmVyaWZ5KG1HbnNzTmF0aXZlLCB0aW1lcygxKSkuc3RvcE1lYXN1cmVtZW50Q29sbGVjdGlvbigpOworCisgICAgICAgIC8vIHJlbW92ZSB0aGUgcGFzc2l2ZSByZXF1ZXN0CisgICAgICAgIG1UZXN0UHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobUxpc3RlbmVyMSk7CisgICAgICAgIHZlcmlmeShtR25zc05hdGl2ZSwgdGltZXMoMikpLnN0b3BNZWFzdXJlbWVudENvbGxlY3Rpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXJlZ2lzdGVyX3ByZUFpZGxWMygpIHsKKyAgICAgICAgZG9SZXR1cm4oSElETF9WMl8xKS53aGVuKG1Nb2NrQ29uZmlndXJhdGlvbikuZ2V0SGFsSW50ZXJmYWNlVmVyc2lvbigpOworCisgICAgICAgIC8vIGFkZCB0aGUgcGFzc2l2ZSByZXF1ZXN0CisgICAgICAgIG1UZXN0UHJvdmlkZXIuYWRkTGlzdGVuZXIoUEFTU0lWRV9SRVFVRVNULCBJREVOVElUWSwgbUxpc3RlbmVyMSk7CisgICAgICAgIHZlcmlmeShtR25zc05hdGl2ZSwgbmV2ZXIoKSkuc3RhcnRNZWFzdXJlbWVudENvbGxlY3Rpb24oYW55Qm9vbGVhbigpLCBhbnlCb29sZWFuKCksCisgICAgICAgICAgICAgICAgYW55SW50KCkpOworCisgICAgICAgIC8vIGFkZCB0aGUgYWN0aXZlIHJlcXVlc3QsIHJlcmVnaXN0ZXIgd2l0aCB0aGUgYWN0aXZlIHJlcXVlc3QKKyAgICAgICAgbVRlc3RQcm92aWRlci5hZGRMaXN0ZW5lcihBQ1RJVkVfUkVRVUVTVCwgSURFTlRJVFksIG1MaXN0ZW5lcjIpOworICAgICAgICB2ZXJpZnkobUduc3NOYXRpdmUsIHRpbWVzKDEpKS5zdG9wTWVhc3VyZW1lbnRDb2xsZWN0aW9uKCk7CisgICAgICAgIHZlcmlmeShtR25zc05hdGl2ZSwgdGltZXMoMSkpLnN0YXJ0TWVhc3VyZW1lbnRDb2xsZWN0aW9uKAorICAgICAgICAgICAgICAgIGVxKEFDVElWRV9SRVFVRVNULmlzRnVsbFRyYWNraW5nKCkpLAorICAgICAgICAgICAgICAgIGVxKEFDVElWRV9SRVFVRVNULmlzQ29ycmVsYXRpb25WZWN0b3JPdXRwdXRzRW5hYmxlZCgpKSwKKyAgICAgICAgICAgICAgICBlcShBQ1RJVkVfUkVRVUVTVC5nZXRJbnRlcnZhbE1pbGxpcygpKSk7CisKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSBhY3RpdmUgcmVxdWVzdCwgcmVyZWdpc3RlciB3aXRoIHRoZSBwYXNzaXZlIHJlcXVlc3QKKyAgICAgICAgbVRlc3RQcm92aWRlci5yZW1vdmVMaXN0ZW5lcihtTGlzdGVuZXIyKTsKKyAgICAgICAgdmVyaWZ5KG1HbnNzTmF0aXZlLCB0aW1lcygyKSkuc3RvcE1lYXN1cmVtZW50Q29sbGVjdGlvbigpOworCisgICAgICAgIC8vIHJlbW92ZSB0aGUgcGFzc2l2ZSByZXF1ZXN0CisgICAgICAgIG1UZXN0UHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobUxpc3RlbmVyMSk7CisgICAgICAgIHZlcmlmeShtR25zc05hdGl2ZSwgdGltZXMoMykpLnN0b3BNZWFzdXJlbWVudENvbGxlY3Rpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJNYW5hZ2VyU2VydmljZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlck1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IDU2NDg5M2MuLmU3YjNlNmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlck1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlck1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICAgICAgbVVtcy5zZXRCb290VXNlcihPVEhFUl9VU0VSX0lEKTsKIAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiZ2V0Qm9vdFVzZXIiKQotICAgICAgICAgICAgICAgIC50aGF0KG1VbWkuZ2V0Qm9vdFVzZXIoKSkuaXNFcXVhbFRvKE9USEVSX1VTRVJfSUQpOworICAgICAgICAgICAgICAgIC50aGF0KG1VbWkuZ2V0Qm9vdFVzZXIoLyogd2FpdFVudGlsU2V0PSAqLyBmYWxzZSkpLmlzRXF1YWxUbyhPVEhFUl9VU0VSX0lEKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjczLDcgKzI3Myw4IEBACiAgICAgICAgIG1VbXMuc2V0Qm9vdFVzZXIoUFJPRklMRV9VU0VSX0lEKTsKIAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiZ2V0Qm9vdFVzZXIiKQotICAgICAgICAgICAgICAgIC50aGF0KG1VbWkuZ2V0Qm9vdFVzZXIoKSkuaXNFcXVhbFRvKFVzZXJIYW5kbGUuVVNFUl9TWVNURU0pOworICAgICAgICAgICAgICAgIC50aGF0KG1VbWkuZ2V0Qm9vdFVzZXIoLyogd2FpdFVudGlsU2V0PSAqLyBmYWxzZSkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhVc2VySGFuZGxlLlVTRVJfU1lTVEVNKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjg5LDcgKzI5MCw3IEBACiAKICAgICAgICAgLy8gQm9vdCB1c2VyIG5vdCBzd2l0Y2hhYmxlIHNvIHJldHVybiBtb3N0IHJlY2VudGx5IGluIGZvcmVncm91bmQuCiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJnZXRCb290VXNlciIpCi0gICAgICAgICAgICAgICAgLnRoYXQobVVtaS5nZXRCb290VXNlcigpKS5pc0VxdWFsVG8oT1RIRVJfVVNFUl9JRCk7CisgICAgICAgICAgICAgICAgLnRoYXQobVVtaS5nZXRCb290VXNlcigvKiB3YWl0VW50aWxTZXQ9ICovIGZhbHNlKSkuaXNFcXVhbFRvKE9USEVSX1VTRVJfSUQpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yOTksNyArMzAwLDggQEAKICAgICAgICAgYWRkVXNlcihPVEhFUl9VU0VSX0lEKTsKIAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiZ2V0Qm9vdFVzZXIiKQotICAgICAgICAgICAgICAgIC50aGF0KG1VbWkuZ2V0Qm9vdFVzZXIoKSkuaXNFcXVhbFRvKFVzZXJIYW5kbGUuVVNFUl9TWVNURU0pOworICAgICAgICAgICAgICAgIC50aGF0KG1VbWkuZ2V0Qm9vdFVzZXIoLyogd2FpdFVudGlsU2V0PSAqLyBmYWxzZSkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhVc2VySGFuZGxlLlVTRVJfU1lTVEVNKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzEyLDE0ICszMTQsMTUgQEAKICAgICAgICAgc2V0TGFzdEZvcmVncm91bmRUaW1lKE9USEVSX1VTRVJfSUQsIDJfMDAwXzAwMEwpOwogCiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJnZXRCb290VXNlciIpCi0gICAgICAgICAgICAgICAgLnRoYXQobVVtaS5nZXRCb290VXNlcigpKS5pc0VxdWFsVG8oT1RIRVJfVVNFUl9JRCk7CisgICAgICAgICAgICAgICAgLnRoYXQobVVtaS5nZXRCb290VXNlcigvKiB3YWl0VW50aWxTZXQ9ICovIGZhbHNlKSkuaXNFcXVhbFRvKE9USEVSX1VTRVJfSUQpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEJvb3RVc2VyX0hlYWRsZXNzX1Rocm93c0lmT25seVN5c3RlbVVzZXJFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc2V0U3lzdGVtVXNlckhlYWRsZXNzKHRydWUpOwogCi0gICAgICAgIGFzc2VydFRocm93cyhVc2VyTWFuYWdlci5DaGVja2VkVXNlck9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gbVVtaS5nZXRCb290VXNlcigpKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKFVzZXJNYW5hZ2VyLkNoZWNrZWRVc2VyT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICgpIC0+IG1VbWkuZ2V0Qm9vdFVzZXIoLyogd2FpdFVudGlsU2V0PSAqLyBmYWxzZSkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBtb2NrQ3VycmVudFVzZXIoQFVzZXJJZEludCBpbnQgdXNlcklkKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJWaXNpYmlsaXR5TWVkaWF0b3JUZXN0Q2FzZS5qYXZhIGIvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9Vc2VyVmlzaWJpbGl0eU1lZGlhdG9yVGVzdENhc2UuamF2YQppbmRleCAyMzliNmZkLi43MGI1YWMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BtL1VzZXJWaXNpYmlsaXR5TWVkaWF0b3JUZXN0Q2FzZS5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vVXNlclZpc2liaWxpdHlNZWRpYXRvclRlc3RDYXNlLmphdmEKQEAgLTU5Niw2ICs1OTYsNyBAQAogICAgICAgICAgICAgICAgIC50aGF0KG1NZWRpYXRvci5hc3NpZ25Vc2VyVG9FeHRyYURpc3BsYXkodXNlcklkLCBkaXNwbGF5SWQpKQogICAgICAgICAgICAgICAgIC5pc1RydWUoKTsKICAgICAgICAgZXhwZWN0VXNlcklzVmlzaWJsZU9uRGlzcGxheSh1c2VySWQsIGRpc3BsYXlJZCk7CisgICAgICAgIGV4cGVjdERpc3BsYXlzQXNzaWduZWRUb1VzZXJDb250YWluc0Rpc3BsYXlJZCh1c2VySWQsIGRpc3BsYXlJZCk7CiAKICAgICAgICAgaWYgKHVuYXNzaWduKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJDYWxsaW5nIHVuYXNzaWduVXNlckZyb21FeHRyYURpc3BsYXkoIiArIHVzZXJJZCArICIsICIgKyBkaXNwbGF5SWQgKyAiKSIpOwpAQCAtNjAzLDYgKzYwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIC50aGF0KG1NZWRpYXRvci51bmFzc2lnblVzZXJGcm9tRXh0cmFEaXNwbGF5KHVzZXJJZCwgZGlzcGxheUlkKSkKICAgICAgICAgICAgICAgICAgICAgLmlzVHJ1ZSgpOwogICAgICAgICAgICAgZXhwZWN0VXNlcklzTm90VmlzaWJsZU9uRGlzcGxheSh1c2VySWQsIGRpc3BsYXlJZCk7CisgICAgICAgICAgICBleHBlY3REaXNwbGF5c0Fzc2lnbmVkVG9Vc2VyRG9lc05vdENvbnRhaW5EaXNwbGF5SWQodXNlcklkLCBkaXNwbGF5SWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02NjgsNiArNjcwLDcgQEAKICAgICAgICAgZXhwZWN0VXNlcklzTm90VmlzaWJsZU9uRGlzcGxheSh1c2VySWQsIElOVkFMSURfRElTUExBWSk7CiAgICAgICAgIGV4cGVjdFVzZXJJc05vdFZpc2libGVPbkRpc3BsYXkodXNlcklkLCBTRUNPTkRBUllfRElTUExBWV9JRCk7CiAgICAgICAgIGV4cGVjdFVzZXJJc05vdFZpc2libGVPbkRpc3BsYXkodXNlcklkLCBPVEhFUl9TRUNPTkRBUllfRElTUExBWV9JRCk7CisgICAgICAgIGV4cGVjdERpc3BsYXlzQXNzaWduZWRUb1VzZXJJc0VtcHR5KHVzZXJJZCk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZXhwZWN0RGlzcGxheUFzc2lnbmVkVG9Vc2VyKEBVc2VySWRJbnQgaW50IHVzZXJJZCwgaW50IGRpc3BsYXlJZCkgewpAQCAtNjgwLDYgKzY4MywyNCBAQAogICAgICAgICAgICAgICAgIC50aGF0KG1NZWRpYXRvci5nZXREaXNwbGF5QXNzaWduZWRUb1VzZXIodXNlcklkKSkuaXNFcXVhbFRvKElOVkFMSURfRElTUExBWSk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgZXhwZWN0RGlzcGxheXNBc3NpZ25lZFRvVXNlckNvbnRhaW5zRGlzcGxheUlkKAorICAgICAgICAgICAgQFVzZXJJZEludCBpbnQgdXNlcklkLCBpbnQgZGlzcGxheUlkKSB7CisgICAgICAgIGV4cGVjdFdpdGhNZXNzYWdlKCJnZXREaXNwbGF5c0Fzc2lnbmVkVG9Vc2VyKCVzKSIsIHVzZXJJZCkKKyAgICAgICAgICAgICAgICAudGhhdChtTWVkaWF0b3IuZ2V0RGlzcGxheXNBc3NpZ25lZFRvVXNlcih1c2VySWQpKS5hc0xpc3QoKS5jb250YWlucyhkaXNwbGF5SWQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV4cGVjdERpc3BsYXlzQXNzaWduZWRUb1VzZXJEb2VzTm90Q29udGFpbkRpc3BsYXlJZCgKKyAgICAgICAgICAgIEBVc2VySWRJbnQgaW50IHVzZXJJZCwgaW50IGRpc3BsYXlJZCkgeworICAgICAgICBleHBlY3RXaXRoTWVzc2FnZSgiZ2V0RGlzcGxheXNBc3NpZ25lZFRvVXNlciglcykiLCB1c2VySWQpCisgICAgICAgICAgICAgICAgLnRoYXQobU1lZGlhdG9yLmdldERpc3BsYXlzQXNzaWduZWRUb1VzZXIodXNlcklkKSkuYXNMaXN0KCkKKyAgICAgICAgICAgICAgICAuZG9lc05vdENvbnRhaW4oZGlzcGxheUlkKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBleHBlY3REaXNwbGF5c0Fzc2lnbmVkVG9Vc2VySXNFbXB0eShAVXNlcklkSW50IGludCB1c2VySWQpIHsKKyAgICAgICAgZXhwZWN0V2l0aE1lc3NhZ2UoImdldERpc3BsYXlzQXNzaWduZWRUb1VzZXIoJXMpIiwgdXNlcklkKQorICAgICAgICAgICAgICAgIC50aGF0KG1NZWRpYXRvci5nZXREaXNwbGF5c0Fzc2lnbmVkVG9Vc2VyKHVzZXJJZCkpLmlzTnVsbCgpOworICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIGV4cGVjdFVzZXJDYW5ub3RCZVVuYXNzaWduZWRGcm9tRGlzcGxheShAVXNlcklkSW50IGludCB1c2VySWQsIGludCBkaXNwbGF5SWQpIHsKICAgICAgICAgZXhwZWN0V2l0aE1lc3NhZ2UoInVuYXNzaWduVXNlckZyb21FeHRyYURpc3BsYXkoJXMsICVzKSIsIHVzZXJJZCwgZGlzcGxheUlkKQogICAgICAgICAgICAgICAgIC50aGF0KG1NZWRpYXRvci51bmFzc2lnblVzZXJGcm9tRXh0cmFEaXNwbGF5KHVzZXJJZCwgZGlzcGxheUlkKSkuaXNGYWxzZSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci90YXJlL1NjcmliZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL21vY2tpbmdzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvdGFyZS9TY3JpYmVUZXN0LmphdmEKaW5kZXggNzEyODBjZS4uZTgxYjYzYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvbW9ja2luZ3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci90YXJlL1NjcmliZVRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9tb2NraW5nc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3RhcmUvU2NyaWJlVGVzdC5qYXZhCkBAIC00MDMsNiArNDAzLDcgQEAKICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFwcGxpY2F0aW9uSW5mbyA9IG5ldyBBcHBsaWNhdGlvbkluZm8oKTsKICAgICAgICAgYXBwbGljYXRpb25JbmZvLnVpZCA9IFVzZXJIYW5kbGUuZ2V0VWlkKHVzZXJJZCwgTWF0aC5hYnMocGtnTmFtZS5oYXNoQ29kZSgpKSk7CiAgICAgICAgIHBrZ0luZm8uYXBwbGljYXRpb25JbmZvID0gYXBwbGljYXRpb25JbmZvOwotICAgICAgICBtSW5zdGFsbGVkUGFja2FnZXMuYWRkKHVzZXJJZCwgcGtnTmFtZSwgbmV3IEluc3RhbGxlZFBhY2thZ2VJbmZvKGdldENvbnRleHQoKSwgcGtnSW5mbykpOworICAgICAgICBtSW5zdGFsbGVkUGFja2FnZXMuYWRkKHVzZXJJZCwgcGtnTmFtZSwgbmV3IEluc3RhbGxlZFBhY2thZ2VJbmZvKGdldENvbnRleHQoKSwgdXNlcklkLAorICAgICAgICAgICAgICAgIHBrZ0luZm8pKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY29tcGFuaW9uL3ZpcnR1YWwvSW5wdXRDb250cm9sbGVyVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2NvbXBhbmlvbi92aXJ0dWFsL0lucHV0Q29udHJvbGxlclRlc3QuamF2YQppbmRleCA3NjQyZTdiLi42YzZiNjA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvY29tcGFuaW9uL3ZpcnR1YWwvSW5wdXRDb250cm9sbGVyVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9jb21wYW5pb24vdmlydHVhbC9JbnB1dENvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlckludGVybmFsOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSUlucHV0TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklucHV0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklucHV0TWFuYWdlckdsb2JhbDsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtMTA5LDcgKzEwOSw3IEBACiAgICAgICAgICAgICAgICAgZGV2aWNlMUlkKS5pc05vdEVxdWFsVG8oZGV2aWNlMklkKTsKIAogCi0gICAgICAgIGludFtdIGRldmljZUlkcyA9IElucHV0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldElucHV0RGV2aWNlSWRzKCk7CisgICAgICAgIGludFtdIGRldmljZUlkcyA9IElucHV0TWFuYWdlckdsb2JhbC5nZXRJbnN0YW5jZSgpLmdldElucHV0RGV2aWNlSWRzKCk7CiAgICAgICAgIGFzc2VydFdpdGhNZXNzYWdlKCJJbnB1dE1hbmFnZXIncyBkZXZpY2VJZHMgbGlzdCBzaG91bGQgY29udGFpbiBpZCBvZiBkZXZpY2UgMSIpLnRoYXQoCiAgICAgICAgICAgICAgICAgZGV2aWNlSWRzKS5hc0xpc3QoKS5jb250YWlucyhkZXZpY2UxSWQpOwogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiSW5wdXRNYW5hZ2VyJ3MgZGV2aWNlSWRzIGxpc3Qgc2hvdWxkIGNvbnRhaW4gaWQgb2YgZGV2aWNlIDIiKS50aGF0KApAQCAtMTUzLDcgKzE1Myw3IEBACiAgICAgICAgICAgICAgICAgZGV2aWNlVG9rZW4sIC8qIGRpc3BsYXlJZD0gKi8gMSwgLyogdG91Y2hwYWRIZWlnaHQ9ICovIDUwLCAvKiB0b3VjaHBhZFdpZHRoPSAqLyA1MCk7CiAKICAgICAgICAgaW50IGRldmljZUlkID0gbUlucHV0Q29udHJvbGxlci5nZXRJbnB1dERldmljZUlkKGRldmljZVRva2VuKTsKLSAgICAgICAgaW50W10gZGV2aWNlSWRzID0gSW5wdXRNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2VJZHMoKTsKKyAgICAgICAgaW50W10gZGV2aWNlSWRzID0gSW5wdXRNYW5hZ2VyR2xvYmFsLmdldEluc3RhbmNlKCkuZ2V0SW5wdXREZXZpY2VJZHMoKTsKIAogICAgICAgICBhc3NlcnRXaXRoTWVzc2FnZSgiSW5wdXRNYW5hZ2VyJ3MgZGV2aWNlSWRzIGxpc3Qgc2hvdWxkIGNvbnRhaW4gaWQgb2YgdGhlIGRldmljZSIpLnRoYXQoCiAgICAgICAgICAgICBkZXZpY2VJZHMpLmFzTGlzdCgpLmNvbnRhaW5zKGRldmljZUlkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvZGV2aWNlc3RhdGUvRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyVGVzdC5qYXZhCmluZGV4IDgxOTZkNmEuLmUzOTYyNjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9kZXZpY2VzdGF0ZS9EZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2RldmljZXN0YXRlL0RldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlclRlc3QuamF2YQpAQCAtNTIsNyArNTIsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1dJVEhPVVRfTk9USUZJQ0FUSU9OID0gMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfV0lUSF9BQ1RJVkVfTk9USUZJQ0FUSU9OID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfV0lUSF9BQ1RJVkVfQU5EX1RIRVJNQUxfTk9USUZJQ0FUSU9OID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfV0lUSF9BTExfTk9USUZJQ0FUSU9OID0gMzsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxJRF9BUFBfVUlEID0gMTAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9BUFBfVUlEID0gMjAwMDsKQEAgLTY4LDYgKzY4LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF8yID0gImNvbnRlbnQyOiUxJHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVSTUFMX1RJVExFXzIgPSAidGhlcm1hbF90aXRsZTIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVSTUFMX0NPTlRFTlRfMiA9ICJ0aGVybWFsX2NvbnRlbnQyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9XRVJfU0FWRV9USVRMRV8yID0gInBvd2VyX3NhdmVfdGl0bGUyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9XRVJfU0FWRV9DT05URU5UXzIgPSAicG93ZXJfc2F2ZV9jb250ZW50MiI7CiAKICAgICBwcml2YXRlIERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlciBtQ29udHJvbGxlcjsKIApAQCAtODgsMTEgKzkwLDEyIEBACiAgICAgICAgIG5vdGlmaWNhdGlvbkluZm9zLnB1dChTVEFURV9XSVRIX0FDVElWRV9OT1RJRklDQVRJT04sCiAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5Ob3RpZmljYXRpb25JbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgTkFNRV8xLCBUSVRMRV8xLCBDT05URU5UXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIpKTsKLSAgICAgICAgbm90aWZpY2F0aW9uSW5mb3MucHV0KFNUQVRFX1dJVEhfQUNUSVZFX0FORF9USEVSTUFMX05PVElGSUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIiLCAiIiwgIiIsICIiKSk7CisgICAgICAgIG5vdGlmaWNhdGlvbkluZm9zLnB1dChTVEFURV9XSVRIX0FMTF9OT1RJRklDQVRJT04sCiAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5Ob3RpZmljYXRpb25JbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgTkFNRV8yLCBUSVRMRV8yLCBDT05URU5UXzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBUSEVSTUFMX1RJVExFXzIsIFRIRVJNQUxfQ09OVEVOVF8yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBUSEVSTUFMX1RJVExFXzIsIFRIRVJNQUxfQ09OVEVOVF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVJfU0FWRV9USVRMRV8yLCBQT1dFUl9TQVZFX0NPTlRFTlRfMikpOwogCiAgICAgICAgIHdoZW4ocGFja2FnZU1hbmFnZXIuZ2V0TmFtZUZvclVpZChWQUxJRF9BUFBfVUlEKSkudGhlblJldHVybihWQUxJRF9BUFBfTkFNRSk7CiAgICAgICAgIHdoZW4ocGFja2FnZU1hbmFnZXIuZ2V0TmFtZUZvclVpZChJTlZBTElEX0FQUF9VSUQpKS50aGVuUmV0dXJuKElOVkFMSURfQVBQX05BTUUpOwpAQCAtMTM5LDEwICsxNDIsNDYgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RfcG93ZXJTYXZlTm90aWZpY2F0aW9uKCkgeworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYWN0aXZlIG5vdGlmaWNhdGlvbiBpcyBjcmVhdGVkLgorICAgICAgICBtQ29udHJvbGxlci5zaG93U3RhdGVBY3RpdmVOb3RpZmljYXRpb25JZk5lZWRlZCgKKyAgICAgICAgICAgICAgICBTVEFURV9XSVRIX0FMTF9OT1RJRklDQVRJT04sIFZBTElEX0FQUF9VSUQpOworICAgICAgICB2ZXJpZnkobU5vdGlmaWNhdGlvbk1hbmFnZXIpLm5vdGlmeSgKKyAgICAgICAgICAgICAgICBlcShEZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIuTk9USUZJQ0FUSU9OX1RBRyksCisgICAgICAgICAgICAgICAgZXEoRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLk5PVElGSUNBVElPTl9JRCksCisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkNhcHRvci5jYXB0dXJlKCkpOworICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbU5vdGlmaWNhdGlvbkNhcHRvci5nZXRWYWx1ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoVElUTEVfMiwgbm90aWZpY2F0aW9uLmV4dHJhcy5nZXRTdHJpbmcoTm90aWZpY2F0aW9uLkVYVFJBX1RJVExFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KENPTlRFTlRfMiwgVkFMSURfQVBQX0xBQkVMKSwKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uZXh0cmFzLmdldFN0cmluZyhOb3RpZmljYXRpb24uRVhUUkFfVEVYVCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTm90aWZpY2F0aW9uLkZMQUdfT05HT0lOR19FVkVOVCwKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19PTkdPSU5HX0VWRU5UKTsKKyAgICAgICAgTW9ja2l0by5jbGVhckludm9jYXRpb25zKG1Ob3RpZmljYXRpb25NYW5hZ2VyKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdGhlcm1hbCBjcml0aWNhbCBub3RpZmljYXRpb24gaXMgY3JlYXRlZC4KKyAgICAgICAgbUNvbnRyb2xsZXIuc2hvd1Bvd2VyU2F2ZU5vdGlmaWNhdGlvbklmTmVlZGVkKAorICAgICAgICAgICAgICAgIFNUQVRFX1dJVEhfQUxMX05PVElGSUNBVElPTik7CisgICAgICAgIHZlcmlmeShtTm90aWZpY2F0aW9uTWFuYWdlcikubm90aWZ5KAorICAgICAgICAgICAgICAgIGVxKERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5OT1RJRklDQVRJT05fVEFHKSwKKyAgICAgICAgICAgICAgICBlcShEZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIuTk9USUZJQ0FUSU9OX0lEKSwKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uQ2FwdG9yLmNhcHR1cmUoKSk7CisgICAgICAgIG5vdGlmaWNhdGlvbiA9IG1Ob3RpZmljYXRpb25DYXB0b3IuZ2V0VmFsdWUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBPV0VSX1NBVkVfVElUTEVfMiwgbm90aWZpY2F0aW9uLmV4dHJhcy5nZXRTdHJpbmcoTm90aWZpY2F0aW9uLkVYVFJBX1RJVExFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQT1dFUl9TQVZFX0NPTlRFTlRfMiwgbm90aWZpY2F0aW9uLmV4dHJhcy5nZXRTdHJpbmcoTm90aWZpY2F0aW9uLkVYVFJBX1RFWFQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBub3RpZmljYXRpb24gaXMgY2FuY2VsZWQuCisgICAgICAgIG1Db250cm9sbGVyLmNhbmNlbE5vdGlmaWNhdGlvbihTVEFURV9XSVRIX0FMTF9OT1RJRklDQVRJT04pOworICAgICAgICB2ZXJpZnkobU5vdGlmaWNhdGlvbk1hbmFnZXIpLmNhbmNlbCgKKyAgICAgICAgICAgICAgICBEZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIuTk9USUZJQ0FUSU9OX1RBRywKKyAgICAgICAgICAgICAgICBEZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIuTk9USUZJQ0FUSU9OX0lEKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RfdGhlcm1hbE5vdGlmaWNhdGlvbigpIHsKICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGFjdGl2ZSBub3RpZmljYXRpb24gaXMgY3JlYXRlZC4KICAgICAgICAgbUNvbnRyb2xsZXIuc2hvd1N0YXRlQWN0aXZlTm90aWZpY2F0aW9uSWZOZWVkZWQoCi0gICAgICAgICAgICAgICAgU1RBVEVfV0lUSF9BQ1RJVkVfQU5EX1RIRVJNQUxfTk9USUZJQ0FUSU9OLCBWQUxJRF9BUFBfVUlEKTsKKyAgICAgICAgICAgICAgICBTVEFURV9XSVRIX0FMTF9OT1RJRklDQVRJT04sIFZBTElEX0FQUF9VSUQpOwogICAgICAgICB2ZXJpZnkobU5vdGlmaWNhdGlvbk1hbmFnZXIpLm5vdGlmeSgKICAgICAgICAgICAgICAgICBlcShEZXZpY2VTdGF0ZU5vdGlmaWNhdGlvbkNvbnRyb2xsZXIuTk9USUZJQ0FUSU9OX1RBRyksCiAgICAgICAgICAgICAgICAgZXEoRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLk5PVElGSUNBVElPTl9JRCksCkBAIC0xNTcsNyArMTk2LDcgQEAKIAogICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdGhlcm1hbCBjcml0aWNhbCBub3RpZmljYXRpb24gaXMgY3JlYXRlZC4KICAgICAgICAgbUNvbnRyb2xsZXIuc2hvd1RoZXJtYWxDcml0aWNhbE5vdGlmaWNhdGlvbklmTmVlZGVkKAotICAgICAgICAgICAgICAgIFNUQVRFX1dJVEhfQUNUSVZFX0FORF9USEVSTUFMX05PVElGSUNBVElPTik7CisgICAgICAgICAgICAgICAgU1RBVEVfV0lUSF9BTExfTk9USUZJQ0FUSU9OKTsKICAgICAgICAgdmVyaWZ5KG1Ob3RpZmljYXRpb25NYW5hZ2VyKS5ub3RpZnkoCiAgICAgICAgICAgICAgICAgZXEoRGV2aWNlU3RhdGVOb3RpZmljYXRpb25Db250cm9sbGVyLk5PVElGSUNBVElPTl9UQUcpLAogICAgICAgICAgICAgICAgIGVxKERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5OT1RJRklDQVRJT05fSUQpLApAQCAtMTY4LDcgKzIwNyw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscygwLCBub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19PTkdPSU5HX0VWRU5UKTsKIAogICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgbm90aWZpY2F0aW9uIGlzIGNhbmNlbGVkLgotICAgICAgICBtQ29udHJvbGxlci5jYW5jZWxOb3RpZmljYXRpb24oU1RBVEVfV0lUSF9BQ1RJVkVfTk9USUZJQ0FUSU9OKTsKKyAgICAgICAgbUNvbnRyb2xsZXIuY2FuY2VsTm90aWZpY2F0aW9uKFNUQVRFX1dJVEhfQUxMX05PVElGSUNBVElPTik7CiAgICAgICAgIHZlcmlmeShtTm90aWZpY2F0aW9uTWFuYWdlcikuY2FuY2VsKAogICAgICAgICAgICAgICAgIERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5OT1RJRklDQVRJT05fVEFHLAogICAgICAgICAgICAgICAgIERldmljZVN0YXRlTm90aWZpY2F0aW9uQ29udHJvbGxlci5OT1RJRklDQVRJT05fSUQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2RyZWFtcy9EcmVhbU92ZXJsYXlTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2RyZWFtcy9EcmVhbU92ZXJsYXlTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IDZjNzNmNzEuLjg1MWQ4ZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9kcmVhbXMvRHJlYW1PdmVybGF5U2VydmljZVRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvZHJlYW1zL0RyZWFtT3ZlcmxheVNlcnZpY2VUZXN0LmphdmEKQEAgLTE4LDYgKzE4LDggQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OwogCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLmRvQW5zd2VyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm5ldmVyOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKIApAQCAtMzksMTAgKzQxLDEzIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm1vY2tpdG8uQXJndW1lbnRDYXB0b3I7CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKIAoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCiAvKioKICAqIEEgY29sbGVjdGlvbiBvZiB0ZXN0cyB0byBleGVyY2lzZSB7QGxpbmsgRHJlYW1PdmVybGF5U2VydmljZX0uCiAgKi8KQEAgLTYwLDYgKzY1LDkgQEAKICAgICBATW9jawogICAgIElEcmVhbU92ZXJsYXlDYWxsYmFjayBtT3ZlcmxheUNhbGxiYWNrOwogCisgICAgQE1vY2sKKyAgICBFeGVjdXRvciBtRXhlY3V0b3I7CisKICAgICAvKioKICAgICAgKiB7QGxpbmsgVGVzdERyZWFtT3ZlcmxheVNlcnZpY2V9IGlzIGEgc2ltcGxlIHtAbGluayBEcmVhbU92ZXJsYXlTZXJ2aWNlfSBpbXBsZW1lbnRhdGlvbiBmb3IKICAgICAgKiB0cmFja2luZyBpbnRlcmFjdGlvbnMgYWNyb3NzIHtAbGluayBJRHJlYW1PdmVybGF5fSBiaW5kZXIgaW50ZXJmYWNlLiBUaGUgc2VydmljZSByZXBvcnRzCkBAIC03OCw4ICs4Niw4IEBACiAKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNb25pdG9yIG1Nb25pdG9yOwogCi0gICAgICAgIFRlc3REcmVhbU92ZXJsYXlTZXJ2aWNlKE1vbml0b3IgbW9uaXRvcikgewotICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgVGVzdERyZWFtT3ZlcmxheVNlcnZpY2UoTW9uaXRvciBtb25pdG9yLCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICAgICAgc3VwZXIoZXhlY3V0b3IpOwogICAgICAgICAgICAgbU1vbml0b3IgPSBtb25pdG9yOwogICAgICAgICB9CiAKQEAgLTExOCwxMyArMTI2LDYzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCBjYWxsYmFja3MgZm9yIHN1YmNsYXNzZXMgYXJlIHJ1biBvbiB0aGUgcHJvdmlkZWQgZXhlY3V0b3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbGJhY2tzUnVuT25FeGVjdXRvcigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBUZXN0RHJlYW1PdmVybGF5U2VydmljZS5Nb25pdG9yIG1vbml0b3IgPSBNb2NraXRvLm1vY2soCisgICAgICAgICAgICAgICAgVGVzdERyZWFtT3ZlcmxheVNlcnZpY2UuTW9uaXRvci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFRlc3REcmVhbU92ZXJsYXlTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgVGVzdERyZWFtT3ZlcmxheVNlcnZpY2UobW9uaXRvciwgbUV4ZWN1dG9yKTsKKyAgICAgICAgZmluYWwgSUJpbmRlciBiaW5kZXIgPSBzZXJ2aWNlLm9uQmluZChuZXcgSW50ZW50KCkpOworICAgICAgICBmaW5hbCBJRHJlYW1PdmVybGF5IG92ZXJsYXkgPSBJRHJlYW1PdmVybGF5LlN0dWIuYXNJbnRlcmZhY2UoYmluZGVyKTsKKworICAgICAgICBmaW5hbCBJRHJlYW1PdmVybGF5Q2xpZW50IGNsaWVudCA9IGdldENsaWVudChvdmVybGF5KTsKKworICAgICAgICAvLyBTdGFydCB0aGUgZHJlYW0uCisgICAgICAgIGNsaWVudC5zdGFydERyZWFtKG1MYXlvdXRQYXJhbXMsIG1PdmVybGF5Q2FsbGJhY2ssCisgICAgICAgICAgICAgICAgRklSU1RfRFJFQU1fQ09NUE9ORU5ULmZsYXR0ZW5Ub1N0cmluZygpLCBmYWxzZSk7CisKKyAgICAgICAgLy8gVGhlIGNhbGxiYWNrIHNob3VsZCBub3QgaGF2ZSBydW4geWV0LgorICAgICAgICB2ZXJpZnkobW9uaXRvciwgbmV2ZXIoKSkub25TdGFydERyZWFtKCk7CisKKyAgICAgICAgLy8gUnVuIHRoZSBSdW5uYWJsZSBzZW50IHRvIHRoZSBleGVjdXRvci4KKyAgICAgICAgQXJndW1lbnRDYXB0b3I8UnVubmFibGU+IG1SdW5uYWJsZUNhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKFJ1bm5hYmxlLmNsYXNzKTsKKyAgICAgICAgdmVyaWZ5KG1FeGVjdXRvcikuZXhlY3V0ZShtUnVubmFibGVDYXB0b3IuY2FwdHVyZSgpKTsKKyAgICAgICAgbVJ1bm5hYmxlQ2FwdG9yLmdldFZhbHVlKCkucnVuKCk7CisKKyAgICAgICAgLy8gQ2FsbGJhY2sgaXMgcnVuLgorICAgICAgICB2ZXJpZnkobW9uaXRvcikub25TdGFydERyZWFtKCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IG9uV2FrZVVwIGlzIHJ1biBvbiB0aGUgZXhlY3V0b3IuCisgICAgICAgIGNsaWVudC53YWtlVXAoKTsKKyAgICAgICAgdmVyaWZ5KG1vbml0b3IsIG5ldmVyKCkpLm9uV2FrZVVwKCk7CisgICAgICAgIG1SdW5uYWJsZUNhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKFJ1bm5hYmxlLmNsYXNzKTsKKyAgICAgICAgdmVyaWZ5KG1FeGVjdXRvcikuZXhlY3V0ZShtUnVubmFibGVDYXB0b3IuY2FwdHVyZSgpKTsKKyAgICAgICAgbVJ1bm5hYmxlQ2FwdG9yLmdldFZhbHVlKCkucnVuKCk7CisgICAgICAgIHZlcmlmeShtb25pdG9yKS5vbldha2VVcCgpOworCisgICAgICAgIC8vIFZlcmlmeSBvbkVuZERyZWFtIGlzIHJ1biBvbiB0aGUgZXhlY3V0b3IuCisgICAgICAgIGNsaWVudC5lbmREcmVhbSgpOworICAgICAgICB2ZXJpZnkobW9uaXRvciwgbmV2ZXIoKSkub25FbmREcmVhbSgpOworICAgICAgICBtUnVubmFibGVDYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcyhSdW5uYWJsZS5jbGFzcyk7CisgICAgICAgIHZlcmlmeShtRXhlY3V0b3IpLmV4ZWN1dGUobVJ1bm5hYmxlQ2FwdG9yLmNhcHR1cmUoKSk7CisgICAgICAgIG1SdW5uYWJsZUNhcHRvci5nZXRWYWx1ZSgpLnJ1bigpOworICAgICAgICB2ZXJpZnkobW9uaXRvcikub25FbmREcmVhbSgpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFZlcmlmaWVzIHRoYXQgb25seSB0aGUgY3VycmVudGx5IHN0YXJ0ZWQgZHJlYW0gaXMgYWJsZSB0byBhZmZlY3QgdGhlIG92ZXJsYXkuCiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmxheUNsaWVudEludGVyYWN0aW9uKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGRvQW5zd2VyKGludm9jYXRpb24gLT4geworICAgICAgICAgICAgKChSdW5uYWJsZSkgaW52b2NhdGlvbi5nZXRBcmd1bWVudCgwKSkucnVuKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSkud2hlbihtRXhlY3V0b3IpLmV4ZWN1dGUoYW55KCkpOworCiAgICAgICAgIGZpbmFsIFRlc3REcmVhbU92ZXJsYXlTZXJ2aWNlLk1vbml0b3IgbW9uaXRvciA9IE1vY2tpdG8ubW9jaygKICAgICAgICAgICAgICAgICBUZXN0RHJlYW1PdmVybGF5U2VydmljZS5Nb25pdG9yLmNsYXNzKTsKLSAgICAgICAgZmluYWwgVGVzdERyZWFtT3ZlcmxheVNlcnZpY2Ugc2VydmljZSA9IG5ldyBUZXN0RHJlYW1PdmVybGF5U2VydmljZShtb25pdG9yKTsKKyAgICAgICAgZmluYWwgVGVzdERyZWFtT3ZlcmxheVNlcnZpY2Ugc2VydmljZSA9IG5ldyBUZXN0RHJlYW1PdmVybGF5U2VydmljZShtb25pdG9yLCBtRXhlY3V0b3IpOwogICAgICAgICBmaW5hbCBJQmluZGVyIGJpbmRlciA9IHNlcnZpY2Uub25CaW5kKG5ldyBJbnRlbnQoKSk7CiAgICAgICAgIGZpbmFsIElEcmVhbU92ZXJsYXkgb3ZlcmxheSA9IElEcmVhbU92ZXJsYXkuU3R1Yi5hc0ludGVyZmFjZShiaW5kZXIpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9ja3NldHRpbmdzL1JlYm9vdEVzY3Jvd01hbmFnZXJUZXN0cy5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2tzZXR0aW5ncy9SZWJvb3RFc2Nyb3dNYW5hZ2VyVGVzdHMuamF2YQppbmRleCBkOWQwNzE1Li42NGU2MjM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9ja3NldHRpbmdzL1JlYm9vdEVzY3Jvd01hbmFnZXJUZXN0cy5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2Nrc2V0dGluZ3MvUmVib290RXNjcm93TWFuYWdlclRlc3RzLmphdmEKQEAgLTc0LDYgKzc0LDggQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIAogaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CkBAIC0zMjQsMTYgKzMyNiwzMCBAQAogICAgICAgICBtSW5qZWN0ZWQgPSBtb2NrKE1vY2thYmxlUmVib290RXNjcm93SW5qZWN0ZWQuY2xhc3MpOwogICAgICAgICBtTW9ja0luamVjdG9yID0gbmV3IE1vY2tJbmplY3RvcihtQ29udGV4dCwgbVVzZXJNYW5hZ2VyLCBtUmVib290RXNjcm93LAogICAgICAgICAgICAgICAgIG1LZXlTdG9yZU1hbmFnZXIsIG1TdG9yYWdlLCBtSW5qZWN0ZWQpOwotICAgICAgICBtU2VydmljZSA9IG5ldyBSZWJvb3RFc2Nyb3dNYW5hZ2VyKG1Nb2NrSW5qZWN0b3IsIG1DYWxsYmFja3MsIG1TdG9yYWdlKTsKICAgICAgICAgSGFuZGxlclRocmVhZCB0aHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiUmVib290RXNjcm93TWFuYWdlclRlc3QiKTsKICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIodGhyZWFkLmdldExvb3BlcigpKTsKKyAgICAgICAgbVNlcnZpY2UgPSBuZXcgUmVib290RXNjcm93TWFuYWdlcihtTW9ja0luamVjdG9yLCBtQ2FsbGJhY2tzLCBtU3RvcmFnZSwgbUhhbmRsZXIpOworCiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldFNlcnZlckJhc2VkUmVib290RXNjcm93UHJvdmlkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbU1vY2tJbmplY3RvciA9IG5ldyBNb2NrSW5qZWN0b3IobUNvbnRleHQsIG1Vc2VyTWFuYWdlciwgbVNlcnZpY2VDb25uZWN0aW9uLAogICAgICAgICAgICAgICAgIG1LZXlTdG9yZU1hbmFnZXIsIG1TdG9yYWdlLCBtSW5qZWN0ZWQpOwotICAgICAgICBtU2VydmljZSA9IG5ldyBSZWJvb3RFc2Nyb3dNYW5hZ2VyKG1Nb2NrSW5qZWN0b3IsIG1DYWxsYmFja3MsIG1TdG9yYWdlKTsKKyAgICAgICAgbVNlcnZpY2UgPSBuZXcgUmVib290RXNjcm93TWFuYWdlcihtTW9ja0luamVjdG9yLCBtQ2FsbGJhY2tzLCBtU3RvcmFnZSwgbUhhbmRsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9ySGFuZGxlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFdhaXQgZm9yIGhhbmRsZXIgdG8gY29tcGxldGUgcHJvY2Vzc2luZy4KKyAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobGF0Y2g6OmNvdW50RG93bik7CisgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkQW5kV2FpdChpbnQgdXNlcklkKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZCh1c2VySWQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgd2FpdEZvckhhbmRsZXIoKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzQzLDcgKzM1OSw3IEBACiAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVSZWJvb3RFc2Nyb3coKTsKIAogICAgICAgICBjbGVhckludm9jYXRpb25zKG1SZWJvb3RFc2Nyb3cpOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogICAgICAgICB2ZXJpZnkobVJlYm9vdEVzY3JvdywgbmV2ZXIoKSkuc3RvcmVLZXkoYW55KCkpOwogICAgIH0KQEAgLTM1NSw4ICszNzEsNyBAQAogICAgICAgICBtU2VydmljZS5zZXRSZWJvb3RFc2Nyb3dMaXN0ZW5lcihtb2NrTGlzdGVuZXIpOwogICAgICAgICBtU2VydmljZS5wcmVwYXJlUmVib290RXNjcm93KCk7CiAKLSAgICAgICAgbVNlcnZpY2UuY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWQoUFJJTUFSWV9VU0VSX0lELCBGQUtFX1NQX1ZFUlNJT04sIEZBS0VfQVVUSF9UT0tFTik7Ci0gICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOworICAgICAgICBjYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZEFuZFdhaXQoUFJJTUFSWV9VU0VSX0lEKTsKICAgICAgICAgdmVyaWZ5KG1TZXJ2aWNlQ29ubmVjdGlvbiwgbmV2ZXIoKSkud3JhcEJsb2IoYW55KCksIGFueUxvbmcoKSwgYW55TG9uZygpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UobVN0b3JhZ2UuaGFzUmVib290RXNjcm93U2VydmVyQmxvYigpKTsKICAgICB9CkBAIC0zNjYsNyArMzgxLDcgQEAKICAgICAgICAgUmVib290RXNjcm93TGlzdGVuZXIgbW9ja0xpc3RlbmVyID0gbW9jayhSZWJvb3RFc2Nyb3dMaXN0ZW5lci5jbGFzcyk7CiAgICAgICAgIG1TZXJ2aWNlLnNldFJlYm9vdEVzY3Jvd0xpc3RlbmVyKG1vY2tMaXN0ZW5lcik7CiAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVSZWJvb3RFc2Nyb3coKTsKLSAgICAgICAgbVNlcnZpY2UuY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWQoUFJJTUFSWV9VU0VSX0lELCBGQUtFX1NQX1ZFUlNJT04sIEZBS0VfQVVUSF9UT0tFTik7CisgICAgICAgIGNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkQW5kV2FpdChQUklNQVJZX1VTRVJfSUQpOwogICAgICAgICB2ZXJpZnkobW9ja0xpc3RlbmVyKS5vblByZXBhcmVkRm9yUmVib290KGVxKHRydWUpKTsKIAogICAgICAgICBjbGVhckludm9jYXRpb25zKG1SZWJvb3RFc2Nyb3cpOwpAQCAtMzkwLDcgKzQwNSw3IEBACiAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVSZWJvb3RFc2Nyb3coKTsKIAogICAgICAgICBjbGVhckludm9jYXRpb25zKG1SZWJvb3RFc2Nyb3cpOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogICAgICAgICB2ZXJpZnkobVJlYm9vdEVzY3JvdywgbmV2ZXIoKSkuc3RvcmVLZXkoYW55KCkpOwogCkBAIC00MTQsNyArNDI5LDcgQEAKICAgICAgICAgbVNlcnZpY2UucHJlcGFyZVJlYm9vdEVzY3JvdygpOwogCiAgICAgICAgIGNsZWFySW52b2NhdGlvbnMobVNlcnZpY2VDb25uZWN0aW9uKTsKLSAgICAgICAgbVNlcnZpY2UuY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWQoUFJJTUFSWV9VU0VSX0lELCBGQUtFX1NQX1ZFUlNJT04sIEZBS0VfQVVUSF9UT0tFTik7CisgICAgICAgIGNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkQW5kV2FpdChQUklNQVJZX1VTRVJfSUQpOwogICAgICAgICB2ZXJpZnkobW9ja0xpc3RlbmVyKS5vblByZXBhcmVkRm9yUmVib290KGVxKHRydWUpKTsKICAgICAgICAgdmVyaWZ5KG1TZXJ2aWNlQ29ubmVjdGlvbiwgbmV2ZXIoKSkud3JhcEJsb2IoYW55KCksIGFueUxvbmcoKSwgYW55TG9uZygpKTsKIApAQCAtNDM1LDcgKzQ1MCw3IEBACiAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVSZWJvb3RFc2Nyb3coKTsKIAogICAgICAgICBjbGVhckludm9jYXRpb25zKG1SZWJvb3RFc2Nyb3cpOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogICAgICAgICB2ZXJpZnkobVJlYm9vdEVzY3JvdywgbmV2ZXIoKSkuc3RvcmVLZXkoYW55KCkpOwogCkBAIC00NTMsMTAgKzQ2OCw5IEBACiAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVSZWJvb3RFc2Nyb3coKTsKIAogICAgICAgICBjbGVhckludm9jYXRpb25zKG1SZWJvb3RFc2Nyb3cpOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChTRUNVUkVfU0VDT05EQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICBGQUtFX0FVVEhfVE9LRU4pOworICAgICAgICBjYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZEFuZFdhaXQoU0VDVVJFX1NFQ09OREFSWV9VU0VSX0lEKTsKICAgICAgICAgdmVyaWZ5KG1SZWJvb3RFc2Nyb3csIG5ldmVyKCkpLnN0b3JlS2V5KGFueSgpKTsKIAogICAgICAgICBhc3NlcnRUcnVlKG1TdG9yYWdlLmhhc1JlYm9vdEVzY3JvdyhQUklNQVJZX1VTRVJfSUQpKTsKQEAgLTQ4OCw3ICs1MDIsNyBAQAogICAgICAgICBtU2VydmljZS5wcmVwYXJlUmVib290RXNjcm93KCk7CiAKICAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtUmVib290RXNjcm93KTsKLSAgICAgICAgbVNlcnZpY2UuY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWQoUFJJTUFSWV9VU0VSX0lELCBGQUtFX1NQX1ZFUlNJT04sIEZBS0VfQVVUSF9UT0tFTik7CisgICAgICAgIGNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkQW5kV2FpdChQUklNQVJZX1VTRVJfSUQpOwogICAgICAgICB2ZXJpZnkobW9ja0xpc3RlbmVyKS5vblByZXBhcmVkRm9yUmVib290KGVxKHRydWUpKTsKICAgICAgICAgdmVyaWZ5KG1SZWJvb3RFc2Nyb3csIG5ldmVyKCkpLnN0b3JlS2V5KGFueSgpKTsKIApAQCAtNTExLDcgKzUyNSw3IEBACiAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVSZWJvb3RFc2Nyb3coKTsKIAogICAgICAgICBjbGVhckludm9jYXRpb25zKG1SZWJvb3RFc2Nyb3cpOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogCiAgICAgICAgIHZlcmlmeShtUmVib290RXNjcm93LCBuZXZlcigpKS5zdG9yZUtleShhbnkoKSk7CkBAIC01NTQsNyArNTY4LDcgQEAKICAgICAgICAgbVNlcnZpY2UucHJlcGFyZVJlYm9vdEVzY3JvdygpOwogCiAgICAgICAgIGNsZWFySW52b2NhdGlvbnMobVNlcnZpY2VDb25uZWN0aW9uKTsKLSAgICAgICAgbVNlcnZpY2UuY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWQoUFJJTUFSWV9VU0VSX0lELCBGQUtFX1NQX1ZFUlNJT04sIEZBS0VfQVVUSF9UT0tFTik7CisgICAgICAgIGNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkQW5kV2FpdChQUklNQVJZX1VTRVJfSUQpOwogICAgICAgICB2ZXJpZnkobW9ja0xpc3RlbmVyKS5vblByZXBhcmVkRm9yUmVib290KGVxKHRydWUpKTsKICAgICAgICAgdmVyaWZ5KG1TZXJ2aWNlQ29ubmVjdGlvbiwgbmV2ZXIoKSkud3JhcEJsb2IoYW55KCksIGFueUxvbmcoKSwgYW55TG9uZygpKTsKIApAQCAtNTk4LDcgKzYxMiw3IEBACiAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVSZWJvb3RFc2Nyb3coKTsKIAogICAgICAgICBjbGVhckludm9jYXRpb25zKG1TZXJ2aWNlQ29ubmVjdGlvbik7Ci0gICAgICAgIG1TZXJ2aWNlLmNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkKFBSSU1BUllfVVNFUl9JRCwgRkFLRV9TUF9WRVJTSU9OLCBGQUtFX0FVVEhfVE9LRU4pOworICAgICAgICBjYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZEFuZFdhaXQoUFJJTUFSWV9VU0VSX0lEKTsKICAgICAgICAgdmVyaWZ5KG1vY2tMaXN0ZW5lcikub25QcmVwYXJlZEZvclJlYm9vdChlcSh0cnVlKSk7CiAgICAgICAgIHZlcmlmeShtU2VydmljZUNvbm5lY3Rpb24sIG5ldmVyKCkpLndyYXBCbG9iKGFueSgpLCBhbnlMb25nKCksIGFueUxvbmcoKSk7CiAKQEAgLTY0Myw3ICs2NTcsNyBAQAogICAgICAgICBtU2VydmljZS5wcmVwYXJlUmVib290RXNjcm93KCk7CiAKICAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtU2VydmljZUNvbm5lY3Rpb24pOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogICAgICAgICB2ZXJpZnkobVNlcnZpY2VDb25uZWN0aW9uLCBuZXZlcigpKS53cmFwQmxvYihhbnkoKSwgYW55TG9uZygpLCBhbnlMb25nKCkpOwogCkBAIC02ODksNyArNzAzLDcgQEAKICAgICAgICAgbVNlcnZpY2UucHJlcGFyZVJlYm9vdEVzY3JvdygpOwogCiAgICAgICAgIGNsZWFySW52b2NhdGlvbnMobVNlcnZpY2VDb25uZWN0aW9uKTsKLSAgICAgICAgbVNlcnZpY2UuY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWQoUFJJTUFSWV9VU0VSX0lELCBGQUtFX1NQX1ZFUlNJT04sIEZBS0VfQVVUSF9UT0tFTik7CisgICAgICAgIGNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkQW5kV2FpdChQUklNQVJZX1VTRVJfSUQpOwogICAgICAgICB2ZXJpZnkobW9ja0xpc3RlbmVyKS5vblByZXBhcmVkRm9yUmVib290KGVxKHRydWUpKTsKICAgICAgICAgdmVyaWZ5KG1TZXJ2aWNlQ29ubmVjdGlvbiwgbmV2ZXIoKSkud3JhcEJsb2IoYW55KCksIGFueUxvbmcoKSwgYW55TG9uZygpKTsKIApAQCAtNzM4LDcgKzc1Miw3IEBACiAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVSZWJvb3RFc2Nyb3coKTsKIAogICAgICAgICBjbGVhckludm9jYXRpb25zKG1TZXJ2aWNlQ29ubmVjdGlvbik7Ci0gICAgICAgIG1TZXJ2aWNlLmNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkKFBSSU1BUllfVVNFUl9JRCwgRkFLRV9TUF9WRVJTSU9OLCBGQUtFX0FVVEhfVE9LRU4pOworICAgICAgICBjYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZEFuZFdhaXQoUFJJTUFSWV9VU0VSX0lEKTsKICAgICAgICAgdmVyaWZ5KG1vY2tMaXN0ZW5lcikub25QcmVwYXJlZEZvclJlYm9vdChlcSh0cnVlKSk7CiAgICAgICAgIHZlcmlmeShtU2VydmljZUNvbm5lY3Rpb24sIG5ldmVyKCkpLndyYXBCbG9iKGFueSgpLCBhbnlMb25nKCksIGFueUxvbmcoKSk7CiAKQEAgLTc5MSw3ICs4MDUsNyBAQAogICAgICAgICBtU2VydmljZS5wcmVwYXJlUmVib290RXNjcm93KCk7CiAKICAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtU2VydmljZUNvbm5lY3Rpb24pOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogICAgICAgICB2ZXJpZnkobVNlcnZpY2VDb25uZWN0aW9uLCBuZXZlcigpKS53cmFwQmxvYihhbnkoKSwgYW55TG9uZygpLCBhbnlMb25nKCkpOwogCkBAIC04NDYsNyArODYwLDcgQEAKICAgICAgICAgbVNlcnZpY2UucHJlcGFyZVJlYm9vdEVzY3JvdygpOwogCiAgICAgICAgIGNsZWFySW52b2NhdGlvbnMobVNlcnZpY2VDb25uZWN0aW9uKTsKLSAgICAgICAgbVNlcnZpY2UuY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWQoUFJJTUFSWV9VU0VSX0lELCBGQUtFX1NQX1ZFUlNJT04sIEZBS0VfQVVUSF9UT0tFTik7CisgICAgICAgIGNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkQW5kV2FpdChQUklNQVJZX1VTRVJfSUQpOwogICAgICAgICB2ZXJpZnkobW9ja0xpc3RlbmVyKS5vblByZXBhcmVkRm9yUmVib290KGVxKHRydWUpKTsKICAgICAgICAgdmVyaWZ5KG1TZXJ2aWNlQ29ubmVjdGlvbiwgbmV2ZXIoKSkud3JhcEJsb2IoYW55KCksIGFueUxvbmcoKSwgYW55TG9uZygpKTsKIApAQCAtODkzLDcgKzkwNyw3IEBACiAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVSZWJvb3RFc2Nyb3coKTsKIAogICAgICAgICBjbGVhckludm9jYXRpb25zKG1TZXJ2aWNlQ29ubmVjdGlvbik7Ci0gICAgICAgIG1TZXJ2aWNlLmNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkKFBSSU1BUllfVVNFUl9JRCwgRkFLRV9TUF9WRVJTSU9OLCBGQUtFX0FVVEhfVE9LRU4pOworICAgICAgICBjYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZEFuZFdhaXQoUFJJTUFSWV9VU0VSX0lEKTsKICAgICAgICAgdmVyaWZ5KG1vY2tMaXN0ZW5lcikub25QcmVwYXJlZEZvclJlYm9vdChlcSh0cnVlKSk7CiAgICAgICAgIHZlcmlmeShtU2VydmljZUNvbm5lY3Rpb24sIG5ldmVyKCkpLndyYXBCbG9iKGFueSgpLCBhbnlMb25nKCksIGFueUxvbmcoKSk7CiAKQEAgLTk0OSw3ICs5NjMsNyBAQAogICAgICAgICBtU2VydmljZS5wcmVwYXJlUmVib290RXNjcm93KCk7CiAKICAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtU2VydmljZUNvbm5lY3Rpb24pOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogICAgICAgICB2ZXJpZnkobVNlcnZpY2VDb25uZWN0aW9uLCBuZXZlcigpKS53cmFwQmxvYihhbnkoKSwgYW55TG9uZygpLCBhbnlMb25nKCkpOwogCkBAIC0xMDA4LDcgKzEwMjIsNyBAQAogICAgICAgICBtU2VydmljZS5wcmVwYXJlUmVib290RXNjcm93KCk7CiAKICAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtU2VydmljZUNvbm5lY3Rpb24pOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogICAgICAgICB2ZXJpZnkobVNlcnZpY2VDb25uZWN0aW9uLCBuZXZlcigpKS53cmFwQmxvYihhbnkoKSwgYW55TG9uZygpLCBhbnlMb25nKCkpOwogCkBAIC0xMDY4LDcgKzEwODIsNyBAQAogICAgICAgICBtU2VydmljZS5wcmVwYXJlUmVib290RXNjcm93KCk7CiAKICAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtU2VydmljZUNvbm5lY3Rpb24pOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogICAgICAgICB2ZXJpZnkobVNlcnZpY2VDb25uZWN0aW9uLCBuZXZlcigpKS53cmFwQmxvYihhbnkoKSwgYW55TG9uZygpLCBhbnlMb25nKCkpOwogCkBAIC0xMTI0LDcgKzExMzgsNyBAQAogICAgICAgICBtU2VydmljZS5wcmVwYXJlUmVib290RXNjcm93KCk7CiAKICAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtU2VydmljZUNvbm5lY3Rpb24pOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogICAgICAgICB2ZXJpZnkobVNlcnZpY2VDb25uZWN0aW9uLCBuZXZlcigpKS53cmFwQmxvYihhbnkoKSwgYW55TG9uZygpLCBhbnlMb25nKCkpOwogCkBAIC0xMTc2LDcgKzExOTAsNyBAQAogICAgICAgICBtU2VydmljZS5wcmVwYXJlUmVib290RXNjcm93KCk7CiAKICAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtUmVib290RXNjcm93KTsKLSAgICAgICAgbVNlcnZpY2UuY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWQoUFJJTUFSWV9VU0VSX0lELCBGQUtFX1NQX1ZFUlNJT04sIEZBS0VfQVVUSF9UT0tFTik7CisgICAgICAgIGNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkQW5kV2FpdChQUklNQVJZX1VTRVJfSUQpOwogICAgICAgICB2ZXJpZnkobW9ja0xpc3RlbmVyKS5vblByZXBhcmVkRm9yUmVib290KGVxKHRydWUpKTsKIAogICAgICAgICB2ZXJpZnkobVJlYm9vdEVzY3JvdywgbmV2ZXIoKSkuc3RvcmVLZXkoYW55KCkpOwpAQCAtMTIwNyw3ICsxMjIxLDcgQEAKICAgICAgICAgbVNlcnZpY2UucHJlcGFyZVJlYm9vdEVzY3JvdygpOwogCiAgICAgICAgIGNsZWFySW52b2NhdGlvbnMobVJlYm9vdEVzY3Jvdyk7Ci0gICAgICAgIG1TZXJ2aWNlLmNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkKFBSSU1BUllfVVNFUl9JRCwgRkFLRV9TUF9WRVJTSU9OLCBGQUtFX0FVVEhfVE9LRU4pOworICAgICAgICBjYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZEFuZFdhaXQoUFJJTUFSWV9VU0VSX0lEKTsKICAgICAgICAgdmVyaWZ5KG1vY2tMaXN0ZW5lcikub25QcmVwYXJlZEZvclJlYm9vdChlcSh0cnVlKSk7CiAKICAgICAgICAgdmVyaWZ5KG1SZWJvb3RFc2Nyb3csIG5ldmVyKCkpLnN0b3JlS2V5KGFueSgpKTsKQEAgLTEyMzUsNyArMTI0OSw3IEBACiAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVSZWJvb3RFc2Nyb3coKTsKIAogICAgICAgICBjbGVhckludm9jYXRpb25zKG1SZWJvb3RFc2Nyb3cpOwotICAgICAgICBtU2VydmljZS5jYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZChQUklNQVJZX1VTRVJfSUQsIEZBS0VfU1BfVkVSU0lPTiwgRkFLRV9BVVRIX1RPS0VOKTsKKyAgICAgICAgY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWRBbmRXYWl0KFBSSU1BUllfVVNFUl9JRCk7CiAgICAgICAgIHZlcmlmeShtb2NrTGlzdGVuZXIpLm9uUHJlcGFyZWRGb3JSZWJvb3QoZXEodHJ1ZSkpOwogCiAgICAgICAgIHZlcmlmeShtUmVib290RXNjcm93LCBuZXZlcigpKS5zdG9yZUtleShhbnkoKSk7CkBAIC0xMjc0LDcgKzEyODgsNyBAQAogICAgICAgICBtU2VydmljZS5wcmVwYXJlUmVib290RXNjcm93KCk7CiAKICAgICAgICAgY2xlYXJJbnZvY2F0aW9ucyhtUmVib290RXNjcm93KTsKLSAgICAgICAgbVNlcnZpY2UuY2FsbFRvUmVib290RXNjcm93SWZOZWVkZWQoUFJJTUFSWV9VU0VSX0lELCBGQUtFX1NQX1ZFUlNJT04sIEZBS0VfQVVUSF9UT0tFTik7CisgICAgICAgIGNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkQW5kV2FpdChQUklNQVJZX1VTRVJfSUQpOwogICAgICAgICB2ZXJpZnkobW9ja0xpc3RlbmVyKS5vblByZXBhcmVkRm9yUmVib290KGVxKHRydWUpKTsKIAogICAgICAgICB2ZXJpZnkobVJlYm9vdEVzY3JvdywgbmV2ZXIoKSkuc3RvcmVLZXkoYW55KCkpOwpAQCAtMTMwOSw3ICsxMzIzLDcgQEAKICAgICAgICAgbVNlcnZpY2UucHJlcGFyZVJlYm9vdEVzY3JvdygpOwogCiAgICAgICAgIGNsZWFySW52b2NhdGlvbnMobVJlYm9vdEVzY3Jvdyk7Ci0gICAgICAgIG1TZXJ2aWNlLmNhbGxUb1JlYm9vdEVzY3Jvd0lmTmVlZGVkKFBSSU1BUllfVVNFUl9JRCwgRkFLRV9TUF9WRVJTSU9OLCBGQUtFX0FVVEhfVE9LRU4pOworICAgICAgICBjYWxsVG9SZWJvb3RFc2Nyb3dJZk5lZWRlZEFuZFdhaXQoUFJJTUFSWV9VU0VSX0lEKTsKICAgICAgICAgdmVyaWZ5KG1vY2tMaXN0ZW5lcikub25QcmVwYXJlZEZvclJlYm9vdChlcSh0cnVlKSk7CiAgICAgICAgIGFzc2VydFRydWUobVN0b3JhZ2UuaGFzUmVib290RXNjcm93KFBSSU1BUllfVVNFUl9JRCkpOwogICAgICAgICB2ZXJpZnkobVJlYm9vdEVzY3JvdywgbmV2ZXIoKSkuc3RvcmVLZXkoYW55KCkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BvbGljeS9EZXZpY2VTdGF0ZVByb3ZpZGVySW1wbFRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9wb2xpY3kvRGV2aWNlU3RhdGVQcm92aWRlckltcGxUZXN0LmphdmEKaW5kZXggNzEyNTc5Ni4uN2U0MGY5NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BvbGljeS9EZXZpY2VTdGF0ZVByb3ZpZGVySW1wbFRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG9saWN5L0RldmljZVN0YXRlUHJvdmlkZXJJbXBsVGVzdC5qYXZhCkBAIC0yMCw2ICsyMCw4IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0LlNFTlNPUl9TRVJWSUNFOwogCiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5EZXZpY2VTdGF0ZVByb3ZpZGVyLlNVUFBPUlRFRF9ERVZJQ0VfU1RBVEVTX0NIQU5HRURfSU5JVElBTElaRUQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5EZXZpY2VTdGF0ZVByb3ZpZGVyLlNVUFBPUlRFRF9ERVZJQ0VfU1RBVEVTX0NIQU5HRURfUE9XRVJfU0FWRV9ESVNBQkxFRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmRldmljZXN0YXRlLkRldmljZVN0YXRlUHJvdmlkZXIuU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9QT1dFUl9TQVZFX0VOQUJMRUQ7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VzdGF0ZS5EZXZpY2VTdGF0ZVByb3ZpZGVyLlNVUFBPUlRFRF9ERVZJQ0VfU1RBVEVTX0NIQU5HRURfVEhFUk1BTF9DUklUSUNBTDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLmRldmljZXN0YXRlLkRldmljZVN0YXRlUHJvdmlkZXIuU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9USEVSTUFMX05PUk1BTDsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLnBvbGljeS5EZXZpY2VTdGF0ZVByb3ZpZGVySW1wbC5ERUZBVUxUX0RFVklDRV9TVEFURTsKQEAgLTMyNyw3ICszMjksOCBAQAogICAgICAgICAgICAgICAgICsgIiAgICAgICAgPG5hbWU+VEhFUk1BTF9URVNUPC9uYW1lPlxuIgogICAgICAgICAgICAgICAgICsgIiAgICAgICAgPGZsYWdzPlxuIgogICAgICAgICAgICAgICAgICsgIiAgICAgICAgICAgIDxmbGFnPkZMQUdfRU1VTEFURURfT05MWTwvZmxhZz5cbiIKLSAgICAgICAgICAgICAgICArICIgICAgICAgICAgICA8ZmxhZz5GTEFHX0RJU0FCTEVfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTDwvZmxhZz5cbiIKKyAgICAgICAgICAgICAgICArICIgICAgICAgICAgICA8ZmxhZz5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUw8L2ZsYWc+XG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgICAgICAgPGZsYWc+RkxBR19VTlNVUFBPUlRFRF9XSEVOX1BPV0VSX1NBVkVfTU9ERTwvZmxhZz5cbiIKICAgICAgICAgICAgICAgICArICIgICAgICAgIDwvZmxhZ3M+XG4iCiAgICAgICAgICAgICAgICAgKyAiICAgIDwvZGV2aWNlLXN0YXRlPlxuIgogICAgICAgICAgICAgICAgICsgIjwvZGV2aWNlLXN0YXRlLWNvbmZpZz5cbiI7CkBAIC0zNTQsNyArMzU3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSgzLCAiT1BFTkVEIiwgMCAvKiBmbGFncyAqLyksCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGUoNCwgIlRIRVJNQUxfVEVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlLkZMQUdfRU1VTEFURURfT05MWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGV2aWNlU3RhdGUuRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXZpY2VTdGF0ZS5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREUpIH0sCiAgICAgICAgICAgICAgICAgbURldmljZVN0YXRlQXJyYXlDYXB0b3IuZ2V0VmFsdWUoKSk7CiAgICAgICAgIC8vIG9uU3RhdGVDaGFuZ2VkKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYmVjYXVzZSB0aGUgcHJvdmlkZXIgaGFzIG5vdCB5ZXQgYmVlbiBub3RpZmllZCBvZgogICAgICAgICAvLyB0aGUgaW5pdGlhbCBzZW5zb3Igc3RhdGUuCkBAIC00MTksNyArNDIzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSgzLCAiT1BFTkVEIiwgMCAvKiBmbGFncyAqLyksCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGUoNCwgIlRIRVJNQUxfVEVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlLkZMQUdfRU1VTEFURURfT05MWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGV2aWNlU3RhdGUuRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXZpY2VTdGF0ZS5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREUpIH0sCiAgICAgICAgICAgICAgICAgbURldmljZVN0YXRlQXJyYXlDYXB0b3IuZ2V0VmFsdWUoKSk7CiAgICAgICAgIE1vY2tpdG8uY2xlYXJJbnZvY2F0aW9ucyhsaXN0ZW5lcik7CiAKQEAgLTQ1MSw3ICs0NTYsNjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSgzLCAiT1BFTkVEIiwgMCAvKiBmbGFncyAqLyksCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGUoNCwgIlRIRVJNQUxfVEVTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlLkZMQUdfRU1VTEFURURfT05MWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGV2aWNlU3RhdGUuRkxBR19ESVNBQkxFX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXZpY2VTdGF0ZS5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9QT1dFUl9TQVZFX01PREUpIH0sCisgICAgICAgICAgICAgICAgbURldmljZVN0YXRlQXJyYXlDYXB0b3IuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X2ZsYWdEaXNhYmxlV2hlblBvd2VyU2F2ZUVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2Vuc29yIHNlbnNvciA9IG5ld1NlbnNvcigic2Vuc29yIiwgU2Vuc29yLlNUUklOR19UWVBFX0hJTkdFX0FOR0xFKTsKKyAgICAgICAgd2hlbihtU2Vuc29yTWFuYWdlci5nZXRTZW5zb3JMaXN0KGFueUludCgpKSkudGhlblJldHVybihMaXN0Lm9mKHNlbnNvcikpOworICAgICAgICBEZXZpY2VTdGF0ZVByb3ZpZGVySW1wbCBwcm92aWRlciA9IGNyZWF0ZV9zZW5zb3JCYXNlZFByb3ZpZGVyKHNlbnNvcik7CisKKyAgICAgICAgcHJvdmlkZXIub25Qb3dlclNhdmVNb2RlQ2hhbmdlZChmYWxzZSAvKiBpc1Bvd2VyU2F2ZU1vZGVFbmFibGVkICovKTsKKyAgICAgICAgRGV2aWNlU3RhdGVQcm92aWRlci5MaXN0ZW5lciBsaXN0ZW5lciA9IG1vY2soRGV2aWNlU3RhdGVQcm92aWRlci5MaXN0ZW5lci5jbGFzcyk7CisgICAgICAgIHByb3ZpZGVyLnNldExpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgICAgICB2ZXJpZnkobGlzdGVuZXIpLm9uU3VwcG9ydGVkRGV2aWNlU3RhdGVzQ2hhbmdlZChtRGV2aWNlU3RhdGVBcnJheUNhcHRvci5jYXB0dXJlKCksCisgICAgICAgICAgICAgICAgZXEoU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9JTklUSUFMSVpFRCkpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscygKKyAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGVbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSgxLCAiQ0xPU0VEIiwgMCAvKiBmbGFncyAqLyksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGUoMiwgIkhBTEZfT1BFTkVEIiwgMCAvKiBmbGFncyAqLyksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGUoMywgIk9QRU5FRCIsIDAgLyogZmxhZ3MgKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDQsICJUSEVSTUFMX1RFU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VTdGF0ZS5GTEFHX0VNVUxBVEVEX09OTFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERldmljZVN0YXRlLkZMQUdfVU5TVVBQT1JURURfV0hFTl9USEVSTUFMX1NUQVRVU19DUklUSUNBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGV2aWNlU3RhdGUuRkxBR19VTlNVUFBPUlRFRF9XSEVOX1BPV0VSX1NBVkVfTU9ERSkgfSwKKyAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVBcnJheUNhcHRvci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgTW9ja2l0by5jbGVhckludm9jYXRpb25zKGxpc3RlbmVyKTsKKworICAgICAgICBwcm92aWRlci5vblBvd2VyU2F2ZU1vZGVDaGFuZ2VkKGZhbHNlIC8qIGlzUG93ZXJTYXZlTW9kZUVuYWJsZWQgKi8pOworICAgICAgICB2ZXJpZnkobGlzdGVuZXIsIG5ldmVyKCkpLm9uU3VwcG9ydGVkRGV2aWNlU3RhdGVzQ2hhbmdlZChtRGV2aWNlU3RhdGVBcnJheUNhcHRvci5jYXB0dXJlKCksCisgICAgICAgICAgICAgICAgZXEoU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9JTklUSUFMSVpFRCkpOworICAgICAgICBNb2NraXRvLmNsZWFySW52b2NhdGlvbnMobGlzdGVuZXIpOworCisgICAgICAgIC8vIFRoZSBUSEVSTUFMX1RFU1Qgc3RhdGUgc2hvdWxkIGJlIGRpc2FibGVkIGR1ZSB0byBwb3dlciBzYXZlIGJlaW5nIGVuYWJsZWQuCisgICAgICAgIHByb3ZpZGVyLm9uUG93ZXJTYXZlTW9kZUNoYW5nZWQodHJ1ZSAvKiBpc1Bvd2VyU2F2ZU1vZGVFbmFibGVkICovKTsKKyAgICAgICAgdmVyaWZ5KGxpc3RlbmVyKS5vblN1cHBvcnRlZERldmljZVN0YXRlc0NoYW5nZWQobURldmljZVN0YXRlQXJyYXlDYXB0b3IuY2FwdHVyZSgpLAorICAgICAgICAgICAgICAgIGVxKFNVUFBPUlRFRF9ERVZJQ0VfU1RBVEVTX0NIQU5HRURfUE9XRVJfU0FWRV9FTkFCTEVEKSk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKAorICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZVtdeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDEsICJDTE9TRUQiLCAwIC8qIGZsYWdzICovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSgyLCAiSEFMRl9PUEVORUQiLCAwIC8qIGZsYWdzICovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSgzLCAiT1BFTkVEIiwgMCAvKiBmbGFncyAqLykgfSwKKyAgICAgICAgICAgICAgICBtRGV2aWNlU3RhdGVBcnJheUNhcHRvci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgTW9ja2l0by5jbGVhckludm9jYXRpb25zKGxpc3RlbmVyKTsKKworICAgICAgICAvLyBUaGUgVEhFUk1BTF9URVNUIHN0YXRlIHNob3VsZCBiZSByZS1lbmFibGVkLgorICAgICAgICBwcm92aWRlci5vblBvd2VyU2F2ZU1vZGVDaGFuZ2VkKGZhbHNlIC8qIGlzUG93ZXJTYXZlTW9kZUVuYWJsZWQgKi8pOworICAgICAgICB2ZXJpZnkobGlzdGVuZXIpLm9uU3VwcG9ydGVkRGV2aWNlU3RhdGVzQ2hhbmdlZChtRGV2aWNlU3RhdGVBcnJheUNhcHRvci5jYXB0dXJlKCksCisgICAgICAgICAgICAgICAgZXEoU1VQUE9SVEVEX0RFVklDRV9TVEFURVNfQ0hBTkdFRF9QT1dFUl9TQVZFX0RJU0FCTEVEKSk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKAorICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZVtdeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZVN0YXRlKDEsICJDTE9TRUQiLCAwIC8qIGZsYWdzICovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSgyLCAiSEFMRl9PUEVORUQiLCAwIC8qIGZsYWdzICovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VTdGF0ZSgzLCAiT1BFTkVEIiwgMCAvKiBmbGFncyAqLyksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlU3RhdGUoNCwgIlRIRVJNQUxfVEVTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlLkZMQUdfRU1VTEFURURfT05MWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGV2aWNlU3RhdGUuRkxBR19VTlNVUFBPUlRFRF9XSEVOX1RIRVJNQUxfU1RBVFVTX0NSSVRJQ0FMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXZpY2VTdGF0ZS5GTEFHX1VOU1VQUE9SVEVEX1dIRU5fUE9XRVJfU0FWRV9NT0RFKSB9LAogICAgICAgICAgICAgICAgIG1EZXZpY2VTdGF0ZUFycmF5Q2FwdG9yLmdldFZhbHVlKCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3ZpYnJhdG9yL0lucHV0RGV2aWNlRGVsZWdhdGVUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvdmlicmF0b3IvSW5wdXREZXZpY2VEZWxlZ2F0ZVRlc3QuamF2YQppbmRleCA2ZWRlZjc1Li4wN2I0MzQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvdmlicmF0b3IvSW5wdXREZXZpY2VEZWxlZ2F0ZVRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvdmlicmF0b3IvSW5wdXREZXZpY2VEZWxlZ2F0ZVRlc3QuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuaW5wdXQuSUlucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmlucHV0LklJbnB1dE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5pbnB1dC5JbnB1dE1hbmFnZXJHbG9iYWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5Db21iaW5lZFZpYnJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwpAQCAtODIsOCArODMsOCBAQAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtVGVzdExvb3BlciA9IG5ldyBUZXN0TG9vcGVyKCk7Ci0gICAgICAgIG1Db250ZXh0U3B5ID0gc3B5KG5ldyBDb250ZXh0V3JhcHBlcihJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkpKTsKICAgICAgICAgSW5wdXRNYW5hZ2VyIGlucHV0TWFuYWdlciA9IElucHV0TWFuYWdlci5yZXNldEluc3RhbmNlKG1JSW5wdXRNYW5hZ2VyTW9jayk7CisgICAgICAgIG1Db250ZXh0U3B5ID0gc3B5KG5ldyBDb250ZXh0V3JhcHBlcihJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRDb250ZXh0KCkpKTsKIAogICAgICAgICB3aGVuKG1Db250ZXh0U3B5LmdldFN5c3RlbVNlcnZpY2UoZXEoQ29udGV4dC5JTlBVVF9TRVJWSUNFKSkpLnRoZW5SZXR1cm4oaW5wdXRNYW5hZ2VyKTsKICAgICAgICAgZG9BbnN3ZXIoaW52b2NhdGlvbiAtPiBtSUlucHV0RGV2aWNlc0NoYW5nZWRMaXN0ZW5lciA9IGludm9jYXRpb24uZ2V0QXJndW1lbnQoMCkpCkBAIC0zMTQsNyArMzE1LDcgQEAKICAgICAgICAgICAgIGRldmljZUlkc0FuZEdlbmVyYXRpb25zW2kgKyAxXSA9IDI7IC8vIHVwZGF0ZSBieSBpbmNyZWFzaW5nIGl0J3MgZ2VuZXJhdGlvbiB0byAyLgogICAgICAgICB9CiAgICAgICAgIC8vIEZvcmNlIGluaXRpYWxpemF0aW9uIG9mIG1JSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyLCBpZiBpdCBzdGlsbCBoYXZlbid0Ci0gICAgICAgIElucHV0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldElucHV0RGV2aWNlSWRzKCk7CisgICAgICAgIElucHV0TWFuYWdlckdsb2JhbC5nZXRJbnN0YW5jZSgpLmdldElucHV0RGV2aWNlSWRzKCk7CiAgICAgICAgIG1JSW5wdXREZXZpY2VzQ2hhbmdlZExpc3RlbmVyLm9uSW5wdXREZXZpY2VzQ2hhbmdlZChkZXZpY2VJZHNBbmRHZW5lcmF0aW9ucyk7CiAgICAgICAgIC8vIE1ha2VzIHN1cmUgYWxsIGNhbGxiYWNrcyBmcm9tIElucHV0RGV2aWNlRGVsZWdhdGUgYXJlIGV4ZWN1dGVkLgogICAgICAgICBtVGVzdExvb3Blci5kaXNwYXRjaEFsbCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvdWlzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL0NvbmRpdGlvblByb3ZpZGVyc1Rlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3Vpc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9Db25kaXRpb25Qcm92aWRlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0ZWQwMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3Vpc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9Db25kaXRpb25Qcm92aWRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5ub3RpZmljYXRpb247CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmVxOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeU5vTW9yZUludGVyYWN0aW9uczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLklJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm5vdGlmaWNhdGlvbi5Db25kaXRpb247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuVWlTZXJ2aWNlVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworCitwdWJsaWMgY2xhc3MgQ29uZGl0aW9uUHJvdmlkZXJzVGVzdCBleHRlbmRzIFVpU2VydmljZVRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgQ29uZGl0aW9uUHJvdmlkZXJzIG1Qcm92aWRlcnM7CisKKyAgICBATW9jaworICAgIHByaXZhdGUgSVBhY2thZ2VNYW5hZ2VyIG1JcG07CisgICAgQE1vY2sKKyAgICBwcml2YXRlIE1hbmFnZWRTZXJ2aWNlcy5Vc2VyUHJvZmlsZXMgbVVzZXJQcm9maWxlczsKKyAgICBATW9jaworICAgIHByaXZhdGUgQ29uZGl0aW9uUHJvdmlkZXJzLkNhbGxiYWNrIG1DYWxsYmFjazsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKKworICAgICAgICBtUHJvdmlkZXJzID0gbmV3IENvbmRpdGlvblByb3ZpZGVycyhtQ29udGV4dCwgbVVzZXJQcm9maWxlcywgbUlwbSk7CisgICAgICAgIG1Qcm92aWRlcnMuc2V0Q2FsbGJhY2sobUNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNvbmRpdGlvbnNfZmluZENvbmRpdGlvbigpIHsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBjbiA9IG5ldyBDb21wb25lbnROYW1lKCJwYWNrYWdlIiwgImNscyIpOworICAgICAgICBNYW5hZ2VkU2VydmljZXMuTWFuYWdlZFNlcnZpY2VJbmZvIG1zaSA9IG1Qcm92aWRlcnMubmV3IE1hbmFnZWRTZXJ2aWNlSW5mbygKKyAgICAgICAgICAgICAgICBtb2NrKElJbnRlcmZhY2UuY2xhc3MpLCBjbiwgMCwgZmFsc2UsIG1vY2soU2VydmljZUNvbm5lY3Rpb24uY2xhc3MpLCAzMywgMTAwKTsKKyAgICAgICAgQ29uZGl0aW9uW10gY29uZGl0aW9ucyA9IG5ldyBDb25kaXRpb25bXSB7CisgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbihVcmkucGFyc2UoImEiKSwgInN1bW1hcnkiLCBDb25kaXRpb24uU1RBVEVfVFJVRSksCisgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbihVcmkucGFyc2UoImIiKSwgInN1bW1hcnkyIiwgQ29uZGl0aW9uLlNUQVRFX1RSVUUpCisgICAgICAgIH07CisKKyAgICAgICAgbVByb3ZpZGVycy5ub3RpZnlDb25kaXRpb25zKCJwYWNrYWdlIiwgbXNpLCBjb25kaXRpb25zKTsKKworICAgICAgICBhc3NlcnRUaGF0KG1Qcm92aWRlcnMuZmluZENvbmRpdGlvbihjbiwgVXJpLnBhcnNlKCJhIikpKS5pc0VxdWFsVG8oY29uZGl0aW9uc1swXSk7CisgICAgICAgIGFzc2VydFRoYXQobVByb3ZpZGVycy5maW5kQ29uZGl0aW9uKGNuLCBVcmkucGFyc2UoImIiKSkpLmlzRXF1YWxUbyhjb25kaXRpb25zWzFdKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtUHJvdmlkZXJzLmZpbmRDb25kaXRpb24obnVsbCwgVXJpLnBhcnNlKCJhIikpKS5pc051bGwoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtUHJvdmlkZXJzLmZpbmRDb25kaXRpb24oY24sIG51bGwpKS5pc051bGwoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNvbmRpdGlvbnNfY2FsbGJhY2tPbkNvbmRpdGlvbkNoYW5nZWQoKSB7CisgICAgICAgIE1hbmFnZWRTZXJ2aWNlcy5NYW5hZ2VkU2VydmljZUluZm8gbXNpID0gbVByb3ZpZGVycy5uZXcgTWFuYWdlZFNlcnZpY2VJbmZvKAorICAgICAgICAgICAgICAgIG1vY2soSUludGVyZmFjZS5jbGFzcyksIG5ldyBDb21wb25lbnROYW1lKCJwYWNrYWdlIiwgImNscyIpLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBtb2NrKFNlcnZpY2VDb25uZWN0aW9uLmNsYXNzKSwgMzMsIDEwMCk7CisgICAgICAgIENvbmRpdGlvbltdIGNvbmRpdGlvbnNUb05vdGlmeSA9IG5ldyBDb25kaXRpb25bXSB7CisgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbihVcmkucGFyc2UoImEiKSwgInN1bW1hcnkiLCBDb25kaXRpb24uU1RBVEVfVFJVRSksCisgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbihVcmkucGFyc2UoImIiKSwgInN1bW1hcnkyIiwgQ29uZGl0aW9uLlNUQVRFX1RSVUUpLAorICAgICAgICAgICAgICAgIG5ldyBDb25kaXRpb24oVXJpLnBhcnNlKCJjIiksICJzdW1tYXJ5MyIsIENvbmRpdGlvbi5TVEFURV9UUlVFKQorICAgICAgICB9OworCisgICAgICAgIG1Qcm92aWRlcnMubm90aWZ5Q29uZGl0aW9ucygicGFja2FnZSIsIG1zaSwgY29uZGl0aW9uc1RvTm90aWZ5KTsKKworICAgICAgICB2ZXJpZnkobUNhbGxiYWNrKS5vbkNvbmRpdGlvbkNoYW5nZWQoZXEoVXJpLnBhcnNlKCJhIikpLCBlcShjb25kaXRpb25zVG9Ob3RpZnlbMF0pKTsKKyAgICAgICAgdmVyaWZ5KG1DYWxsYmFjaykub25Db25kaXRpb25DaGFuZ2VkKGVxKFVyaS5wYXJzZSgiYiIpKSwgZXEoY29uZGl0aW9uc1RvTm90aWZ5WzFdKSk7CisgICAgICAgIHZlcmlmeShtQ2FsbGJhY2spLm9uQ29uZGl0aW9uQ2hhbmdlZChlcShVcmkucGFyc2UoImMiKSksIGVxKGNvbmRpdGlvbnNUb05vdGlmeVsyXSkpOworICAgICAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMobUNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNvbmRpdGlvbnNfZHVwbGljYXRlSWRzX2lnbm9yZWQoKSB7CisgICAgICAgIE1hbmFnZWRTZXJ2aWNlcy5NYW5hZ2VkU2VydmljZUluZm8gbXNpID0gbVByb3ZpZGVycy5uZXcgTWFuYWdlZFNlcnZpY2VJbmZvKAorICAgICAgICAgICAgICAgIG1vY2soSUludGVyZmFjZS5jbGFzcyksIG5ldyBDb21wb25lbnROYW1lKCJwYWNrYWdlIiwgImNscyIpLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBtb2NrKFNlcnZpY2VDb25uZWN0aW9uLmNsYXNzKSwgMzMsIDEwMCk7CisgICAgICAgIENvbmRpdGlvbltdIGNvbmRpdGlvbnNUb05vdGlmeSA9IG5ldyBDb25kaXRpb25bXSB7CisgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbihVcmkucGFyc2UoImEiKSwgInN1bW1hcnkiLCBDb25kaXRpb24uU1RBVEVfVFJVRSksCisgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbihVcmkucGFyc2UoImIiKSwgInN1bW1hcnkyIiwgQ29uZGl0aW9uLlNUQVRFX1RSVUUpLAorICAgICAgICAgICAgICAgIG5ldyBDb25kaXRpb24oVXJpLnBhcnNlKCJhIiksICJzdW1tYXJ5MyIsIENvbmRpdGlvbi5TVEFURV9GQUxTRSksCisgICAgICAgICAgICAgICAgbmV3IENvbmRpdGlvbihVcmkucGFyc2UoImEiKSwgInN1bW1hcnk0IiwgQ29uZGl0aW9uLlNUQVRFX0ZBTFNFKQorICAgICAgICB9OworCisgICAgICAgIG1Qcm92aWRlcnMubm90aWZ5Q29uZGl0aW9ucygicGFja2FnZSIsIG1zaSwgY29uZGl0aW9uc1RvTm90aWZ5KTsKKworICAgICAgICB2ZXJpZnkobUNhbGxiYWNrKS5vbkNvbmRpdGlvbkNoYW5nZWQoZXEoVXJpLnBhcnNlKCJhIikpLCBlcShjb25kaXRpb25zVG9Ob3RpZnlbMF0pKTsKKyAgICAgICAgdmVyaWZ5KG1DYWxsYmFjaykub25Db25kaXRpb25DaGFuZ2VkKGVxKFVyaS5wYXJzZSgiYiIpKSwgZXEoY29uZGl0aW9uc1RvTm90aWZ5WzFdKSk7CisKKyAgICAgICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKG1DYWxsYmFjayk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlDb25kaXRpb25zX251bGxJdGVtc19pZ25vcmVkKCkgeworICAgICAgICBNYW5hZ2VkU2VydmljZXMuTWFuYWdlZFNlcnZpY2VJbmZvIG1zaSA9IG1Qcm92aWRlcnMubmV3IE1hbmFnZWRTZXJ2aWNlSW5mbygKKyAgICAgICAgICAgICAgICBtb2NrKElJbnRlcmZhY2UuY2xhc3MpLCBuZXcgQ29tcG9uZW50TmFtZSgicGFja2FnZSIsICJjbHMiKSwgMCwgZmFsc2UsCisgICAgICAgICAgICAgICAgbW9jayhTZXJ2aWNlQ29ubmVjdGlvbi5jbGFzcyksIDMzLCAxMDApOworICAgICAgICBDb25kaXRpb25bXSBjb25kaXRpb25zVG9Ob3RpZnkgPSBuZXcgQ29uZGl0aW9uW10geworICAgICAgICAgICAgICAgIG5ldyBDb25kaXRpb24oVXJpLnBhcnNlKCJhIiksICJzdW1tYXJ5IiwgQ29uZGl0aW9uLlNUQVRFX1RSVUUpLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZGl0aW9uKFVyaS5wYXJzZSgiYiIpLCAic3VtbWFyeSIsIENvbmRpdGlvbi5TVEFURV9UUlVFKQorICAgICAgICB9OworCisgICAgICAgIG1Qcm92aWRlcnMubm90aWZ5Q29uZGl0aW9ucygicGFja2FnZSIsIG1zaSwgY29uZGl0aW9uc1RvTm90aWZ5KTsKKworICAgICAgICB2ZXJpZnkobUNhbGxiYWNrKS5vbkNvbmRpdGlvbkNoYW5nZWQoZXEoVXJpLnBhcnNlKCJhIikpLCBlcShjb25kaXRpb25zVG9Ob3RpZnlbMF0pKTsKKyAgICAgICAgdmVyaWZ5KG1DYWxsYmFjaykub25Db25kaXRpb25DaGFuZ2VkKGVxKFVyaS5wYXJzZSgiYiIpKSwgZXEoY29uZGl0aW9uc1RvTm90aWZ5WzNdKSk7CisgICAgICAgIHZlcmlmeU5vTW9yZUludGVyYWN0aW9ucyhtQ2FsbGJhY2spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3Vpc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3Vpc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZVRlc3QuamF2YQppbmRleCA0MWE5NTA0Li41Y2JkMTIwIDEwMDc1NQotLS0gYS9zZXJ2aWNlcy90ZXN0cy91aXNlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2VUZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvdWlzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCkBAIC0xMDQ0MSw2ICsxMDQ0MSwzMSBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZml4Q2FsbE5vdGlmaWNhdGlvbl93aXRoT25Hb2luZ0ZsYWdfc2hvdWxkTm90QmVOb25EaXNtaXNzaWJsZSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gR2l2ZW46IGEgY2FsbCBub3RpZmljYXRpb24gaGFzIHRoZSBmbGFnIEZMQUdfT05HT0lOR19FVkVOVCBzZXQKKyAgICAgICAgLy8gZmVhdHVyZSBmbGFnOiBBTExPV19ESVNNSVNTX09OR09JTkcgaXMgb24KKyAgICAgICAgbVRlc3RGbGFnUmVzb2x2ZXIuc2V0RmxhZ092ZXJyaWRlKEFMTE9XX0RJU01JU1NfT05HT0lORywgdHJ1ZSk7CisgICAgICAgIHdoZW4obVRlbGVjb21NYW5hZ2VyLmlzSW5NYW5hZ2VkQ2FsbCgpKS50aGVuUmV0dXJuKHRydWUpOworCisgICAgICAgIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lKCJjYWxsZXIiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihtQ29udGV4dCwgInRlc3QiKQorICAgICAgICAgICAgICAgIC5zZXRPbmdvaW5nKHRydWUpCisgICAgICAgICAgICAgICAgLnNldFN0eWxlKE5vdGlmaWNhdGlvbi5DYWxsU3R5bGUuZm9yT25nb2luZ0NhbGwoCisgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb24sIG1vY2soUGVuZGluZ0ludGVudC5jbGFzcykpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIC8vIFdoZW46IGZpeCB0aGUgbm90aWZpY2F0aW9uIHdpdGggTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UKKyAgICAgICAgbVNlcnZpY2UuZml4Tm90aWZpY2F0aW9uKG4sIFBLRywgInRhZyIsIDksIDAsIG1VaWQsIE5PVF9GT1JFR1JPVU5EX1NFUlZJQ0UpOworCisgICAgICAgIC8vIFRoZW46IHRoZSBub3RpZmljYXRpb24ncyBmbGFnIEZMQUdfTk9fRElTTUlTUyBzaG91bGQgYmUgc2V0CisgICAgICAgIGFzc2VydE5vdFNhbWUoMCwgbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX05PX0RJU01JU1MpOworICAgIH0KKworCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBmaXhOb25FeGVtcHROb3RpZmljYXRpb25fd2l0aE9uR29pbmdGbGFnX3Nob3VsZEJlRGlzbWlzc2libGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gR2l2ZW46IGEgbm9uLWV4ZW1wdCBub3RpZmljYXRpb24gaGFzIHRoZSBmbGFnIEZMQUdfT05HT0lOR19FVkVOVCBzZXQKICAgICAgICAgLy8gZmVhdHVyZSBmbGFnOiBBTExPV19ESVNNSVNTX09OR09JTkcgaXMgb24KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3Vpc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9WYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3Vpc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL25vdGlmaWNhdGlvbi9WYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZVRlc3QuamF2YQppbmRleCBkNzJjZmM3Li4wNTY0YTczIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy91aXNlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9ub3RpZmljYXRpb24vVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGVUZXN0LmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvdWlzZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbm90aWZpY2F0aW9uL1ZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSw4IEBACiAgKi8KIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLm5vdGlmaWNhdGlvbjsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC01MSw2ICs1Myw4IEBACiBpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5VaVNlcnZpY2VUZXN0Q2FzZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubm90aWZpY2F0aW9uLlZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlLkxvb2t1cFJlc3VsdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubm90aWZpY2F0aW9uLlZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlLlBlb3BsZVJhbmtpbmdSZWNvbnNpZGVyYXRpb247CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC02MCw2ICs2NCw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIEBTbWFsbFRlc3QKIEBSdW5XaXRoKEFuZHJvaWRKVW5pdDQuY2xhc3MpCkBAIC0yMTUsNyArMjIwLDcgQEAKICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzLkNPTlRFTlRfTE9PS1VQX1VSSSwKICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzLkVOVEVSUFJJU0VfQ09OVEFDVF9MT09LVVBfUFJFRklYICsgY29udGFjdElkKTsKIAotICAgICAgICBuZXcgVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUoKS5zZWFyY2hDb250YWN0cyhtb2NrQ29udGV4dCwgbG9va3VwVXJpKTsKKyAgICAgICAgUGVvcGxlUmFua2luZ1JlY29uc2lkZXJhdGlvbi5zZWFyY2hDb250YWN0cyhtb2NrQ29udGV4dCwgbG9va3VwVXJpKTsKIAogICAgICAgICBBcmd1bWVudENhcHRvcjxVcmk+IHF1ZXJ5VXJpID0gQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoVXJpLmNsYXNzKTsKICAgICAgICAgdmVyaWZ5KG1vY2tDb250ZW50UmVzb2x2ZXIpLnF1ZXJ5KApAQCAtMjQyLDcgKzI0Nyw3IEBACiAgICAgICAgIGZpbmFsIFVyaSBsb29rdXBVcmkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aCgKICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzLkNPTlRFTlRfTE9PS1VQX1VSSSwgU3RyaW5nLnZhbHVlT2YoY29udGFjdElkKSk7CiAKLSAgICAgICAgbmV3IFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlKCkuc2VhcmNoQ29udGFjdHMobW9ja0NvbnRleHQsIGxvb2t1cFVyaSk7CisgICAgICAgIFBlb3BsZVJhbmtpbmdSZWNvbnNpZGVyYXRpb24uc2VhcmNoQ29udGFjdHMobW9ja0NvbnRleHQsIGxvb2t1cFVyaSk7CiAKICAgICAgICAgQXJndW1lbnRDYXB0b3I8VXJpPiBxdWVyeVVyaSA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKFVyaS5jbGFzcyk7CiAgICAgICAgIHZlcmlmeShtb2NrQ29udGVudFJlc29sdmVyKS5xdWVyeSgKQEAgLTI3Nyw3ICsyODIsNyBAQAogCiAgICAgICAgIC8vIGNhbGwgc2VhcmNoQ29udGFjdHMgYW5kIHRoZW4gbWVyZ2VQaG9uZU51bWJlcnMsIG1ha2Ugc3VyZSB3ZSBuZXZlciBhY3R1YWxseQogICAgICAgICAvLyBxdWVyeSB0aGUgY29udGVudCByZXNvbHZlciBmb3IgYSBwaG9uZSBudW1iZXIKLSAgICAgICAgbmV3IFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlKCkuc2VhcmNoQ29udGFjdHNBbmRMb29rdXBOdW1iZXJzKG1vY2tDb250ZXh0LCBsb29rdXBVcmkpOworICAgICAgICBQZW9wbGVSYW5raW5nUmVjb25zaWRlcmF0aW9uLnNlYXJjaENvbnRhY3RzQW5kTG9va3VwTnVtYmVycyhtb2NrQ29udGV4dCwgbG9va3VwVXJpKTsKICAgICAgICAgdmVyaWZ5KG1vY2tDb250ZW50UmVzb2x2ZXIsIG5ldmVyKCkpLnF1ZXJ5KAogICAgICAgICAgICAgICAgIGVxKENvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lLkNPTlRFTlRfVVJJKSwKICAgICAgICAgICAgICAgICBlcShWYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZS5QSE9ORV9MT09LVVBfUFJPSkVDVElPTiksCkBAIC0zMjAsNyArMzI1LDcgQEAKIAogICAgICAgICAvLyBjYWxsIHNlYXJjaENvbnRhY3RzIGFuZCB0aGVuIG1lcmdlUGhvbmVOdW1iZXJzLCBhbmQgY2hlY2sgdGhhdCB3ZSBxdWVyeQogICAgICAgICAvLyBvbmNlIGZvciB0aGUKLSAgICAgICAgbmV3IFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlKCkuc2VhcmNoQ29udGFjdHNBbmRMb29rdXBOdW1iZXJzKG1vY2tDb250ZXh0LCBsb29rdXBVcmkpOworICAgICAgICBQZW9wbGVSYW5raW5nUmVjb25zaWRlcmF0aW9uLnNlYXJjaENvbnRhY3RzQW5kTG9va3VwTnVtYmVycyhtb2NrQ29udGV4dCwgbG9va3VwVXJpKTsKICAgICAgICAgdmVyaWZ5KG1vY2tDb250ZW50UmVzb2x2ZXIsIHRpbWVzKDEpKS5xdWVyeSgKICAgICAgICAgICAgICAgICBlcShDb250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZS5DT05URU5UX1VSSSksCiAgICAgICAgICAgICAgICAgZXEoVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUuUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04pLApAQCAtMzM5LDcgKzM0NCw3IEBACiAKICAgICAgICAgLy8gQ3JlYXRlIHZhbGlkYXRvciB3aXRoIGVtcHR5IGNhY2hlCiAgICAgICAgIFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlIHZucCA9IG5ldyBWYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZSgpOwotICAgICAgICBMcnVDYWNoZSBjYWNoZSA9IG5ldyBMcnVDYWNoZTxTdHJpbmcsIFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlLkxvb2t1cFJlc3VsdD4oNSk7CisgICAgICAgIExydUNhY2hlPFN0cmluZywgTG9va3VwUmVzdWx0PiBjYWNoZSA9IG5ldyBMcnVDYWNoZTw+KDUpOwogICAgICAgICB2bnAuaW5pdEZvclRlc3RzKG1vY2tDb250ZXh0LCBtb2NrTm90aWZpY2F0aW9uVXNhZ2VTdGF0cywgY2FjaGUpOwogCiAgICAgICAgIE5vdGlmaWNhdGlvblJlY29yZCByZWNvcmQgPSBnZXROb3RpZmljYXRpb25SZWNvcmQoKTsKQEAgLTM2Niw5ICszNzEsOCBAQAogICAgICAgICBmbG9hdCBhZmZpbml0eSA9IDAuN2Y7CiAKICAgICAgICAgLy8gQ3JlYXRlIGEgZmFrZSBMb29rdXBSZXN1bHQgZm9yIHRoZSBkYXRhIHdlJ2xsIHBhc3MgaW4KLSAgICAgICAgTHJ1Q2FjaGUgY2FjaGUgPSBuZXcgTHJ1Q2FjaGU8U3RyaW5nLCBWYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZS5Mb29rdXBSZXN1bHQ+KDUpOwotICAgICAgICBWYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZS5Mb29rdXBSZXN1bHQgbHIgPQotICAgICAgICAgICAgICAgIG1vY2soVmFsaWRhdGVOb3RpZmljYXRpb25QZW9wbGUuTG9va3VwUmVzdWx0LmNsYXNzKTsKKyAgICAgICAgTHJ1Q2FjaGU8U3RyaW5nLCBMb29rdXBSZXN1bHQ+IGNhY2hlID0gbmV3IExydUNhY2hlPD4oNSk7CisgICAgICAgIExvb2t1cFJlc3VsdCBsciA9IG1vY2soTG9va3VwUmVzdWx0LmNsYXNzKTsKICAgICAgICAgd2hlbihsci5nZXRBZmZpbml0eSgpKS50aGVuUmV0dXJuKGFmZmluaXR5KTsKICAgICAgICAgd2hlbihsci5nZXRQaG9uZU51bWJlcnMoKSkudGhlblJldHVybihuZXcgQXJyYXlTZXQ8PihuZXcgU3RyaW5nW117bG9va3VwVGVsfSkpOwogICAgICAgICB3aGVuKGxyLmlzRXhwaXJlZCgpKS50aGVuUmV0dXJuKGZhbHNlKTsKQEAgLTM5Miw2ICszOTYsMjMgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShyZWNvcmQuZ2V0UGhvbmVOdW1iZXJzKCkuY29udGFpbnMobG9va3VwVGVsKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVBlb3BsZV9yZWNvbnNpZGVyYXRpb25XaWxsTm90QmVEZWxheWVkKCkgeworICAgICAgICBmaW5hbCBDb250ZXh0IG1vY2tDb250ZXh0ID0gbW9jayhDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIG1vY2tDb250ZW50UmVzb2x2ZXIgPSBtb2NrKENvbnRlbnRSZXNvbHZlci5jbGFzcyk7CisgICAgICAgIHdoZW4obW9ja0NvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkpLnRoZW5SZXR1cm4obW9ja0NvbnRlbnRSZXNvbHZlcik7CisgICAgICAgIFZhbGlkYXRlTm90aWZpY2F0aW9uUGVvcGxlIHZucCA9IG5ldyBWYWxpZGF0ZU5vdGlmaWNhdGlvblBlb3BsZSgpOworICAgICAgICB2bnAuaW5pdEZvclRlc3RzKG1vY2tDb250ZXh0LCBtb2NrKE5vdGlmaWNhdGlvblVzYWdlU3RhdHMuY2xhc3MpLCBuZXcgTHJ1Q2FjaGU8Pig1KSk7CisgICAgICAgIE5vdGlmaWNhdGlvblJlY29yZCByZWNvcmQgPSBnZXROb3RpZmljYXRpb25SZWNvcmQoKTsKKyAgICAgICAgU3RyaW5nW10gY2FsbE51bWJlciA9IG5ldyBTdHJpbmdbXXsidGVsOjEyMzQ1Njc4OTEwIn07CisgICAgICAgIHNldE5vdGlmaWNhdGlvblBlb3BsZShyZWNvcmQsIGNhbGxOdW1iZXIpOworCisgICAgICAgIFJhbmtpbmdSZWNvbnNpZGVyYXRpb24gcnIgPSB2bnAudmFsaWRhdGVQZW9wbGUobW9ja0NvbnRleHQsIHJlY29yZCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChycikuaXNOb3ROdWxsKCk7CisgICAgICAgIGFzc2VydFRoYXQocnIuZ2V0RGVsYXkoVGltZVVuaXQuTUlMTElTRUNPTkRTKSkuaXNFcXVhbFRvKDApOworICAgIH0KKwogICAgIC8vIENyZWF0ZXMgYSBjdXJzb3IgdGhhdCBwb2ludHMgdG8gb25lIGl0ZW0gb2YgQ29udGFjdHMgZGF0YSB3aXRoIHRoZSBzcGVjaWZpZWQKICAgICAvLyBjb2x1bW5zLgogICAgIHByaXZhdGUgQ3Vyc29yIG1ha2VNb2NrQ3Vyc29yKGludCBpZCwgU3RyaW5nIGxvb2t1cEtleSwgaW50IHN0YXJyZWQsIGludCBoYXNQaG9uZSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FwcFRyYW5zaXRpb25Db250cm9sbGVyVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL0FwcFRyYW5zaXRpb25Db250cm9sbGVyVGVzdC5qYXZhCmluZGV4IGM3MzIzN2UuLjBhZTU3OWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9BcHBUcmFuc2l0aW9uQ29udHJvbGxlclRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQXBwVHJhbnNpdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEKQEAgLTM3Niw0NiArMzc2LDYgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmltYXRpb25UYXJnZXRzX3dpbmRvd3NBcmVCZWluZ1JlcGxhY2VkKCkgewotICAgICAgICAvLyBbRGlzcGxheUNvbnRlbnRdIC0rLSBbVGFzazFdIC0gW0FjdGl2aXR5UmVjb3JkMV0gKG9wZW5pbmcsIHZpc2libGUpCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0gW0FwcFdpbmRvdzFdIChiZWluZy1yZXBsYWNlZCkKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgKy0gW1Rhc2syXSAtIFtBY3Rpdml0eVJlY29yZDJdIChjbG9zaW5nLCBpbnZpc2libGUpCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0gW0FwcFdpbmRvdzJdIChiZWluZy1yZXBsYWNlZCkKLSAgICAgICAgZmluYWwgQWN0aXZpdHlSZWNvcmQgYWN0aXZpdHkxID0gY3JlYXRlQWN0aXZpdHlSZWNvcmQobURpc3BsYXlDb250ZW50KTsKLSAgICAgICAgZmluYWwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgVFlQRV9CQVNFX0FQUExJQ0FUSU9OKTsKLSAgICAgICAgYXR0cnMuc2V0VGl0bGUoIkFwcFdpbmRvdzEiKTsKLSAgICAgICAgZmluYWwgVGVzdFdpbmRvd1N0YXRlIGFwcFdpbmRvdzEgPSBjcmVhdGVXaW5kb3dTdGF0ZShhdHRycywgYWN0aXZpdHkxKTsKLSAgICAgICAgYXBwV2luZG93MS5tV2lsbFJlcGxhY2VXaW5kb3cgPSB0cnVlOwotICAgICAgICBhY3Rpdml0eTEuYWRkV2luZG93KGFwcFdpbmRvdzEpOwotCi0gICAgICAgIGZpbmFsIEFjdGl2aXR5UmVjb3JkIGFjdGl2aXR5MiA9IGNyZWF0ZUFjdGl2aXR5UmVjb3JkKG1EaXNwbGF5Q29udGVudCk7Ci0gICAgICAgIGFjdGl2aXR5Mi5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgYWN0aXZpdHkyLnNldFZpc2libGVSZXF1ZXN0ZWQoZmFsc2UpOwotICAgICAgICBhdHRycy5zZXRUaXRsZSgiQXBwV2luZG93MiIpOwotICAgICAgICBmaW5hbCBUZXN0V2luZG93U3RhdGUgYXBwV2luZG93MiA9IGNyZWF0ZVdpbmRvd1N0YXRlKGF0dHJzLCBhY3Rpdml0eTIpOwotICAgICAgICBhcHBXaW5kb3cyLm1XaWxsUmVwbGFjZVdpbmRvdyA9IHRydWU7Ci0gICAgICAgIGFjdGl2aXR5Mi5hZGRXaW5kb3coYXBwV2luZG93Mik7Ci0KLSAgICAgICAgZmluYWwgQXJyYXlTZXQ8QWN0aXZpdHlSZWNvcmQ+IG9wZW5pbmcgPSBuZXcgQXJyYXlTZXQ8PigpOwotICAgICAgICBvcGVuaW5nLmFkZChhY3Rpdml0eTEpOwotICAgICAgICBmaW5hbCBBcnJheVNldDxBY3Rpdml0eVJlY29yZD4gY2xvc2luZyA9IG5ldyBBcnJheVNldDw+KCk7Ci0gICAgICAgIGNsb3NpbmcuYWRkKGFjdGl2aXR5Mik7Ci0KLSAgICAgICAgLy8gQW5pbWF0ZSBvcGVuaW5nIGFwcHMgZXZlbiBpZiBpdCdzIGFscmVhZHkgdmlzaWJsZSBpbiBjYXNlIGl0cyB3aW5kb3dzIGFyZSBiZWluZyByZXBsYWNlZC4KLSAgICAgICAgLy8gRG9uJ3QgYW5pbWF0ZSBjbG9zaW5nIGFwcHMgaWYgaXQncyBhbHJlYWR5IGludmlzaWJsZSBldmVuIHRob3VnaCBpdHMgd2luZG93cyBhcmUgYmVpbmcKLSAgICAgICAgLy8gcmVwbGFjZWQuCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlTZXQ8PihuZXcgV2luZG93Q29udGFpbmVyW117YWN0aXZpdHkxLmdldFJvb3RUYXNrKCl9KSwKLSAgICAgICAgICAgICAgICBBcHBUcmFuc2l0aW9uQ29udHJvbGxlci5nZXRBbmltYXRpb25UYXJnZXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmluZywgY2xvc2luZywgdHJ1ZSAvKiB2aXNpYmxlICovKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlTZXQ8PihuZXcgV2luZG93Q29udGFpbmVyW117fSksCi0gICAgICAgICAgICAgICAgQXBwVHJhbnNpdGlvbkNvbnRyb2xsZXIuZ2V0QW5pbWF0aW9uVGFyZ2V0cygKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5pbmcsIGNsb3NpbmcsIGZhbHNlIC8qIHZpc2libGUgKi8pKTsKLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmltYXRpb25UYXJnZXRzX29wZW5pbmdDbG9zaW5nSW5EaWZmZXJlbnRUYXNrKCkgewogICAgICAgICAvLyBbRGlzcGxheUNvbnRlbnRdIC0rLSBbVGFzazFdIC0rLSBbQWN0aXZpdHlSZWNvcmQxXSAob3BlbmluZywgaW52aXNpYmxlKQogICAgICAgICAvLyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICArLSBbQWN0aXZpdHlSZWNvcmQyXSAoaW52aXNpYmxlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL0xldHRlcmJveFVpQ29udHJvbGxlclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9MZXR0ZXJib3hVaUNvbnRyb2xsZXJUZXN0LmphdmEKaW5kZXggMDZiNmVkOC4uZGEwNzhhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL0xldHRlcmJveFVpQ29udHJvbGxlclRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vTGV0dGVyYm94VWlDb250cm9sbGVyVGVzdC5qYXZhCkBAIC00NTksOCArNDU5LDE3IEBACiAgICAgICAgIG1haW5XaW5kb3cubUludkdsb2JhbFNjYWxlID0gaW52R2xvYmFsU2NhbGU7CiAgICAgICAgIG1MZXR0ZXJib3hDb25maWd1cmF0aW9uLnNldExldHRlcmJveEFjdGl2aXR5Q29ybmVyc1JhZGl1cyhjb25maWd1cmF0aW9uUmFkaXVzKTsKIAorICAgICAgICBkb1JldHVybih0cnVlKS53aGVuKG1BY3Rpdml0eSkuaXNJbkxldHRlcmJveEFuaW1hdGlvbigpOwogICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSYWRpdXMsIG1Db250cm9sbGVyLmdldFJvdW5kZWRDb3JuZXJzUmFkaXVzKG1haW5XaW5kb3cpKTsKIAorICAgICAgICBkb1JldHVybihmYWxzZSkud2hlbihtQWN0aXZpdHkpLmlzSW5MZXR0ZXJib3hBbmltYXRpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmFkaXVzLCBtQ29udHJvbGxlci5nZXRSb3VuZGVkQ29ybmVyc1JhZGl1cyhtYWluV2luZG93KSk7CisKKyAgICAgICAgZG9SZXR1cm4oZmFsc2UpLndoZW4obWFpbldpbmRvdykuaXNPblNjcmVlbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUNvbnRyb2xsZXIuZ2V0Um91bmRlZENvcm5lcnNSYWRpdXMobWFpbldpbmRvdykpOworCisgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4obUFjdGl2aXR5KS5pc0luTGV0dGVyYm94QW5pbWF0aW9uKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJhZGl1cywgbUNvbnRyb2xsZXIuZ2V0Um91bmRlZENvcm5lcnNSYWRpdXMobWFpbldpbmRvdykpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC00OTUsNiArNTA0LDcgQEAKICAgICAgICAgICAgIGluc2V0cy5hZGRTb3VyY2UodGFza2Jhcik7CiAgICAgICAgIH0KICAgICAgICAgZG9SZXR1cm4obUxldHRlcmJveGVkUG9ydHJhaXRUYXNrQm91bmRzKS53aGVuKG1BY3Rpdml0eSkuZ2V0Qm91bmRzKCk7CisgICAgICAgIGRvUmV0dXJuKGZhbHNlKS53aGVuKG1BY3Rpdml0eSkuaXNJbkxldHRlcmJveEFuaW1hdGlvbigpOwogICAgICAgICBkb1JldHVybih0cnVlKS53aGVuKG1BY3Rpdml0eSkuaXNWaXNpYmxlKCk7CiAgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4obUFjdGl2aXR5KS5pc0xldHRlcmJveGVkRm9yRml4ZWRPcmllbnRhdGlvbkFuZEFzcGVjdFJhdGlvKCk7CiAgICAgICAgIGRvUmV0dXJuKGluc2V0cykud2hlbihtYWluV2luZG93KS5nZXRJbnNldHNTdGF0ZSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1NpemVDb21wYXRUZXN0cy5qYXZhIGIvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1NpemVDb21wYXRUZXN0cy5qYXZhCmluZGV4IDc1M2NjNjIuLjJjYzQ2YTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9TaXplQ29tcGF0VGVzdHMuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU2l6ZUNvbXBhdFRlc3RzLmphdmEKQEAgLTUxLDYgKzUxLDcgQEAKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5GcmFtZXdvcmtTdGF0c0xvZy5BUFBfQ09NUEFUX1NUQVRFX0NIQU5HRURfX1NUQVRFX19MRVRURVJCT1hFRF9GT1JfU0laRV9DT01QQVRfTU9ERTsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5GcmFtZXdvcmtTdGF0c0xvZy5BUFBfQ09NUEFUX1NUQVRFX0NIQU5HRURfX1NUQVRFX19OT1RfTEVUVEVSQk9YRUQ7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuRnJhbWV3b3JrU3RhdHNMb2cuQVBQX0NPTVBBVF9TVEFURV9DSEFOR0VEX19TVEFURV9fTk9UX1ZJU0lCTEU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci53bS5BY3Rpdml0eVJlY29yZC5TdGF0ZS5QQVVTRUQ7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci53bS5BY3Rpdml0eVJlY29yZC5TdGF0ZS5SRVNUQVJUSU5HX1BST0NFU1M7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci53bS5BY3Rpdml0eVJlY29yZC5TdGF0ZS5SRVNVTUVEOwogaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIud20uQWN0aXZpdHlSZWNvcmQuU3RhdGUuU1RPUFBFRDsKQEAgLTM5MTgsNiArMzkxOSwyNCBAQAogICAgICAgICBhc3NlcnRUcnVlKG1BY3Rpdml0eS5pblNpemVDb21wYXRNb2RlKCkpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvcEFjdGl2aXR5SW5TaXplQ29tcGF0TW9kZV9wYXVzZWRBbmRJblNpemVDb21wYXRNb2RlX3JldHVybnNUcnVlKCkgeworICAgICAgICBzZXRVcERpc3BsYXlTaXplV2l0aEFwcCgxMDAwLCAyNTAwKTsKKyAgICAgICAgbUFjdGl2aXR5Lm1EaXNwbGF5Q29udGVudC5zZXRJZ25vcmVPcmllbnRhdGlvblJlcXVlc3QodHJ1ZSAvKiBpZ25vcmVPcmllbnRhdGlvblJlcXVlc3QgKi8pOworCisgICAgICAgIHNweU9uKG1BY3Rpdml0eSk7CisgICAgICAgIGRvUmV0dXJuKG1UYXNrKS53aGVuKG1BY3Rpdml0eSkuZ2V0T3JnYW5pemVkVGFzaygpOworICAgICAgICBwcmVwYXJlVW5yZXNpemFibGUobUFjdGl2aXR5LCBTQ1JFRU5fT1JJRU5UQVRJT05fUE9SVFJBSVQpOworCisgICAgICAgIHJvdGF0ZURpc3BsYXkobUFjdGl2aXR5Lm1EaXNwbGF5Q29udGVudCwgUk9UQVRJT05fOTApOworICAgICAgICBtQWN0aXZpdHkuc2V0U3RhdGUoUEFVU0VELCAidGVzdCIpOworCisgICAgICAgIGFzc2VydFRydWUobUFjdGl2aXR5LmluU2l6ZUNvbXBhdE1vZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtQWN0aXZpdHkuZ2V0U3RhdGUoKSwgUEFVU0VEKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtQWN0aXZpdHkuaXNWaXNpYmxlKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1UYXNrLmdldFRhc2tJbmZvKCkudG9wQWN0aXZpdHlJblNpemVDb21wYXQpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRlc3RzIHRoYXQgYWxsIHRocmVlIHBhdGhzIGluIHdoaWNoIGFzcGVjdCByYXRpbyBsb2dpYyBjYW4gYmUgYXBwbGllZCB5aWVsZCB0aGUgc2FtZQogICAgICAqIHJlc3VsdCwgd2hpY2ggaXMgdGhhdCBhc3BlY3QgcmF0aW8gaXMgcmVzcGVjdGVkIG9uIGFwcCBib3VuZHMuIFRoZSB0aHJlZSBwYXRocyBhcmUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UcmFuc2l0aW9uVGVzdHMuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9UcmFuc2l0aW9uVGVzdHMuamF2YQppbmRleCBkZWJmYzg0Li42MTZkNTI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vVHJhbnNpdGlvblRlc3RzLmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1RyYW5zaXRpb25UZXN0cy5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQud2luZG93LlRyYW5zaXRpb25JbmZvLkZMQUdfVFJBTlNMVUNFTlQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQud2luZG93LlRyYW5zaXRpb25JbmZvLmlzSW5kZXBlbmRlbnQ7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuZHgubW9ja2l0by5pbmxpbmUuZXh0ZW5kZWQuRXh0ZW5kZWRNb2NraXRvLmRvQ2FsbFJlYWxNZXRob2Q7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmR4Lm1vY2tpdG8uaW5saW5lLmV4dGVuZGVkLkV4dGVuZGVkTW9ja2l0by5kb05vdGhpbmc7CiBpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmR4Lm1vY2tpdG8uaW5saW5lLmV4dGVuZGVkLkV4dGVuZGVkTW9ja2l0by5kb1JldHVybjsKIGltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuZHgubW9ja2l0by5pbmxpbmUuZXh0ZW5kZWQuRXh0ZW5kZWRNb2NraXRvLnNweU9uOwpAQCAtNTQsNiArNTUsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUJvb2xlYW47CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55SW50OwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmVxOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CkBAIC01MjAsNiArNTIyLDQ3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSW5mb19NdWx0aURpc3BsYXkoKSB7CisgICAgICAgIERpc3BsYXlDb250ZW50IG90aGVyRGlzcGxheSA9IGNyZWF0ZU5ld0Rpc3BsYXkoKTsKKyAgICAgICAgZmluYWwgVHJhbnNpdGlvbiB0cmFuc2l0aW9uID0gY3JlYXRlVGVzdFRyYW5zaXRpb24oVFJBTlNJVF9PUEVOKTsKKyAgICAgICAgQXJyYXlNYXA8V2luZG93Q29udGFpbmVyLCBUcmFuc2l0aW9uLkNoYW5nZUluZm8+IGNoYW5nZXMgPSB0cmFuc2l0aW9uLm1DaGFuZ2VzOworICAgICAgICBBcnJheVNldDxXaW5kb3dDb250YWluZXI+IHBhcnRpY2lwYW50cyA9IHRyYW5zaXRpb24ubVBhcnRpY2lwYW50czsKKworICAgICAgICBmaW5hbCBUYXNrIGRpc3BsYXkwVGFzayA9IGNyZWF0ZVRhc2sobURpc3BsYXlDb250ZW50KTsKKyAgICAgICAgZmluYWwgVGFzayBkaXNwbGF5MVRhc2sgPSBjcmVhdGVUYXNrKG90aGVyRGlzcGxheSk7CisgICAgICAgIC8vIFN0YXJ0IHN0YXRlcy4KKyAgICAgICAgY2hhbmdlcy5wdXQoZGlzcGxheTBUYXNrLAorICAgICAgICAgICAgICAgIG5ldyBUcmFuc2l0aW9uLkNoYW5nZUluZm8oZGlzcGxheTBUYXNrLCBmYWxzZSAvKiB2aXMgKi8sIHRydWUgLyogZXhDaGcgKi8pKTsKKyAgICAgICAgY2hhbmdlcy5wdXQoZGlzcGxheTFUYXNrLAorICAgICAgICAgICAgICAgIG5ldyBUcmFuc2l0aW9uLkNoYW5nZUluZm8oZGlzcGxheTFUYXNrLCBmYWxzZSAvKiB2aXMgKi8sIHRydWUgLyogZXhDaGcgKi8pKTsKKyAgICAgICAgZmlsbENoYW5nZU1hcChjaGFuZ2VzLCBkaXNwbGF5MFRhc2spOworICAgICAgICBmaWxsQ2hhbmdlTWFwKGNoYW5nZXMsIGRpc3BsYXkxVGFzayk7CisgICAgICAgIC8vIEVuZCBzdGF0ZXMuCisgICAgICAgIGRpc3BsYXkwVGFzay5zZXRWaXNpYmxlUmVxdWVzdGVkKHRydWUpOworICAgICAgICBkaXNwbGF5MVRhc2suc2V0VmlzaWJsZVJlcXVlc3RlZCh0cnVlKTsKKworICAgICAgICBmaW5hbCBpbnQgdHJhbnNpdCA9IHRyYW5zaXRpb24ubVR5cGU7CisgICAgICAgIGludCBmbGFncyA9IDA7CisKKyAgICAgICAgcGFydGljaXBhbnRzLmFkZChkaXNwbGF5MFRhc2spOworICAgICAgICBwYXJ0aWNpcGFudHMuYWRkKGRpc3BsYXkxVGFzayk7CisgICAgICAgIEFycmF5TGlzdDxUcmFuc2l0aW9uLkNoYW5nZUluZm8+IHRhcmdldHMgPQorICAgICAgICAgICAgICAgIFRyYW5zaXRpb24uY2FsY3VsYXRlVGFyZ2V0cyhwYXJ0aWNpcGFudHMsIGNoYW5nZXMpOworICAgICAgICBUcmFuc2l0aW9uSW5mbyBpbmZvID0gVHJhbnNpdGlvbi5jYWxjdWxhdGVUcmFuc2l0aW9uSW5mbyh0cmFuc2l0LCBmbGFncywgdGFyZ2V0cywgbU1vY2tUKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluZm8uZ2V0Um9vdENvdW50KCkpOworICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBhc3NpZ25lZCB0byB0aGUgY29ycmVjdCBkaXNwbGF5CisgICAgICAgIGFzc2VydEVxdWFscyhtRGlzcGxheUNvbnRlbnQuZ2V0RGlzcGxheUlkKCksIGluZm8uZ2V0Q2hhbmdlKAorICAgICAgICAgICAgICAgIGRpc3BsYXkwVGFzay5tUmVtb3RlVG9rZW4udG9XaW5kb3dDb250YWluZXJUb2tlbigpKS5nZXRFbmREaXNwbGF5SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvdGhlckRpc3BsYXkuZ2V0RGlzcGxheUlkKCksIGluZm8uZ2V0Q2hhbmdlKAorICAgICAgICAgICAgICAgIGRpc3BsYXkxVGFzay5tUmVtb3RlVG9rZW4udG9XaW5kb3dDb250YWluZXJUb2tlbigpKS5nZXRFbmREaXNwbGF5SWQoKSk7CisgICAgICAgIC8vIENoZWNrIHRoYXQgcm9vdHMgY2FuIGJlIGZvdW5kIGJ5IGRpc3BsYXkgYW5kIGhhdmUgdGhlIGNvcnJlY3QgZGlzcGxheQorICAgICAgICBhc3NlcnRFcXVhbHMobURpc3BsYXlDb250ZW50LmdldERpc3BsYXlJZCgpLAorICAgICAgICAgICAgICAgIGluZm8uZ2V0Um9vdChpbmZvLmZpbmRSb290SW5kZXgobURpc3BsYXlDb250ZW50LmdldERpc3BsYXlJZCgpKSkuZ2V0RGlzcGxheUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob3RoZXJEaXNwbGF5LmdldERpc3BsYXlJZCgpLAorICAgICAgICAgICAgICAgIGluZm8uZ2V0Um9vdChpbmZvLmZpbmRSb290SW5kZXgob3RoZXJEaXNwbGF5LmdldERpc3BsYXlJZCgpKSkuZ2V0RGlzcGxheUlkKCkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRhcmdldHNfbm9JbnRlcm1lZGlhdGVzVG9XYWxscGFwZXIoKSB7CiAgICAgICAgIGZpbmFsIFRyYW5zaXRpb24gdHJhbnNpdGlvbiA9IGNyZWF0ZVRlc3RUcmFuc2l0aW9uKFRSQU5TSVRfT1BFTik7CiAKQEAgLTEzNTAsNyArMTM5Myw3IEBACiAKICAgICAgICAgdmVyaWZ5KHNuYXBzaG90Q29udHJvbGxlciwgdGltZXMoMSkpLnJlY29yZFNuYXBzaG90KGVxKHRhc2syKSwgZXEoZmFsc2UpKTsKIAotICAgICAgICBvcGVuVHJhbnNpdGlvbi5maW5pc2hUcmFuc2l0aW9uKCk7CisgICAgICAgIGNvbnRyb2xsZXIuZmluaXNoVHJhbnNpdGlvbihvcGVuVHJhbnNpdGlvbik7CiAKICAgICAgICAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byBzaW11bGF0ZSBjbG9zaW5nIHRhc2sxIHRvIHJldHVybiBiYWNrIHRvIChvcGVuKSB0YXNrMi4KICAgICAgICAgZmluYWwgVHJhbnNpdGlvbiBjbG9zZVRyYW5zaXRpb24gPSBjb250cm9sbGVyLmNyZWF0ZVRyYW5zaXRpb24oVFJBTlNJVF9DTE9TRSk7CkBAIC0xMzU5LDcgKzE0MDIsMTMgQEAKICAgICAgICAgY2xvc2VUcmFuc2l0aW9uLmNvbGxlY3RFeGlzdGVuY2VDaGFuZ2UoYWN0aXZpdHkxKTsKICAgICAgICAgY2xvc2VUcmFuc2l0aW9uLmNvbGxlY3RFeGlzdGVuY2VDaGFuZ2UodGFzazIpOwogICAgICAgICBjbG9zZVRyYW5zaXRpb24uY29sbGVjdEV4aXN0ZW5jZUNoYW5nZShhY3Rpdml0eTIpOwotICAgICAgICBjbG9zZVRyYW5zaXRpb24uc2V0VHJhbnNpZW50TGF1bmNoKGFjdGl2aXR5MiwgbnVsbCAvKiByZXN0b3JlQmVsb3cgKi8pOworICAgICAgICBjbG9zZVRyYW5zaXRpb24uc2V0VHJhbnNpZW50TGF1bmNoKGFjdGl2aXR5MiwgdGFzazEpOworICAgICAgICBmaW5hbCBUcmFuc2l0aW9uLkNoYW5nZUluZm8gdGFzazFDaGFuZ2VJbmZvID0gY2xvc2VUcmFuc2l0aW9uLm1DaGFuZ2VzLmdldCh0YXNrMSk7CisgICAgICAgIGFzc2VydE5vdE51bGwodGFzazFDaGFuZ2VJbmZvKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXNrMUNoYW5nZUluZm8uaGFzQ2hhbmdlZCgpKTsKKyAgICAgICAgZmluYWwgVHJhbnNpdGlvbi5DaGFuZ2VJbmZvIGFjdGl2aXR5MUNoYW5nZUluZm8gPSBjbG9zZVRyYW5zaXRpb24ubUNoYW5nZXMuZ2V0KGFjdGl2aXR5MSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYWN0aXZpdHkxQ2hhbmdlSW5mbyk7CisgICAgICAgIGFzc2VydFRydWUoYWN0aXZpdHkxQ2hhbmdlSW5mby5oYXNDaGFuZ2VkKCkpOwogCiAgICAgICAgIGFjdGl2aXR5MS5zZXRWaXNpYmxlUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgYWN0aXZpdHkyLnNldFZpc2libGVSZXF1ZXN0ZWQodHJ1ZSk7CkBAIC0xMzc1LDkgKzE0MjQsMjcgQEAKICAgICAgICAgdmVyaWZ5KHNuYXBzaG90Q29udHJvbGxlciwgdGltZXMoMCkpLnJlY29yZFNuYXBzaG90KGVxKHRhc2sxKSwgZXEoZmFsc2UpKTsKIAogICAgICAgICBlbnRlcmluZ0FuaW1SZXBvcnRzLmNsZWFyKCk7Ci0gICAgICAgIGNsb3NlVHJhbnNpdGlvbi5maW5pc2hUcmFuc2l0aW9uKCk7CisgICAgICAgIGRvQ2FsbFJlYWxNZXRob2QoKS53aGVuKG1XbS5tUm9vdCkuZW5zdXJlQWN0aXZpdGllc1Zpc2libGUoYW55KCksCisgICAgICAgICAgICAgICAgYW55SW50KCksIGFueUJvb2xlYW4oKSwgYW55Qm9vbGVhbigpKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbltdIHdhc0luRmluaXNoaW5nVHJhbnNpdGlvbiA9IHsgZmFsc2UgfTsKKyAgICAgICAgY29udHJvbGxlci5yZWdpc3RlckxlZ2FjeUxpc3RlbmVyKG5ldyBXaW5kb3dNYW5hZ2VySW50ZXJuYWwuQXBwVHJhbnNpdGlvbkxpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFwcFRyYW5zaXRpb25GaW5pc2hlZExvY2tlZChJQmluZGVyIHRva2VuKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlSZWNvcmQgciA9IEFjdGl2aXR5UmVjb3JkLmZvclRva2VuKHRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHdhc0luRmluaXNoaW5nVHJhbnNpdGlvblswXSA9IGNvbnRyb2xsZXIuaW5GaW5pc2hpbmdUcmFuc2l0aW9uKHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGNvbnRyb2xsZXIuZmluaXNoVHJhbnNpdGlvbihjbG9zZVRyYW5zaXRpb24pOworICAgICAgICBhc3NlcnRUcnVlKHdhc0luRmluaXNoaW5nVHJhbnNpdGlvblswXSk7CisgICAgICAgIGFzc2VydE51bGwoY29udHJvbGxlci5tRmluaXNoaW5nVHJhbnNpdGlvbik7CiAKKyAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpdml0eTIuaXNWaXNpYmxlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoQWN0aXZpdHlUYXNrTWFuYWdlclNlcnZpY2UuQVBQX1NXSVRDSF9ESVNBTExPVywgbUF0bS5nZXRCYWxBcHBTd2l0Y2hlc1N0YXRlKCkpOworICAgICAgICAvLyBCZWNhdXNlIHRhc2sxIGlzIG9jY2x1ZGVkIGJ5IHRhc2syLCBmaW5pc2hUcmFuc2l0aW9uIHNob3VsZCBtYWtlIGFjdGl2aXR5MSBpbnZpc2libGUuCisgICAgICAgIGFzc2VydEZhbHNlKGFjdGl2aXR5MS5pc1Zpc2libGVSZXF1ZXN0ZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGFjdGl2aXR5MS5pc1Zpc2libGUoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGFjdGl2aXR5MS5hcHAuaGFzQWN0aXZpdHlJblZpc2libGVUYXNrKCkpOwogCiAgICAgICAgIHZlcmlmeShzbmFwc2hvdENvbnRyb2xsZXIsIHRpbWVzKDEpKS5yZWNvcmRTbmFwc2hvdChlcSh0YXNrMSksIGVxKGZhbHNlKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2FsbHBhcGVyQ29udHJvbGxlclRlc3RzLmphdmEgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2FsbHBhcGVyQ29udHJvbGxlclRlc3RzLmphdmEKaW5kZXggNjU2MzFlYS4uOTg0Yjg2OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dhbGxwYXBlckNvbnRyb2xsZXJUZXN0cy5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYWxscGFwZXJDb250cm9sbGVyVGVzdHMuamF2YQpAQCAtMzk2LDcgKzM5Niw3IEBACiAgICAgICAgIGZpbmFsIFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uIHQgPSBtb2NrKFN1cmZhY2VDb250cm9sLlRyYW5zYWN0aW9uLmNsYXNzKTsKICAgICAgICAgdG9rZW4uZmluaXNoU3luYyh0LCBmYWxzZSAvKiBjYW5jZWwgKi8pOwogICAgICAgICB0cmFuc2l0Lm9uVHJhbnNhY3Rpb25SZWFkeSh0cmFuc2l0LmdldFN5bmNJZCgpLCB0KTsKLSAgICAgICAgZGMubVRyYW5zaXRpb25Db250cm9sbGVyLmZpbmlzaFRyYW5zaXRpb24odHJhbnNpdC5nZXRUb2tlbigpKTsKKyAgICAgICAgZGMubVRyYW5zaXRpb25Db250cm9sbGVyLmZpbmlzaFRyYW5zaXRpb24odHJhbnNpdCk7CiAgICAgICAgIGFzc2VydEZhbHNlKHdhbGxwYXBlcldpbmRvdy5pc1Zpc2libGUoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKHRva2VuLmlzVmlzaWJsZSgpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2VUZXN0cy5qYXZhIGIvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTZXJ2aWNlVGVzdHMuamF2YQppbmRleCA3ZDZjZjRhLi42NzdlYzQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2VUZXN0cy5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZVRlc3RzLmphdmEKQEAgLTI2LDcgKzI2LDEwIEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlci5WSVJUVUFMX0RJU1BMQVlfRkxBR19UUlVTVEVEOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuRGlzcGxheS5ERUZBVUxUX0RJU1BMQVk7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5EaXNwbGF5LkZMQUdfT1dOX0ZPQ1VTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuSU5QVVRfRkVBVFVSRV9TUFk7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5JTlZBTElEX1dJTkRPV19UWVBFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuUFJJVkFURV9GTEFHX1RSVVNURURfT1ZFUkxBWTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQVBQTElDQVRJT047CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0FQUExJQ0FUSU9OX0FUVEFDSEVEX0RJQUxPRzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQkFTRV9BUFBMSUNBVElPTjsKQEAgLTQ5LDExICs1MiwxMyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlCb29sZWFuOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueUludDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYXJnVGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5lcTsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOwogaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnRpbWVzOwpAQCAtNjcsMTIgKzcyLDE2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSW5wdXRDb25maWc7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuVXNlckhhbmRsZTsKIGltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTWVyZ2VkQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvdzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd1Nlc3Npb25DYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRDaGFubmVsOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnNldHNTb3VyY2VDb250cm9sOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnNldHNTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKQEAgLTY5MCw2ICs2OTksMTAyIEBACiAgICAgICAgIGFzc2VydEVxdWFscyh2YWxpZFJlY3QsIHJlc3VsdGluZ0FyZ3MubVNvdXJjZUNyb3ApOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyYW50SW5wdXRDaGFubmVsX3Nhbml0aXplU3B5V2luZG93Rm9yQXBwbGljYXRpb25zKCkgeworICAgICAgICBmaW5hbCBTZXNzaW9uIHNlc3Npb24gPSBtb2NrKFNlc3Npb24uY2xhc3MpOworICAgICAgICBmaW5hbCBpbnQgY2FsbGluZ1VpZCA9IFByb2Nlc3MuRklSU1RfQVBQTElDQVRJT05fVUlEOworICAgICAgICBmaW5hbCBpbnQgY2FsbGluZ1BpZCA9IDEyMzQ7CisgICAgICAgIGZpbmFsIFN1cmZhY2VDb250cm9sIHN1cmZhY2VDb250cm9sID0gbW9jayhTdXJmYWNlQ29udHJvbC5jbGFzcyk7CisgICAgICAgIGZpbmFsIElXaW5kb3cgd2luZG93ID0gbW9jayhJV2luZG93LmNsYXNzKTsKKyAgICAgICAgZmluYWwgSUJpbmRlciB3aW5kb3dUb2tlbiA9IG1vY2soSUJpbmRlci5jbGFzcyk7CisgICAgICAgIHdoZW4od2luZG93LmFzQmluZGVyKCkpLnRoZW5SZXR1cm4od2luZG93VG9rZW4pOworICAgICAgICBmaW5hbCBJQmluZGVyIGZvY3VzR3JhbnRUb2tlbiA9IG1vY2soSUJpbmRlci5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgSW5wdXRDaGFubmVsIGlucHV0Q2hhbm5lbCA9IG5ldyBJbnB1dENoYW5uZWwoKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4KKyAgICAgICAgICAgICAgICBtV20uZ3JhbnRJbnB1dENoYW5uZWwoc2Vzc2lvbiwgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgREVGQVVMVF9ESVNQTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZUNvbnRyb2wsIHdpbmRvdywgbnVsbCAvKiBob3N0SW5wdXRUb2tlbiAqLywgRkxBR19OT1RfRk9DVVNBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgUFJJVkFURV9GTEFHX1RSVVNURURfT1ZFUkxBWSwgSU5QVVRfRkVBVFVSRV9TUFksIFRZUEVfQVBQTElDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHdpbmRvd1Rva2VuICovLCBmb2N1c0dyYW50VG9rZW4sICJUZXN0SW5wdXRDaGFubmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q2hhbm5lbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyYW50SW5wdXRDaGFubmVsX2FsbG93U3B5V2luZG93Rm9ySW5wdXRNb25pdG9yUGVybWlzc2lvbigpIHsKKyAgICAgICAgZmluYWwgU2Vzc2lvbiBzZXNzaW9uID0gbW9jayhTZXNzaW9uLmNsYXNzKTsKKyAgICAgICAgZmluYWwgaW50IGNhbGxpbmdVaWQgPSBQcm9jZXNzLlNZU1RFTV9VSUQ7CisgICAgICAgIGZpbmFsIGludCBjYWxsaW5nUGlkID0gMTIzNDsKKyAgICAgICAgZmluYWwgU3VyZmFjZUNvbnRyb2wgc3VyZmFjZUNvbnRyb2wgPSBtb2NrKFN1cmZhY2VDb250cm9sLmNsYXNzKTsKKyAgICAgICAgZmluYWwgSVdpbmRvdyB3aW5kb3cgPSBtb2NrKElXaW5kb3cuY2xhc3MpOworICAgICAgICBmaW5hbCBJQmluZGVyIHdpbmRvd1Rva2VuID0gbW9jayhJQmluZGVyLmNsYXNzKTsKKyAgICAgICAgd2hlbih3aW5kb3cuYXNCaW5kZXIoKSkudGhlblJldHVybih3aW5kb3dUb2tlbik7CisgICAgICAgIGZpbmFsIElCaW5kZXIgZm9jdXNHcmFudFRva2VuID0gbW9jayhJQmluZGVyLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBJbnB1dENoYW5uZWwgaW5wdXRDaGFubmVsID0gbmV3IElucHV0Q2hhbm5lbCgpOworICAgICAgICBtV20uZ3JhbnRJbnB1dENoYW5uZWwoc2Vzc2lvbiwgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgREVGQVVMVF9ESVNQTEFZLCBzdXJmYWNlQ29udHJvbCwKKyAgICAgICAgICAgICAgICB3aW5kb3csIG51bGwgLyogaG9zdElucHV0VG9rZW4gKi8sIEZMQUdfTk9UX0ZPQ1VTQUJMRSwgUFJJVkFURV9GTEFHX1RSVVNURURfT1ZFUkxBWSwKKyAgICAgICAgICAgICAgICBJTlBVVF9GRUFUVVJFX1NQWSwgVFlQRV9BUFBMSUNBVElPTiwgbnVsbCAvKiB3aW5kb3dUb2tlbiAqLywgZm9jdXNHcmFudFRva2VuLAorICAgICAgICAgICAgICAgICJUZXN0SW5wdXRDaGFubmVsIiwgaW5wdXRDaGFubmVsKTsKKworICAgICAgICB2ZXJpZnkobVRyYW5zYWN0aW9uKS5zZXRJbnB1dFdpbmRvd0luZm8oCisgICAgICAgICAgICAgICAgZXEoc3VyZmFjZUNvbnRyb2wpLAorICAgICAgICAgICAgICAgIGFyZ1RoYXQoaCAtPiAoaC5pbnB1dENvbmZpZyAmIElucHV0Q29uZmlnLlNQWSkgPT0gSW5wdXRDb25maWcuU1BZKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSW5wdXRDaGFubmVsX3Nhbml0aXplU3B5V2luZG93Rm9yQXBwbGljYXRpb25zKCkgeworICAgICAgICBmaW5hbCBTZXNzaW9uIHNlc3Npb24gPSBtb2NrKFNlc3Npb24uY2xhc3MpOworICAgICAgICBmaW5hbCBpbnQgY2FsbGluZ1VpZCA9IFByb2Nlc3MuRklSU1RfQVBQTElDQVRJT05fVUlEOworICAgICAgICBmaW5hbCBpbnQgY2FsbGluZ1BpZCA9IDEyMzQ7CisgICAgICAgIGZpbmFsIFN1cmZhY2VDb250cm9sIHN1cmZhY2VDb250cm9sID0gbW9jayhTdXJmYWNlQ29udHJvbC5jbGFzcyk7CisgICAgICAgIGZpbmFsIElXaW5kb3cgd2luZG93ID0gbW9jayhJV2luZG93LmNsYXNzKTsKKyAgICAgICAgZmluYWwgSUJpbmRlciB3aW5kb3dUb2tlbiA9IG1vY2soSUJpbmRlci5jbGFzcyk7CisgICAgICAgIHdoZW4od2luZG93LmFzQmluZGVyKCkpLnRoZW5SZXR1cm4od2luZG93VG9rZW4pOworICAgICAgICBmaW5hbCBJQmluZGVyIGZvY3VzR3JhbnRUb2tlbiA9IG1vY2soSUJpbmRlci5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgSW5wdXRDaGFubmVsIGlucHV0Q2hhbm5lbCA9IG5ldyBJbnB1dENoYW5uZWwoKTsKKyAgICAgICAgbVdtLmdyYW50SW5wdXRDaGFubmVsKHNlc3Npb24sIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQsIERFRkFVTFRfRElTUExBWSwgc3VyZmFjZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgd2luZG93LCBudWxsIC8qIGhvc3RJbnB1dFRva2VuICovLCBGTEFHX05PVF9GT0NVU0FCTEUsIFBSSVZBVEVfRkxBR19UUlVTVEVEX09WRVJMQVksCisgICAgICAgICAgICAgICAgMCAvKiBpbnB1dEZlYXR1cmVzICovLCBUWVBFX0FQUExJQ0FUSU9OLCBudWxsIC8qIHdpbmRvd1Rva2VuICovLCBmb2N1c0dyYW50VG9rZW4sCisgICAgICAgICAgICAgICAgIlRlc3RJbnB1dENoYW5uZWwiLCBpbnB1dENoYW5uZWwpOworICAgICAgICB2ZXJpZnkobVRyYW5zYWN0aW9uKS5zZXRJbnB1dFdpbmRvd0luZm8oCisgICAgICAgICAgICAgICAgZXEoc3VyZmFjZUNvbnRyb2wpLAorICAgICAgICAgICAgICAgIGFyZ1RoYXQoaCAtPiAoaC5pbnB1dENvbmZpZyAmIElucHV0Q29uZmlnLlNQWSkgPT0gMCkpOworCisgICAgICAgIGFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+CisgICAgICAgICAgICAgICAgbVdtLnVwZGF0ZUlucHV0Q2hhbm5lbChpbnB1dENoYW5uZWwuZ2V0VG9rZW4oKSwgREVGQVVMVF9ESVNQTEFZLCBzdXJmYWNlQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZMQUdfTk9UX0ZPQ1VTQUJMRSwgUFJJVkFURV9GTEFHX1RSVVNURURfT1ZFUkxBWSwgSU5QVVRfRkVBVFVSRV9TUFksCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHJlZ2lvbiAqLykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZUlucHV0Q2hhbm5lbF9hbGxvd1NweVdpbmRvd0ZvcklucHV0TW9uaXRvclBlcm1pc3Npb24oKSB7CisgICAgICAgIGZpbmFsIFNlc3Npb24gc2Vzc2lvbiA9IG1vY2soU2Vzc2lvbi5jbGFzcyk7CisgICAgICAgIGZpbmFsIGludCBjYWxsaW5nVWlkID0gUHJvY2Vzcy5TWVNURU1fVUlEOworICAgICAgICBmaW5hbCBpbnQgY2FsbGluZ1BpZCA9IDEyMzQ7CisgICAgICAgIGZpbmFsIFN1cmZhY2VDb250cm9sIHN1cmZhY2VDb250cm9sID0gbW9jayhTdXJmYWNlQ29udHJvbC5jbGFzcyk7CisgICAgICAgIGZpbmFsIElXaW5kb3cgd2luZG93ID0gbW9jayhJV2luZG93LmNsYXNzKTsKKyAgICAgICAgZmluYWwgSUJpbmRlciB3aW5kb3dUb2tlbiA9IG1vY2soSUJpbmRlci5jbGFzcyk7CisgICAgICAgIHdoZW4od2luZG93LmFzQmluZGVyKCkpLnRoZW5SZXR1cm4od2luZG93VG9rZW4pOworICAgICAgICBmaW5hbCBJQmluZGVyIGZvY3VzR3JhbnRUb2tlbiA9IG1vY2soSUJpbmRlci5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgSW5wdXRDaGFubmVsIGlucHV0Q2hhbm5lbCA9IG5ldyBJbnB1dENoYW5uZWwoKTsKKyAgICAgICAgbVdtLmdyYW50SW5wdXRDaGFubmVsKHNlc3Npb24sIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQsIERFRkFVTFRfRElTUExBWSwgc3VyZmFjZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgd2luZG93LCBudWxsIC8qIGhvc3RJbnB1dFRva2VuICovLCBGTEFHX05PVF9GT0NVU0FCTEUsIFBSSVZBVEVfRkxBR19UUlVTVEVEX09WRVJMQVksCisgICAgICAgICAgICAgICAgMCAvKiBpbnB1dEZlYXR1cmVzICovLCBUWVBFX0FQUExJQ0FUSU9OLCBudWxsIC8qIHdpbmRvd1Rva2VuICovLCBmb2N1c0dyYW50VG9rZW4sCisgICAgICAgICAgICAgICAgIlRlc3RJbnB1dENoYW5uZWwiLCBpbnB1dENoYW5uZWwpOworICAgICAgICB2ZXJpZnkobVRyYW5zYWN0aW9uKS5zZXRJbnB1dFdpbmRvd0luZm8oCisgICAgICAgICAgICAgICAgZXEoc3VyZmFjZUNvbnRyb2wpLAorICAgICAgICAgICAgICAgIGFyZ1RoYXQoaCAtPiAoaC5pbnB1dENvbmZpZyAmIElucHV0Q29uZmlnLlNQWSkgPT0gMCkpOworCisgICAgICAgIG1XbS51cGRhdGVJbnB1dENoYW5uZWwoaW5wdXRDaGFubmVsLmdldFRva2VuKCksIERFRkFVTFRfRElTUExBWSwgc3VyZmFjZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgRkxBR19OT1RfRk9DVVNBQkxFLCBQUklWQVRFX0ZMQUdfVFJVU1RFRF9PVkVSTEFZLCBJTlBVVF9GRUFUVVJFX1NQWSwKKyAgICAgICAgICAgICAgICBudWxsIC8qIHJlZ2lvbiAqLyk7CisgICAgICAgIHZlcmlmeShtVHJhbnNhY3Rpb24pLnNldElucHV0V2luZG93SW5mbygKKyAgICAgICAgICAgICAgICBlcShzdXJmYWNlQ29udHJvbCksCisgICAgICAgICAgICAgICAgYXJnVGhhdChoIC0+IChoLmlucHV0Q29uZmlnICYgSW5wdXRDb25maWcuU1BZKSA9PSBJbnB1dENvbmZpZy5TUFkpKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgc2V0dXBBY3Rpdml0eVdpdGhMYXVuY2hDb29raWUoSUJpbmRlciBsYXVuY2hDb29raWUsIFdpbmRvd0NvbnRhaW5lclRva2VuIHdjdCkgewogICAgICAgICBmaW5hbCBXaW5kb3dDb250YWluZXIuUmVtb3RlVG9rZW4gcmVtb3RlVG9rZW4gPSBtb2NrKFdpbmRvd0NvbnRhaW5lci5SZW1vdGVUb2tlbi5jbGFzcyk7CiAgICAgICAgIHdoZW4ocmVtb3RlVG9rZW4udG9XaW5kb3dDb250YWluZXJUb2tlbigpKS50aGVuUmV0dXJuKHdjdCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93T3JnYW5pemVyVGVzdHMuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dPcmdhbml6ZXJUZXN0cy5qYXZhCmluZGV4IGE2OGE1NzMuLjE3YWQ0ZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dPcmdhbml6ZXJUZXN0cy5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dPcmdhbml6ZXJUZXN0cy5qYXZhCkBAIC0xNDg2LDkgKzE0ODYsOSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMocm9vdFRhc2subVRhc2tJZCwgaW5mby50YXNrSWQpOwogICAgICAgICBhc3NlcnRUcnVlKGluZm8udG9wQWN0aXZpdHlJblNpemVDb21wYXQpOwogCi0gICAgICAgIC8vIEVuc3VyZSB0YXNrIGluZm8gc2hvdyB0b3AgYWN0aXZpdHkgdGhhdCBpcyBub3QgaW4gZm9yZWdyb3VuZCBhcyBub3QgaW4gc2l6ZSBjb21wYXQuCisgICAgICAgIC8vIEVuc3VyZSB0YXNrIGluZm8gc2hvdyB0b3AgYWN0aXZpdHkgdGhhdCBpcyBub3QgdmlzaWJsZSBhcyBub3QgaW4gc2l6ZSBjb21wYXQuCiAgICAgICAgIGNsZWFySW52b2NhdGlvbnMob3JnYW5pemVyKTsKLSAgICAgICAgZG9SZXR1cm4oZmFsc2UpLndoZW4oYWN0aXZpdHkpLmlzU3RhdGUoUkVTVU1FRCk7CisgICAgICAgIGRvUmV0dXJuKGZhbHNlKS53aGVuKGFjdGl2aXR5KS5pc1Zpc2libGUoKTsKICAgICAgICAgcm9vdFRhc2sub25TaXplQ29tcGF0QWN0aXZpdHlDaGFuZ2VkKCk7CiAgICAgICAgIG1XbS5tQXRtU2VydmljZS5tVGFza09yZ2FuaXplckNvbnRyb2xsZXIuZGlzcGF0Y2hQZW5kaW5nRXZlbnRzKCk7CiAgICAgICAgIHZlcmlmeShvcmdhbml6ZXIpLm9uVGFza0luZm9DaGFuZ2VkKGluZm9DYXB0b3IuY2FwdHVyZSgpKTsKQEAgLTE0OTgsNyArMTQ5OCw3IEBACiAKICAgICAgICAgLy8gRW5zdXJlIHRhc2sgaW5mbyBzaG93IG5vbiBzaXplIGNvbXBhdCB0b3AgYWN0aXZpdHkgYXMgbm90IGluIHNpemUgY29tcGF0LgogICAgICAgICBjbGVhckludm9jYXRpb25zKG9yZ2FuaXplcik7Ci0gICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4oYWN0aXZpdHkpLmlzU3RhdGUoUkVTVU1FRCk7CisgICAgICAgIGRvUmV0dXJuKHRydWUpLndoZW4oYWN0aXZpdHkpLmlzVmlzaWJsZSgpOwogICAgICAgICBkb1JldHVybihmYWxzZSkud2hlbihhY3Rpdml0eSkuaW5TaXplQ29tcGF0TW9kZSgpOwogICAgICAgICByb290VGFzay5vblNpemVDb21wYXRBY3Rpdml0eUNoYW5nZWQoKTsKICAgICAgICAgbVdtLm1BdG1TZXJ2aWNlLm1UYXNrT3JnYW5pemVyQ29udHJvbGxlci5kaXNwYXRjaFBlbmRpbmdFdmVudHMoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlck1hcFRlc3RzLmphdmEgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93UHJvY2Vzc0NvbnRyb2xsZXJNYXBUZXN0cy5qYXZhCmluZGV4IGMyZWUwNzkuLjJhM2M5YmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlck1hcFRlc3RzLmphdmEKKysrIGIvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyTWFwVGVzdHMuamF2YQpAQCAtMjIsNiArMjIsOCBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5zcHk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OwogCiBpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwogaW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQ7CkBAIC0xMjksNCArMTMxLDE0IEBACiAgICAgICAgIGFzc2VydEVxdWFscyh1aWQycHJvY2Vzc2VzLnNpemUoKSwgMSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhtUHJvY2Vzc01hcC5nZXRQcm9jZXNzKEZBS0VfUElEMSksIHBpZDF1aWQyKTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVfY2FsbHNEZXN0cm95KCkgeworICAgICAgICB2YXIgcHJvYyA9IHNweShwaWQxdWlkMSk7CisgICAgICAgIG1Qcm9jZXNzTWFwLnB1dChGQUtFX1BJRDEsIHByb2MpOworCisgICAgICAgIG1Qcm9jZXNzTWFwLnJlbW92ZShGQUtFX1BJRDEpOworCisgICAgICAgIHZlcmlmeShwcm9jKS5kZXN0cm95KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyVGVzdHMuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dQcm9jZXNzQ29udHJvbGxlclRlc3RzLmphdmEKaW5kZXggZDZjZmQwMC4uY2Y4Mzk4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Byb2Nlc3NDb250cm9sbGVyVGVzdHMuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93UHJvY2Vzc0NvbnRyb2xsZXJUZXN0cy5qYXZhCkBAIC0xNTksNiArMTU5LDE3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVzdHJveV91bnJlZ2lzdGVyc0Rpc3BsYXlBcmVhTGlzdGVuZXIoKSB7CisgICAgICAgIGZpbmFsIFRlc3REaXNwbGF5Q29udGVudCB0ZXN0RGlzcGxheUNvbnRlbnQxID0gY3JlYXRlVGVzdERpc3BsYXlDb250ZW50SW5Db250YWluZXIoKTsKKyAgICAgICAgZmluYWwgRGlzcGxheUFyZWEgaW1lQ29udGFpbmVyMSA9IHRlc3REaXNwbGF5Q29udGVudDEuZ2V0SW1lQ29udGFpbmVyKCk7CisgICAgICAgIG1XcGMucmVnaXN0ZXJEaXNwbGF5QXJlYUNvbmZpZ3VyYXRpb25MaXN0ZW5lcihpbWVDb250YWluZXIxKTsKKworICAgICAgICBtV3BjLmRlc3Ryb3koKTsKKworICAgICAgICBhc3NlcnROdWxsKG1XcGMuZ2V0RGlzcGxheUFyZWEoKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UnVubmluZ1JlY2VudHNBbmltYXRpb24oKSB7CiAgICAgICAgIG1XcGMuc2V0UnVubmluZ1JlY2VudHNBbmltYXRpb24odHJ1ZSk7CiAgICAgICAgIG1XcGMuc2V0UnVubmluZ1JlY2VudHNBbmltYXRpb24oZmFsc2UpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Rlc3RzQmFzZS5qYXZhIGIvc2VydmljZXMvdGVzdHMvd210ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1Rlc3RzQmFzZS5qYXZhCmluZGV4IGNlNmNkOTAuLmI4MDUwMGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3dtdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dUZXN0c0Jhc2UuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy93bXRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93VGVzdHNCYXNlLmphdmEKQEAgLTE3OTksNyArMTc5OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7Ci0gICAgICAgICAgICBtQ29udHJvbGxlci5maW5pc2hUcmFuc2l0aW9uKG1MYXN0VHJhbnNpdC5nZXRUb2tlbigpKTsKKyAgICAgICAgICAgIG1Db250cm9sbGVyLmZpbmlzaFRyYW5zaXRpb24obUxhc3RUcmFuc2l0KTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3RyYW5zbGF0aW9uL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3RyYW5zbGF0aW9uL1RyYW5zbGF0aW9uTWFuYWdlclNlcnZpY2VJbXBsLmphdmEgYi9zZXJ2aWNlcy90cmFuc2xhdGlvbi9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci90cmFuc2xhdGlvbi9UcmFuc2xhdGlvbk1hbmFnZXJTZXJ2aWNlSW1wbC5qYXZhCmluZGV4IDJkMzgyYTIuLjc5MDQ2ZGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3RyYW5zbGF0aW9uL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3RyYW5zbGF0aW9uL1RyYW5zbGF0aW9uTWFuYWdlclNlcnZpY2VJbXBsLmphdmEKKysrIGIvc2VydmljZXMvdHJhbnNsYXRpb24vamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdHJhbnNsYXRpb24vVHJhbnNsYXRpb25NYW5hZ2VyU2VydmljZUltcGwuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklSZW1vdGVDYWxsYmFjazsKQEAgLTE2MCwxMSArMTYxLDIwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIHNlcnZpY2VDb21wb25lbnQgPSBDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VBdmFpbGFibGVGb3JVc2VyKHNlcnZpY2VDb21wb25lbnQpKSB7CisgICAgICAgICAgICBib29sZWFuIGlzU2VydmljZUF2YWlsYWJsZUZvclVzZXI7CisgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50aXR5ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlzU2VydmljZUF2YWlsYWJsZUZvclVzZXIgPSBpc1NlcnZpY2VBdmFpbGFibGVGb3JVc2VyKHNlcnZpY2VDb21wb25lbnQpOwogICAgICAgICAgICAgICAgIGlmIChtTWFzdGVyLnZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy52KFRBRywgImVuc3VyZVJlbW90ZVNlcnZpY2VMb2NrZWQoKTogIiArIHNlcnZpY2VDb21wb25lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGF2YWlsYWJsZSwiKTsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy52KFRBRywgImVuc3VyZVJlbW90ZVNlcnZpY2VMb2NrZWQoKTogaXNTZXJ2aWNlQXZhaWxhYmxlRm9yVXNlcj0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpc1NlcnZpY2VBdmFpbGFibGVGb3JVc2VyKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlQXZhaWxhYmxlRm9yVXNlcikgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJlbnN1cmVSZW1vdGVTZXJ2aWNlTG9ja2VkKCk6ICIgKyBzZXJ2aWNlQ29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGF2YWlsYWJsZSwiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1SZW1vdGVUcmFuc2xhdGlvblNlcnZpY2UgPSBuZXcgUmVtb3RlVHJhbnNsYXRpb25TZXJ2aWNlKGdldENvbnRleHQoKSwgc2VydmljZUNvbXBvbmVudCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3ZvaWNlaW50ZXJhY3Rpb24vamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdm9pY2VpbnRlcmFjdGlvbi9EZXRlY3RvclNlc3Npb24uamF2YSBiL3NlcnZpY2VzL3ZvaWNlaW50ZXJhY3Rpb24vamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdm9pY2VpbnRlcmFjdGlvbi9EZXRlY3RvclNlc3Npb24uamF2YQppbmRleCAwNmZjNDE2Li5kYmM4MjRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy92b2ljZWludGVyYWN0aW9uL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3ZvaWNlaW50ZXJhY3Rpb24vRGV0ZWN0b3JTZXNzaW9uLmphdmEKKysrIGIvc2VydmljZXMvdm9pY2VpbnRlcmFjdGlvbi9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci92b2ljZWludGVyYWN0aW9uL0RldGVjdG9yU2Vzc2lvbi5qYXZhCkBAIC02OCw2ICs2OCw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QZXJzaXN0YWJsZUJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNoYXJlZE1lbW9yeTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuRGV0ZWN0b3JGYWlsdXJlOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0ZWRSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0aW9uU2VydmljZUZhaWx1cmU7CkBAIC02MjMsMTEgKzYyNCw5IEBACiAgICAgICAgIG1SZW1vdGVEZXRlY3Rpb25TZXJ2aWNlID0gcmVtb3RlRGV0ZWN0aW9uU2VydmljZTsKICAgICB9CiAKLSAgICB2b2lkIHJlcG9ydEVycm9yTG9ja2VkKGludCBlcnJvckNvZGUsIEBOb25OdWxsIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKKyAgICB2b2lkIHJlcG9ydEVycm9yTG9ja2VkKEBOb25OdWxsIERldGVjdG9yRmFpbHVyZSBkZXRlY3RvckZhaWx1cmUpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRPRE86IFVzZSBpbnN0YW5jZW9mKHRoaXMpIHRvIGdldCBkaWZmZXJlbnQgZGV0ZWN0b3IgdG8gc2V0IHRoZSByaWdodCBlcnJvciBzb3VyY2UuCi0gICAgICAgICAgICBtQ2FsbGJhY2sub25EZXRlY3Rpb25GYWlsdXJlKAotICAgICAgICAgICAgICAgICAgICBuZXcgSG90d29yZERldGVjdGlvblNlcnZpY2VGYWlsdXJlKGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlKSk7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25EZXRlY3Rpb25GYWlsdXJlKGRldGVjdG9yRmFpbHVyZSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbGVkIHRvIHJlcG9ydCBvbkVycm9yIHN0YXR1czogIiArIGUpOwogICAgICAgICAgICAgaWYgKGdldERldGVjdG9yVHlwZSgpICE9IEhvdHdvcmREZXRlY3Rvci5ERVRFQ1RPUl9UWVBFX1ZJU1VBTF9RVUVSWV9ERVRFQ1RPUikgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdm9pY2VpbnRlcmFjdGlvbi9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci92b2ljZWludGVyYWN0aW9uL0hvdHdvcmREZXRlY3Rpb25Db25uZWN0aW9uLmphdmEgYi9zZXJ2aWNlcy92b2ljZWludGVyYWN0aW9uL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3ZvaWNlaW50ZXJhY3Rpb24vSG90d29yZERldGVjdGlvbkNvbm5lY3Rpb24uamF2YQppbmRleCAwMjVlMWRjLi40ZmQ1OTc5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy92b2ljZWludGVyYWN0aW9uL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3ZvaWNlaW50ZXJhY3Rpb24vSG90d29yZERldGVjdGlvbkNvbm5lY3Rpb24uamF2YQorKysgYi9zZXJ2aWNlcy92b2ljZWludGVyYWN0aW9uL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3ZvaWNlaW50ZXJhY3Rpb24vSG90d29yZERldGVjdGlvbkNvbm5lY3Rpb24uamF2YQpAQCAtNTEsMTEgKzUxLDE0IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TaGFyZWRNZW1vcnk7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWc7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Ib3R3b3JkRGV0ZWN0aW9uU2VydmljZUZhaWx1cmU7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkhvdHdvcmREZXRlY3RvcjsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSU1pY3JvcGhvbmVIb3R3b3JkRGV0ZWN0aW9uVm9pY2VJbnRlcmFjdGlvbkNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5JU2FuZGJveGVkRGV0ZWN0aW9uU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSVZpc3VhbFF1ZXJ5RGV0ZWN0aW9uVm9pY2VJbnRlcmFjdGlvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Vbmtub3duRmFpbHVyZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuVmlzdWFsUXVlcnlEZXRlY3Rpb25TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5WaXN1YWxRdWVyeURldGVjdGlvblNlcnZpY2VGYWlsdXJlOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Wb2ljZUludGVyYWN0aW9uTWFuYWdlckludGVybmFsLkhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlSWRlbnRpdHk7CiBpbXBvcnQgYW5kcm9pZC5zcGVlY2guSVJlY29nbml0aW9uU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CkBAIC0xMDksNiArMTEyLDE2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBSRVNFVF9ERUJVR19IT1RXT1JEX0xPR0dJTkdfVElNRU9VVF9NSUxMSVMgPSA2MCAqIDYwICogMTAwMDsgLy8gMSBob3VyCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9JU09MQVRFRF9QUk9DRVNTX05VTUJFUiA9IDEwOwogCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoZSB7QGxpbmsgSG90d29yZERldGVjdGlvblNlcnZpY2V9IGlzIGNyZWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVEVDVElPTl9TRVJWSUNFX1RZUEVfSE9UV09SRCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIHtAbGluayBWaXN1YWxRdWVyeURldGVjdGlvblNlcnZpY2V9IGlzIGNyZWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVEVDVElPTl9TRVJWSUNFX1RZUEVfVklTVUFMX1FVRVJZID0gMjsKKwogICAgIC8vIFRPRE86IFRoaXMgbWF5IG5lZWQgdG8gYmUgYSBIYW5kbGVyKGxvb3BlcikKICAgICBwcml2YXRlIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBtU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlID0KICAgICAgICAgICAgIEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRTY2hlZHVsZWRFeGVjdXRvcigpOwpAQCAtMTg2LDExICsxOTksMTEgQEAKIAogICAgICAgICBtSG90d29yZERldGVjdGlvblNlcnZpY2VDb25uZWN0aW9uRmFjdG9yeSA9CiAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VDb25uZWN0aW9uRmFjdG9yeShob3R3b3JkRGV0ZWN0aW9uU2VydmljZUludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRJbnN0YW50U2VydmljZUFsbG93ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluc3RhbnRTZXJ2aWNlQWxsb3dlZCwgREVURUNUSU9OX1NFUlZJQ0VfVFlQRV9IT1RXT1JEKTsKIAogICAgICAgICBtVmlzdWFsUXVlcnlEZXRlY3Rpb25TZXJ2aWNlQ29ubmVjdGlvbkZhY3RvcnkgPQogICAgICAgICAgICAgICAgIG5ldyBTZXJ2aWNlQ29ubmVjdGlvbkZhY3RvcnkodmlzdWFsUXVlcnlEZXRlY3Rpb25TZXJ2aWNlSW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgYmluZEluc3RhbnRTZXJ2aWNlQWxsb3dlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kSW5zdGFudFNlcnZpY2VBbGxvd2VkLCBERVRFQ1RJT05fU0VSVklDRV9UWVBFX1ZJU1VBTF9RVUVSWSk7CiAKIAogICAgICAgICBtTGFzdFJlc3RhcnRJbnN0YW50ID0gSW5zdGFudC5ub3coKTsKQEAgLTYwNCwxNyArNjE3LDIwIEBACiAgICAgcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlQ29ubmVjdGlvbkZhY3RvcnkgewogICAgICAgICBwcml2YXRlIGZpbmFsIEludGVudCBtSW50ZW50OwogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQmluZGluZ0ZsYWdzOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtRGV0ZWN0aW9uU2VydmljZVR5cGU7CiAKLSAgICAgICAgU2VydmljZUNvbm5lY3Rpb25GYWN0b3J5KEBOb25OdWxsIEludGVudCBpbnRlbnQsIGJvb2xlYW4gYmluZEluc3RhbnRTZXJ2aWNlQWxsb3dlZCkgeworICAgICAgICBTZXJ2aWNlQ29ubmVjdGlvbkZhY3RvcnkoQE5vbk51bGwgSW50ZW50IGludGVudCwgYm9vbGVhbiBiaW5kSW5zdGFudFNlcnZpY2VBbGxvd2VkLAorICAgICAgICAgICAgICAgIGludCBkZXRlY3Rpb25TZXJ2aWNlVHlwZSkgewogICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKICAgICAgICAgICAgIG1CaW5kaW5nRmxhZ3MgPSBiaW5kSW5zdGFudFNlcnZpY2VBbGxvd2VkID8gQ29udGV4dC5CSU5EX0FMTE9XX0lOU1RBTlQgOiAwOworICAgICAgICAgICAgbURldGVjdGlvblNlcnZpY2VUeXBlID0gZGV0ZWN0aW9uU2VydmljZVR5cGU7CiAgICAgICAgIH0KIAogICAgICAgICBTZXJ2aWNlQ29ubmVjdGlvbiBjcmVhdGVMb2NrZWQoKSB7CiAgICAgICAgICAgICBTZXJ2aWNlQ29ubmVjdGlvbiBjb25uZWN0aW9uID0KICAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VDb25uZWN0aW9uKG1Db250ZXh0LCBtSW50ZW50LCBtQmluZGluZ0ZsYWdzLCBtVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU2FuZGJveGVkRGV0ZWN0aW9uU2VydmljZS5TdHViOjphc0ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzdGFydENvdW50ICUgTUFYX0lTT0xBVEVEX1BST0NFU1NfTlVNQkVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzdGFydENvdW50ICUgTUFYX0lTT0xBVEVEX1BST0NFU1NfTlVNQkVSLCBtRGV0ZWN0aW9uU2VydmljZVR5cGUpOwogICAgICAgICAgICAgY29ubmVjdGlvbi5jb25uZWN0KCk7CiAKICAgICAgICAgICAgIHVwZGF0ZUF1ZGlvRmxpbmdlcihjb25uZWN0aW9uLCBtQXVkaW9GbGluZ2VyKTsKQEAgLTYzNSwxNSArNjUxLDE3IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzcGVjdFNlcnZpY2VDb25uZWN0aW9uU3RhdHVzQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNCb3VuZCA9IGZhbHNlOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTG9nZ2VkRmlyc3RDb25uZWN0ID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1EZXRlY3Rpb25TZXJ2aWNlVHlwZTsKIAogICAgICAgICBTZXJ2aWNlQ29ubmVjdGlvbihATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICAgICAgQE5vbk51bGwgSW50ZW50IHNlcnZpY2VJbnRlbnQsIGludCBiaW5kaW5nRmxhZ3MsIGludCB1c2VySWQsCiAgICAgICAgICAgICAgICAgQE51bGxhYmxlIEZ1bmN0aW9uPElCaW5kZXIsIElTYW5kYm94ZWREZXRlY3Rpb25TZXJ2aWNlPiBiaW5kZXJBc0ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICBpbnQgaW5zdGFuY2VOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5zdGFuY2VOdW1iZXIsIGludCBkZXRlY3Rpb25TZXJ2aWNlVHlwZSkgewogICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc2VydmljZUludGVudCwgYmluZGluZ0ZsYWdzLCB1c2VySWQsIGJpbmRlckFzSW50ZXJmYWNlKTsKICAgICAgICAgICAgIHRoaXMubUludGVudCA9IHNlcnZpY2VJbnRlbnQ7CiAgICAgICAgICAgICB0aGlzLm1CaW5kaW5nRmxhZ3MgPSBiaW5kaW5nRmxhZ3M7CiAgICAgICAgICAgICB0aGlzLm1JbnN0YW5jZU51bWJlciA9IGluc3RhbmNlTnVtYmVyOworICAgICAgICAgICAgdGhpcy5tRGV0ZWN0aW9uU2VydmljZVR5cGUgPSBkZXRlY3Rpb25TZXJ2aWNlVHlwZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZSAvLyBmcm9tIFNlcnZpY2VDb25uZWN0b3IuSW1wbApAQCAtNjYwLDE0ICs2NzgsMTQgQEAKICAgICAgICAgICAgICAgICBtSXNCb3VuZCA9IGNvbm5lY3RlZDsKIAogICAgICAgICAgICAgICAgIGlmICghY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRGV0ZWN0b3JUeXBlICE9IEhvdHdvcmREZXRlY3Rvci5ERVRFQ1RPUl9UWVBFX1ZJU1VBTF9RVUVSWV9ERVRFQ1RPUikgeworICAgICAgICAgICAgICAgICAgICBpZiAobURldGVjdGlvblNlcnZpY2VUeXBlICE9IERFVEVDVElPTl9TRVJWSUNFX1RZUEVfVklTVUFMX1FVRVJZKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBIb3R3b3JkTWV0cmljc0xvZ2dlci53cml0ZURldGVjdG9yRXZlbnQobURldGVjdG9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE9UV09SRF9ERVRFQ1RPUl9FVkVOVFNfX0VWRU5UX19PTl9ESVNDT05ORUNURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2ljZUludGVyYWN0aW9uU2VydmljZVVpZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtSXNMb2dnZWRGaXJzdENvbm5lY3QpIHsKICAgICAgICAgICAgICAgICAgICAgbUlzTG9nZ2VkRmlyc3RDb25uZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXRlY3RvclR5cGUgIT0gSG90d29yZERldGVjdG9yLkRFVEVDVE9SX1RZUEVfVklTVUFMX1FVRVJZX0RFVEVDVE9SKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGV0ZWN0aW9uU2VydmljZVR5cGUgIT0gREVURUNUSU9OX1NFUlZJQ0VfVFlQRV9WSVNVQUxfUVVFUlkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEhvdHdvcmRNZXRyaWNzTG9nZ2VyLndyaXRlRGV0ZWN0b3JFdmVudChtRGV0ZWN0b3JUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1RXT1JEX0RFVEVDVE9SX0VWRU5UU19fRVZFTlRfX09OX0NPTk5FQ1RFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvaWNlSW50ZXJhY3Rpb25TZXJ2aWNlVWlkKTsKQEAgLTY4NCw3ICs3MDIsNyBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKICAgICAgICAgICAgIHN1cGVyLmJpbmRlckRpZWQoKTsKLSAgICAgICAgICAgIFNsb2cudyhUQUcsICJiaW5kZXJEaWVkIik7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAiYmluZGVyRGllZCBtRGV0ZWN0aW9uU2VydmljZVR5cGUgPSAiICsgbURldGVjdGlvblNlcnZpY2VUeXBlKTsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgICAgICBpZiAoIW1SZXNwZWN0U2VydmljZUNvbm5lY3Rpb25TdGF0dXNDaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cudihUQUcsICJJZ25vcmVkICNiaW5kZXJEaWVkIGV2ZW50Iik7CkBAIC02OTMsMTMgKzcxMSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy9UT0RPKGIyNjU1MzUyNTcpOiByZXBvcnQgZXJyb3IgdG8gZWl0aGVyIHNlcnZpY2Ugb25seS4KICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoSG90d29yZERldGVjdGlvbkNvbm5lY3Rpb24udGhpcy5tTG9jaykgewotICAgICAgICAgICAgICAgIHJ1bkZvckVhY2hEZXRlY3RvclNlc3Npb25Mb2NrZWQoKHNlc3Npb24pIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZXBvcnRFcnJvckxvY2tlZChEZXRlY3RvclNlc3Npb24uSE9UV09SRF9ERVRFQ1RJT05fU0VSVklDRV9ESUVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZXRlY3Rpb24gc2VydmljZSBpcyBkZWFkLiIpOwotICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHJ1bkZvckVhY2hEZXRlY3RvclNlc3Npb25Mb2NrZWQodGhpczo6cmVwb3J0QmluZGVyRGllZExvY2tlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBDYW4gaW1wcm92ZSB0byBsb2cgZXhpdCByZWFzb24gaWYgbmVlZGVkCi0gICAgICAgICAgICBpZiAobURldGVjdG9yVHlwZSAhPSBIb3R3b3JkRGV0ZWN0b3IuREVURUNUT1JfVFlQRV9WSVNVQUxfUVVFUllfREVURUNUT1IpIHsKKyAgICAgICAgICAgIGlmIChtRGV0ZWN0aW9uU2VydmljZVR5cGUgIT0gREVURUNUSU9OX1NFUlZJQ0VfVFlQRV9WSVNVQUxfUVVFUlkpIHsKICAgICAgICAgICAgICAgICBIb3R3b3JkTWV0cmljc0xvZ2dlci53cml0ZUtleXBocmFzZVRyaWdnZXJFdmVudCgKICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXRlY3RvclR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBIT1RXT1JEX0RFVEVDVE9SX0tFWVBIUkFTRV9UUklHR0VSRURfX1JFU1VMVF9fU0VSVklDRV9DUkFTSCwKQEAgLTcxMSw3ICs3MjYsNyBAQAogICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBiaW5kU2VydmljZSgKICAgICAgICAgICAgICAgICBATm9uTnVsbCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb24gc2VydmljZUNvbm5lY3Rpb24pIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1EZXRlY3RvclR5cGUgIT0gSG90d29yZERldGVjdG9yLkRFVEVDVE9SX1RZUEVfVklTVUFMX1FVRVJZX0RFVEVDVE9SKSB7CisgICAgICAgICAgICAgICAgaWYgKG1EZXRlY3Rpb25TZXJ2aWNlVHlwZSAhPSBERVRFQ1RJT05fU0VSVklDRV9UWVBFX1ZJU1VBTF9RVUVSWSkgewogICAgICAgICAgICAgICAgICAgICBIb3R3b3JkTWV0cmljc0xvZ2dlci53cml0ZURldGVjdG9yRXZlbnQobURldGVjdG9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1RXT1JEX0RFVEVDVE9SX0VWRU5UU19fRVZFTlRfX1JFUVVFU1RfQklORF9TRVJWSUNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2ljZUludGVyYWN0aW9uU2VydmljZVVpZCk7CkBAIC03MjMsNyArNzM4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtRXhlY3V0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ29ubmVjdGlvbik7CiAgICAgICAgICAgICAgICAgaWYgKCFiaW5kUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRGV0ZWN0b3JUeXBlICE9IEhvdHdvcmREZXRlY3Rvci5ERVRFQ1RPUl9UWVBFX1ZJU1VBTF9RVUVSWV9ERVRFQ1RPUikgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaW5kU2VydmljZSBmYWlsdXJlIG1EZXRlY3Rpb25TZXJ2aWNlVHlwZSA9ICIgKyBtRGV0ZWN0aW9uU2VydmljZVR5cGUpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEhvdHdvcmREZXRlY3Rpb25Db25uZWN0aW9uLnRoaXMubUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkZvckVhY2hEZXRlY3RvclNlc3Npb25Mb2NrZWQodGhpczo6cmVwb3J0QmluZFNlcnZpY2VGYWlsdXJlTG9ja2VkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobURldGVjdGlvblNlcnZpY2VUeXBlICE9IERFVEVDVElPTl9TRVJWSUNFX1RZUEVfVklTVUFMX1FVRVJZKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBIb3R3b3JkTWV0cmljc0xvZ2dlci53cml0ZURldGVjdG9yRXZlbnQobURldGVjdG9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE9UV09SRF9ERVRFQ1RPUl9FVkVOVFNfX0VWRU5UX19SRVFVRVNUX0JJTkRfU0VSVklDRV9GQUlMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9pY2VJbnRlcmFjdGlvblNlcnZpY2VVaWQpOwpAQCAtNzMxLDcgKzc1MSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBiaW5kUmVzdWx0OwogICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobURldGVjdG9yVHlwZSAhPSBIb3R3b3JkRGV0ZWN0b3IuREVURUNUT1JfVFlQRV9WSVNVQUxfUVVFUllfREVURUNUT1IpIHsKKyAgICAgICAgICAgICAgICBpZiAobURldGVjdGlvblNlcnZpY2VUeXBlICE9IERFVEVDVElPTl9TRVJWSUNFX1RZUEVfVklTVUFMX1FVRVJZKSB7CiAgICAgICAgICAgICAgICAgICAgIEhvdHdvcmRNZXRyaWNzTG9nZ2VyLndyaXRlRGV0ZWN0b3JFdmVudChtRGV0ZWN0b3JUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPVFdPUkRfREVURUNUT1JfRVZFTlRTX19FVkVOVF9fUkVRVUVTVF9CSU5EX1NFUlZJQ0VfRkFJTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9pY2VJbnRlcmFjdGlvblNlcnZpY2VVaWQpOwpAQCAtNzUyLDYgKzc3Miw0MiBAQAogICAgICAgICAgICAgICAgIG1SZXNwZWN0U2VydmljZUNvbm5lY3Rpb25TdGF0dXNDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVwb3J0QmluZGVyRGllZExvY2tlZChEZXRlY3RvclNlc3Npb24gZGV0ZWN0b3JTZXNzaW9uKSB7CisgICAgICAgICAgICBpZiAobURldGVjdGlvblNlcnZpY2VUeXBlID09IERFVEVDVElPTl9TRVJWSUNFX1RZUEVfSE9UV09SRCAmJiAoCisgICAgICAgICAgICAgICAgICAgIGRldGVjdG9yU2Vzc2lvbiBpbnN0YW5jZW9mIERzcFRydXN0ZWRIb3R3b3JkRGV0ZWN0b3JTZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGV0ZWN0b3JTZXNzaW9uIGluc3RhbmNlb2YgU29mdHdhcmVUcnVzdGVkSG90d29yZERldGVjdG9yU2Vzc2lvbikpIHsKKyAgICAgICAgICAgICAgICBkZXRlY3RvclNlc3Npb24ucmVwb3J0RXJyb3JMb2NrZWQobmV3IEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlRmFpbHVyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlRmFpbHVyZS5FUlJPUl9DT0RFX0JJTkRJTkdfRElFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEZXRlY3Rpb24gc2VydmljZSBpcyBkZWFkLiIpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobURldGVjdGlvblNlcnZpY2VUeXBlID09IERFVEVDVElPTl9TRVJWSUNFX1RZUEVfVklTVUFMX1FVRVJZCisgICAgICAgICAgICAgICAgICAgICYmIGRldGVjdG9yU2Vzc2lvbiBpbnN0YW5jZW9mIFZpc3VhbFF1ZXJ5RGV0ZWN0b3JTZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgZGV0ZWN0b3JTZXNzaW9uLnJlcG9ydEVycm9yTG9ja2VkKG5ldyBWaXN1YWxRdWVyeURldGVjdGlvblNlcnZpY2VGYWlsdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsUXVlcnlEZXRlY3Rpb25TZXJ2aWNlRmFpbHVyZS5FUlJPUl9DT0RFX0JJTkRJTkdfRElFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEZXRlY3Rpb24gc2VydmljZSBpcyBkZWFkLiIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGV0ZWN0b3JTZXNzaW9uLnJlcG9ydEVycm9yTG9ja2VkKG5ldyBVbmtub3duRmFpbHVyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJEZXRlY3Rpb24gc2VydmljZSBpcyBkZWFkIHdpdGggdW5rbm93biBkZXRlY3Rpb24gc2VydmljZSB0eXBlLiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZXBvcnRCaW5kU2VydmljZUZhaWx1cmVMb2NrZWQoRGV0ZWN0b3JTZXNzaW9uIGRldGVjdG9yU2Vzc2lvbikgeworICAgICAgICAgICAgaWYgKG1EZXRlY3Rpb25TZXJ2aWNlVHlwZSA9PSBERVRFQ1RJT05fU0VSVklDRV9UWVBFX0hPVFdPUkQgJiYgKAorICAgICAgICAgICAgICAgICAgICBkZXRlY3RvclNlc3Npb24gaW5zdGFuY2VvZiBEc3BUcnVzdGVkSG90d29yZERldGVjdG9yU2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRldGVjdG9yU2Vzc2lvbiBpbnN0YW5jZW9mIFNvZnR3YXJlVHJ1c3RlZEhvdHdvcmREZXRlY3RvclNlc3Npb24pKSB7CisgICAgICAgICAgICAgICAgZGV0ZWN0b3JTZXNzaW9uLnJlcG9ydEVycm9yTG9ja2VkKG5ldyBIb3R3b3JkRGV0ZWN0aW9uU2VydmljZUZhaWx1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBIb3R3b3JkRGV0ZWN0aW9uU2VydmljZUZhaWx1cmUuRVJST1JfQ09ERV9CSU5EX0ZBSUxVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAiQmluZCBkZXRlY3Rpb24gc2VydmljZSBmYWlsdXJlLiIpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobURldGVjdGlvblNlcnZpY2VUeXBlID09IERFVEVDVElPTl9TRVJWSUNFX1RZUEVfVklTVUFMX1FVRVJZCisgICAgICAgICAgICAgICAgICAgICYmIGRldGVjdG9yU2Vzc2lvbiBpbnN0YW5jZW9mIFZpc3VhbFF1ZXJ5RGV0ZWN0b3JTZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgZGV0ZWN0b3JTZXNzaW9uLnJlcG9ydEVycm9yTG9ja2VkKG5ldyBWaXN1YWxRdWVyeURldGVjdGlvblNlcnZpY2VGYWlsdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsUXVlcnlEZXRlY3Rpb25TZXJ2aWNlRmFpbHVyZS5FUlJPUl9DT0RFX0JJTkRfRkFJTFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCaW5kIGRldGVjdGlvbiBzZXJ2aWNlIGZhaWx1cmUuIikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXRlY3RvclNlc3Npb24ucmVwb3J0RXJyb3JMb2NrZWQobmV3IFVua25vd25GYWlsdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgIkJpbmQgZGV0ZWN0aW9uIHNlcnZpY2UgZmFpbHVyZSB3aXRoIHVua25vd24gZGV0ZWN0aW9uIHNlcnZpY2UgdHlwZS4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiR3VhcmRlZEJ5IikKZGlmZiAtLWdpdCBhL3RlbGVjb21tL2phdmEvYW5kcm9pZC90ZWxlY29tL0Nvbm5lY3Rpb24uamF2YSBiL3RlbGVjb21tL2phdmEvYW5kcm9pZC90ZWxlY29tL0Nvbm5lY3Rpb24uamF2YQppbmRleCA2MTM4ZjY3Li45NDNkOGQ2IDEwMDY0NAotLS0gYS90ZWxlY29tbS9qYXZhL2FuZHJvaWQvdGVsZWNvbS9Db25uZWN0aW9uLmphdmEKKysrIGIvdGVsZWNvbW0vamF2YS9hbmRyb2lkL3RlbGVjb20vQ29ubmVjdGlvbi5qYXZhCkBAIC04Nyw3ICs4Nyw3IEBACiAgKiBtdXN0IGNhbGwge0BsaW5rICNkZXN0cm95KCl9IHRvIHNpZ25hbCB0byB0aGUgZnJhbWV3b3JrIHRoYXQgdGhlIHtAY29kZSBDb25uZWN0aW9ufSBpcyBubwogICogbG9uZ2VyIHVzZWQgYW5kIGFzc29jaWF0ZWQgcmVzb3VyY2VzIG1heSBiZSByZWNvdmVyZWQuCiAgKiA8cD4KLSAqIFN1YmNsYXNzZXMgb2Yge0Bjb2RlIENvbm5lY3Rpb259IG92ZXJyaWRlIHRoZSB7QGNvZGUgb24qfSBtZXRob2RzIHRvIHByb3ZpZGUgdGhlIHRoZQorICogU3ViY2xhc3NlcyBvZiB7QGNvZGUgQ29ubmVjdGlvbn0gb3ZlcnJpZGUgdGhlIHtAY29kZSBvbip9IG1ldGhvZHMgdG8gcHJvdmlkZSB0aGUKICAqIHtAbGluayBDb25uZWN0aW9uU2VydmljZX0ncyBpbXBsZW1lbnRhdGlvbiBvZiBjYWxsaW5nIGZ1bmN0aW9uYWxpdHkuICBUaGUge0Bjb2RlIG9uKn0gbWV0aG9kcyBhcmUKICAqIGNhbGxlZCBieSBUZWxlY29tIHRvIGluZm9ybSBhbiBpbnN0YW5jZSBvZiBhIHtAY29kZSBDb25uZWN0aW9ufSBvZiBhY3Rpb25zIHNwZWNpZmljIHRvIHRoYXQKICAqIHtAY29kZSBDb25uZWN0aW9ufSBpbnN0YW5jZS4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L0NhcnJpZXJDb25maWdNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9DYXJyaWVyQ29uZmlnTWFuYWdlci5qYXZhCmluZGV4IGJmMTJiOWMuLjdhYTEzMzQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L0NhcnJpZXJDb25maWdNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvQ2FycmllckNvbmZpZ01hbmFnZXIuamF2YQpAQCAtMTYyOCw2ICsxNjI4LDcgQEAKICAgICAgKiA8bGk+ICA5OiBXaUZpIENhbGxpbmc8L2xpPgogICAgICAqIDxsaT4gMTA6IFZvV2lmaTwvbGk+CiAgICAgICogPGxpPiAxMTogJXMgV2lGaSBDYWxsaW5nPC9saT4KKyAgICAgKiA8bGk+IDEyOiBXaUZpIENhbGw8L2xpPgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1dGQ19TUE5fRk9STUFUX0lEWF9JTlQgPSAid2ZjX3Nwbl9mb3JtYXRfaWR4X2ludCI7CkBAIC0xOTc0LDggKzE5NzUsMTMgQEAKICAgICAvKioKICAgICAgKiBCb29sZWFuIGluZGljYXRpbmcgaWYgTFRFKyBpY29uIHNob3VsZCBiZSBzaG93biBpZiBhdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0hJREVfTFRFX1BMVVNfREFUQV9JQ09OX0JPT0wgPQotICAgICAgICAgICAgImhpZGVfbHRlX3BsdXNfZGF0YV9pY29uX2Jvb2wiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ISURFX0xURV9QTFVTX0RBVEFfSUNPTl9CT09MID0gImhpZGVfbHRlX3BsdXNfZGF0YV9pY29uX2Jvb2wiOworCisgICAgLyoqCisgICAgICogQm9vbGVhbiBpbmRpY3RpbmcgaWYgdGhlIDVHIHNsaWNlIGljb24gc2hvdWxkIGJlIHNob3duIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSE9XXzVHX1NMSUNFX0lDT05fQk9PTCA9ICJzaG93XzVnX3NsaWNlX2ljb25fYm9vbCI7CiAKICAgICAvKioKICAgICAgKiBUaGUgY29tYmluZWQgY2hhbm5lbCBiYW5kd2lkdGggdGhyZXNob2xkIChub24taW5jbHVzaXZlKSBpbiBLSHogcmVxdWlyZWQgdG8gZGlzcGxheSB0aGUKQEAgLTg2NDgsNiArODY1NCwxNiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVBER19BRERSRVNTX1BSSU9SSVRZX0lOVF9BUlJBWSA9CiAgICAgICAgICAgICAgICAgS0VZX1BSRUZJWCArICJlcGRnX2FkZHJlc3NfcHJpb3JpdHlfaW50X2FycmF5IjsKIAorICAgICAgICAvKioKKyAgICAgICAgICogQSBwcmlvcml0eSBsaXN0IG9mIFBMTU4gdG8gYmUgdXNlZCBpbiBFUERHX0FERFJFU1NfUExNTi4gUG9zc2libGUgdmFsdWVzIGFyZSB7QGxpbmsKKyAgICAgICAgICogI0VQREdfUExNTl9SUExNTn0sIHtAbGluayAjRVBER19QTE1OX0hQTE1OfSwge0BsaW5rICNFUERHX1BMTU5fRUhQTE1OX0FMTH0sIHtAbGluaworICAgICAgICAgKiAjRVBER19QTE1OX0VIUExNTl9GSVJTVH0KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FUERHX1BMTU5fUFJJT1JJVFlfSU5UX0FSUkFZID0KKyAgICAgICAgICAgICAgICBLRVlfUFJFRklYICsgImVwZGdfcGxtbl9wcmlvcml0eV9pbnRfYXJyYXkiOworCiAgICAgICAgIC8qKiBFcGRnIHN0YXRpYyBJUCBhZGRyZXNzIG9yIEZRRE4gKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VQREdfU1RBVElDX0FERFJFU1NfU1RSSU5HID0KICAgICAgICAgICAgICAgICBLRVlfUFJFRklYICsgImVwZGdfc3RhdGljX2FkZHJlc3Nfc3RyaW5nIjsKQEAgLTg4NDgsNiArODg2NCwzNiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUERHX0FERFJFU1NfVklTSVRFRF9DT1VOVFJZID0gNDsKIAogICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgQEludERlZih7CisgICAgICAgICAgICAgICAgRVBER19QTE1OX1JQTE1OLAorICAgICAgICAgICAgICAgIEVQREdfUExNTl9IUExNTiwKKyAgICAgICAgICAgICAgICBFUERHX1BMTU5fRUhQTE1OX0FMTCwKKyAgICAgICAgICAgICAgICBFUERHX1BMTU5fRUhQTE1OX0ZJUlNUCisgICAgICAgIH0pCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVwZGdBZGRyZXNzUGxtblR5cGUge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIHRoZSBSZWdpc3RlcmVkIFBMTU4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVQREdfUExNTl9SUExNTiA9IDA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgdGhlIFBMTU4gZGVyaXZlZCBmcm9tIElNU0kKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVQREdfUExNTl9IUExNTiA9IDE7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgYWxsIEVIUExNTiBmcm9tIFNJTSBFRiBmaWxlcworICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVBER19QTE1OX0VIUExNTl9BTEwgPSAyOworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIHRoZSBmaXJzdCBFSFBMTU4gZnJvbSBTSU0gRUYgZmlsZXMKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVQREdfUExNTl9FSFBMTU5fRklSU1QgPSAzOworCisgICAgICAgIC8qKiBAaGlkZSAqLwogICAgICAgICBASW50RGVmKHtJRF9UWVBFX0ZRRE4sIElEX1RZUEVfUkZDODIyX0FERFIsIElEX1RZUEVfS0VZX0lEfSkKICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWtlSWRUeXBlIHt9CiAKQEAgLTg5ODIsNiArOTAyOCwxMiBAQAogICAgICAgICAgICAgZGVmYXVsdHMucHV0SW50QXJyYXkoCiAgICAgICAgICAgICAgICAgICAgIEtFWV9FUERHX0FERFJFU1NfUFJJT1JJVFlfSU5UX0FSUkFZLAogICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10ge0VQREdfQUREUkVTU19QTE1OLCBFUERHX0FERFJFU1NfU1RBVElDfSk7CisgICAgICAgICAgICBkZWZhdWx0cy5wdXRJbnRBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgS0VZX0VQREdfUExNTl9QUklPUklUWV9JTlRfQVJSQVksCisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUERHX1BMTU5fUlBMTU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBER19QTE1OX0hQTE1OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQREdfUExNTl9FSFBMTU5fQUxMfSk7CiAgICAgICAgICAgICBkZWZhdWx0cy5wdXRTdHJpbmdBcnJheShLRVlfTUNDX01OQ1NfU1RSSU5HX0FSUkFZLCBuZXcgU3RyaW5nWzBdKTsKICAgICAgICAgICAgIGRlZmF1bHRzLnB1dEludChLRVlfSUtFX0xPQ0FMX0lEX1RZUEVfSU5ULCBJRF9UWVBFX1JGQzgyMl9BRERSKTsKICAgICAgICAgICAgIGRlZmF1bHRzLnB1dEludChLRVlfSUtFX1JFTU9URV9JRF9UWVBFX0lOVCwgSURfVFlQRV9GUUROKTsKQEAgLTk5MTMsNiArOTk2NSw3IEBACiAgICAgICAgIHNEZWZhdWx0cy5wdXRTdHJpbmcoS0VZX09QRVJBVE9SX05BTUVfRklMVEVSX1BBVFRFUk5fU1RSSU5HLCAiIik7CiAgICAgICAgIHNEZWZhdWx0cy5wdXRTdHJpbmcoS0VZX1NIT1dfQ0FSUklFUl9EQVRBX0lDT05fUEFUVEVSTl9TVFJJTkcsICIiKTsKICAgICAgICAgc0RlZmF1bHRzLnB1dEJvb2xlYW4oS0VZX0hJREVfTFRFX1BMVVNfREFUQV9JQ09OX0JPT0wsIHRydWUpOworICAgICAgICBzRGVmYXVsdHMucHV0Qm9vbGVhbihLRVlfU0hPV181R19TTElDRV9JQ09OX0JPT0wsIHRydWUpOwogICAgICAgICBzRGVmYXVsdHMucHV0SW50KEtFWV9MVEVfUExVU19USFJFU0hPTERfQkFORFdJRFRIX0tIWl9JTlQsIDIwMDAwKTsKICAgICAgICAgc0RlZmF1bHRzLnB1dEludChLRVlfTlJfQURWQU5DRURfVEhSRVNIT0xEX0JBTkRXSURUSF9LSFpfSU5ULCAwKTsKICAgICAgICAgc0RlZmF1bHRzLnB1dEJvb2xlYW4oS0VZX0lOQ0xVREVfTFRFX0ZPUl9OUl9BRFZBTkNFRF9USFJFU0hPTERfQkFORFdJRFRIX0JPT0wsIGZhbHNlKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L2RhdGEvUW9zQmVhcmVyU2Vzc2lvbi5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvZGF0YS9Rb3NCZWFyZXJTZXNzaW9uLmphdmEKaW5kZXggZGQwODA4NS4uMTY2ODE5MyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvZGF0YS9Rb3NCZWFyZXJTZXNzaW9uLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvZGF0YS9Rb3NCZWFyZXJTZXNzaW9uLmphdmEKQEAgLTEwMiwxMiArMTAyLDExIEBACiAKICAgICAgICAgUW9zQmVhcmVyU2Vzc2lvbiBvdGhlciA9IChRb3NCZWFyZXJTZXNzaW9uKSBvOwogICAgICAgICByZXR1cm4gdGhpcy5xb3NCZWFyZXJTZXNzaW9uSWQgPT0gb3RoZXIucW9zQmVhcmVyU2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgJiYgdGhpcy5xb3MuZXF1YWxzKG90aGVyLnFvcykKKyAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyh0aGlzLnFvcywgb3RoZXIucW9zKQogICAgICAgICAgICAgICAgICYmIHRoaXMucW9zQmVhcmVyRmlsdGVyTGlzdC5zaXplKCkgPT0gb3RoZXIucW9zQmVhcmVyRmlsdGVyTGlzdC5zaXplKCkKICAgICAgICAgICAgICAgICAmJiB0aGlzLnFvc0JlYXJlckZpbHRlckxpc3QuY29udGFpbnNBbGwob3RoZXIucW9zQmVhcmVyRmlsdGVyTGlzdCk7CiAgICAgfQogCi0KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEBOb25OdWxsIFBhcmNlbGFibGUuQ3JlYXRvcjxRb3NCZWFyZXJTZXNzaW9uPiBDUkVBVE9SID0KICAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8UW9zQmVhcmVyU2Vzc2lvbj4oKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvSVNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2suYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlU3RhdGVDYWxsYmFjay5haWRsCmluZGV4IDk4MjIxYzkuLmNkOWQ4MWUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlU3RhdGVDYWxsYmFjay5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlU3RhdGVDYWxsYmFjay5haWRsCkBAIC0yMiwxMyArMjIsNiBAQAogICovCiBvbmV3YXkgaW50ZXJmYWNlIElTYXRlbGxpdGVTdGF0ZUNhbGxiYWNrIHsKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2F0ZWxsaXRlIGhhcyBwZW5kaW5nIGRhdGFncmFtcyBmb3IgdGhlIGRldmljZSB0byBiZSBwdWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHBlbmRpbmcgZGF0YWdyYW1zLgotICAgICAqLwotICAgIHZvaWQgb25QZW5kaW5nRGF0YWdyYW1Db3VudChpbiBpbnQgY291bnQpOwotCi0gICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNhdGVsbGl0ZSBtb2RlbSBzdGF0ZSBoYXMgY2hhbmdlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzYXRlbGxpdGUgbW9kZW0gc3RhdGUuCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvSVNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlQ2FsbGJhY2suYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2suYWlkbApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvSVNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlQ2FsbGJhY2suYWlkbApyZW5hbWUgdG8gdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL0lTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVDYWxsYmFjay5haWRsCmluZGV4IGQzZjEwOTEuLmE4MTQ0NGQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjay5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9JU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2suYWlkbApAQCAtMjIsMTcgKzIyLDI0IEBACiAgKiBJbnRlcmZhY2UgZm9yIHBvc2l0aW9uIHVwZGF0ZSBhbmQgZGF0YWdyYW0gdHJhbnNmZXIgc3RhdGUgY2hhbmdlIGNhbGxiYWNrLgogICogQGhpZGUKICAqLwotb25ld2F5IGludGVyZmFjZSBJU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjayB7CitvbmV3YXkgaW50ZXJmYWNlIElTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVDYWxsYmFjayB7CiAgICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gc2F0ZWxsaXRlIGRhdGFncmFtIHRyYW5zZmVyIHN0YXRlIGNoYW5nZWQuCisgICAgICogQ2FsbGVkIHdoZW4gc2F0ZWxsaXRlIGRhdGFncmFtIHNlbmQgc3RhdGUgY2hhbmdlZC4KICAgICAgKgotICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgbmV3IGRhdGFncmFtIHRyYW5zZmVyIHN0YXRlLgorICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgbmV3IHNlbmQgZGF0YWdyYW0gdHJhbnNmZXIgc3RhdGUuCiAgICAgICogQHBhcmFtIHNlbmRQZW5kaW5nQ291bnQgVGhlIG51bWJlciBvZiBkYXRhZ3JhbXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHNlbnQuCi0gICAgICogQHBhcmFtIHJlY2VpdmVQZW5kaW5nQ291bnQgVGhlIG51bWJlciBvZiBkYXRhZ3JhbXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHJlY2VpdmVkLgogICAgICAqIEBwYXJhbSBlcnJvckNvZGUgSWYgZGF0YWdyYW0gdHJhbnNmZXIgZmFpbGVkLCB0aGUgcmVhc29uIGZvciBmYWlsdXJlLgogICAgICAqLwotICAgIHZvaWQgb25EYXRhZ3JhbVRyYW5zZmVyU3RhdGVDaGFuZ2VkKGluIGludCBzdGF0ZSwgaW4gaW50IHNlbmRQZW5kaW5nQ291bnQsCi0gICAgICAgICAgICBpbiBpbnQgcmVjZWl2ZVBlbmRpbmdDb3VudCwgaW4gaW50IGVycm9yQ29kZSk7CisgICAgdm9pZCBvblNlbmREYXRhZ3JhbVN0YXRlQ2hhbmdlZChpbiBpbnQgc3RhdGUsIGluIGludCBzZW5kUGVuZGluZ0NvdW50LCBpbiBpbnQgZXJyb3JDb2RlKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHNhdGVsbGl0ZSBkYXRhZ3JhbSByZWNlaXZlIHN0YXRlIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIG5ldyByZWNlaXZlIGRhdGFncmFtIHRyYW5zZmVyIHN0YXRlLgorICAgICAqIEBwYXJhbSByZWNlaXZlUGVuZGluZ0NvdW50IFRoZSBudW1iZXIgb2YgZGF0YWdyYW1zIHRoYXQgYXJlIGN1cnJlbnRseSBwZW5kaW5nIHRvIGJlIHJlY2VpdmVkLgorICAgICAqIEBwYXJhbSBlcnJvckNvZGUgSWYgZGF0YWdyYW0gdHJhbnNmZXIgZmFpbGVkLCB0aGUgcmVhc29uIGZvciBmYWlsdXJlLgorICAgICAqLworICAgIHZvaWQgb25SZWNlaXZlRGF0YWdyYW1TdGF0ZUNoYW5nZWQoaW4gaW50IHN0YXRlLCBpbiBpbnQgcmVjZWl2ZVBlbmRpbmdDb3VudCwgaW4gaW50IGVycm9yQ29kZSk7CiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2F0ZWxsaXRlIHBvc2l0aW9uIGNoYW5nZWQuCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvUG9pbnRpbmdJbmZvLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvUG9pbnRpbmdJbmZvLmphdmEKaW5kZXggYTNjM2YxOS4uN2M3OTQ0NzMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9Qb2ludGluZ0luZm8uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvUG9pbnRpbmdJbmZvLmphdmEKQEAgLTMwLDMxICszMCwxMiBAQAogICAgIC8qKiBTYXRlbGxpdGUgZWxldmF0aW9uIGluIGRlZ3JlZXMgKi8KICAgICBwcml2YXRlIGZsb2F0IG1TYXRlbGxpdGVFbGV2YXRpb25EZWdyZWVzOwogCi0gICAgLyoqIEFudGVubmEgYXppbXV0aCBpbiBkZWdyZWVzICovCi0gICAgcHJpdmF0ZSBmbG9hdCBtQW50ZW5uYUF6aW11dGhEZWdyZWVzOwotCi0gICAgLyoqCi0gICAgICogQW5nbGUgb2Ygcm90YXRpb24gYWJvdXQgdGhlIHggYXhpcy4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBhbmdsZSBiZXR3ZWVuIGEgcGxhbmUKLSAgICAgKiBwYXJhbGxlbCB0byB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGFuZCBhIHBsYW5lIHBhcmFsbGVsIHRvIHRoZSBncm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmbG9hdCBtQW50ZW5uYVBpdGNoRGVncmVlczsKLQotICAgIC8qKgotICAgICAqIEFuZ2xlIG9mIHJvdGF0aW9uIGFib3V0IHRoZSB5IGF4aXMuIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgYW5nbGUgYmV0d2VlbiBhIHBsYW5lCi0gICAgICogcGVycGVuZGljdWxhciB0byB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGFuZCBhIHBsYW5lIHBhcmFsbGVsIHRvIHRoZSBncm91bmQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmbG9hdCBtQW50ZW5uYVJvbGxEZWdyZWVzOwotCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgUG9pbnRpbmdJbmZvKGZsb2F0IHNhdGVsbGl0ZUF6aW11dGhEZWdyZWVzLCBmbG9hdCBzYXRlbGxpdGVFbGV2YXRpb25EZWdyZWVzLAotICAgICAgICAgICAgZmxvYXQgYW50ZW5uYUF6aW11dGhEZWdyZWVzLCBmbG9hdCBhbnRlbm5hUGl0Y2hEZWdyZWVzLCBmbG9hdCBhbnRlbm5hUm9sbERlZ3JlZXMpIHsKKyAgICBwdWJsaWMgUG9pbnRpbmdJbmZvKGZsb2F0IHNhdGVsbGl0ZUF6aW11dGhEZWdyZWVzLCBmbG9hdCBzYXRlbGxpdGVFbGV2YXRpb25EZWdyZWVzKSB7CiAgICAgICAgIG1TYXRlbGxpdGVBemltdXRoRGVncmVlcyA9IHNhdGVsbGl0ZUF6aW11dGhEZWdyZWVzOwogICAgICAgICBtU2F0ZWxsaXRlRWxldmF0aW9uRGVncmVlcyA9IHNhdGVsbGl0ZUVsZXZhdGlvbkRlZ3JlZXM7Ci0gICAgICAgIG1BbnRlbm5hQXppbXV0aERlZ3JlZXMgPSBhbnRlbm5hQXppbXV0aERlZ3JlZXM7Ci0gICAgICAgIG1BbnRlbm5hUGl0Y2hEZWdyZWVzID0gYW50ZW5uYVBpdGNoRGVncmVlczsKLSAgICAgICAgbUFudGVubmFSb2xsRGVncmVlcyA9IGFudGVubmFSb2xsRGVncmVlczsKICAgICB9CiAKICAgICBwcml2YXRlIFBvaW50aW5nSW5mbyhQYXJjZWwgaW4pIHsKQEAgLTcwLDkgKzUxLDYgQEAKICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKEBOb25OdWxsIFBhcmNlbCBvdXQsIGludCBmbGFncykgewogICAgICAgICBvdXQud3JpdGVGbG9hdChtU2F0ZWxsaXRlQXppbXV0aERlZ3JlZXMpOwogICAgICAgICBvdXQud3JpdGVGbG9hdChtU2F0ZWxsaXRlRWxldmF0aW9uRGVncmVlcyk7Ci0gICAgICAgIG91dC53cml0ZUZsb2F0KG1BbnRlbm5hQXppbXV0aERlZ3JlZXMpOwotICAgICAgICBvdXQud3JpdGVGbG9hdChtQW50ZW5uYVBpdGNoRGVncmVlcyk7Ci0gICAgICAgIG91dC53cml0ZUZsb2F0KG1BbnRlbm5hUm9sbERlZ3JlZXMpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsIENyZWF0b3I8UG9pbnRpbmdJbmZvPiBDUkVBVE9SID0KQEAgLTk5LDE4ICs3Nyw2IEBACiAKICAgICAgICAgc2IuYXBwZW5kKCJTYXRlbGxpdGVFbGV2YXRpb25EZWdyZWVzOiIpOwogICAgICAgICBzYi5hcHBlbmQobVNhdGVsbGl0ZUVsZXZhdGlvbkRlZ3JlZXMpOwotICAgICAgICBzYi5hcHBlbmQoIiwiKTsKLQotICAgICAgICBzYi5hcHBlbmQoIkFudGVubmFBemltdXRoRGVncmVlczoiKTsKLSAgICAgICAgc2IuYXBwZW5kKG1BbnRlbm5hQXppbXV0aERlZ3JlZXMpOwotICAgICAgICBzYi5hcHBlbmQoIiwiKTsKLQotICAgICAgICBzYi5hcHBlbmQoIkFudGVubmFQaXRjaERlZ3JlZXM6Iik7Ci0gICAgICAgIHNiLmFwcGVuZChtQW50ZW5uYVBpdGNoRGVncmVlcyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCIpOwotCi0gICAgICAgIHNiLmFwcGVuZCgiQW50ZW5uYVJvbGxEZWdyZWVzOiIpOwotICAgICAgICBzYi5hcHBlbmQobUFudGVubmFSb2xsRGVncmVlcyk7CiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KIApAQCAtMTIyLDIzICs4OCw4IEBACiAgICAgICAgIHJldHVybiBtU2F0ZWxsaXRlRWxldmF0aW9uRGVncmVlczsKICAgICB9CiAKLSAgICBwdWJsaWMgZmxvYXQgZ2V0QW50ZW5uYUF6aW11dGhEZWdyZWVzKCkgewotICAgICAgICByZXR1cm4gbUFudGVubmFBemltdXRoRGVncmVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0QW50ZW5uYVBpdGNoRGVncmVlcygpIHsKLSAgICAgICAgcmV0dXJuIG1BbnRlbm5hUGl0Y2hEZWdyZWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCBnZXRBbnRlbm5hUm9sbERlZ3JlZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQW50ZW5uYVJvbGxEZWdyZWVzOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCByZWFkRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKICAgICAgICAgbVNhdGVsbGl0ZUF6aW11dGhEZWdyZWVzID0gaW4ucmVhZEZsb2F0KCk7CiAgICAgICAgIG1TYXRlbGxpdGVFbGV2YXRpb25EZWdyZWVzID0gaW4ucmVhZEZsb2F0KCk7Ci0gICAgICAgIG1BbnRlbm5hQXppbXV0aERlZ3JlZXMgPSBpbi5yZWFkRmxvYXQoKTsKLSAgICAgICAgbUFudGVubmFQaXRjaERlZ3JlZXMgPSBpbi5yZWFkRmxvYXQoKTsKLSAgICAgICAgbUFudGVubmFSb2xsRGVncmVlcyA9IGluLnJlYWRGbG9hdCgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVDYXBhYmlsaXRpZXMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVDYXBhYmlsaXRpZXMuamF2YQppbmRleCA4ODk4NTZiLi5kZjgwMTU5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZUNhcGFiaWxpdGllcy5qYXZhCkBAIC0zMywzMSArMzMsMjQgQEAKICAgICBATm9uTnVsbCBAU2F0ZWxsaXRlTWFuYWdlci5OVFJhZGlvVGVjaG5vbG9neSBwcml2YXRlIFNldDxJbnRlZ2VyPiBtU3VwcG9ydGVkUmFkaW9UZWNobm9sb2dpZXM7CiAKICAgICAvKioKLSAgICAgKiBXaGV0aGVyIHNhdGVsbGl0ZSBtb2RlbSBpcyBhbHdheXMgb24uCi0gICAgICogVGhpcyBpbmRpY2F0ZXMgdGhlIHBvd2VyIGltcGFjdCBvZiBrZWVwaW5nIGl0IG9uIGlzIHZlcnkgbWluaW1hbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWx3YXlzT247Ci0KLSAgICAvKioKICAgICAgKiBXaGV0aGVyIFVFIG5lZWRzIHRvIHBvaW50IHRvIGEgc2F0ZWxsaXRlIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YS4KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRzUG9pbnRpbmdUb1NhdGVsbGl0ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUG9pbnRpbmdSZXF1aXJlZDsKIAogICAgIC8qKgotICAgICAqIFdoZXRoZXIgVUUgbmVlZHMgYSBzZXBhcmF0ZSBTSU0gcHJvZmlsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzYXRlbGxpdGUgbmV0d29yay4KKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcGVyIGRhdGFncmFtIHRoYXQgY2FuIGJlIHNlbnQgb3ZlciBzYXRlbGxpdGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkc1NlcGFyYXRlU2ltUHJvZmlsZTsKKyAgICBwcml2YXRlIGludCBtTWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtOwogCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzKFNldDxJbnRlZ2VyPiBzdXBwb3J0ZWRSYWRpb1RlY2hub2xvZ2llcywgYm9vbGVhbiBpc0Fsd2F5c09uLAotICAgICAgICAgICAgYm9vbGVhbiBuZWVkc1BvaW50aW5nVG9TYXRlbGxpdGUsIGJvb2xlYW4gbmVlZHNTZXBhcmF0ZVNpbVByb2ZpbGUpIHsKKyAgICBwdWJsaWMgU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzKFNldDxJbnRlZ2VyPiBzdXBwb3J0ZWRSYWRpb1RlY2hub2xvZ2llcywKKyAgICAgICAgICAgIGJvb2xlYW4gaXNQb2ludGluZ1JlcXVpcmVkLCBpbnQgbWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtKSB7CiAgICAgICAgIG1TdXBwb3J0ZWRSYWRpb1RlY2hub2xvZ2llcyA9IHN1cHBvcnRlZFJhZGlvVGVjaG5vbG9naWVzID09IG51bGwKICAgICAgICAgICAgICAgICA/IG5ldyBIYXNoU2V0PD4oKSA6IHN1cHBvcnRlZFJhZGlvVGVjaG5vbG9naWVzOwotICAgICAgICBtSXNBbHdheXNPbiA9IGlzQWx3YXlzT247Ci0gICAgICAgIG1OZWVkc1BvaW50aW5nVG9TYXRlbGxpdGUgPSBuZWVkc1BvaW50aW5nVG9TYXRlbGxpdGU7Ci0gICAgICAgIG1OZWVkc1NlcGFyYXRlU2ltUHJvZmlsZSA9IG5lZWRzU2VwYXJhdGVTaW1Qcm9maWxlOworICAgICAgICBtSXNQb2ludGluZ1JlcXVpcmVkID0gaXNQb2ludGluZ1JlcXVpcmVkOworICAgICAgICBtTWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtID0gbWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtOwogICAgIH0KIAogICAgIHByaXZhdGUgU2F0ZWxsaXRlQ2FwYWJpbGl0aWVzKFBhcmNlbCBpbikgewpAQCAtODAsOSArNzMsOCBAQAogICAgICAgICAgICAgb3V0LndyaXRlSW50KDApOwogICAgICAgICB9CiAKLSAgICAgICAgb3V0LndyaXRlQm9vbGVhbihtSXNBbHdheXNPbik7Ci0gICAgICAgIG91dC53cml0ZUJvb2xlYW4obU5lZWRzUG9pbnRpbmdUb1NhdGVsbGl0ZSk7Ci0gICAgICAgIG91dC53cml0ZUJvb2xlYW4obU5lZWRzU2VwYXJhdGVTaW1Qcm9maWxlKTsKKyAgICAgICAgb3V0LndyaXRlQm9vbGVhbihtSXNQb2ludGluZ1JlcXVpcmVkKTsKKyAgICAgICAgb3V0LndyaXRlSW50KG1NYXhCeXRlc1Blck91dGdvaW5nRGF0YWdyYW0pOwogICAgIH0KIAogICAgIEBOb25OdWxsIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxTYXRlbGxpdGVDYXBhYmlsaXRpZXM+IENSRUFUT1IgPSBuZXcgQ3JlYXRvcjw+KCkgewpAQCAtMTExLDE2ICsxMDMsMTIgQEAKICAgICAgICAgICAgIHNiLmFwcGVuZCgibm9uZSwiKTsKICAgICAgICAgfQogCi0gICAgICAgIHNiLmFwcGVuZCgiaXNBbHdheXNPbjoiKTsKLSAgICAgICAgc2IuYXBwZW5kKG1Jc0Fsd2F5c09uKTsKKyAgICAgICAgc2IuYXBwZW5kKCJpc1BvaW50aW5nUmVxdWlyZWQ6Iik7CisgICAgICAgIHNiLmFwcGVuZChtSXNQb2ludGluZ1JlcXVpcmVkKTsKICAgICAgICAgc2IuYXBwZW5kKCIsIik7CiAKLSAgICAgICAgc2IuYXBwZW5kKCJuZWVkc1BvaW50aW5nVG9TYXRlbGxpdGU6Iik7Ci0gICAgICAgIHNiLmFwcGVuZChtTmVlZHNQb2ludGluZ1RvU2F0ZWxsaXRlKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsIik7Ci0KLSAgICAgICAgc2IuYXBwZW5kKCJuZWVkc1NlcGFyYXRlU2ltUHJvZmlsZToiKTsKLSAgICAgICAgc2IuYXBwZW5kKG1OZWVkc1NlcGFyYXRlU2ltUHJvZmlsZSk7CisgICAgICAgIHNiLmFwcGVuZCgibWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtIik7CisgICAgICAgIHNiLmFwcGVuZChtTWF4Qnl0ZXNQZXJPdXRnb2luZ0RhdGFncmFtKTsKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQogCkBAIC0xMzMsMzMgKzEyMSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB3aGV0aGVyIHRoZSBzYXRlbGxpdGUgbW9kZW0gaXMgYWx3YXlzIG9uLgotICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBwb3dlciBpbXBhY3Qgb2Yga2VlcGluZyBpdCBvbiBpcyB2ZXJ5IG1pbmltYWwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGFsd2F5cyBvbiBhbmQge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbHdheXNPbigpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0Fsd2F5c09uOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCB3aGV0aGVyIFVFIG5lZWRzIHRvIHBvaW50IHRvIGEgc2F0ZWxsaXRlIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YS4KICAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIFVFIG5lZWRzIHRvIHBvaW50aW5nIHRvIGEgc2F0ZWxsaXRlIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSBhbmQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBVRSBuZWVkcyB0byBwb2ludCB0byBhIHNhdGVsbGl0ZSB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEgYW5kCiAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc1BvaW50aW5nVG9TYXRlbGxpdGUoKSB7Ci0gICAgICAgIHJldHVybiBtTmVlZHNQb2ludGluZ1RvU2F0ZWxsaXRlOworICAgIHB1YmxpYyBib29sZWFuIGlzUG9pbnRpbmdSZXF1aXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Jc1BvaW50aW5nUmVxdWlyZWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHdoZXRoZXIgVUUgbmVlZHMgYSBzZXBhcmF0ZSBTSU0gcHJvZmlsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzYXRlbGxpdGUgbmV0d29yay4KKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgcGVyIGRhdGFncmFtIHRoYXQgY2FuIGJlIHNlbnQgb3ZlciBzYXRlbGxpdGUuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBVRSBuZWVkcyBhIHNlcGFyYXRlIFNJTSBwcm9maWxlIHRvIGNvbXVuaWNhdGUgd2l0aCB0aGUgc2F0ZWxsaXRlCi0gICAgICogICAgICAgICBuZXR3b3JrIGFuZCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBwZXIgZGF0YWdyYW0gdGhhdCBjYW4gYmUgc2VudCBvdmVyIHNhdGVsbGl0ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc1NlcGFyYXRlU2ltUHJvZmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OZWVkc1NlcGFyYXRlU2ltUHJvZmlsZTsKKyAgICBwdWJsaWMgaW50IGdldE1heEJ5dGVzUGVyT3V0Z29pbmdEYXRhZ3JhbSgpIHsKKyAgICAgICAgcmV0dXJuIG1NYXhCeXRlc1Blck91dGdvaW5nRGF0YWdyYW07CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCBpbikgewpAQCAtMTcxLDggKzE0OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBtSXNBbHdheXNPbiA9IGluLnJlYWRCb29sZWFuKCk7Ci0gICAgICAgIG1OZWVkc1BvaW50aW5nVG9TYXRlbGxpdGUgPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICBtTmVlZHNTZXBhcmF0ZVNpbVByb2ZpbGUgPSBpbi5yZWFkQm9vbGVhbigpOworICAgICAgICBtSXNQb2ludGluZ1JlcXVpcmVkID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgbU1heEJ5dGVzUGVyT3V0Z29pbmdEYXRhZ3JhbSA9IGluLnJlYWRJbnQoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlRGF0YWdyYW0uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVEYXRhZ3JhbS5qYXZhCmluZGV4IGNjNWE5ZjQuLmQzY2I4YTAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVEYXRhZ3JhbS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVEYXRhZ3JhbS5qYXZhCkBAIC0xNyw3ICsxNyw2IEBACiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LnNhdGVsbGl0ZTsKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiAKQEAgLTI4LDcgKzI3LDcgQEAKICAgICAvKioKICAgICAgKiBEYXRhZ3JhbSB0byBiZSBzZW50IG9yIHJlY2VpdmVkIG92ZXIgc2F0ZWxsaXRlLgogICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIG1EYXRhOworICAgIEBOb25OdWxsIHByaXZhdGUgYnl0ZVtdIG1EYXRhOwogCiAgICAgLyoqCiAgICAgICogQGhpZGUKQEAgLTUxLDggKzUwLDggQEAKICAgICAgICAgb3V0LndyaXRlQnl0ZUFycmF5KG1EYXRhKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbCBDcmVhdG9yPFNhdGVsbGl0ZURhdGFncmFtPiBDUkVBVE9SID0KLSAgICAgICAgICAgIG5ldyBDcmVhdG9yPFNhdGVsbGl0ZURhdGFncmFtPigpIHsKKyAgICBATm9uTnVsbCBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8U2F0ZWxsaXRlRGF0YWdyYW0+IENSRUFUT1IgPQorICAgICAgICAgICAgbmV3IENyZWF0b3I8PigpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgU2F0ZWxsaXRlRGF0YWdyYW0gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXRlbGxpdGVEYXRhZ3JhbShpbik7CkBAIC02NCw4ICs2Myw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKIAotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBieXRlW10gZ2V0U2F0ZWxsaXRlRGF0YWdyYW0oKSB7CisgICAgQE5vbk51bGwgcHVibGljIGJ5dGVbXSBnZXRTYXRlbGxpdGVEYXRhZ3JhbSgpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2suamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrLmphdmEKaW5kZXggMjEzYjk4NS4uZjIzN2FkYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2suamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjay5qYXZhCkBAIC0xNyw0OCArMTcsMTggQEAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlOwogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSUxvbmdDb25zdW1lcjsKIAotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCiAvKioKICAqIEEgY2FsbGJhY2sgY2xhc3MgZm9yIGxpc3RlbmluZyB0byBzYXRlbGxpdGUgZGF0YWdyYW1zLgogICoKICAqIEBoaWRlCiAgKi8KLXB1YmxpYyBjbGFzcyBTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrIHsKLSAgICBwcml2YXRlIGZpbmFsIENhbGxiYWNrQmluZGVyIG1CaW5kZXIgPSBuZXcgQ2FsbGJhY2tCaW5kZXIodGhpcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWxsYmFja0JpbmRlciBleHRlbmRzIElTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrLlN0dWIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2sgbUxvY2FsQ2FsbGJhY2s7Ci0gICAgICAgIHByaXZhdGUgRXhlY3V0b3IgbUV4ZWN1dG9yOwotCi0gICAgICAgIHByaXZhdGUgQ2FsbGJhY2tCaW5kZXIoU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjayBsb2NhbENhbGxiYWNrKSB7Ci0gICAgICAgICAgICBtTG9jYWxDYWxsYmFjayA9IGxvY2FsQ2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVEYXRhZ3JhbVJlY2VpdmVkKGxvbmcgZGF0YWdyYW1JZCwKLSAgICAgICAgICAgICAgICBATm9uTnVsbCBTYXRlbGxpdGVEYXRhZ3JhbSBkYXRhZ3JhbSwgaW50IHBlbmRpbmdDb3VudCwKLSAgICAgICAgICAgICAgICBATm9uTnVsbCBJTG9uZ0NvbnN1bWVyIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGNhbGxpbmdJZGVudGl0eSA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBtTG9jYWxDYWxsYmFjay5vblNhdGVsbGl0ZURhdGFncmFtUmVjZWl2ZWQoZGF0YWdyYW1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFncmFtLCBwZW5kaW5nQ291bnQsIGNhbGxiYWNrKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoY2FsbGluZ0lkZW50aXR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRFeGVjdXRvcihFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgbUV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KK3B1YmxpYyBpbnRlcmZhY2UgU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjayB7CiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gaW5jb21pbmcgZGF0YWdyYW0gdG8gYmUgcmVjZWl2ZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YWdyYW1JZCBBbiBpZCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgaW5jb21pbmcgZGF0YWdyYW0uCiAgICAgICogQHBhcmFtIGRhdGFncmFtIERhdGFncmFtIHRvIGJlIHJlY2VpdmVkIG92ZXIgc2F0ZWxsaXRlLgogICAgICAqIEBwYXJhbSBwZW5kaW5nQ291bnQgTnVtYmVyIG9mIGRhdGFncmFtcyB5ZXQgdG8gYmUgcmVjZWl2ZWQgYnkgdGhlIGFwcC4KQEAgLTY2LDE5ICszNiw2IEBACiAgICAgICogICAgICAgICAgICAgICAgIGRhdGFncmFtSWQgdG8gVGVsZXBob255LiBJZiB0aGUgY2FsbGJhY2sgaXMgbm90IHJlY2VpdmVkIHdpdGhpbiBmaXZlIG1pbnV0ZXMsCiAgICAgICogICAgICAgICAgICAgICAgIFRlbGVwaG9ueSB3aWxsIHJlc2VuZCB0aGUgZGF0YWdyYW0uCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVEYXRhZ3JhbVJlY2VpdmVkKGxvbmcgZGF0YWdyYW1JZCwgQE5vbk51bGwgU2F0ZWxsaXRlRGF0YWdyYW0gZGF0YWdyYW0sCi0gICAgICAgICAgICBpbnQgcGVuZGluZ0NvdW50LCBATm9uTnVsbCBJTG9uZ0NvbnN1bWVyIGNhbGxiYWNrKSB7Ci0gICAgICAgIC8vIEJhc2UgSW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICAvKiogQGhpZGUgKi8KLSAgICBATm9uTnVsbAotICAgIGZpbmFsIElTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrIGdldEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1CaW5kZXI7Ci0gICAgfQotCi0gICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhlY3V0b3IoQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKLSAgICAgICAgbUJpbmRlci5zZXRFeGVjdXRvcihleGVjdXRvcik7Ci0gICAgfQorICAgIHZvaWQgb25TYXRlbGxpdGVEYXRhZ3JhbVJlY2VpdmVkKGxvbmcgZGF0YWdyYW1JZCwgQE5vbk51bGwgU2F0ZWxsaXRlRGF0YWdyYW0gZGF0YWdyYW0sCisgICAgICAgICAgICBpbnQgcGVuZGluZ0NvdW50LCBATm9uTnVsbCBJTG9uZ0NvbnN1bWVyIGNhbGxiYWNrKTsKIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlTWFuYWdlci5qYXZhCmluZGV4IDllYzY5MjkuLmUzMjU2NmQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZU1hbmFnZXIuamF2YQpAQCAtMzYsMTIgKzM2LDE1IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255RnJhbWV3b3JrSW5pdGlhbGl6ZXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSUludGVnZXJDb25zdW1lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSUxvbmdDb25zdW1lcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueTsKIGltcG9ydCBjb20uYW5kcm9pZC50ZWxlcGhvbnkuUmxvZzsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS50aW1lLkR1cmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIApAQCAtNTUsNiArNTgsMTcgQEAKIHB1YmxpYyBjbGFzcyBTYXRlbGxpdGVNYW5hZ2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhdGVsbGl0ZU1hbmFnZXIiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjaywgSVNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2s+CisgICAgICAgICAgICBzU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFja01hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjaywKKyAgICAgICAgICAgIElTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrPiBzU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFja01hcCA9CisgICAgICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2ssIElTYXRlbGxpdGVTdGF0ZUNhbGxiYWNrPgorICAgICAgICAgICAgc1NhdGVsbGl0ZVN0YXRlQ2FsbGJhY2tNYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrLAorICAgICAgICAgICAgSVNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrPiBzU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2tNYXAgPQorICAgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKwogICAgIHByaXZhdGUgZmluYWwgaW50IG1TdWJJZDsKIAogICAgIC8qKgpAQCAtNjYsNiArODAsNyBAQAogICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgU2F0ZWxsaXRlTWFuYWdlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRoZSBTYXRlbGxpdGVNYW5hZ2VyIGJlbG9uZ3MgdG8uCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgU2F0ZWxsaXRlTWFuYWdlcihATnVsbGFibGUgQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgU3Vic2NyaXB0aW9uTWFuYWdlci5ERUZBVUxUX1NVQlNDUklQVElPTl9JRCk7CkBAIC0xMTYsNyArMTMxLDcgQEAKIAogICAgIC8qKgogICAgICAqIEJ1bmRsZSBrZXkgdG8gZ2V0IHRoZSByZXNwb25zZSBmcm9tCi0gICAgICoge0BsaW5rICNyZXF1ZXN0SXNTYXRlbGxpdGVEZW1vTW9kZUVuYWJsZWQoRXhlY3V0b3IsIE91dGNvbWVSZWNlaXZlcil9LgorICAgICAqIHtAbGluayAjcmVxdWVzdElzRGVtb01vZGVFbmFibGVkKEV4ZWN1dG9yLCBPdXRjb21lUmVjZWl2ZXIpfS4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERU1PX01PREVfRU5BQkxFRCA9ICJkZW1vX21vZGVfZW5hYmxlZCI7CkBAIC0xMzcsMTQgKzE1Miw2IEBACiAKICAgICAvKioKICAgICAgKiBCdW5kbGUga2V5IHRvIGdldCB0aGUgcmVzcG9uc2UgZnJvbQotICAgICAqIHtAbGluayAjcmVxdWVzdE1heFNpemVQZXJTZW5kaW5nRGF0YWdyYW0oRXhlY3V0b3IsIE91dGNvbWVSZWNlaXZlcil9IC4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfQ0hBUkFDVEVSU19QRVJfU0FURUxMSVRFX1RFWFQgPQotICAgICAgICAgICAgIm1heF9jaGFyYWN0ZXJzX3Blcl9zYXRlbGxpdGVfdGV4dCI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUga2V5IHRvIGdldCB0aGUgcmVzcG9uc2UgZnJvbQogICAgICAqIHtAbGluayAjcmVxdWVzdElzU2F0ZWxsaXRlUHJvdmlzaW9uZWQoRXhlY3V0b3IsIE91dGNvbWVSZWNlaXZlcil9LgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC0zMTksMjMgKzMyNiwyNSBAQAogICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5UUmFkaW9UZWNobm9sb2d5IHt9CiAKICAgICAvKioKLSAgICAgKiBSZXF1ZXN0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0uIElmIHRoZSBzYXRlbGxpdGUgbW9kZW0gaXMgZW5hYmxlZCwgdGhpcwotICAgICAqIHdpbGwgYWxzbyBkaXNhYmxlIHRoZSBjZWxsdWxhciBtb2RlbSwgYW5kIGlmIHRoZSBzYXRlbGxpdGUgbW9kZW0gaXMgZGlzYWJsZWQsIHRoaXMgd2lsbCBhbHNvCi0gICAgICogcmUtZW5hYmxlIHRoZSBjZWxsdWxhciBtb2RlbS4KKyAgICAgKiBSZXF1ZXN0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0gYW5kIGRlbW8gbW9kZS4gSWYgdGhlIHNhdGVsbGl0ZSBtb2RlbSBpcworICAgICAqIGVuYWJsZWQsIHRoaXMgbWF5IGFsc28gZGlzYWJsZSB0aGUgY2VsbHVsYXIgbW9kZW0sIGFuZCBpZiB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGRpc2FibGVkLAorICAgICAqIHRoaXMgbWF5IGFsc28gcmUtZW5hYmxlIHRoZSBjZWxsdWxhciBtb2RlbS4KICAgICAgKgotICAgICAqIEBwYXJhbSBlbmFibGUge0Bjb2RlIHRydWV9IHRvIGVuYWJsZSB0aGUgc2F0ZWxsaXRlIG1vZGVtIGFuZCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCisgICAgICogQHBhcmFtIGVuYWJsZVNhdGVsbGl0ZSB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0gYW5kCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCisgICAgICogQHBhcmFtIGVuYWJsZURlbW9Nb2RlIHtAY29kZSB0cnVlfSB0byBlbmFibGUgZGVtbyBtb2RlIGFuZCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCiAgICAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSBleGVjdXRvciBvbiB3aGljaCB0aGUgZXJyb3IgY29kZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZC4KLSAgICAgKiBAcGFyYW0gZXJyb3JDb2RlTGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSByZXN1bHRMaXN0ZW5lciBMaXN0ZW5lciBmb3IgdGhlIHtAbGluayBTYXRlbGxpdGVFcnJvcn0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBjYWxsZXIgZG9lc24ndCBoYXZlIHJlcXVpcmVkIHBlcm1pc3Npb24uCiAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIFRlbGVwaG9ueSBwcm9jZXNzIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLgogICAgICAqLwogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikKLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZCgKLSAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlLCBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIEBOb25OdWxsIENvbnN1bWVyPEludGVnZXI+IGVycm9yQ29kZUxpc3RlbmVyKSB7CisgICAgcHVibGljIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVTYXRlbGxpdGUsIGJvb2xlYW4gZW5hYmxlRGVtb01vZGUsCisgICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKKyAgICAgICAgICAgIEBTYXRlbGxpdGVFcnJvciBATm9uTnVsbCBDb25zdW1lcjxJbnRlZ2VyPiByZXN1bHRMaXN0ZW5lcikgewogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGV4ZWN1dG9yKTsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChlcnJvckNvZGVMaXN0ZW5lcik7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwocmVzdWx0TGlzdGVuZXIpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBJVGVsZXBob255IHRlbGVwaG9ueSA9IGdldElUZWxlcGhvbnkoKTsKQEAgLTM0NCwxMCArMzUzLDExIEBACiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoaW50IHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBlcnJvckNvZGVMaXN0ZW5lci5hY2NlcHQocmVzdWx0KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiByZXN1bHRMaXN0ZW5lci5hY2NlcHQocmVzdWx0KSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB0ZWxlcGhvbnkucmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQobVN1YklkLCBlbmFibGUsIGVycm9yQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIHRlbGVwaG9ueS5yZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZChtU3ViSWQsIGVuYWJsZVNhdGVsbGl0ZSwgZW5hYmxlRGVtb01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTQxMiw1MCArNDIyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2F0ZWxsaXRlIHNlcnZpY2UgZGVtbyBtb2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlIHRoZSBzYXRlbGxpdGUgZGVtbyBtb2RlIGFuZCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCi0gICAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSBleGVjdXRvciBvbiB3aGljaCB0aGUgZXJyb3IgY29kZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZC4KLSAgICAgKiBAcGFyYW0gZXJyb3JDb2RlTGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZURlbW9Nb2RlRW5hYmxlZChib29sZWFuIGVuYWJsZSwKLSAgICAgICAgICAgIEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLAotICAgICAgICAgICAgQE5vbk51bGwgQ29uc3VtZXI8SW50ZWdlcj4gZXJyb3JDb2RlTGlzdGVuZXIpIHsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvcik7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXJyb3JDb2RlTGlzdGVuZXIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVGVsZXBob255IHRlbGVwaG9ueSA9IGdldElUZWxlcGhvbnkoKTsKLSAgICAgICAgICAgIGlmICh0ZWxlcGhvbnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjayA9IG5ldyBJSW50ZWdlckNvbnN1bWVyLlN0dWIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoaW50IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBlcnJvckNvZGVMaXN0ZW5lci5hY2NlcHQocmVzdWx0KSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB0ZWxlcGhvbnkucmVxdWVzdFNhdGVsbGl0ZURlbW9Nb2RlRW5hYmxlZChtU3ViSWQsIGVuYWJsZSwgZXJyb3JDYWxsYmFjayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRlbGVwaG9ueSBzZXJ2aWNlIGlzIG51bGwuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgUmxvZy5lKFRBRywgInJlcXVlc3RTYXRlbGxpdGVEZW1vTW9kZUVuYWJsZWQoKSBSZW1vdGVFeGNlcHRpb246ICIsIGV4KTsKLSAgICAgICAgICAgIGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGdldCB3aGV0aGVyIHRoZSBzYXRlbGxpdGUgc2VydmljZSBkZW1vIG1vZGUgaXMgZW5hYmxlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBleGVjdXRvciBUaGUgZXhlY3V0b3Igb24gd2hpY2ggdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkLgogICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2JqZWN0IHRvIHdoaWNoIHRoZSByZXN1bHQgd2lsbCBiZSBkZWxpdmVyZWQuCiAgICAgICogICAgICAgICAgICAgICAgIElmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsIHtAbGluayBPdXRjb21lUmVjZWl2ZXIjb25SZXN1bHQoT2JqZWN0KX0KLSAgICAgKiAgICAgICAgICAgICAgICAgd2lsbCByZXR1cm4gYSB7QGNvZGUgYm9vbGVhbn0gd2l0aCB2YWx1ZSB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNhdGVsbGl0ZQotICAgICAqICAgICAgICAgICAgICAgICBkZW1vIG1vZGUgaXMgZW5hYmxlZCBhbmQge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogICAgICAgICAgICAgICAgIHdpbGwgcmV0dXJuIGEge0Bjb2RlIGJvb2xlYW59IHdpdGggdmFsdWUge0Bjb2RlIHRydWV9IGlmIGRlbW8gbW9kZSBpcyBlbmFibGVkCisgICAgICogICAgICAgICAgICAgICAgIGFuZCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKiAgICAgICAgICAgICAgICAgSWYgdGhlIHJlcXVlc3QgaXMgbm90IHN1Y2Nlc3NmdWwsIHtAbGluayBPdXRjb21lUmVjZWl2ZXIjb25FcnJvcihUaHJvd2FibGUpfQogICAgICAqICAgICAgICAgICAgICAgICB3aWxsIHJldHVybiBhIHtAbGluayBTYXRlbGxpdGVFeGNlcHRpb259IHdpdGggdGhlIHtAbGluayBTYXRlbGxpdGVFcnJvcn0uCiAgICAgICoKQEAgLTQ2Myw3ICs0MzYsNyBAQAogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdElzU2F0ZWxsaXRlRGVtb01vZGVFbmFibGVkKEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLAorICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RJc0RlbW9Nb2RlRW5hYmxlZChATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKICAgICAgICAgICAgIEBOb25OdWxsIE91dGNvbWVSZWNlaXZlcjxCb29sZWFuLCBTYXRlbGxpdGVFeGNlcHRpb24+IGNhbGxiYWNrKSB7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXhlY3V0b3IpOwogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGNhbGxiYWNrKTsKQEAgLTQ5MiwxMiArNDY1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIHRlbGVwaG9ueS5yZXF1ZXN0SXNTYXRlbGxpdGVEZW1vTW9kZUVuYWJsZWQobVN1YklkLCByZWNlaXZlcik7CisgICAgICAgICAgICAgICAgdGVsZXBob255LnJlcXVlc3RJc0RlbW9Nb2RlRW5hYmxlZChtU3ViSWQsIHJlY2VpdmVyKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2dlKCJyZXF1ZXN0SXNTYXRlbGxpdGVEZW1vTW9kZUVuYWJsZWQoKSBSZW1vdGVFeGNlcHRpb246ICIgKyBleCk7CisgICAgICAgICAgICBsb2dlKCJyZXF1ZXN0SXNEZW1vTW9kZUVuYWJsZWQoKSBSZW1vdGVFeGNlcHRpb246ICIgKyBleCk7CiAgICAgICAgICAgICBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjc0LDYgKzY0Nyw3IEBACiAgICAgfSkKICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCiAgICAgcHVibGljIEBpbnRlcmZhY2UgU2F0ZWxsaXRlRGF0YWdyYW1UcmFuc2ZlclN0YXRlIHt9CisgICAgLy8gVE9ETzogU3BsaXQgaW50byB0d28gZW51bXMgZm9yIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBzdGF0ZXMKIAogICAgIC8qKgogICAgICAqIFNhdGVsbGl0ZSBtb2RlbSBpcyBpbiBpZGxlIHN0YXRlLgpAQCAtNzQyLDE0NSArNzE2LDEyNSBAQAogICAgIHB1YmxpYyBAaW50ZXJmYWNlIERhdGFncmFtVHlwZSB7fQogCiAgICAgLyoqCi0gICAgICogU3RhcnQgcmVjZWl2aW5nIHNhdGVsbGl0ZSBwb3NpdGlvbiB1cGRhdGVzLgorICAgICAqIFN0YXJ0IHJlY2VpdmluZyBzYXRlbGxpdGUgdHJhbnNtaXNzaW9uIHVwZGF0ZXMuCiAgICAgICogVGhpcyBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBwb2ludGluZyBVSSB3aGVuIHRoZSB1c2VyIHN0YXJ0cyBwb2ludGluZyB0byB0aGUgc2F0ZWxsaXRlLgogICAgICAqIE1vZGVtIHNob3VsZCBjb250aW51ZSB0byByZXBvcnQgdGhlIHBvaW50aW5nIGlucHV0IGFzIHRoZSBkZXZpY2Ugb3Igc2F0ZWxsaXRlIG1vdmVzLgotICAgICAqIFNhdGVsbGl0ZSBwb3NpdGlvbiB1cGRhdGVzIGFyZSBzdGFydGVkIG9ubHkgb24ge0BsaW5rICNTQVRFTExJVEVfRVJST1JfTk9ORX0uCisgICAgICogU2F0ZWxsaXRlIHRyYW5zbWlzc2lvbiB1cGRhdGVzIGFyZSBzdGFydGVkIG9ubHkgb24ge0BsaW5rICNTQVRFTExJVEVfRVJST1JfTk9ORX0uCiAgICAgICogQWxsIG90aGVyIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBmYWlsZWQuCi0gICAgICogT25jZSBzYXRlbGxpdGUgcG9zaXRpb24gdXBkYXRlcyBiZWdpbiwgZGF0YWdyYW0gdHJhbnNmZXIgc3RhdGUgdXBkYXRlcyB3aWxsIGJlIHNlbnQKLSAgICAgKiB0aHJvdWdoIHtAbGluayBTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrfS4KKyAgICAgKiBPbmNlIHNhdGVsbGl0ZSB0cmFuc21pc3Npb24gdXBkYXRlcyBiZWdpbiwgcG9zaXRpb24gYW5kIGRhdGFncmFtIHRyYW5zZmVyIHN0YXRlIHVwZGF0ZXMKKyAgICAgKiB3aWxsIGJlIHNlbnQgdGhyb3VnaCB7QGxpbmsgU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2t9LgogICAgICAqCiAgICAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSBleGVjdXRvciBvbiB3aGljaCB0aGUgY2FsbGJhY2sgYW5kIGVycm9yIGNvZGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQuCi0gICAgICogQHBhcmFtIGVycm9yQ29kZUxpc3RlbmVyIExpc3RlbmVyIGZvciB0aGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIG5vdGlmeSBvZiBjaGFuZ2VzIGluIHNhdGVsbGl0ZSBwb3NpdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0TGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gbm90aWZ5IG9mIHNhdGVsbGl0ZSB0cmFuc21pc3Npb24gdXBkYXRlcy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgdGhlIGNhbGxlciBkb2Vzbid0IGhhdmUgcmVxdWlyZWQgcGVybWlzc2lvbi4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgVGVsZXBob255IHByb2Nlc3MgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVzKEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLAotICAgICAgICAgICAgQE5vbk51bGwgQ29uc3VtZXI8SW50ZWdlcj4gZXJyb3JDb2RlTGlzdGVuZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgcHVibGljIHZvaWQgc3RhcnRTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVzKEBOb25OdWxsIEBDYWxsYmFja0V4ZWN1dG9yIEV4ZWN1dG9yIGV4ZWN1dG9yLAorICAgICAgICAgICAgQFNhdGVsbGl0ZUVycm9yIEBOb25OdWxsIENvbnN1bWVyPEludGVnZXI+IHJlc3VsdExpc3RlbmVyLAorICAgICAgICAgICAgQE5vbk51bGwgU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvcik7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXJyb3JDb2RlTGlzdGVuZXIpOworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHJlc3VsdExpc3RlbmVyKTsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChjYWxsYmFjayk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwogICAgICAgICAgICAgICAgIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjayA9IG5ldyBJSW50ZWdlckNvbnN1bWVyLlN0dWIoKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoaW50IHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBlcnJvckNvZGVMaXN0ZW5lci5hY2NlcHQocmVzdWx0KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiByZXN1bHRMaXN0ZW5lci5hY2NlcHQocmVzdWx0KSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB0ZWxlcGhvbnkuc3RhcnRTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViSWQsIGVycm9yQ2FsbGJhY2ssIGNhbGxiYWNrLmdldEJpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBJU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2sgaW50ZXJuYWxDYWxsYmFjayA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSVNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrLlN0dWIoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNhdGVsbGl0ZVBvc2l0aW9uQ2hhbmdlZChQb2ludGluZ0luZm8gcG9pbnRpbmdJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjYWxsYmFjay5vblNhdGVsbGl0ZVBvc2l0aW9uQ2hhbmdlZChwb2ludGluZ0luZm8pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZW5kRGF0YWdyYW1TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLCBpbnQgc2VuZFBlbmRpbmdDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvckNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNhbGxiYWNrLm9uU2VuZERhdGFncmFtU3RhdGVDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIHNlbmRQZW5kaW5nQ291bnQsIGVycm9yQ29kZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVEYXRhZ3JhbVN0YXRlQ2hhbmdlZChpbnQgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjZWl2ZVBlbmRpbmdDb3VudCwgaW50IGVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY2FsbGJhY2sub25SZWNlaXZlRGF0YWdyYW1TdGF0ZUNoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgcmVjZWl2ZVBlbmRpbmdDb3VudCwgZXJyb3JDb2RlKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgc1NhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrTWFwLnB1dChjYWxsYmFjaywgaW50ZXJuYWxDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgdGVsZXBob255LnN0YXJ0U2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlcyhtU3ViSWQsIGVycm9yQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbENhbGxiYWNrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2dlKCJzdGFydFNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlcygpIFJlbW90ZUV4Y2VwdGlvbjogIiArIGV4KTsKKyAgICAgICAgICAgIGxvZ2UoInN0YXJ0U2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlcygpIFJlbW90ZUV4Y2VwdGlvbjogIiArIGV4KTsKICAgICAgICAgICAgIGV4LnJldGhyb3dGcm9tU3lzdGVtU2VydmVyKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdG9wIHJlY2VpdmluZyBzYXRlbGxpdGUgcG9zaXRpb24gdXBkYXRlcy4KKyAgICAgKiBTdG9wIHJlY2VpdmluZyBzYXRlbGxpdGUgdHJhbnNtaXNzaW9uIHVwZGF0ZXMuCiAgICAgICogVGhpcyBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBwb2ludGluZyBVSSB3aGVuIHRoZSB1c2VyIHN0b3BzIHBvaW50aW5nIHRvIHRoZSBzYXRlbGxpdGUuCi0gICAgICogU2F0ZWxsaXRlIHBvc2l0aW9uIHVwZGF0ZXMgYXJlIHN0b3BwZWQgYW5kIHRoZSBjYWxsYmFjayBpcyB1bnJlZ2lzdGVyZWQgb25seSBvbgorICAgICAqIFNhdGVsbGl0ZSB0cmFuc21pc3Npb24gdXBkYXRlcyBhcmUgc3RvcHBlZCBhbmQgdGhlIGNhbGxiYWNrIGlzIHVucmVnaXN0ZXJlZCBvbmx5IG9uCiAgICAgICoge0BsaW5rICNTQVRFTExJVEVfRVJST1JfTk9ORX0uIEFsbCBvdGhlciByZXN1bHRzIHRoYXQgdGhpcyBvcGVyYXRpb24gZmFpbGVkLgogICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IHdhcyBwYXNzZWQgdG8KLSAgICAgKiB7QGxpbmsgI3N0YXJ0U2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVzKEV4ZWN1dG9yLCBDb25zdW1lciwgU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjayl9LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdGhhdCB3YXMgcGFzc2VkIHRvIHtAbGluaworICAgICAqICNzdGFydFNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZXMoRXhlY3V0b3IsIENvbnN1bWVyLCBTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVDYWxsYmFjayl9LgogICAgICAqIEBwYXJhbSBleGVjdXRvciBUaGUgZXhlY3V0b3Igb24gd2hpY2ggdGhlIGVycm9yIGNvZGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQuCi0gICAgICogQHBhcmFtIGVycm9yQ29kZUxpc3RlbmVyIExpc3RlbmVyIGZvciB0aGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0TGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCi0gICAgcHVibGljIHZvaWQgc3RvcFNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlcyhATm9uTnVsbCBTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrIGNhbGxiYWNrLAorICAgIHB1YmxpYyB2b2lkIHN0b3BTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVzKAorICAgICAgICAgICAgQE5vbk51bGwgU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIEBOb25OdWxsIENvbnN1bWVyPEludGVnZXI+IGVycm9yQ29kZUxpc3RlbmVyKSB7CisgICAgICAgICAgICBAU2F0ZWxsaXRlRXJyb3IgQE5vbk51bGwgQ29uc3VtZXI8SW50ZWdlcj4gcmVzdWx0TGlzdGVuZXIpIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChjYWxsYmFjayk7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXhlY3V0b3IpOwotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGVycm9yQ29kZUxpc3RlbmVyKTsKKyAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChyZXN1bHRMaXN0ZW5lcik7CisgICAgICAgIElTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVDYWxsYmFjayBpbnRlcm5hbENhbGxiYWNrID0KKyAgICAgICAgICAgICAgICBzU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2tNYXAucmVtb3ZlKGNhbGxiYWNrKTsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgSVRlbGVwaG9ueSB0ZWxlcGhvbnkgPSBnZXRJVGVsZXBob255KCk7CiAgICAgICAgICAgICBpZiAodGVsZXBob255ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2sgPSBuZXcgSUludGVnZXJDb25zdW1lci5TdHViKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGludCByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gZXJyb3JDb2RlTGlzdGVuZXIuYWNjZXB0KHJlc3VsdCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgdGVsZXBob255LnN0b3BTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZXMobVN1YklkLCBlcnJvckNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZ2V0QmluZGVyKCkpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IE5vdGlmeSBTbXNIYW5kbGVyIHRoYXQgcG9pbnRpbmcgVUkgc3RvcHBlZAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0ZWxlcGhvbnkgc2VydmljZSBpcyBudWxsLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZ2UoInN0b3BTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZXMoKSBSZW1vdGVFeGNlcHRpb246ICIgKyBleCk7Ci0gICAgICAgICAgICBleC5yZXRocm93RnJvbVN5c3RlbVNlcnZlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBnZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBkYXRhZ3JhbSB0aGF0IGNhbiBiZSBzZW50IHRvIHNhdGVsbGl0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleGVjdXRvciBUaGUgZXhlY3V0b3Igb24gd2hpY2ggdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2JqZWN0IHRvIHdoaWNoIHRoZSByZXN1bHQgd2lsbCBiZSBkZWxpdmVyZWQuCi0gICAgICogICAgICAgICAgICAgICAgIElmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsIHtAbGluayBPdXRjb21lUmVjZWl2ZXIjb25SZXN1bHQoT2JqZWN0KX0KLSAgICAgKiAgICAgICAgICAgICAgICAgd2lsbCByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBkYXRhZ3JhbSB0aGF0IGNhbiBiZSBzZW50IHRvCi0gICAgICogICAgICAgICAgICAgICAgIHNhdGVsbGl0ZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgSWYgdGhlIHJlcXVlc3QgaXMgbm90IHN1Y2Nlc3NmdWwsIHtAbGluayBPdXRjb21lUmVjZWl2ZXIjb25FcnJvcihUaHJvd2FibGUpfQotICAgICAqCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdE1heFNpemVQZXJTZW5kaW5nRGF0YWdyYW0oCi0gICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIEBOb25OdWxsIE91dGNvbWVSZWNlaXZlcjxJbnRlZ2VyLCBTYXRlbGxpdGVFeGNlcHRpb24+IGNhbGxiYWNrKSB7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXhlY3V0b3IpOwotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGNhbGxiYWNrKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVRlbGVwaG9ueSB0ZWxlcGhvbnkgPSBnZXRJVGVsZXBob255KCk7Ci0gICAgICAgICAgICBpZiAodGVsZXBob255ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBSZXN1bHRSZWNlaXZlciByZWNlaXZlciA9IG5ldyBSZXN1bHRSZWNlaXZlcihudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlY2VpdmVSZXN1bHQoaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHREYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Q29kZSA9PSBTQVRFTExJVEVfRVJST1JfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHREYXRhLmNvbnRhaW5zS2V5KEtFWV9NQVhfQ0hBUkFDVEVSU19QRVJfU0FURUxMSVRFX1RFWFQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhDaGFyYWN0ZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHREYXRhLmdldEludChLRVlfTUFYX0NIQVJBQ1RFUlNfUEVSX1NBVEVMTElURV9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KCgpIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQobWF4Q2hhcmFjdGVycykpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dlKCJLRVlfTUFYX0NIQVJBQ1RFUlNfUEVSX1NBVEVMTElURV9URVhUIGRvZXMgbm90IGV4aXN0LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNhdGVsbGl0ZUV4Y2VwdGlvbihTQVRFTExJVEVfUkVRVUVTVF9GQUlMRUQpKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBCaW5kZXIud2l0aENsZWFuQ2FsbGluZ0lkZW50aXR5KCgpIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKG5ldyBTYXRlbGxpdGVFeGNlcHRpb24ocmVzdWx0Q29kZSkpKSk7CisgICAgICAgICAgICAgICAgaWYgKGludGVybmFsQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2sgPSBuZXcgSUludGVnZXJDb25zdW1lci5TdHViKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoaW50IHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IHJlc3VsdExpc3RlbmVyLmFjY2VwdChyZXN1bHQpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIHRlbGVwaG9ueS5yZXF1ZXN0TWF4U2l6ZVBlclNlbmRpbmdEYXRhZ3JhbShtU3ViSWQsIHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdGVsZXBob255LnN0b3BTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVzKG1TdWJJZCwgZXJyb3JDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogTm90aWZ5IFNtc0hhbmRsZXIgdGhhdCBwb2ludGluZyBVSSBzdG9wcGVkCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZSgic3RvcFNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZXM6IE5vIGludGVybmFsIGNhbGxiYWNrLiIpOworICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gcmVzdWx0TGlzdGVuZXIuYWNjZXB0KFNBVEVMTElURV9JTlZBTElEX0FSR1VNRU5UUykpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRlbGVwaG9ueSBzZXJ2aWNlIGlzIG51bGwuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nZSgicmVxdWVzdE1heENoYXJhY3RlcnNQZXJTYXRlbGxpdGVUZXh0TWVzc2FnZSgpIFJlbW90ZUV4Y2VwdGlvbjogIiArIGV4KTsKKyAgICAgICAgICAgIGxvZ2UoInN0b3BTYXRlbGxpdGVUcmFuc21pc3Npb25VcGRhdGVzKCkgUmVtb3RlRXhjZXB0aW9uOiAiICsgZXgpOwogICAgICAgICAgICAgZXgucmV0aHJvd0Zyb21TeXN0ZW1TZXJ2ZXIoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTg5MSwyMyArODQ1LDI0IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIGJlIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgcHJvdmlzaW9uaW5nIHdpdGggc2F0ZWxsaXRlCiAgICAgICogICAgICAgICAgICAgIGdhdGV3YXkuCisgICAgICogQHBhcmFtIHJlZ2lvbklkIFRoZSByZWdpb24gSUQgZm9yIHRoZSBkZXZpY2UncyBjdXJyZW50IGxvY2F0aW9uLgogICAgICAqIEBwYXJhbSBjYW5jZWxsYXRpb25TaWduYWwgVGhlIG9wdGlvbmFsIHNpZ25hbCB1c2VkIGJ5IHRoZSBjYWxsZXIgdG8gY2FuY2VsIHRoZSBwcm92aXNpb24KICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuIEV2ZW4gd2hlbiB0aGUgY2FuY2VsbGF0aW9uIGlzIHNpZ25hbGVkLCBUZWxlcGhvbnkgd2lsbAogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgdHJpZ2dlciB0aGUgY2FsbGJhY2sgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhpcyByZXF1ZXN0LgogICAgICAqIEBwYXJhbSBleGVjdXRvciBUaGUgZXhlY3V0b3Igb24gd2hpY2ggdGhlIGVycm9yIGNvZGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQuCi0gICAgICogQHBhcmFtIGVycm9yQ29kZUxpc3RlbmVyIExpc3RlbmVyIGZvciB0aGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0TGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCi0gICAgcHVibGljIHZvaWQgcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShATm9uTnVsbCBTdHJpbmcgdG9rZW4sCisgICAgcHVibGljIHZvaWQgcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShATm9uTnVsbCBTdHJpbmcgdG9rZW4sIEBOb25OdWxsIFN0cmluZyByZWdpb25JZCwKICAgICAgICAgICAgIEBOdWxsYWJsZSBDYW5jZWxsYXRpb25TaWduYWwgY2FuY2VsbGF0aW9uU2lnbmFsLAogICAgICAgICAgICAgQE5vbk51bGwgQENhbGxiYWNrRXhlY3V0b3IgRXhlY3V0b3IgZXhlY3V0b3IsCi0gICAgICAgICAgICBAU2F0ZWxsaXRlRXJyb3IgQE5vbk51bGwgQ29uc3VtZXI8SW50ZWdlcj4gZXJyb3JDb2RlTGlzdGVuZXIpIHsKKyAgICAgICAgICAgIEBTYXRlbGxpdGVFcnJvciBATm9uTnVsbCBDb25zdW1lcjxJbnRlZ2VyPiByZXN1bHRMaXN0ZW5lcikgewogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHRva2VuKTsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvcik7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoZXJyb3JDb2RlTGlzdGVuZXIpOworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHJlc3VsdExpc3RlbmVyKTsKIAogICAgICAgICBJQ2FuY2VsbGF0aW9uU2lnbmFsIGNhbmNlbFJlbW90ZSA9IG51bGw7CiAgICAgICAgIHRyeSB7CkBAIC05MTcsMTAgKzg3MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGludCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gZXJyb3JDb2RlTGlzdGVuZXIuYWNjZXB0KHJlc3VsdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gcmVzdWx0TGlzdGVuZXIuYWNjZXB0KHJlc3VsdCkpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgY2FuY2VsUmVtb3RlID0gdGVsZXBob255LnByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UobVN1YklkLCB0b2tlbiwgZXJyb3JDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgY2FuY2VsUmVtb3RlID0gdGVsZXBob255LnByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UobVN1YklkLCB0b2tlbiwgcmVnaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTk0Miw3ICs4OTgsNyBAQAogICAgICAqIHtAbGluayAjcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShTdHJpbmcsIENhbmNlbGxhdGlvblNpZ25hbCwgRXhlY3V0b3IsIENvbnN1bWVyKX0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIG9mIHRoZSBkZXZpY2Uvc3Vic2NyaXB0aW9uIHRvIGJlIGRlcHJvdmlzaW9uZWQuCi0gICAgICogQHBhcmFtIGVycm9yQ29kZUxpc3RlbmVyIExpc3RlbmVyIGZvciB0aGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0TGlzdGVuZXIgTGlzdGVuZXIgZm9yIHRoZSB7QGxpbmsgU2F0ZWxsaXRlRXJyb3J9IHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KQEAgLTk1MCwxMCArOTA2LDEwIEBACiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKQogICAgIHB1YmxpYyB2b2lkIGRlcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShATm9uTnVsbCBTdHJpbmcgdG9rZW4sCiAgICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIEBTYXRlbGxpdGVFcnJvciBATm9uTnVsbCBDb25zdW1lcjxJbnRlZ2VyPiBlcnJvckNvZGVMaXN0ZW5lcikgeworICAgICAgICAgICAgQFNhdGVsbGl0ZUVycm9yIEBOb25OdWxsIENvbnN1bWVyPEludGVnZXI+IHJlc3VsdExpc3RlbmVyKSB7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwodG9rZW4pOwogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGV4ZWN1dG9yKTsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChlcnJvckNvZGVMaXN0ZW5lcik7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwocmVzdWx0TGlzdGVuZXIpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBJVGVsZXBob255IHRlbGVwaG9ueSA9IGdldElUZWxlcGhvbnkoKTsKQEAgLTk2Miw3ICs5MTgsNyBAQAogICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGludCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gZXJyb3JDb2RlTGlzdGVuZXIuYWNjZXB0KHJlc3VsdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gcmVzdWx0TGlzdGVuZXIuYWNjZXB0KHJlc3VsdCkpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgdGVsZXBob255LmRlcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShtU3ViSWQsIHRva2VuLCBlcnJvckNhbGxiYWNrKTsKQEAgLTk5Niw5ICs5NTIsMTggQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0RXhlY3V0b3IoZXhlY3V0b3IpOworICAgICAgICAgICAgICAgIElTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrIGludGVybmFsQ2FsbGJhY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrLlN0dWIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQoYm9vbGVhbiBwcm92aXNpb25lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY2FsbGJhY2sub25TYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aXNpb25lZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHNTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrTWFwLnB1dChjYWxsYmFjaywgaW50ZXJuYWxDYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbGVwaG9ueS5yZWdpc3RlckZvclNhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJJZCwgY2FsbGJhY2suZ2V0QmluZGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN1YklkLCBpbnRlcm5hbENhbGxiYWNrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTEwMjMsMTEgKzk4OCwxNyBAQAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQoCiAgICAgICAgICAgICBATm9uTnVsbCBTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoY2FsbGJhY2spOworICAgICAgICBJU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjayBpbnRlcm5hbENhbGxiYWNrID0KKyAgICAgICAgICAgICAgICBzU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFja01hcC5yZW1vdmUoY2FsbGJhY2spOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBJVGVsZXBob255IHRlbGVwaG9ueSA9IGdldElUZWxlcGhvbnkoKTsKICAgICAgICAgICAgIGlmICh0ZWxlcGhvbnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRlbGVwaG9ueS51bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDaGFuZ2VkKG1TdWJJZCwgY2FsbGJhY2suZ2V0QmluZGVyKCkpOworICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVsZXBob255LnVucmVnaXN0ZXJGb3JTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQobVN1YklkLCBpbnRlcm5hbENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2dlKCJ1bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDaGFuZ2VkOiBObyBpbnRlcm5hbCBjYWxsYmFjay4iKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRlbGVwaG9ueSBzZXJ2aWNlIGlzIG51bGwuIik7CiAgICAgICAgICAgICB9CkBAIC0xMTEyLDkgKzEwODMsMTUgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwotICAgICAgICAgICAgICAgIHJldHVybiB0ZWxlcGhvbnkucmVnaXN0ZXJGb3JTYXRlbGxpdGVNb2RlbVN0YXRlQ2hhbmdlZChtU3ViSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5nZXRCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgSVNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2sgaW50ZXJuYWxDYWxsYmFjayA9IG5ldyBJU2F0ZWxsaXRlU3RhdGVDYWxsYmFjay5TdHViKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVNb2RlbVN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gQmluZGVyLndpdGhDbGVhbkNhbGxpbmdJZGVudGl0eSgoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblNhdGVsbGl0ZU1vZGVtU3RhdGVDaGFuZ2VkKHN0YXRlKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBzU2F0ZWxsaXRlU3RhdGVDYWxsYmFja01hcC5wdXQoY2FsbGJhY2ssIGludGVybmFsQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIHJldHVybiB0ZWxlcGhvbnkucmVnaXN0ZXJGb3JTYXRlbGxpdGVNb2RlbVN0YXRlQ2hhbmdlZChtU3ViSWQsIGludGVybmFsQ2FsbGJhY2spOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0ZWxlcGhvbnkgc2VydmljZSBpcyBudWxsLiIpOwogICAgICAgICAgICAgfQpAQCAtMTEzOCwxMSArMTExNSwxNiBAQAogICAgIEBSZXF1aXJlc1Blcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQoQE5vbk51bGwgU2F0ZWxsaXRlU3RhdGVDYWxsYmFjayBjYWxsYmFjaykgewogICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGNhbGxiYWNrKTsKKyAgICAgICAgSVNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2sgaW50ZXJuYWxDYWxsYmFjayA9IHNTYXRlbGxpdGVTdGF0ZUNhbGxiYWNrTWFwLnJlbW92ZShjYWxsYmFjayk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGVsZXBob255LnVucmVnaXN0ZXJGb3JTYXRlbGxpdGVNb2RlbVN0YXRlQ2hhbmdlZChtU3ViSWQsIGNhbGxiYWNrLmdldEJpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbGVwaG9ueS51bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQobVN1YklkLCBpbnRlcm5hbENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2dlKCJ1bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQ6IE5vIGludGVybmFsIGNhbGxiYWNrLiIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTExNTUsOCArMTEzNyw2IEBACiAgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgdG8gcmVjZWl2ZSBpbmNvbWluZyBkYXRhZ3JhbXMgb3ZlciBzYXRlbGxpdGUuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YWdyYW1UeXBlIGRhdGFncmFtIHR5cGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkYXRhZ3JhbSBpcyBvZiB0eXBlCi0gICAgICogICAgICAgICAgICAgICAgICAgICBTT1NfU01TIG9yIExPQ0FUSU9OX1NIQVJJTkcuCiAgICAgICogQHBhcmFtIGV4ZWN1dG9yIFRoZSBleGVjdXRvciBvbiB3aGljaCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBoYW5kbGUgaW5jb21pbmcgZGF0YWdyYW1zIG92ZXIgc2F0ZWxsaXRlLgogICAgICAqICAgICAgICAgICAgICAgICBUaGlzIGNhbGxiYWNrIHdpdGggYmUgaW52b2tlZCB3aGVuIGEgbmV3IGRhdGFncmFtIGlzIHJlY2VpdmVkIGZyb20gc2F0ZWxsaXRlLgpAQCAtMTE2Nyw3ICsxMTQ3LDcgQEAKICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgVGVsZXBob255IHByb2Nlc3MgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuCiAgICAgICovCiAgICAgQFJlcXVpcmVzUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKQotICAgIEBTYXRlbGxpdGVFcnJvciBwdWJsaWMgaW50IHJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0oQERhdGFncmFtVHlwZSBpbnQgZGF0YWdyYW1UeXBlLAorICAgIEBTYXRlbGxpdGVFcnJvciBwdWJsaWMgaW50IHJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0oCiAgICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKICAgICAgICAgICAgIEBOb25OdWxsIFNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvcik7CkBAIC0xMTc2LDkgKzExNTYsMTkgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwotICAgICAgICAgICAgICAgIHJldHVybiB0ZWxlcGhvbnkucmVnaXN0ZXJGb3JTYXRlbGxpdGVEYXRhZ3JhbShtU3ViSWQsIGRhdGFncmFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5nZXRCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgSVNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2sgaW50ZXJuYWxDYWxsYmFjayA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSVNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2suU3R1YigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNhdGVsbGl0ZURhdGFncmFtUmVjZWl2ZWQobG9uZyBkYXRhZ3JhbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgU2F0ZWxsaXRlRGF0YWdyYW0gZGF0YWdyYW0sIGludCBwZW5kaW5nQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBJTG9uZ0NvbnN1bWVyIGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY2FsbGJhY2sub25TYXRlbGxpdGVEYXRhZ3JhbVJlY2VpdmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWdyYW1JZCwgZGF0YWdyYW0sIHBlbmRpbmdDb3VudCwgYWNrKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgc1NhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2tNYXAucHV0KGNhbGxiYWNrLCBpbnRlcm5hbENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVsZXBob255LnJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0obVN1YklkLCBpbnRlcm5hbENhbGxiYWNrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTExOTQsNyArMTE4NCw3IEBACiAgICAgICogSWYgY2FsbGJhY2sgd2FzIG5vdCByZWdpc3RlcmVkIGJlZm9yZSwgdGhlIHJlcXVlc3Qgd2lsbCBiZSBpZ25vcmVkLgogICAgICAqCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IHdhcyBwYXNzZWQgdG8KLSAgICAgKiB7QGxpbmsgI3JlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0oaW50LCBFeGVjdXRvciwgU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjayl9LgorICAgICAqIHtAbGluayAjcmVnaXN0ZXJGb3JTYXRlbGxpdGVEYXRhZ3JhbShFeGVjdXRvciwgU2F0ZWxsaXRlRGF0YWdyYW1DYWxsYmFjayl9LgogICAgICAqCiAgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSByZXF1aXJlZCBwZXJtaXNzaW9uLgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBUZWxlcGhvbnkgcHJvY2VzcyBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KQEAgLTEyMDIsMTEgKzExOTIsMTcgQEAKICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclNhdGVsbGl0ZURhdGFncmFtKEBOb25OdWxsIFNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChjYWxsYmFjayk7CisgICAgICAgIElTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrIGludGVybmFsQ2FsbGJhY2sgPQorICAgICAgICAgICAgICAgIHNTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrTWFwLnJlbW92ZShjYWxsYmFjayk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIElUZWxlcGhvbnkgdGVsZXBob255ID0gZ2V0SVRlbGVwaG9ueSgpOwogICAgICAgICAgICAgaWYgKHRlbGVwaG9ueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGVsZXBob255LnVucmVnaXN0ZXJGb3JTYXRlbGxpdGVEYXRhZ3JhbShtU3ViSWQsIGNhbGxiYWNrLmdldEJpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbGVwaG9ueS51bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW0obVN1YklkLCBpbnRlcm5hbENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2dlKCJ1bnJlZ2lzdGVyRm9yU2F0ZWxsaXRlRGF0YWdyYW06IE5vIGludGVybmFsIGNhbGxiYWNrLiIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGVsZXBob255IHNlcnZpY2UgaXMgbnVsbC4iKTsKICAgICAgICAgICAgIH0KQEAgLTEyMjIsNyArMTIxOCw3IEBACiAgICAgICogVGhpcyBtZXRob2QgcmVxdWVzdHMgbW9kZW0gdG8gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIGRhdGFncmFtcyB0byBiZSByZWNlaXZlZCBvdmVyCiAgICAgICogc2F0ZWxsaXRlLiBJZiB0aGVyZSBhcmUgYW55IGluY29taW5nIGRhdGFncmFtcywgdGhleSB3aWxsIGJlIHJlY2VpdmVkIHZpYQogICAgICAqIHtAbGluayBTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrI29uU2F0ZWxsaXRlRGF0YWdyYW1SZWNlaXZlZChsb25nLCBTYXRlbGxpdGVEYXRhZ3JhbSwgaW50LAotICAgICAqICAgICAgICAgIElTYXRlbGxpdGVEYXRhZ3JhbVJlY2VpdmVyQWNrKX0KKyAgICAgKiAgICAgICAgSUxvbmdDb25zdW1lcil9CiAgICAgICoKICAgICAgKiBAcGFyYW0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIG9uIHdoaWNoIHRoZSByZXN1bHQgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQuCiAgICAgICogQHBhcmFtIHJlc3VsdExpc3RlbmVyIExpc3RlbmVyIGZvciB0aGUge0BsaW5rIFNhdGVsbGl0ZUVycm9yfSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KQEAgLTEzNzEsOSArMTM2Nyw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBnZXQgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIHNhdGVsbGl0ZSB3aWxsIGJlIHZpc2libGUuIFRoaXMgaXMgYW4KLSAgICAgKiB7QGNvZGUgaW50fSByZXByZXNlbnRpbmcgdGhlIGR1cmF0aW9uIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHNhdGVsbGl0ZSB3aWxsIGJlIHZpc2libGUuCi0gICAgICogVGhpcyB3aWxsIHJldHVybiB7QGNvZGUgMH0gaWYgdGhlIHNhdGVsbGl0ZSBpcyBjdXJyZW50bHkgdmlzaWJsZS4KKyAgICAgKiBSZXF1ZXN0IHRvIGdldCB0aGUgZHVyYXRpb24gaW4gc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgc2F0ZWxsaXRlIHdpbGwgYmUgdmlzaWJsZS4KKyAgICAgKiBUaGlzIHdpbGwgYmUge0BsaW5rIER1cmF0aW9uI1pFUk99IGlmIHRoZSBzYXRlbGxpdGUgaXMgY3VycmVudGx5IHZpc2libGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIG9uIHdoaWNoIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZC4KICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIG9iamVjdCB0byB3aGljaCB0aGUgcmVzdWx0IHdpbGwgYmUgZGVsaXZlcmVkLgpAQCAtMTM4Nyw3ICsxMzgyLDcgQEAKICAgICAgKi8KICAgICBAUmVxdWlyZXNQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pCiAgICAgcHVibGljIHZvaWQgcmVxdWVzdFRpbWVGb3JOZXh0U2F0ZWxsaXRlVmlzaWJpbGl0eShATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIEBOb25OdWxsIE91dGNvbWVSZWNlaXZlcjxJbnRlZ2VyLCBTYXRlbGxpdGVFeGNlcHRpb24+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBATm9uTnVsbCBPdXRjb21lUmVjZWl2ZXI8RHVyYXRpb24sIFNhdGVsbGl0ZUV4Y2VwdGlvbj4gY2FsbGJhY2spIHsKICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChleGVjdXRvcik7CiAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoY2FsbGJhY2spOwogCkBAIC0xNDAyLDcgKzEzOTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dFZpc2liaWxpdHlEdXJhdGlvbiA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RGF0YS5nZXRJbnQoS0VZX1NBVEVMTElURV9ORVhUX1ZJU0lCSUxJVFkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChuZXh0VmlzaWJpbGl0eUR1cmF0aW9uKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24ub2ZTZWNvbmRzKG5leHRWaXNpYmlsaXR5RHVyYXRpb24pKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2UoIktFWV9TQVRFTExJVEVfTkVYVF9WSVNJQklMSVRZIGRvZXMgbm90IGV4aXN0LiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IEJpbmRlci53aXRoQ2xlYW5DYWxsaW5nSWRlbnRpdHkoKCkgLT4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDRhODRkLi4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotLyoqCi0gKiBBIGNhbGxiYWNrIGNsYXNzIGZvciBtb25pdG9yaW5nIHNhdGVsbGl0ZSBwb3NpdGlvbiB1cGRhdGUgYW5kIGRhdGFncmFtIHRyYW5zZmVyIHN0YXRlIGNoYW5nZQotICogZXZlbnRzLgotICoKLSAqIEBoaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrIHsKLSAgICBwcml2YXRlIGZpbmFsIENhbGxiYWNrQmluZGVyIG1CaW5kZXIgPSBuZXcgQ2FsbGJhY2tCaW5kZXIodGhpcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWxsYmFja0JpbmRlciBleHRlbmRzIElTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrLlN0dWIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlQ2FsbGJhY2sgbUxvY2FsQ2FsbGJhY2s7Ci0gICAgICAgIHByaXZhdGUgRXhlY3V0b3IgbUV4ZWN1dG9yOwotCi0gICAgICAgIHByaXZhdGUgQ2FsbGJhY2tCaW5kZXIoU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjayBsb2NhbENhbGxiYWNrKSB7Ci0gICAgICAgICAgICBtTG9jYWxDYWxsYmFjayA9IGxvY2FsQ2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TYXRlbGxpdGVQb3NpdGlvbkNoYW5nZWQoQE5vbk51bGwgUG9pbnRpbmdJbmZvIHBvaW50aW5nSW5mbykgewotICAgICAgICAgICAgZmluYWwgbG9uZyBjYWxsaW5nSWRlbnRpdHkgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NhbENhbGxiYWNrLm9uU2F0ZWxsaXRlUG9zaXRpb25DaGFuZ2VkKHBvaW50aW5nSW5mbykpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGNhbGxpbmdJZGVudGl0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25EYXRhZ3JhbVRyYW5zZmVyU3RhdGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgIEBTYXRlbGxpdGVNYW5hZ2VyLlNhdGVsbGl0ZURhdGFncmFtVHJhbnNmZXJTdGF0ZSBpbnQgc3RhdGUsIGludCBzZW5kUGVuZGluZ0NvdW50LAotICAgICAgICAgICAgICAgIGludCByZWNlaXZlUGVuZGluZ0NvdW50LCBAU2F0ZWxsaXRlTWFuYWdlci5TYXRlbGxpdGVFcnJvciBpbnQgZXJyb3JDb2RlKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGNhbGxpbmdJZGVudGl0eSA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2FsQ2FsbGJhY2sub25EYXRhZ3JhbVRyYW5zZmVyU3RhdGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgc2VuZFBlbmRpbmdDb3VudCwgcmVjZWl2ZVBlbmRpbmdDb3VudCwgZXJyb3JDb2RlKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoY2FsbGluZ0lkZW50aXR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRFeGVjdXRvcihFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgbUV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2F0ZWxsaXRlIHBvc2l0aW9uIGNoYW5nZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9pbnRpbmdJbmZvIFRoZSBwb2ludGluZyBpbmZvIGNvbnRhaW5pbmcgdGhlIHNhdGVsbGl0ZSBsb2NhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblNhdGVsbGl0ZVBvc2l0aW9uQ2hhbmdlZChATm9uTnVsbCBQb2ludGluZ0luZm8gcG9pbnRpbmdJbmZvKSB7Ci0gICAgICAgIC8vIEJhc2UgSW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBzYXRlbGxpdGUgZGF0YWdyYW0gdHJhbnNmZXIgc3RhdGUgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgbmV3IGRhdGFncmFtIHRyYW5zZmVyIHN0YXRlLgotICAgICAqIEBwYXJhbSBzZW5kUGVuZGluZ0NvdW50IFRoZSBudW1iZXIgb2YgZGF0YWdyYW1zIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBzZW50LgotICAgICAqIEBwYXJhbSByZWNlaXZlUGVuZGluZ0NvdW50IFRoZSBudW1iZXIgb2YgZGF0YWdyYW1zIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyByZWNlaXZlZC4KLSAgICAgKiBAcGFyYW0gZXJyb3JDb2RlIElmIGRhdGFncmFtIHRyYW5zZmVyIGZhaWxlZCwgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkRhdGFncmFtVHJhbnNmZXJTdGF0ZUNoYW5nZWQoCi0gICAgICAgICAgICBAU2F0ZWxsaXRlTWFuYWdlci5TYXRlbGxpdGVEYXRhZ3JhbVRyYW5zZmVyU3RhdGUgaW50IHN0YXRlLCBpbnQgc2VuZFBlbmRpbmdDb3VudCwKLSAgICAgICAgICAgIGludCByZWNlaXZlUGVuZGluZ0NvdW50LCBAU2F0ZWxsaXRlTWFuYWdlci5TYXRlbGxpdGVFcnJvciBpbnQgZXJyb3JDb2RlKSB7Ci0gICAgICAgIC8vIEJhc2UgSW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICAvKipAaGlkZSovCi0gICAgQE5vbk51bGwKLSAgICBmaW5hbCBJU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjayBnZXRCaW5kZXIoKSB7Ci0gICAgICAgIHJldHVybiBtQmluZGVyOwotICAgIH0KLQotICAgIC8qKkBoaWRlKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRvcihATm9uTnVsbCBFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICBtQmluZGVyLnNldEV4ZWN1dG9yKGV4ZWN1dG9yKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjay5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2FsbGJhY2suamF2YQppbmRleCAyYjZhNWQ5Li5hNjJlYjhiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjay5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrLmphdmEKQEAgLTE2LDYxICsxNiwxNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255LnNhdGVsbGl0ZTsKIAotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KIC8qKgogICogQSBjYWxsYmFjayBjbGFzcyBmb3IgbW9uaXRvcmluZyBzYXRlbGxpdGUgcHJvdmlzaW9uIHN0YXRlIGNoYW5nZSBldmVudHMuCiAgKgogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIFNhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2FsbGJhY2sgewotICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2tCaW5kZXIgbUJpbmRlciA9IG5ldyBDYWxsYmFja0JpbmRlcih0aGlzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhbGxiYWNrQmluZGVyIGV4dGVuZHMgSVNhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2FsbGJhY2suU3R1YiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjayBtTG9jYWxDYWxsYmFjazsKLSAgICAgICAgcHJpdmF0ZSBFeGVjdXRvciBtRXhlY3V0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBDYWxsYmFja0JpbmRlcihTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrIGxvY2FsQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1Mb2NhbENhbGxiYWNrID0gbG9jYWxDYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNhdGVsbGl0ZVByb3Zpc2lvblN0YXRlQ2hhbmdlZChib29sZWFuIHByb3Zpc2lvbmVkKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGNhbGxpbmdJZGVudGl0eSA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2FsQ2FsbGJhY2sub25TYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQocHJvdmlzaW9uZWQpKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShjYWxsaW5nSWRlbnRpdHkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEV4ZWN1dG9yKEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgICAgICBtRXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgfQotICAgIH0KLQorcHVibGljIGludGVyZmFjZSBTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrIHsKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiBzYXRlbGxpdGUgcHJvdmlzaW9uIHN0YXRlIGNoYW5nZXMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcHJvdmlzaW9uZWQgVGhlIG5ldyBwcm92aXNpb24gc3RhdGUuIHtAY29kZSB0cnVlfSBtZWFucyBzYXRlbGxpdGUgaXMgcHJvdmlzaW9uZWQKICAgICAgKiAgICAgICAgICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBtZWFucyBzYXRlbGxpdGUgaXMgbm90IHByb3Zpc2lvbmVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDaGFuZ2VkKGJvb2xlYW4gcHJvdmlzaW9uZWQpIHsKLSAgICAgICAgLy8gQmFzZSBJbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIC8qKkBoaWRlKi8KLSAgICBATm9uTnVsbAotICAgIGZpbmFsIElTYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNhbGxiYWNrIGdldEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1CaW5kZXI7Ci0gICAgfQotCi0gICAgLyoqQGhpZGUqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgIG1CaW5kZXIuc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwotICAgIH0KKyAgICB2b2lkIG9uU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDaGFuZ2VkKGJvb2xlYW4gcHJvdmlzaW9uZWQpOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZVN0YXRlQ2FsbGJhY2suamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9TYXRlbGxpdGVTdGF0ZUNhbGxiYWNrLmphdmEKaW5kZXggMTdkMDViNy4uZDllY2FhMyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZVN0YXRlQ2FsbGJhY2suamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlU3RhdGVDYWxsYmFjay5qYXZhCkBAIC0xNiw4MCArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueS5zYXRlbGxpdGU7CiAKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCiAvKioKICAqIEEgY2FsbGJhY2sgY2xhc3MgZm9yIG1vbml0b3Jpbmcgc2F0ZWxsaXRlIG1vZGVtIHN0YXRlIGNoYW5nZSBldmVudHMuCiAgKgogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIFNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2sgewotICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2tCaW5kZXIgbUJpbmRlciA9IG5ldyBDYWxsYmFja0JpbmRlcih0aGlzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhbGxiYWNrQmluZGVyIGV4dGVuZHMgSVNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2suU3R1YiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU2F0ZWxsaXRlU3RhdGVDYWxsYmFjayBtTG9jYWxDYWxsYmFjazsKLSAgICAgICAgcHJpdmF0ZSBFeGVjdXRvciBtRXhlY3V0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBDYWxsYmFja0JpbmRlcihTYXRlbGxpdGVTdGF0ZUNhbGxiYWNrIGxvY2FsQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1Mb2NhbENhbGxiYWNrID0gbG9jYWxDYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNhdGVsbGl0ZU1vZGVtU3RhdGVDaGFuZ2VkKEBTYXRlbGxpdGVNYW5hZ2VyLlNhdGVsbGl0ZU1vZGVtU3RhdGUgaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGNhbGxpbmdJZGVudGl0eSA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2FsQ2FsbGJhY2sub25TYXRlbGxpdGVNb2RlbVN0YXRlQ2hhbmdlZChzdGF0ZSkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGNhbGxpbmdJZGVudGl0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QZW5kaW5nRGF0YWdyYW1Db3VudChpbnQgY291bnQpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgY2FsbGluZ0lkZW50aXR5ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1FeGVjdXRvci5leGVjdXRlKCgpIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTG9jYWxDYWxsYmFjay5vblBlbmRpbmdEYXRhZ3JhbUNvdW50KGNvdW50KSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoY2FsbGluZ0lkZW50aXR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRFeGVjdXRvcihFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICAgICAgbUV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KK3B1YmxpYyBpbnRlcmZhY2UgU2F0ZWxsaXRlU3RhdGVDYWxsYmFjayB7CiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gc2F0ZWxsaXRlIG1vZGVtIHN0YXRlIGNoYW5nZXMuCiAgICAgICogQHBhcmFtIHN0YXRlIFRoZSBuZXcgc2F0ZWxsaXRlIG1vZGVtIHN0YXRlLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQoQFNhdGVsbGl0ZU1hbmFnZXIuU2F0ZWxsaXRlTW9kZW1TdGF0ZSBpbnQgc3RhdGUpIHsKLSAgICAgICAgLy8gQmFzZSBJbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZXJlIGFyZSBwZW5kaW5nIGRhdGFncmFtcyB0byBiZSByZWNlaXZlZCBmcm9tIHNhdGVsbGl0ZS4KLSAgICAgKiBAcGFyYW0gY291bnQgUGVuZGluZyBkYXRhZ3JhbSBjb3VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblBlbmRpbmdEYXRhZ3JhbUNvdW50KGludCBjb3VudCkgewotICAgICAgICAvLyBCYXNlIEltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgLy9UT0RPOiBBZGQgYW4gQVBJIGZvciBkYXRhZ3JhbSB0cmFuc2ZlciBzdGF0ZSB1cGRhdGUgaGVyZS4KLQotICAgIC8qKkBoaWRlKi8KLSAgICBATm9uTnVsbAotICAgIGZpbmFsIElTYXRlbGxpdGVTdGF0ZUNhbGxiYWNrIGdldEJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1CaW5kZXI7Ci0gICAgfQotCi0gICAgLyoqQGhpZGUqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgIG1CaW5kZXIuc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwotICAgIH0KKyAgICB2b2lkIG9uU2F0ZWxsaXRlTW9kZW1TdGF0ZUNoYW5nZWQoQFNhdGVsbGl0ZU1hbmFnZXIuU2F0ZWxsaXRlTW9kZW1TdGF0ZSBpbnQgc3RhdGUpOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGZlNTdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL1NhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CisKKy8qKgorICogQSBjYWxsYmFjayBjbGFzcyBmb3IgbW9uaXRvcmluZyBzYXRlbGxpdGUgcG9zaXRpb24gdXBkYXRlIGFuZCBkYXRhZ3JhbSB0cmFuc2ZlciBzdGF0ZSBjaGFuZ2UKKyAqIGV2ZW50cy4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrIHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2F0ZWxsaXRlIHBvc2l0aW9uIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9pbnRpbmdJbmZvIFRoZSBwb2ludGluZyBpbmZvIGNvbnRhaW5pbmcgdGhlIHNhdGVsbGl0ZSBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIG9uU2F0ZWxsaXRlUG9zaXRpb25DaGFuZ2VkKEBOb25OdWxsIFBvaW50aW5nSW5mbyBwb2ludGluZ0luZm8pOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gc2F0ZWxsaXRlIGRhdGFncmFtIHNlbmQgc3RhdGUgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgbmV3IHNlbmQgZGF0YWdyYW0gdHJhbnNmZXIgc3RhdGUuCisgICAgICogQHBhcmFtIHNlbmRQZW5kaW5nQ291bnQgVGhlIG51bWJlciBvZiBkYXRhZ3JhbXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHNlbnQuCisgICAgICogQHBhcmFtIGVycm9yQ29kZSBJZiBkYXRhZ3JhbSB0cmFuc2ZlciBmYWlsZWQsIHRoZSByZWFzb24gZm9yIGZhaWx1cmUuCisgICAgICovCisgICAgdm9pZCBvblNlbmREYXRhZ3JhbVN0YXRlQ2hhbmdlZCgKKyAgICAgICAgICAgIEBTYXRlbGxpdGVNYW5hZ2VyLlNhdGVsbGl0ZURhdGFncmFtVHJhbnNmZXJTdGF0ZSBpbnQgc3RhdGUsIGludCBzZW5kUGVuZGluZ0NvdW50LAorICAgICAgICAgICAgQFNhdGVsbGl0ZU1hbmFnZXIuU2F0ZWxsaXRlRXJyb3IgaW50IGVycm9yQ29kZSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBzYXRlbGxpdGUgZGF0YWdyYW0gcmVjZWl2ZSBzdGF0ZSBjaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlIFRoZSBuZXcgcmVjZWl2ZSBkYXRhZ3JhbSB0cmFuc2ZlciBzdGF0ZS4KKyAgICAgKiBAcGFyYW0gcmVjZWl2ZVBlbmRpbmdDb3VudCBUaGUgbnVtYmVyIG9mIGRhdGFncmFtcyB0aGF0IGFyZSBjdXJyZW50bHkgcGVuZGluZyB0byBiZSByZWNlaXZlZC4KKyAgICAgKiBAcGFyYW0gZXJyb3JDb2RlIElmIGRhdGFncmFtIHRyYW5zZmVyIGZhaWxlZCwgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKyAgICAgKi8KKyAgICB2b2lkIG9uUmVjZWl2ZURhdGFncmFtU3RhdGVDaGFuZ2VkKAorICAgICAgICAgICAgQFNhdGVsbGl0ZU1hbmFnZXIuU2F0ZWxsaXRlRGF0YWdyYW1UcmFuc2ZlclN0YXRlIGludCBzdGF0ZSwgaW50IHJlY2VpdmVQZW5kaW5nQ291bnQsCisgICAgICAgICAgICBAU2F0ZWxsaXRlTWFuYWdlci5TYXRlbGxpdGVFcnJvciBpbnQgZXJyb3JDb2RlKTsKK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL0lTYXRlbGxpdGUuYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL0lTYXRlbGxpdGUuYWlkbAppbmRleCBkOTNlZTIxLi5hNzgwY2I5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvc3R1Yi9JU2F0ZWxsaXRlLmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvSVNhdGVsbGl0ZS5haWRsCkBAIC00OSwxMCArNDksOSBAQAogICAgICAqIExpc3RlbmluZyBtb2RlIGFsbG93cyB0aGUgc2F0ZWxsaXRlIHNlcnZpY2UgdG8gbGlzdGVuIGZvciBpbmNvbWluZyBwYWdlcy4KICAgICAgKgogICAgICAqIEBwYXJhbSBlbmFibGUgVHJ1ZSB0byBlbmFibGUgc2F0ZWxsaXRlIGxpc3RlbmluZyBtb2RlIGFuZCBmYWxzZSB0byBkaXNhYmxlLgotICAgICAqIEBwYXJhbSBpc0RlbW9Nb2RlIFdoZXRoZXIgZGVtbyBtb2RlIGlzIGVuYWJsZWQuCiAgICAgICogQHBhcmFtIHRpbWVvdXQgSG93IGxvbmcgdGhlIHNhdGVsbGl0ZSBtb2RlbSBzaG91bGQgd2FpdCBmb3IgdGhlIG5leHQgaW5jb21pbmcgcGFnZSBiZWZvcmUKICAgICAgKiAgICAgICAgICAgICAgICBkaXNhYmxpbmcgbGlzdGVuaW5nIG1vZGUuCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogVmFsaWQgZXJyb3IgY29kZXMgcmV0dXJuZWQ6CiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpFUlJPUl9OT05FCkBAIC02NCwxNiArNjMsMTcgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCiAgICAgICovCi0gICAgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlTGlzdGVuaW5nRW5hYmxlZChpbiBib29sZWFuIGVuYWJsZSwgaW4gYm9vbGVhbiBpc0RlbW9Nb2RlLCBpbiBpbnQgdGltZW91dCwKLSAgICAgICAgICAgIGluIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjayk7CisgICAgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlTGlzdGVuaW5nRW5hYmxlZChpbiBib29sZWFuIGVuYWJsZSwgaW4gaW50IHRpbWVvdXQsCisgICAgICAgICAgICBpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrKTsKIAogICAgIC8qKgotICAgICAqIFJlcXVlc3QgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNhdGVsbGl0ZSBtb2RlbS4gSWYgdGhlIHNhdGVsbGl0ZSBtb2RlbSBpcyBlbmFibGVkLAotICAgICAqIHRoaXMgd2lsbCBhbHNvIGRpc2FibGUgdGhlIGNlbGx1bGFyIG1vZGVtLCBhbmQgaWYgdGhlIHNhdGVsbGl0ZSBtb2RlbSBpcyBkaXNhYmxlZCwKLSAgICAgKiB0aGlzIHdpbGwgYWxzbyByZS1lbmFibGUgdGhlIGNlbGx1bGFyIG1vZGVtLgorICAgICAqIFJlcXVlc3QgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNhdGVsbGl0ZSBtb2RlbSBhbmQgZGVtbyBtb2RlLiBJZiB0aGUgc2F0ZWxsaXRlIG1vZGVtCisgICAgICogaXMgZW5hYmxlZCwgdGhpcyBtYXkgYWxzbyBkaXNhYmxlIHRoZSBjZWxsdWxhciBtb2RlbSwgYW5kIGlmIHRoZSBzYXRlbGxpdGUgbW9kZW0gaXMgZGlzYWJsZWQsCisgICAgICogdGhpcyBtYXkgYWxzbyByZS1lbmFibGUgdGhlIGNlbGx1bGFyIG1vZGVtLgogICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZSBUcnVlIHRvIGVuYWJsZSB0aGUgc2F0ZWxsaXRlIG1vZGVtIGFuZCBmYWxzZSB0byBkaXNhYmxlLgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBlbmFibGVTYXRlbGxpdGUgVHJ1ZSB0byBlbmFibGUgdGhlIHNhdGVsbGl0ZSBtb2RlbSBhbmQgZmFsc2UgdG8gZGlzYWJsZS4KKyAgICAgKiBAcGFyYW0gZW5hYmxlRGVtb01vZGUgVHJ1ZSB0byBlbmFibGUgZGVtbyBtb2RlIGFuZCBmYWxzZSB0byBkaXNhYmxlLgorICAgICAqIEBwYXJhbSByZXN1bHRDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICAgICAgKgogICAgICAqIFZhbGlkIGVycm9yIGNvZGVzIHJldHVybmVkOgogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6RVJST1JfTk9ORQpAQCAtODUsMTMgKzg1LDE0IEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpSRVFVRVNUX05PVF9TVVBQT1JURUQKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5PX1JFU09VUkNFUwogICAgICAqLwotICAgIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQoaW4gYm9vbGVhbiBlbmFibGVkLCBpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spOworICAgIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQoaW4gYm9vbGVhbiBlbmFibGVTYXRlbGxpdGUsIGluIGJvb2xlYW4gZW5hYmxlRGVtb01vZGUsCisgICAgICAgICAgICBpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrKTsKIAogICAgIC8qKgogICAgICAqIFJlcXVlc3QgdG8gZ2V0IHdoZXRoZXIgdGhlIHNhdGVsbGl0ZSBtb2RlbSBpcyBlbmFibGVkLgogICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG9ubHkgYmUgc2VudCB3aGVuIHRoZSByZXN1bHQgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIGVycm9yIGlzIG5vdCBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLgogICAgICAqIEBwYXJhbSBjYWxsYmFjayBJZiB0aGUgcmVzdWx0IGlzIFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUsIHRoZSBjYWxsYmFjayB0byByZWNlaXZlCiAgICAgICogICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHNhdGVsbGl0ZSBtb2RlbSBpcyBlbmFibGVkLgogICAgICAqCkBAIC0xMDUsMTMgKzEwNiwxMyBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKICAgICAgKi8KLSAgICB2b2lkIHJlcXVlc3RJc1NhdGVsbGl0ZUVuYWJsZWQoaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLCBpbiBJQm9vbGVhbkNvbnN1bWVyIGNhbGxiYWNrKTsKKyAgICB2b2lkIHJlcXVlc3RJc1NhdGVsbGl0ZUVuYWJsZWQoaW4gSUludGVnZXJDb25zdW1lciByZXN1bHRDYWxsYmFjaywgaW4gSUJvb2xlYW5Db25zdW1lciBjYWxsYmFjayk7CiAKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGdldCB3aGV0aGVyIHRoZSBzYXRlbGxpdGUgc2VydmljZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGRldmljZS4KICAgICAgKgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBvbmx5IGJlIHNlbnQgd2hlbiB0aGUgcmVzdWx0IGlzIG5vdCBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLgorICAgICAqIEBwYXJhbSByZXN1bHRDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG9ubHkgYmUgc2VudCB3aGVuIHRoZSBlcnJvciBpcyBub3QgU2F0ZWxsaXRlRXJyb3IjRVJST1JfTk9ORS4KICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgSWYgdGhlIHJlc3VsdCBpcyBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLCB0aGUgY2FsbGJhY2sgdG8gcmVjZWl2ZQogICAgICAqICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBzYXRlbGxpdGUgc2VydmljZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGRldmljZS4KICAgICAgKgpAQCAtMTI1LDE0ICsxMjYsMTQgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCiAgICAgICovCi0gICAgdm9pZCByZXF1ZXN0SXNTYXRlbGxpdGVTdXBwb3J0ZWQoaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLAorICAgIHZvaWQgcmVxdWVzdElzU2F0ZWxsaXRlU3VwcG9ydGVkKGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2ssCiAgICAgICAgICAgICBpbiBJQm9vbGVhbkNvbnN1bWVyIGNhbGxiYWNrKTsKIAogICAgIC8qKgogICAgICAqIFJlcXVlc3QgdG8gZ2V0IHRoZSBTYXRlbGxpdGVDYXBhYmlsaXRpZXMgb2YgdGhlIHNhdGVsbGl0ZSBzZXJ2aWNlLgogICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG9ubHkgYmUgc2VudCB3aGVuIHRoZSByZXN1bHQgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIGVycm9yIGlzIG5vdCBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLgogICAgICAqIEBwYXJhbSBjYWxsYmFjayBJZiB0aGUgcmVzdWx0IGlzIFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUsIHRoZSBjYWxsYmFjayB0byByZWNlaXZlCiAgICAgICogICAgICAgICAgICAgICAgIHRoZSBTYXRlbGxpdGVDYXBhYmlsaXRpZXMgb2YgdGhlIHNhdGVsbGl0ZSBzZXJ2aWNlLgogICAgICAqCkBAIC0xNDYsNyArMTQ3LDcgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCiAgICAgICovCi0gICAgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlQ2FwYWJpbGl0aWVzKGluIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaywKKyAgICB2b2lkIHJlcXVlc3RTYXRlbGxpdGVDYXBhYmlsaXRpZXMoaW4gSUludGVnZXJDb25zdW1lciByZXN1bHRDYWxsYmFjaywKICAgICAgICAgICAgIGluIElTYXRlbGxpdGVDYXBhYmlsaXRpZXNDb25zdW1lciBjYWxsYmFjayk7CiAKICAgICAvKioKQEAgLTE1NCw3ICsxNTUsNyBAQAogICAgICAqIFRoZSBzYXRlbGxpdGUgc2VydmljZSBzaG91bGQgcmVwb3J0IHRoZSBzYXRlbGxpdGUgcG9pbnRpbmcgaW5mbyB2aWEKICAgICAgKiBJU2F0ZWxsaXRlTGlzdGVuZXIjb25TYXRlbGxpdGVQb3NpdGlvbkNoYW5nZWQgYXMgdGhlIHVzZXIgZGV2aWNlL3NhdGVsbGl0ZSBtb3Zlcy4KICAgICAgKgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSByZXN1bHRDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICAgICAgKgogICAgICAqIFZhbGlkIGVycm9yIGNvZGVzIHJldHVybmVkOgogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6RVJST1JfTk9ORQpAQCAtMTY2LDEzICsxNjcsMTMgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCiAgICAgICovCi0gICAgdm9pZCBzdGFydFNlbmRpbmdTYXRlbGxpdGVQb2ludGluZ0luZm8oaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKTsKKyAgICB2b2lkIHN0YXJ0U2VuZGluZ1NhdGVsbGl0ZVBvaW50aW5nSW5mbyhpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrKTsKIAogICAgIC8qKgogICAgICAqIFVzZXIgc3RvcHBlZCBwb2ludGluZyB0byB0aGUgc2F0ZWxsaXRlLgogICAgICAqIFRoZSBzYXRlbGxpdGUgc2VydmljZSBzaG91bGQgc3RvcCByZXBvcnRpbmcgc2F0ZWxsaXRlIHBvaW50aW5nIGluZm8gdG8gdGhlIGZyYW1ld29yay4KICAgICAgKgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSByZXN1bHRDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICAgICAgKgogICAgICAqIFZhbGlkIGVycm9yIGNvZGVzIHJldHVybmVkOgogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6RVJST1JfTk9ORQpAQCAtMTg0LDI4ICsxODUsNyBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKICAgICAgKi8KLSAgICB2b2lkIHN0b3BTZW5kaW5nU2F0ZWxsaXRlUG9pbnRpbmdJbmZvKGluIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjayk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXF1ZXN0IHRvIGdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBwZXIgTU8gdGV4dCBtZXNzYWdlIG9uIHNhdGVsbGl0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBvbmx5IGJlIHNlbnQgd2hlbiB0aGUgcmVzdWx0IGlzIG5vdCBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBJZiB0aGUgcmVzdWx0IGlzIFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUsIHRoZSBjYWxsYmFjayB0byByZWNlaXZlCi0gICAgICogICAgICAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHBlciBNTyB0ZXh0IG1lc3NhZ2Ugb24gc2F0ZWxsaXRlLgotICAgICAqCi0gICAgICogVmFsaWQgZXJyb3IgY29kZXMgcmV0dXJuZWQ6Ci0gICAgICogICBTYXRlbGxpdGVFcnJvcjpFUlJPUl9OT05FCi0gICAgICogICBTYXRlbGxpdGVFcnJvcjpTRVJWSUNFX0VSUk9SCi0gICAgICogICBTYXRlbGxpdGVFcnJvcjpNT0RFTV9FUlJPUgotICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6SU5WQUxJRF9NT0RFTV9TVEFURQotICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6SU5WQUxJRF9BUkdVTUVOVFMKLSAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJBRElPX05PVF9BVkFJTEFCTEUKLSAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAotICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCi0gICAgICovCi0gICAgdm9pZCByZXF1ZXN0TWF4Q2hhcmFjdGVyc1Blck1PVGV4dE1lc3NhZ2UoaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLAotICAgICAgICAgICAgaW4gSUludGVnZXJDb25zdW1lciBjYWxsYmFjayk7CisgICAgdm9pZCBzdG9wU2VuZGluZ1NhdGVsbGl0ZVBvaW50aW5nSW5mbyhpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrKTsKIAogICAgIC8qKgogICAgICAqIFByb3Zpc2lvbiB0aGUgZGV2aWNlIHdpdGggYSBzYXRlbGxpdGUgcHJvdmlkZXIuCkBAIC0yMTQsNyArMTk0LDggQEAKICAgICAgKgogICAgICAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gdG8gYmUgdXNlZCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBwcm92aXNpb25pbmcgd2l0aCBzYXRlbGxpdGUKICAgICAgKiAgICAgICAgICAgICAgZ2F0ZXdheS4KLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVnaW9uSWQgVGhlIHJlZ2lvbiBJRCBmb3IgdGhlIGRldmljZSdzIGN1cnJlbnQgbG9jYXRpb24uCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogVmFsaWQgZXJyb3IgY29kZXMgcmV0dXJuZWQ6CiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpFUlJPUl9OT05FCkBAIC0yMjksNyArMjEwLDggQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfQUJPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6TkVUV09SS19USU1FT1VUCiAgICAgICovCi0gICAgdm9pZCBwcm92aXNpb25TYXRlbGxpdGVTZXJ2aWNlKGluIFN0cmluZyB0b2tlbiwgaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKTsKKyAgICB2b2lkIHByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UoaW4gU3RyaW5nIHRva2VuLCBpbiBTdHJpbmcgcmVnaW9uSWQsCisgICAgICAgICAgICBpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrKTsKIAogICAgIC8qKgogICAgICAqIERlcHJvdmlzaW9uIHRoZSBkZXZpY2Ugd2l0aCB0aGUgc2F0ZWxsaXRlIHByb3ZpZGVyLgpAQCAtMjM3LDcgKzIxOSw3IEBACiAgICAgICogT25jZSBkZXByb3Zpc2lvbmVkLCBJU2F0ZWxsaXRlTGlzdGVuZXIjb25TYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQgc2hvdWxkIHJlcG9ydCBmYWxzZS4KICAgICAgKgogICAgICAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gb2YgdGhlIGRldmljZS9zdWJzY3JpcHRpb24gdG8gYmUgZGVwcm92aXNpb25lZC4KLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAgICAgICoKICAgICAgKiBWYWxpZCBlcnJvciBjb2RlcyByZXR1cm5lZDoKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOkVSUk9SX05PTkUKQEAgLTI1MiwxMyArMjM0LDEzIEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpSRVFVRVNUX0FCT1JURUQKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5FVFdPUktfVElNRU9VVAogICAgICAqLwotICAgIHZvaWQgZGVwcm92aXNpb25TYXRlbGxpdGVTZXJ2aWNlKGluIFN0cmluZyB0b2tlbiwgaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKTsKKyAgICB2b2lkIGRlcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShpbiBTdHJpbmcgdG9rZW4sIGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2spOwogCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCB0byBnZXQgd2hldGhlciB0aGlzIGRldmljZSBpcyBwcm92aXNpb25lZCB3aXRoIGEgc2F0ZWxsaXRlIHByb3ZpZGVyLgogICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG9ubHkgYmUgc2VudCB3aGVuIHRoZSByZXN1bHQgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIGVycm9yIGlzIG5vdCBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLgogICAgICAqIEBwYXJhbSBjYWxsYmFjayBJZiB0aGUgcmVzdWx0IGlzIFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUsIHRoZSBjYWxsYmFjayB0byByZWNlaXZlCiAgICAgICogICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhpcyBkZXZpY2UgaXMgcHJvdmlzaW9uZWQgd2l0aCBhIHNhdGVsbGl0ZSBwcm92aWRlci4KICAgICAgKgpAQCAtMjcyLDcgKzI1NCw3IEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpSRVFVRVNUX05PVF9TVVBQT1JURUQKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5PX1JFU09VUkNFUwogICAgICAqLwotICAgIHZvaWQgcmVxdWVzdElzU2F0ZWxsaXRlUHJvdmlzaW9uZWQoaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLAorICAgIHZvaWQgcmVxdWVzdElzU2F0ZWxsaXRlUHJvdmlzaW9uZWQoaW4gSUludGVnZXJDb25zdW1lciByZXN1bHRDYWxsYmFjaywKICAgICAgICAgICAgIGluIElCb29sZWFuQ29uc3VtZXIgY2FsbGJhY2spOwogCiAgICAgLyoqCkBAIC0yODAsNyArMjYyLDcgQEAKICAgICAgKiBUaGUgc2F0ZWxsaXRlIHNlcnZpY2Ugc2hvdWxkIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyBkYXRhZ3JhbXMgdG8gYmUgcmVjZWl2ZWQgb3ZlcgogICAgICAqIHNhdGVsbGl0ZSBhbmQgcmVwb3J0IHRoZW0gdmlhIElTYXRlbGxpdGVMaXN0ZW5lciNvblNhdGVsbGl0ZURhdGFncmFtc1JlY2VpdmVkLgogICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogVmFsaWQgZXJyb3IgY29kZXMgcmV0dXJuZWQ6CiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpFUlJPUl9OT05FCkBAIC0yOTcsMTUgKzI3OSwxNCBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6U0FURUxMSVRFX05PVF9SRUFDSEFCTEUKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5PVF9BVVRIT1JJWkVECiAgICAgICovCi0gICAgdm9pZCBwb2xsUGVuZGluZ1NhdGVsbGl0ZURhdGFncmFtcyhpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spOworICAgIHZvaWQgcG9sbFBlbmRpbmdTYXRlbGxpdGVEYXRhZ3JhbXMoaW4gSUludGVnZXJDb25zdW1lciByZXN1bHRDYWxsYmFjayk7CiAKICAgICAvKioKICAgICAgKiBTZW5kIGRhdGFncmFtIG92ZXIgc2F0ZWxsaXRlLgogICAgICAqCiAgICAgICogQHBhcmFtIGRhdGFncmFtIERhdGFncmFtIHRvIHNlbmQgaW4gYnl0ZSBmb3JtYXQuCi0gICAgICogQHBhcmFtIGlzRGVtb01vZGUgV2hldGhlciBkZW1vIG1vZGUgaXMgZW5hYmxlZC4KICAgICAgKiBAcGFyYW0gaXNFbWVyZ2VuY3kgV2hldGhlciB0aGlzIGlzIGFuIGVtZXJnZW5jeSBkYXRhZ3JhbS4KLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAgICAgICoKICAgICAgKiBWYWxpZCBlcnJvciBjb2RlcyByZXR1cm5lZDoKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOkVSUk9SX05PTkUKQEAgLTMyMywxNiArMzA0LDE2IEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpTQVRFTExJVEVfTk9UX1JFQUNIQUJMRQogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9UX0FVVEhPUklaRUQKICAgICAgKi8KLSAgICB2b2lkIHNlbmRTYXRlbGxpdGVEYXRhZ3JhbShpbiBTYXRlbGxpdGVEYXRhZ3JhbSBkYXRhZ3JhbSwgaW4gYm9vbGVhbiBpc0RlbW9Nb2RlLAotICAgICAgICAgICAgaW4gYm9vbGVhbiBpc0VtZXJnZW5jeSwgaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKTsKKyAgICB2b2lkIHNlbmRTYXRlbGxpdGVEYXRhZ3JhbShpbiBTYXRlbGxpdGVEYXRhZ3JhbSBkYXRhZ3JhbSwgaW4gYm9vbGVhbiBpc0VtZXJnZW5jeSwKKyAgICAgICAgICAgIGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2spOwogCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCB0aGUgY3VycmVudCBzYXRlbGxpdGUgbW9kZW0gc3RhdGUuCiAgICAgICogVGhlIHNhdGVsbGl0ZSBzZXJ2aWNlIHNob3VsZCByZXBvcnQgdGhlIGN1cnJlbnQgc2F0ZWxsaXRlIG1vZGVtIHN0YXRlIHZpYQogICAgICAqIElTYXRlbGxpdGVMaXN0ZW5lciNvblNhdGVsbGl0ZU1vZGVtU3RhdGVDaGFuZ2VkLgogICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG9ubHkgYmUgc2VudCB3aGVuIHRoZSByZXN1bHQgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIGVycm9yIGlzIG5vdCBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLgogICAgICAqIEBwYXJhbSBjYWxsYmFjayBJZiB0aGUgcmVzdWx0IGlzIFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUsIHRoZSBjYWxsYmFjayB0byByZWNlaXZlCiAgICAgICogICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IHNhdGVsbGl0ZSBtb2RlbSBzdGF0ZS4KICAgICAgKgpAQCAtMzQ2LDE0ICszMjcsMTQgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCiAgICAgICovCi0gICAgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlTW9kZW1TdGF0ZShpbiBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2ssCisgICAgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlTW9kZW1TdGF0ZShpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrLAogICAgICAgICAgICAgaW4gSUludGVnZXJDb25zdW1lciBjYWxsYmFjayk7CiAKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGdldCB3aGV0aGVyIHNhdGVsbGl0ZSBjb21tdW5pY2F0aW9uIGlzIGFsbG93ZWQgZm9yIHRoZSBjdXJyZW50IGxvY2F0aW9uLgogICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG9ubHkgYmUgc2VudCB3aGVuIHRoZSByZXN1bHQgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIGVycm9yIGlzIG5vdCBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLgogICAgICAqIEBwYXJhbSBjYWxsYmFjayBJZiB0aGUgcmVzdWx0IGlzIFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUsIHRoZSBjYWxsYmFjayB0byByZWNlaXZlCiAgICAgICogICAgICAgICAgICAgICAgIHdoZXRoZXIgc2F0ZWxsaXRlIGNvbW11bmljYXRpb24gaXMgYWxsb3dlZCBmb3IgdGhlIGN1cnJlbnQgbG9jYXRpb24uCiAgICAgICoKQEAgLTM2OCwxNSArMzQ5LDE1IEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKICAgICAgKi8KICAgICB2b2lkIHJlcXVlc3RJc1NhdGVsbGl0ZUNvbW11bmljYXRpb25BbGxvd2VkRm9yQ3VycmVudExvY2F0aW9uKAotICAgICAgICAgICAgaW4gSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLCBpbiBJQm9vbGVhbkNvbnN1bWVyIGNhbGxiYWNrKTsKKyAgICAgICAgICAgIGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2ssIGluIElCb29sZWFuQ29uc3VtZXIgY2FsbGJhY2spOwogCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCB0byBnZXQgdGhlIHRpbWUgYWZ0ZXIgd2hpY2ggdGhlIHNhdGVsbGl0ZSB3aWxsIGJlIHZpc2libGUuIFRoaXMgaXMgYW4gaW50CiAgICAgICogcmVwcmVzZW50aW5nIHRoZSBkdXJhdGlvbiBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBzYXRlbGxpdGUgd2lsbCBiZSB2aXNpYmxlLgogICAgICAqIFRoaXMgd2lsbCByZXR1cm4gMCBpZiB0aGUgc2F0ZWxsaXRlIGlzIGN1cnJlbnRseSB2aXNpYmxlLgogICAgICAqCi0gICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtdXN0IG9ubHkgYmUgc2VudCB3aGVuIHRoZSByZXN1bHQgaXMgbm90IFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUuCisgICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3Qgb25seSBiZSBzZW50IHdoZW4gdGhlIGVycm9yIGlzIG5vdCBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLgogICAgICAqIEBwYXJhbSBjYWxsYmFjayBJZiB0aGUgcmVzdWx0IGlzIFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUsIHRoZSBjYWxsYmFjayB0byByZWNlaXZlCiAgICAgICogICAgICAgICAgICAgICAgIHRoZSB0aW1lIGFmdGVyIHdoaWNoIHRoZSBzYXRlbGxpdGUgd2lsbCBiZSB2aXNpYmxlLgogICAgICAqCkBAIC0zOTAsNiArMzcxLDYgQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCiAgICAgICovCi0gICAgdm9pZCByZXF1ZXN0VGltZUZvck5leHRTYXRlbGxpdGVWaXNpYmlsaXR5KGluIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaywKKyAgICB2b2lkIHJlcXVlc3RUaW1lRm9yTmV4dFNhdGVsbGl0ZVZpc2liaWxpdHkoaW4gSUludGVnZXJDb25zdW1lciByZXN1bHRDYWxsYmFjaywKICAgICAgICAgICAgIGluIElJbnRlZ2VyQ29uc3VtZXIgY2FsbGJhY2spOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvSVNhdGVsbGl0ZUxpc3RlbmVyLmFpZGwgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvc3R1Yi9JU2F0ZWxsaXRlTGlzdGVuZXIuYWlkbAppbmRleCBkOTY2ODY4Li41ZTY5MjE1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvc3R1Yi9JU2F0ZWxsaXRlTGlzdGVuZXIuYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvc3R1Yi9JU2F0ZWxsaXRlTGlzdGVuZXIuYWlkbApAQCAtNDMsMTAgKzQzLDggQEAKIAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBzYXRlbGxpdGUgaGFzIHBlbmRpbmcgZGF0YWdyYW1zIGZvciB0aGUgZGV2aWNlIHRvIGJlIHB1bGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgcGVuZGluZyBkYXRhZ3JhbXMuCiAgICAgICovCi0gICAgdm9pZCBvblBlbmRpbmdEYXRhZ3JhbUNvdW50KGluIGludCBjb3VudCk7CisgICAgdm9pZCBvblBlbmRpbmdEYXRhZ3JhbXMoKTsKIAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBzYXRlbGxpdGUgcG9pbnRpbmcgaW5wdXQgaGFzIGNoYW5nZWQuCkBAIC02MSwxMSArNTksNCBAQAogICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzYXRlbGxpdGUgbW9kZW0gc3RhdGUuCiAgICAgICovCiAgICAgdm9pZCBvblNhdGVsbGl0ZU1vZGVtU3RhdGVDaGFuZ2VkKGluIFNhdGVsbGl0ZU1vZGVtU3RhdGUgc3RhdGUpOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNhdGVsbGl0ZSByYWRpbyB0ZWNobm9sb2d5IGhhcyBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHRlY2hub2xvZ3kgVGhlIGN1cnJlbnQgc2F0ZWxsaXRlIHJhZGlvIHRlY2hub2xvZ3kuCi0gICAgICovCi0gICAgdm9pZCBvblNhdGVsbGl0ZVJhZGlvVGVjaG5vbG9neUNoYW5nZWQoaW4gTlRSYWRpb1RlY2hub2xvZ3kgdGVjaG5vbG9neSk7CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvc3R1Yi9Qb2ludGluZ0luZm8uYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1BvaW50aW5nSW5mby5haWRsCmluZGV4IDgzMzkyZGQuLjUyYTM2ZDggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1BvaW50aW5nSW5mby5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1BvaW50aW5nSW5mby5haWRsCkBAIC0yOSwyMSArMjksNCBAQAogICAgICAqIFNhdGVsbGl0ZSBlbGV2YXRpb24gaW4gZGVncmVlcy4KICAgICAgKi8KICAgICBmbG9hdCBzYXRlbGxpdGVFbGV2YXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBbnRlbm5hIGF6aW11dGggaW4gZGVncmVlcy4KLSAgICAgKi8KLSAgICBmbG9hdCBhbnRlbm5hQXppbXV0aDsKLQotICAgIC8qKgotICAgICAqIEFuZ2xlIG9mIHJvdGF0aW9uIGFib3V0IHRoZSB4IGF4aXMuIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgYW5nbGUgYmV0d2VlbiBhIHBsYW5lCi0gICAgICogcGFyYWxsZWwgdG8gdGhlIGRldmljZSdzIHNjcmVlbiBhbmQgYSBwbGFuZSBwYXJhbGxlbCB0byB0aGUgZ3JvdW5kLgotICAgICAqLwotICAgIGZsb2F0IGFudGVubmFQaXRjaDsKLQotICAgIC8qKgotICAgICAqIEFuZ2xlIG9mIHJvdGF0aW9uIGFib3V0IHRoZSB5IGF4aXMuIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgYW5nbGUgYmV0d2VlbiBhIHBsYW5lCi0gICAgICogcGVycGVuZGljdWxhciB0byB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGFuZCBhIHBsYW5lIHBhcmFsbGVsIHRvIHRoZSBncm91bmQuCi0gICAgICovCi0gICAgZmxvYXQgYW50ZW5uYVJvbGw7CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvc3R1Yi9TYXRlbGxpdGVDYXBhYmlsaXRpZXMuYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1NhdGVsbGl0ZUNhcGFiaWxpdGllcy5haWRsCmluZGV4IDEwYzJlYTMuLmNkNjlkYTEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1NhdGVsbGl0ZUNhcGFiaWxpdGllcy5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1NhdGVsbGl0ZUNhcGFiaWxpdGllcy5haWRsCkBAIC0yOCwxOCArMjgsMTIgQEAKICAgICBOVFJhZGlvVGVjaG5vbG9neVtdIHN1cHBvcnRlZFJhZGlvVGVjaG5vbG9naWVzOwogCiAgICAgLyoqCi0gICAgICogV2hldGhlciBzYXRlbGxpdGUgbW9kZW0gaXMgYWx3YXlzIG9uLgotICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBwb3dlciBpbXBhY3Qgb2Yga2VlcGluZyBpdCBvbiBpcyB2ZXJ5IG1pbmltYWwuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0Fsd2F5c09uOwotCi0gICAgLyoqCiAgICAgICogV2hldGhlciBVRSBuZWVkcyB0byBwb2ludCB0byBhIHNhdGVsbGl0ZSB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEuCiAgICAgICovCi0gICAgYm9vbGVhbiBuZWVkc1BvaW50aW5nVG9TYXRlbGxpdGU7CisgICAgYm9vbGVhbiBpc1BvaW50aW5nUmVxdWlyZWQ7CiAKICAgICAvKioKLSAgICAgKiBXaGV0aGVyIFVFIG5lZWRzIGEgc2VwYXJhdGUgU0lNIHByb2ZpbGUgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2F0ZWxsaXRlIG5ldHdvcmsuCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBkYXRhZ3JhbSB0aGF0IGNhbiBiZSBzZW50IG92ZXIgc2F0ZWxsaXRlLgogICAgICAqLwotICAgIGJvb2xlYW4gbmVlZHNTZXBhcmF0ZVNpbVByb2ZpbGU7CisgICAgaW50IG1heEJ5dGVzUGVyT3V0Z29pbmdEYXRhZ3JhbTsKIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1NhdGVsbGl0ZUltcGxCYXNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9zYXRlbGxpdGUvc3R1Yi9TYXRlbGxpdGVJbXBsQmFzZS5qYXZhCmluZGV4IDcxMWRjYmUuLmRlYmIzOTQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L3NhdGVsbGl0ZS9zdHViL1NhdGVsbGl0ZUltcGxCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvc2F0ZWxsaXRlL3N0dWIvU2F0ZWxsaXRlSW1wbEJhc2UuamF2YQpAQCAtNzAsMjAgKzcwLDIxIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUxpc3RlbmluZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGUsIGJvb2xlYW4gaXNEZW1vTW9kZSwKLSAgICAgICAgICAgICAgICBpbnQgdGltZW91dCwgSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUxpc3RlbmluZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGUsIGludCB0aW1lb3V0LAorICAgICAgICAgICAgICAgIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBleGVjdXRlTWV0aG9kQXN5bmMoCiAgICAgICAgICAgICAgICAgICAgICgpIC0+IFNhdGVsbGl0ZUltcGxCYXNlLnRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdFNhdGVsbGl0ZUxpc3RlbmluZ0VuYWJsZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUsIGlzRGVtb01vZGUsIHRpbWVvdXQsIGVycm9yQ2FsbGJhY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0U2F0ZWxsaXRlTGlzdGVuaW5nRW5hYmxlZChlbmFibGUsIHRpbWVvdXQsIGVycm9yQ2FsbGJhY2spLAogICAgICAgICAgICAgICAgICAgICAicmVxdWVzdFNhdGVsbGl0ZUxpc3RlbmluZ0VuYWJsZWQiKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZChib29sZWFuIGVuYWJsZSwgSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKQotICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZChib29sZWFuIGVuYWJsZVNhdGVsbGl0ZSwgYm9vbGVhbiBlbmFibGVEZW1vTW9kZSwKKyAgICAgICAgICAgICAgICBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICAgICAgZXhlY3V0ZU1ldGhvZEFzeW5jKAotICAgICAgICAgICAgICAgICAgICAoKSAtPiBTYXRlbGxpdGVJbXBsQmFzZS50aGlzLnJlcXVlc3RTYXRlbGxpdGVFbmFibGVkKGVuYWJsZSwgZXJyb3JDYWxsYmFjayksCisgICAgICAgICAgICAgICAgICAgICgpIC0+IFNhdGVsbGl0ZUltcGxCYXNlLnRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVTYXRlbGxpdGUsIGVuYWJsZURlbW9Nb2RlLCBlcnJvckNhbGxiYWNrKSwKICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3RTYXRlbGxpdGVFbmFibGVkIik7CiAgICAgICAgIH0KIApAQCAtMTMxLDE5ICsxMzIsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0TWF4Q2hhcmFjdGVyc1Blck1PVGV4dE1lc3NhZ2UoSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrLAotICAgICAgICAgICAgICAgIElJbnRlZ2VyQ29uc3VtZXIgY2FsbGJhY2spIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgdm9pZCBwcm92aXNpb25TYXRlbGxpdGVTZXJ2aWNlKFN0cmluZyB0b2tlbiwgU3RyaW5nIHJlZ2lvbklkLAorICAgICAgICAgICAgICAgIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBleGVjdXRlTWV0aG9kQXN5bmMoCiAgICAgICAgICAgICAgICAgICAgICgpIC0+IFNhdGVsbGl0ZUltcGxCYXNlLnRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdE1heENoYXJhY3RlcnNQZXJNT1RleHRNZXNzYWdlKGVycm9yQ2FsbGJhY2ssIGNhbGxiYWNrKSwKLSAgICAgICAgICAgICAgICAgICAgInJlcXVlc3RNYXhDaGFyYWN0ZXJzUGVyTU9UZXh0TWVzc2FnZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UoU3RyaW5nIHRva2VuLCBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spCi0gICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBleGVjdXRlTWV0aG9kQXN5bmMoCi0gICAgICAgICAgICAgICAgICAgICgpIC0+IFNhdGVsbGl0ZUltcGxCYXNlLnRoaXMucHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZSh0b2tlbiwgZXJyb3JDYWxsYmFjayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UodG9rZW4sIHJlZ2lvbklkLCBlcnJvckNhbGxiYWNrKSwKICAgICAgICAgICAgICAgICAgICAgInByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UiKTsKICAgICAgICAgfQogCkBAIC0xNzMsMTIgKzE2NiwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbmRTYXRlbGxpdGVEYXRhZ3JhbShTYXRlbGxpdGVEYXRhZ3JhbSBkYXRhZ3JhbSwgYm9vbGVhbiBpc0RlbW9Nb2RlLAotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbWVyZ2VuY3ksIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRTYXRlbGxpdGVEYXRhZ3JhbShTYXRlbGxpdGVEYXRhZ3JhbSBkYXRhZ3JhbSwgYm9vbGVhbiBpc0VtZXJnZW5jeSwKKyAgICAgICAgICAgICAgICBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICAgICAgZXhlY3V0ZU1ldGhvZEFzeW5jKAogICAgICAgICAgICAgICAgICAgICAoKSAtPiBTYXRlbGxpdGVJbXBsQmFzZS50aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbmRTYXRlbGxpdGVEYXRhZ3JhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFncmFtLCBpc0RlbW9Nb2RlLCBpc0VtZXJnZW5jeSwgZXJyb3JDYWxsYmFjayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbmRTYXRlbGxpdGVEYXRhZ3JhbShkYXRhZ3JhbSwgaXNFbWVyZ2VuY3ksIGVycm9yQ2FsbGJhY2spLAogICAgICAgICAgICAgICAgICAgICAic2VuZFNhdGVsbGl0ZURhdGFncmFtIik7CiAgICAgICAgIH0KIApAQCAtMjQ5LDcgKzI0MSw2IEBACiAgICAgICogTGlzdGVuaW5nIG1vZGUgYWxsb3dzIHRoZSBzYXRlbGxpdGUgc2VydmljZSB0byBsaXN0ZW4gZm9yIGluY29taW5nIHBhZ2VzLgogICAgICAqCiAgICAgICogQHBhcmFtIGVuYWJsZSBUcnVlIHRvIGVuYWJsZSBzYXRlbGxpdGUgbGlzdGVuaW5nIG1vZGUgYW5kIGZhbHNlIHRvIGRpc2FibGUuCi0gICAgICogQHBhcmFtIGlzRGVtb01vZGUgV2hldGhlciBkZW1vIG1vZGUgaXMgZW5hYmxlZC4KICAgICAgKiBAcGFyYW0gdGltZW91dCBIb3cgbG9uZyB0aGUgc2F0ZWxsaXRlIG1vZGVtIHNob3VsZCB3YWl0IGZvciB0aGUgbmV4dCBpbmNvbWluZyBwYWdlIGJlZm9yZQogICAgICAqICAgICAgICAgICAgICAgIGRpc2FibGluZyBsaXN0ZW5pbmcgbW9kZS4KICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KQEAgLTI2NCwxNyArMjU1LDE4IEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpSRVFVRVNUX05PVF9TVVBQT1JURUQKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5PX1JFU09VUkNFUwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTYXRlbGxpdGVMaXN0ZW5pbmdFbmFibGVkKGJvb2xlYW4gZW5hYmxlLCBib29sZWFuIGlzRGVtb01vZGUsIGludCB0aW1lb3V0LAorICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTYXRlbGxpdGVMaXN0ZW5pbmdFbmFibGVkKGJvb2xlYW4gZW5hYmxlLCBpbnQgdGltZW91dCwKICAgICAgICAgICAgIEBOb25OdWxsIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaykgewogICAgICAgICAvLyBzdHViIGltcGxlbWVudGF0aW9uCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2F0ZWxsaXRlIG1vZGVtLiBJZiB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGVuYWJsZWQsCi0gICAgICogdGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgY2VsbHVsYXIgbW9kZW0sIGFuZCBpZiB0aGUgc2F0ZWxsaXRlIG1vZGVtIGlzIGRpc2FibGVkLAotICAgICAqIHRoaXMgd2lsbCBhbHNvIHJlLWVuYWJsZSB0aGUgY2VsbHVsYXIgbW9kZW0uCisgICAgICogUmVxdWVzdCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2F0ZWxsaXRlIG1vZGVtIGFuZCBkZW1vIG1vZGUuIElmIHRoZSBzYXRlbGxpdGUgbW9kZW0gaXMKKyAgICAgKiBlbmFibGVkLCB0aGlzIG1heSBhbHNvIGRpc2FibGUgdGhlIGNlbGx1bGFyIG1vZGVtLCBhbmQgaWYgdGhlIHNhdGVsbGl0ZSBtb2RlbSBpcyBkaXNhYmxlZCwKKyAgICAgKiB0aGlzIG1heSBhbHNvIHJlLWVuYWJsZSB0aGUgY2VsbHVsYXIgbW9kZW0uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZW5hYmxlIFRydWUgdG8gZW5hYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0gYW5kIGZhbHNlIHRvIGRpc2FibGUuCisgICAgICogQHBhcmFtIGVuYWJsZVNhdGVsbGl0ZSBUcnVlIHRvIGVuYWJsZSB0aGUgc2F0ZWxsaXRlIG1vZGVtIGFuZCBmYWxzZSB0byBkaXNhYmxlLgorICAgICAqIEBwYXJhbSBlbmFibGVEZW1vTW9kZSBUcnVlIHRvIGVuYWJsZSBkZW1vIG1vZGUgYW5kIGZhbHNlIHRvIGRpc2FibGUuCiAgICAgICogQHBhcmFtIGVycm9yQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIGVycm9yIGNvZGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAgICAgICoKICAgICAgKiBWYWxpZCBlcnJvciBjb2RlcyByZXR1cm5lZDoKQEAgLTI4Nyw3ICsyNzksOCBAQAogICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6UkVRVUVTVF9OT1RfU1VQUE9SVEVECiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT19SRVNPVVJDRVMKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZChib29sZWFuIGVuYWJsZSwgQE5vbk51bGwgSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKSB7CisgICAgcHVibGljIHZvaWQgcmVxdWVzdFNhdGVsbGl0ZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVTYXRlbGxpdGUsIGJvb2xlYW4gZW5hYmxlRGVtb01vZGUsCisgICAgICAgICAgICBATm9uTnVsbCBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgLy8gc3R1YiBpbXBsZW1lbnRhdGlvbgogICAgIH0KIApAQCAtNDAyLDM1ICszOTUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXF1ZXN0IHRvIGdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBwZXIgTU8gdGV4dCBtZXNzYWdlIG9uIHNhdGVsbGl0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbXVzdCBvbmx5IGJlIHNlbnQgd2hlbiB0aGUgcmVzdWx0IGlzIG5vdCBTYXRlbGxpdGVFcnJvciNFUlJPUl9OT05FLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBJZiB0aGUgcmVzdWx0IGlzIFNhdGVsbGl0ZUVycm9yI0VSUk9SX05PTkUsIHRoZSBjYWxsYmFjayB0byByZWNlaXZlCi0gICAgICogICAgICAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHBlciBNTyB0ZXh0IG1lc3NhZ2Ugb24gc2F0ZWxsaXRlLgotICAgICAqCi0gICAgICogVmFsaWQgZXJyb3IgY29kZXMgcmV0dXJuZWQ6Ci0gICAgICogICBTYXRlbGxpdGVFcnJvcjpFUlJPUl9OT05FCi0gICAgICogICBTYXRlbGxpdGVFcnJvcjpTRVJWSUNFX0VSUk9SCi0gICAgICogICBTYXRlbGxpdGVFcnJvcjpNT0RFTV9FUlJPUgotICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6SU5WQUxJRF9NT0RFTV9TVEFURQotICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6SU5WQUxJRF9BUkdVTUVOVFMKLSAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJBRElPX05PVF9BVkFJTEFCTEUKLSAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlJFUVVFU1RfTk9UX1NVUFBPUlRFRAotICAgICAqICAgU2F0ZWxsaXRlRXJyb3I6Tk9fUkVTT1VSQ0VTCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdE1heENoYXJhY3RlcnNQZXJNT1RleHRNZXNzYWdlKEBOb25OdWxsIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaywKLSAgICAgICAgICAgIEBOb25OdWxsIElJbnRlZ2VyQ29uc3VtZXIgY2FsbGJhY2spIHsKLSAgICAgICAgLy8gc3R1YiBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIC8qKgogICAgICAqIFByb3Zpc2lvbiB0aGUgZGV2aWNlIHdpdGggYSBzYXRlbGxpdGUgcHJvdmlkZXIuCiAgICAgICogVGhpcyBpcyBuZWVkZWQgaWYgdGhlIHByb3ZpZGVyIGFsbG93cyBkeW5hbWljIHJlZ2lzdHJhdGlvbi4KICAgICAgKiBPbmNlIHByb3Zpc2lvbmVkLCBJU2F0ZWxsaXRlTGlzdGVuZXIjb25TYXRlbGxpdGVQcm92aXNpb25TdGF0ZUNoYW5nZWQgc2hvdWxkIHJlcG9ydCB0cnVlLgogICAgICAqCiAgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiB0byBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHByb3Zpc2lvbmluZyB3aXRoIHNhdGVsbGl0ZQogICAgICAqICAgICAgICAgICAgICBnYXRld2F5LgorICAgICAqIEBwYXJhbSByZWdpb25JZCBUaGUgcmVnaW9uIElEIGZvciB0aGUgZGV2aWNlJ3MgY3VycmVudCBsb2NhdGlvbi4KICAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgZXJyb3IgY29kZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi4KICAgICAgKgogICAgICAqIFZhbGlkIGVycm9yIGNvZGVzIHJldHVybmVkOgpAQCAtNDQ2LDcgKzQxNyw3IEBACiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpSRVFVRVNUX0FCT1JURUQKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOk5FVFdPUktfVElNRU9VVAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UoQE5vbk51bGwgU3RyaW5nIHRva2VuLAorICAgIHB1YmxpYyB2b2lkIHByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UoQE5vbk51bGwgU3RyaW5nIHRva2VuLCBATm9uTnVsbCBTdHJpbmcgcmVnaW9uSWQsCiAgICAgICAgICAgICBATm9uTnVsbCBJSW50ZWdlckNvbnN1bWVyIGVycm9yQ2FsbGJhY2spIHsKICAgICAgICAgLy8gc3R1YiBpbXBsZW1lbnRhdGlvbgogICAgIH0KQEAgLTUzMCw3ICs1MDEsNiBAQAogICAgICAqIFNlbmQgZGF0YWdyYW0gb3ZlciBzYXRlbGxpdGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YWdyYW0gRGF0YWdyYW0gdG8gc2VuZCBpbiBieXRlIGZvcm1hdC4KLSAgICAgKiBAcGFyYW0gaXNEZW1vTW9kZSBXaGV0aGVyIGRlbW8gbW9kZSBpcyBlbmFibGVkLgogICAgICAqIEBwYXJhbSBpc0VtZXJnZW5jeSBXaGV0aGVyIHRoaXMgaXMgYW4gZW1lcmdlbmN5IGRhdGFncmFtLgogICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSBlcnJvciBjb2RlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLgogICAgICAqCkBAIC01NTAsOCArNTIwLDggQEAKICAgICAgKiAgIFNhdGVsbGl0ZUVycm9yOlNBVEVMTElURV9OT1RfUkVBQ0hBQkxFCiAgICAgICogICBTYXRlbGxpdGVFcnJvcjpOT1RfQVVUSE9SSVpFRAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRTYXRlbGxpdGVEYXRhZ3JhbShATm9uTnVsbCBTYXRlbGxpdGVEYXRhZ3JhbSBkYXRhZ3JhbSwgYm9vbGVhbiBpc0RlbW9Nb2RlLAotICAgICAgICAgICAgYm9vbGVhbiBpc0VtZXJnZW5jeSwgQE5vbk51bGwgSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKSB7CisgICAgcHVibGljIHZvaWQgc2VuZFNhdGVsbGl0ZURhdGFncmFtKEBOb25OdWxsIFNhdGVsbGl0ZURhdGFncmFtIGRhdGFncmFtLCBib29sZWFuIGlzRW1lcmdlbmN5LAorICAgICAgICAgICAgQE5vbk51bGwgSUludGVnZXJDb25zdW1lciBlcnJvckNhbGxiYWNrKSB7CiAgICAgICAgIC8vIHN0dWIgaW1wbGVtZW50YXRpb24KICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCmluZGV4IDMyM2ZhNmYuLmQwZGUzYWMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbApAQCAtNjgsNyArNjgsNyBAQAogaW1wb3J0IGFuZHJvaWQudGVsZXBob255Lmltcy5haWRsLklJbXNSZWdpc3RyYXRpb25DYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5pbXMuYWlkbC5JUmNzQ29uZmlnQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlLklTYXRlbGxpdGVEYXRhZ3JhbUNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LnNhdGVsbGl0ZS5JU2F0ZWxsaXRlUG9zaXRpb25VcGRhdGVDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5zYXRlbGxpdGUuSVNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LnNhdGVsbGl0ZS5JU2F0ZWxsaXRlUHJvdmlzaW9uU3RhdGVDYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5zYXRlbGxpdGUuSVNhdGVsbGl0ZVN0YXRlQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuc2F0ZWxsaXRlLlNhdGVsbGl0ZUNhcGFiaWxpdGllczsKQEAgLTI3MjYsMTEgKzI3MjYsMTMgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzdWJJZCBUaGUgc3ViSWQgb2YgdGhlIHN1YnNjcmlwdGlvbiB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2F0ZWxsaXRlIG1vZGVtIGZvci4KICAgICAgKiBAcGFyYW0gZW5hYmxlIFRydWUgdG8gZW5hYmxlIHRoZSBzYXRlbGxpdGUgbW9kZW0gYW5kIGZhbHNlIHRvIGRpc2FibGUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBnZXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJlcXVlc3QuCisgICAgICogQHBhcmFtIGlzRGVtb01vZGVFbmFibGVkIFRydWUgaWYgZGVtbyBtb2RlIGlzIGVuYWJsZWQgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSByZXF1ZXN0LgogICAgICAqLwogICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oIgogICAgICAgICAgICAgKyAiYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKSIpCi0gICAgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlRW5hYmxlZChpbnQgc3ViSWQsIGJvb2xlYW4gZW5hYmxlLCBpbiBJSW50ZWdlckNvbnN1bWVyIGNhbGxiYWNrKTsKKyAgICB2b2lkIHJlcXVlc3RTYXRlbGxpdGVFbmFibGVkKGludCBzdWJJZCwgYm9vbGVhbiBlbmFibGUsIGJvb2xlYW4gaXNEZW1vTW9kZUVuYWJsZWQsCisgICAgICAgICAgICBpbiBJSW50ZWdlckNvbnN1bWVyIGNhbGxiYWNrKTsKIAogICAgIC8qKgogICAgICAqIFJlcXVlc3QgdG8gZ2V0IHdoZXRoZXIgdGhlIHNhdGVsbGl0ZSBtb2RlbSBpcyBlbmFibGVkLgpAQCAtMjc0NCwxNyArMjc0Niw2IEBACiAgICAgdm9pZCByZXF1ZXN0SXNTYXRlbGxpdGVFbmFibGVkKGludCBzdWJJZCwgaW4gUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpOwogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2F0ZWxsaXRlIHNlcnZpY2UgZGVtbyBtb2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN1YklkIFRoZSBzdWJJZCBvZiB0aGUgc3Vic2NyaXB0aW9uIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzYXRlbGxpdGUgZGVtbyBtb2RlIGZvci4KLSAgICAgKiBAcGFyYW0gZW5hYmxlIFRydWUgdG8gZW5hYmxlIHRoZSBzYXRlbGxpdGUgZGVtbyBtb2RlIGFuZCBmYWxzZSB0byBkaXNhYmxlLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSBlcnJvciBjb2RlIG9mIHRoZSByZXF1ZXN0LgotICAgICAqLwotICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oIgotICAgICAgICAgICAgKyAiYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKSIpCi0gICAgdm9pZCByZXF1ZXN0U2F0ZWxsaXRlRGVtb01vZGVFbmFibGVkKGludCBzdWJJZCwgYm9vbGVhbiBlbmFibGUsIGluIElJbnRlZ2VyQ29uc3VtZXIgY2FsbGJhY2spOwotCi0gICAgLyoqCiAgICAgICogUmVxdWVzdCB0byBnZXQgd2hldGhlciB0aGUgc2F0ZWxsaXRlIHNlcnZpY2UgZGVtbyBtb2RlIGlzIGVuYWJsZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gc3ViSWQgVGhlIHN1YklkIG9mIHRoZSBzdWJzY3JpcHRpb24gdG8gcmVxdWVzdCB3aGV0aGVyIHRoZSBzYXRlbGxpdGUgZGVtbyBtb2RlIGlzCkBAIC0yNzY0LDcgKzI3NTUsNyBAQAogICAgICAqLwogICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oIgogICAgICAgICAgICAgKyAiYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKSIpCi0gICAgdm9pZCByZXF1ZXN0SXNTYXRlbGxpdGVEZW1vTW9kZUVuYWJsZWQoaW50IHN1YklkLCBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7CisgICAgdm9pZCByZXF1ZXN0SXNEZW1vTW9kZUVuYWJsZWQoaW50IHN1YklkLCBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7CiAKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGdldCB3aGV0aGVyIHRoZSBzYXRlbGxpdGUgc2VydmljZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGRldmljZS4KQEAgLTI3ODcsMzkgKzI3NzgsMjggQEAKICAgICB2b2lkIHJlcXVlc3RTYXRlbGxpdGVDYXBhYmlsaXRpZXMoaW50IHN1YklkLCBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7CiAKICAgICAvKioKLSAgICAgKiBTdGFydCByZWNlaXZpbmcgc2F0ZWxsaXRlIHBvaW50aW5nIHVwZGF0ZXMuCisgICAgICogU3RhcnQgcmVjZWl2aW5nIHNhdGVsbGl0ZSB0cmFuc21pc3Npb24gdXBkYXRlcy4KICAgICAgKgotICAgICAqIEBwYXJhbSBzdWJJZCBUaGUgc3ViSWQgb2YgdGhlIHN1YnNjcmlwdGlvbiB0byBzdG9wIHNhdGVsbGl0ZSBwb3NpdGlvbiB1cGRhdGVzIGZvci4KLSAgICAgKiBAcGFyYW0gZXJyb3JDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSBlcnJvciBjb2RlIG9mIHRoZSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gaGFuZGxlIHBvc2l0aW9uIHVwZGF0ZXMuCisgICAgICogQHBhcmFtIHN1YklkIFRoZSBzdWJJZCBvZiB0aGUgc3Vic2NyaXB0aW9uIHRvIHN0b3Agc2F0ZWxsaXRlIHRyYW5zbWlzc2lvbiB1cGRhdGVzIGZvci4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSByZXF1ZXN0LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gaGFuZGxlIHRyYW5zbWlzc2lvbiB1cGRhdGVzLgogICAgICAqLwogICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oIgogICAgICAgICAgICAgKyAiYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNBVEVMTElURV9DT01NVU5JQ0FUSU9OKSIpCi0gICAgdm9pZCBzdGFydFNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlcyhpbnQgc3ViSWQsIGluIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaywKLSAgICAgICAgICAgIGluIElTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICB2b2lkIHN0YXJ0U2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlcyhpbnQgc3ViSWQsIGluIElJbnRlZ2VyQ29uc3VtZXIgcmVzdWx0Q2FsbGJhY2ssCisgICAgICAgICAgICBpbiBJU2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlQ2FsbGJhY2sgY2FsbGJhY2spOwogCiAgICAgLyoqCi0gICAgICogU3RvcCByZWNlaXZpbmcgc2F0ZWxsaXRlIHBvaW50aW5nIHVwZGF0ZXMuCisgICAgICogU3RvcCByZWNlaXZpbmcgc2F0ZWxsaXRlIHRyYW5zbWlzc2lvbiB1cGRhdGVzLgogICAgICAqCi0gICAgICogQHBhcmFtIHN1YklkIFRoZSBzdWJJZCBvZiB0aGUgc3Vic2NyaXRwaW9uIHRvIHN0b3Agc2F0ZWxsaXRlIHBvc2l0aW9uIHVwZGF0ZXMgZm9yLgotICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBnZXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IHdhcyBwYXNzZWQgdG8gc3RhcnRTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZXMuCisgICAgICogQHBhcmFtIHN1YklkIFRoZSBzdWJJZCBvZiB0aGUgc3Vic2NyaXRwaW9uIHRvIHN0b3Agc2F0ZWxsaXRlIHRyYW5zbWlzc2lvbiB1cGRhdGVzIGZvci4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSByZXF1ZXN0LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdGhhdCB3YXMgcGFzc2VkIHRvIHN0YXJ0U2F0ZWxsaXRlVHJhbnNtaXNzaW9uVXBkYXRlcy4KICAgICAgKi8KICAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKCIKICAgICAgICAgICAgICsgImFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikiKQotICAgIHZvaWQgc3RvcFNhdGVsbGl0ZVBvc2l0aW9uVXBkYXRlcyhpbnQgc3ViSWQsIGluIElJbnRlZ2VyQ29uc3VtZXIgZXJyb3JDYWxsYmFjaywKLSAgICAgICAgICAgIGluIElTYXRlbGxpdGVQb3NpdGlvblVwZGF0ZUNhbGxiYWNrIGNhbGxiYWNrKTsKLQotICAgIC8qKgotICAgICAqIFJlcXVlc3QgdG8gZ2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBwZXIgZGF0YWdyYW0gdGhhdCBjYW4gYmUgc2VudCB0byBzYXRlbGxpdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3ViSWQgVGhlIHN1YklkIG9mIHRoZSBzdWJzY3JpcHRpb24gdG8gZ2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZvci4KLSAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgUmVzdWx0IHJlY2VpdmVyIHRvIGdldCB0aGUgZXJyb3IgY29kZSBvZiB0aGUgcmVxdWVzdCBhbmQgdGhlIHJlcXVlc3RlZAotICAgICAqICAgICAgICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBwZXIgZGF0YWdyYW0gdGhhdCBjYW4gYmUgc2VudCB0byBzYXRlbGxpdGUuCi0gICAgICovCi0gICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbigiCi0gICAgICAgICAgICArICJhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pIikKLSAgICB2b2lkIHJlcXVlc3RNYXhTaXplUGVyU2VuZGluZ0RhdGFncmFtKGludCBzdWJJZCwgaW4gUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpOworICAgIHZvaWQgc3RvcFNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZXMoaW50IHN1YklkLCBpbiBJSW50ZWdlckNvbnN1bWVyIHJlc3VsdENhbGxiYWNrLAorICAgICAgICAgICAgaW4gSVNhdGVsbGl0ZVRyYW5zbWlzc2lvblVwZGF0ZUNhbGxiYWNrIGNhbGxiYWNrKTsKIAogICAgIC8qKgogICAgICAqIFJlZ2lzdGVyIHRoZSBzdWJzY3JpcHRpb24gd2l0aCBhIHNhdGVsbGl0ZSBwcm92aWRlci4KQEAgLTI4MjgsMTMgKzI4MDgsMTQgQEAKICAgICAgKiBAcGFyYW0gc3ViSWQgVGhlIHN1YklkIG9mIHRoZSBzdWJzY3JpcHRpb24gdG8gYmUgcHJvdmlzaW9uZWQuCiAgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiB0byBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHByb3Zpc2lvbmluZyB3aXRoIHNhdGVsbGl0ZQogICAgICAqICAgICAgICAgICAgICBnYXRld2F5LgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSBlcnJvciBjb2RlIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIEBwYXJhbSByZWdpb25JZCBUaGUgcmVnaW9uIElEIGZvciB0aGUgZGV2aWNlJ3MgY3VycmVudCBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSByZXF1ZXN0LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgc2lnbmFsIHRyYW5zcG9ydCB1c2VkIGJ5IGNhbGxlcnMgdG8gY2FuY2VsIHRoZSBwcm92aXNpb24gcmVxdWVzdC4KICAgICAgKi8KICAgICBASmF2YVBhc3N0aHJvdWdoKGFubm90YXRpb249IkBhbmRyb2lkLmFubm90YXRpb24uUmVxdWlyZXNQZXJtaXNzaW9uKCIKICAgICAgICAgICAgICsgImFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikiKQotICAgIElDYW5jZWxsYXRpb25TaWduYWwgcHJvdmlzaW9uU2F0ZWxsaXRlU2VydmljZShpbnQgc3ViSWQsIGluIFN0cmluZyB0b2tlbiwKKyAgICBJQ2FuY2VsbGF0aW9uU2lnbmFsIHByb3Zpc2lvblNhdGVsbGl0ZVNlcnZpY2UoaW50IHN1YklkLCBpbiBTdHJpbmcgdG9rZW4sIGluIFN0cmluZyByZWdpb25JZCwKICAgICAgICAgICAgIGluIElJbnRlZ2VyQ29uc3VtZXIgY2FsbGJhY2spOwogCiAgICAgLyoqCkBAIC0yODQ2LDcgKzI4MjcsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHN1YklkIFRoZSBzdWJJZCBvZiB0aGUgc3Vic2NyaXB0aW9uIHRvIGJlIGRlcHJvdmlzaW9uZWQuCiAgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiBvZiB0aGUgZGV2aWNlL3N1YnNjcmlwdGlvbiB0byBiZSBkZXByb3Zpc2lvbmVkLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSBlcnJvciBjb2RlIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIHJlcXVlc3QuCiAgICAgICovCiAgICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbigiCiAgICAgICAgICAgICArICJhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pIikKQEAgLTI5MTYsMTUgKzI4OTcsMTMgQEAKICAgICAgKiBSZWdpc3RlciB0byByZWNlaXZlIGluY29taW5nIGRhdGFncmFtcyBvdmVyIHNhdGVsbGl0ZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBzdWJJZCBUaGUgc3ViSWQgb2YgdGhlIHN1YnNjcmlwdGlvbiB0byByZWdpc3RlciBmb3IgaW5jb21pbmcgc2F0ZWxsaXRlIGRhdGFncmFtcy4KLSAgICAgKiBAcGFyYW0gZGF0YWdyYW1UeXBlIFR5cGUgb2YgZGF0YWdyYW0uCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBoYW5kbGUgdGhlIGluY29taW5nIGRhdGFncmFtcy4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBTYXRlbGxpdGVFcnJvcn0gcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCiAgICAgICovCiAgICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbigiCiAgICAgICAgICAgICArICJhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pIikKLSAgICBpbnQgcmVnaXN0ZXJGb3JTYXRlbGxpdGVEYXRhZ3JhbSgKLSAgICAgICAgICAgIGludCBzdWJJZCwgaW50IGRhdGFncmFtVHlwZSwgSVNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIGludCByZWdpc3RlckZvclNhdGVsbGl0ZURhdGFncmFtKGludCBzdWJJZCwgSVNhdGVsbGl0ZURhdGFncmFtQ2FsbGJhY2sgY2FsbGJhY2spOwogCiAgICAvKioKICAgICAgKiBVbnJlZ2lzdGVyIHRvIHN0b3AgcmVjZWl2aW5nIGluY29taW5nIGRhdGFncmFtcyBvdmVyIHNhdGVsbGl0ZS4KQEAgLTI5NDEsNyArMjkyMCw3IEBACiAgICAgKiBQb2xsIHBlbmRpbmcgc2F0ZWxsaXRlIGRhdGFncmFtcyBvdmVyIHNhdGVsbGl0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3ViSWQgVGhlIHN1YklkIG9mIHRoZSBzdWJzY3JpcHRpb24gdXNlZCBmb3IgcmVjZWl2aW5nIGRhdGFncmFtcy4KLSAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZ2V0IHRoZSBlcnJvciBjb2RlIG9mIHRoZSByZXF1ZXN0LgorICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBnZXQgdGhlIHJlc3VsdCBvZiB0aGUgcmVxdWVzdC4KICAgICAqLwogICAgIEBKYXZhUGFzc3Rocm91Z2goYW5ub3RhdGlvbj0iQGFuZHJvaWQuYW5ub3RhdGlvbi5SZXF1aXJlc1Blcm1pc3Npb24oIgogICAgICAgICAgICAgICAgICsgImFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TQVRFTExJVEVfQ09NTVVOSUNBVElPTikiKQpAQCAtMjk1NSw3ICsyOTM0LDcgQEAKICAgICAqIEBwYXJhbSBkYXRhZ3JhbSBEYXRhZ3JhbSB0byBzZW5kIG92ZXIgc2F0ZWxsaXRlLgogICAgICogQHBhcmFtIG5lZWRGdWxsU2NyZWVuUG9pbnRpbmdVSSB0aGlzIGlzIHVzZWQgdG8gaW5kaWNhdGUgcG9pbnRpbmdVSSBhcHAgdG8gb3BlbiBpbgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsIHNjcmVlbiBtb2RlLgotICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBnZXQgdGhlIGVycm9yIGNvZGUgb2YgdGhlIHJlcXVlc3QuCisgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSByZXF1ZXN0LgogICAgICovCiAgICAgQEphdmFQYXNzdGhyb3VnaChhbm5vdGF0aW9uPSJAYW5kcm9pZC5hbm5vdGF0aW9uLlJlcXVpcmVzUGVybWlzc2lvbigiCiAgICAgICAgICAgICArICJhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0FURUxMSVRFX0NPTU1VTklDQVRJT04pIikKZGlmZiAtLWdpdCBhL3Rlc3RzL0JhY2tncm91bmREZXhPcHRTZXJ2aWNlSW50ZWdyYXRpb25UZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3BtL0JhY2tncm91bmREZXhPcHRTZXJ2aWNlSW50ZWdyYXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvQmFja2dyb3VuZERleE9wdFNlcnZpY2VJbnRlZ3JhdGlvblRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vQmFja2dyb3VuZERleE9wdFNlcnZpY2VJbnRlZ3JhdGlvblRlc3RzLmphdmEKaW5kZXggZDJhNmJmMi4uODFlZmRhMSAxMDA2NDQKLS0tIGEvdGVzdHMvQmFja2dyb3VuZERleE9wdFNlcnZpY2VJbnRlZ3JhdGlvblRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vQmFja2dyb3VuZERleE9wdFNlcnZpY2VJbnRlZ3JhdGlvblRlc3RzLmphdmEKKysrIGIvdGVzdHMvQmFja2dyb3VuZERleE9wdFNlcnZpY2VJbnRlZ3JhdGlvblRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vQmFja2dyb3VuZERleE9wdFNlcnZpY2VJbnRlZ3JhdGlvblRlc3RzLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIucG07CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwpAQCAtMTEyLDYgKzExNCw3IEBACiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3N1bWVGYWxzZShTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oImRhbHZpay52bS51c2VhcnRzZXJ2aWNlIiwgZmFsc2UpKTsKICAgICAgICAgRmlsZSBkYXRhRGlyID0gZ2V0Q29udGV4dCgpLmdldERhdGFEaXIoKTsKICAgICAgICAgbUJpZ0ZpbGUgPSBuZXcgRmlsZShkYXRhRGlyLCBCSUdfRklMRSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vQW5kcm9pZC5icCBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5YTg5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2Jhc2VfbGljZW5zZSJdLAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzLWVuZm9yY2UtcGVybWlzc2lvbi10ZXN0LWFpZGwiLAorICAgIHNyY3M6IFsiYWlkbC8qKi8qLmFpZGwiXSwKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL1RFU1RfTUFQUElORyBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJmNDJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNyBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkVuZm9yY2VQZXJtaXNzaW9uVGVzdHMiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkva2V5Z3VhcmQvc2hhcmVkL21vZGVsL0tleWd1YXJkQm91bmNlck1vZGVsLmt0IGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vYWlkbC9hbmRyb2lkL3Rlc3RzL2VuZm9yY2VwZXJtaXNzaW9uL0lOZXN0ZWQuYWlkbApzaW1pbGFyaXR5IGluZGV4IDYwJQpjb3B5IGZyb20gcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3NoYXJlZC9tb2RlbC9LZXlndWFyZEJvdW5jZXJNb2RlbC5rdApjb3B5IHRvIHRlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL2FpZGwvYW5kcm9pZC90ZXN0cy9lbmZvcmNlcGVybWlzc2lvbi9JTmVzdGVkLmFpZGwKaW5kZXggYWQ3ODNkYS4uMWViNzczZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL2tleWd1YXJkL3NoYXJlZC9tb2RlbC9LZXlndWFyZEJvdW5jZXJNb2RlbC5rdAorKysgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9haWRsL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vSU5lc3RlZC5haWRsCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTEsMTQgKzExLDE1IEBACiAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5rZXlndWFyZC5zaGFyZWQubW9kZWwKK3BhY2thZ2UgYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbjsKIAotLyoqIE1vZGVscyB0aGUgc3RhdGUgb2YgdGhlIGxvY2stc2NyZWVuIGJvdW5jZXIgKi8KLWRhdGEgY2xhc3MgS2V5Z3VhcmRCb3VuY2VyTW9kZWwoCi0gICAgdmFsIHByb21wdFJlYXNvbjogSW50ID0gMCwKLSAgICB2YWwgZXJyb3JNZXNzYWdlOiBDaGFyU2VxdWVuY2U/ID0gbnVsbCwKLSAgICB2YWwgZXhwYW5zaW9uQW1vdW50OiBGbG9hdCA9IDBmLAotKQoraW50ZXJmYWNlIElOZXN0ZWQgeworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiQUNDRVNTX05FVFdPUktfU1RBVEUiKQorICAgIHZvaWQgUHJvdGVjdGVkQnlBY2Nlc3NOZXR3b3JrU3RhdGUoKTsKKworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiUkVBRF9TWU5DX1NFVFRJTkdTIikKKyAgICB2b2lkIFByb3RlY3RlZEJ5UmVhZFN5bmNTZXR0aW5ncygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vYWlkbC9hbmRyb2lkL3Rlc3RzL2VuZm9yY2VwZXJtaXNzaW9uL0lQcm90ZWN0ZWQuYWlkbCBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL2FpZGwvYW5kcm9pZC90ZXN0cy9lbmZvcmNlcGVybWlzc2lvbi9JUHJvdGVjdGVkLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlM2FlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL2FpZGwvYW5kcm9pZC90ZXN0cy9lbmZvcmNlcGVybWlzc2lvbi9JUHJvdGVjdGVkLmFpZGwKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbjsKKworaW50ZXJmYWNlIElQcm90ZWN0ZWQgeworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiSU5URVJORVQiKQorICAgIHZvaWQgUHJvdGVjdGVkQnlJbnRlcm5ldCgpOworCisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJWSUJSQVRFIikKKyAgICB2b2lkIFByb3RlY3RlZEJ5VmlicmF0ZSgpOworCisgICAgQEVuZm9yY2VQZXJtaXNzaW9uKCJJTlRFUk5FVCIpCisgICAgdm9pZCBQcm90ZWN0ZWRCeUludGVybmV0QW5kVmlicmF0ZUltcGxpY2l0bHkoKTsKKworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiSU5URVJORVQiKQorICAgIHZvaWQgUHJvdGVjdGVkQnlJbnRlcm5ldEFuZEFjY2Vzc05ldHdvcmtTdGF0ZUltcGxpY2l0bHkoKTsKKworICAgIEBFbmZvcmNlUGVybWlzc2lvbigiSU5URVJORVQiKQorICAgIHZvaWQgUHJvdGVjdGVkQnlJbnRlcm5ldEFuZFJlYWRTeW5jU2V0dGluZ3NJbXBsaWNpdGx5KCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9zZXJ2aWNlLWFwcC9BbmRyb2lkLmJwIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGFjMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvQW5kcm9pZC5icApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYmFzZV9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19iYXNlX2xpY2Vuc2UiXSwKK30KKworYW5kcm9pZF90ZXN0X2hlbHBlcl9hcHAgeworICAgIG5hbWU6ICJFbmZvcmNlUGVybWlzc2lvblRlc3RIZWxwZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy8qKi8qLmphdmEiLAorICAgICAgICAiOmZyYW1ld29ya3MtZW5mb3JjZS1wZXJtaXNzaW9uLXRlc3QtYWlkbCIsCisgICAgXSwKKyAgICBwbGF0Zm9ybV9hcGlzOiB0cnVlLAorICAgIGNlcnRpZmljYXRlOiAicGxhdGZvcm0iLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWRNYW5pZmVzdC1yMTAwMC54bWwgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9zZXJ2aWNlLWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSBzZXJ2aWNlcy90ZXN0cy9QYWNrYWdlTWFuYWdlclNlcnZpY2VUZXN0cy9hcGtzL2luc3RhbGxfdXNlc19zZGsvQW5kcm9pZE1hbmlmZXN0LXIxMDAwLnhtbApjb3B5IHRvIHRlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3NlcnZpY2UtYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggOWJmOTI1NC4uZGRhZmUxNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvUGFja2FnZU1hbmFnZXJTZXJ2aWNlVGVzdHMvYXBrcy9pbnN0YWxsX3VzZXNfc2RrL0FuZHJvaWRNYW5pZmVzdC1yMTAwMC54bWwKKysrIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMSw1ICsxLDUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNCBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy5zZXJ2aWNlc3Rlc3RzLmluc3RhbGxfdXNlc19zZGsiPgotCi0gICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNCIgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyOSI+Ci0gICAgICAgIDwhLS0gVGhpcyB3aWxsIGZhaWwgdG8gaW5zdGFsbCwgYmVjYXVzZSBtaW5FeHRlbnNpb25WZXJzaW9uIGlzIG5vdCBtZXQgLS0+Ci0gICAgICAgIDxleHRlbnNpb24tc2RrIGFuZHJvaWQ6c2RrVmVyc2lvbj0iMzAiIGFuZHJvaWQ6bWluRXh0ZW5zaW9uVmVyc2lvbj0iMTAwMCIgLz4KLSAgICA8L3VzZXMtc2RrPgotCisgIHBhY2thZ2U9ImFuZHJvaWQudGVzdHMuZW5mb3JjZXBlcm1pc3Npb24uc2VydmljZSI+CiAgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8c2VydmljZQorICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLlRlc3RTZXJ2aWNlIgorICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiIC8+CisKKyAgICAgICAgPHNlcnZpY2UKKyAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5OZXN0ZWRUZXN0U2VydmljZSIKKyAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvc3JjL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vc2VydmljZS9OZXN0ZWRUZXN0U2VydmljZS5qYXZhIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvc3JjL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vc2VydmljZS9OZXN0ZWRUZXN0U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NzlhMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9zZXJ2aWNlLWFwcC9zcmMvYW5kcm9pZC90ZXN0cy9lbmZvcmNlcGVybWlzc2lvbi9zZXJ2aWNlL05lc3RlZFRlc3RTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdHMuZW5mb3JjZXBlcm1pc3Npb24uc2VydmljZTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5FbmZvcmNlUGVybWlzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudGVzdHMuZW5mb3JjZXBlcm1pc3Npb24uSU5lc3RlZDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgTmVzdGVkVGVzdFNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkVuZm9yY2VQZXJtaXNzaW9uLk5lc3RlZFRlc3RTZXJ2aWNlIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIExvZy5pKFRBRywgIm9uQmluZCIpOworICAgICAgICByZXR1cm4gbUJpbmRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIElOZXN0ZWQuU3R1YiBtQmluZGVyID0gbmV3IElOZXN0ZWQuU3R1YigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBFbmZvcmNlUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUpCisgICAgICAgIHB1YmxpYyB2b2lkIFByb3RlY3RlZEJ5QWNjZXNzTmV0d29ya1N0YXRlKCkgeworICAgICAgICAgICAgUHJvdGVjdGVkQnlBY2Nlc3NOZXR3b3JrU3RhdGVfZW5mb3JjZVBlcm1pc3Npb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBARW5mb3JjZVBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfU1lOQ19TRVRUSU5HUykKKyAgICAgICAgcHVibGljIHZvaWQgUHJvdGVjdGVkQnlSZWFkU3luY1NldHRpbmdzKCkgeworICAgICAgICAgICAgUHJvdGVjdGVkQnlSZWFkU3luY1NldHRpbmdzX2VuZm9yY2VQZXJtaXNzaW9uKCk7CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvc3JjL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vc2VydmljZS9UZXN0U2VydmljZS5qYXZhIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vc2VydmljZS1hcHAvc3JjL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vc2VydmljZS9UZXN0U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Yjg5N2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi9zZXJ2aWNlLWFwcC9zcmMvYW5kcm9pZC90ZXN0cy9lbmZvcmNlcGVybWlzc2lvbi9zZXJ2aWNlL1Rlc3RTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLnNlcnZpY2U7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uRW5mb3JjZVBlcm1pc3Npb247CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLklOZXN0ZWQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbi5JUHJvdGVjdGVkOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkVuZm9yY2VQZXJtaXNzaW9uLlRlc3RTZXJ2aWNlIjsKKyAgICBwcml2YXRlIHZvbGF0aWxlIFNlcnZpY2VDb25uZWN0aW9uIG1OZXN0ZWRTZXJ2aWNlQ29ubmVjdGlvbjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBtTmVzdGVkU2VydmljZUNvbm5lY3Rpb24gPSBuZXcgU2VydmljZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgTmVzdGVkVGVzdFNlcnZpY2UuY2xhc3MpOworICAgICAgICBib29sZWFuIGJvdW5kID0gYmluZFNlcnZpY2UoaW50ZW50LCBtTmVzdGVkU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIGlmICghYm91bmQpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiYmluZFNlcnZpY2UoKSBvbiBOZXN0ZWRUZXN0U2VydmljZSBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgdW5iaW5kU2VydmljZShtTmVzdGVkU2VydmljZUNvbm5lY3Rpb24pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBDb21wbGV0YWJsZUZ1dHVyZTxJTmVzdGVkPiBtRnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKworICAgICAgICBwdWJsaWMgSU5lc3RlZCBnZXQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtRnV0dXJlLmdldCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIHwgVGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byByZWFjaCBOZXN0ZWRUZXN0U2VydmljZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIGNsYXNzTmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtRnV0dXJlLmNvbXBsZXRlKElOZXN0ZWQuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBjbGFzc05hbWUpIHsKKyAgICAgICAgICAgIG1GdXR1cmUgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICB9CisgICAgfTsKKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG1CaW5kZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBJUHJvdGVjdGVkLlN0dWIgbUJpbmRlciA9IG5ldyBJUHJvdGVjdGVkLlN0dWIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBARW5mb3JjZVBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLklOVEVSTkVUKQorICAgICAgICBwdWJsaWMgdm9pZCBQcm90ZWN0ZWRCeUludGVybmV0KCkgeworICAgICAgICAgICAgUHJvdGVjdGVkQnlJbnRlcm5ldF9lbmZvcmNlUGVybWlzc2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBFbmZvcmNlUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uVklCUkFURSkKKyAgICAgICAgcHVibGljIHZvaWQgUHJvdGVjdGVkQnlWaWJyYXRlKCkgeworICAgICAgICAgICAgUHJvdGVjdGVkQnlWaWJyYXRlX2VuZm9yY2VQZXJtaXNzaW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQEVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5JTlRFUk5FVCkKKyAgICAgICAgcHVibGljIHZvaWQgUHJvdGVjdGVkQnlJbnRlcm5ldEFuZFZpYnJhdGVJbXBsaWNpdGx5KCkgeworICAgICAgICAgICAgUHJvdGVjdGVkQnlJbnRlcm5ldEFuZFZpYnJhdGVJbXBsaWNpdGx5X2VuZm9yY2VQZXJtaXNzaW9uKCk7CisKKyAgICAgICAgICAgIFByb3RlY3RlZEJ5VmlicmF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBFbmZvcmNlUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQpCisgICAgICAgIHB1YmxpYyB2b2lkIFByb3RlY3RlZEJ5SW50ZXJuZXRBbmRBY2Nlc3NOZXR3b3JrU3RhdGVJbXBsaWNpdGx5KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBQcm90ZWN0ZWRCeUludGVybmV0QW5kQWNjZXNzTmV0d29ya1N0YXRlSW1wbGljaXRseV9lbmZvcmNlUGVybWlzc2lvbigpOworCisgICAgICAgICAgICBtTmVzdGVkU2VydmljZUNvbm5lY3Rpb24uZ2V0KCkuUHJvdGVjdGVkQnlBY2Nlc3NOZXR3b3JrU3RhdGUoKTsKKworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBFbmZvcmNlUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5URVJORVQpCisgICAgICAgIHB1YmxpYyB2b2lkIFByb3RlY3RlZEJ5SW50ZXJuZXRBbmRSZWFkU3luY1NldHRpbmdzSW1wbGljaXRseSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgUHJvdGVjdGVkQnlJbnRlcm5ldEFuZFJlYWRTeW5jU2V0dGluZ3NJbXBsaWNpdGx5X2VuZm9yY2VQZXJtaXNzaW9uKCk7CisKKyAgICAgICAgICAgIG1OZXN0ZWRTZXJ2aWNlQ29ubmVjdGlvbi5nZXQoKS5Qcm90ZWN0ZWRCeVJlYWRTeW5jU2V0dGluZ3MoKTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi90ZXN0LWFwcC9BbmRyb2lkLmJwIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vdGVzdC1hcHAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDUzODU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vdGVzdC1hcHAvQW5kcm9pZC5icApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYmFzZV9saWNlbnNlIl0sCit9CisKK2FuZHJvaWRfdGVzdCB7CisgICAgbmFtZTogIkVuZm9yY2VQZXJtaXNzaW9uVGVzdHMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy8qKi8qLmphdmEiLAorICAgICAgICAiOmZyYW1ld29ya3MtZW5mb3JjZS1wZXJtaXNzaW9uLXRlc3QtYWlkbCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZHgudGVzdC5ydWxlcyIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJhbmRyb2lkLnRlc3QuYmFzZSIsCisgICAgICAgICJhbmRyb2lkLnRlc3QucnVubmVyIiwKKyAgICBdLAorICAgIGRhdGE6IFsKKyAgICAgICAgIjpFbmZvcmNlUGVybWlzc2lvblRlc3RIZWxwZXIiLAorICAgIF0sCisgICAgcGxhdGZvcm1fYXBpczogdHJ1ZSwKKyAgICBjZXJ0aWZpY2F0ZTogInBsYXRmb3JtIiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3Rlc3QtYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi90ZXN0LWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGM2YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi90ZXN0LWFwcC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICBwYWNrYWdlPSJhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLnRlc3RzIj4KKworICAgIDwhLS0gRXhwZWN0ZWQgZm9yIHRoZSB0ZXN0cyAobm90IGFjdHVhbGx5IHVzZWQpIC0tPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1NZTkNfU0VUVElOR1MiIC8+CisKKyAgICA8cXVlcmllcz4KKyAgICAgICAgPHBhY2thZ2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLnNlcnZpY2UiIC8+CisgICAgPC9xdWVyaWVzPgorCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImFuZHJvaWQudGVzdHMuZW5mb3JjZXBlcm1pc3Npb24udGVzdHMiLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi90ZXN0LWFwcC9BbmRyb2lkVGVzdC54bWwgYi90ZXN0cy9FbmZvcmNlUGVybWlzc2lvbi90ZXN0LWFwcC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwMzgxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3Rlc3QtYXBwL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlJ1bnMgRW5mb3JjZVBlcm1pc3Npb24gRW5kLXRvLUVuZCBUZXN0cyI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5UZXN0QXBwSW5zdGFsbFNldHVwIj4KKyAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJFbmZvcmNlUGVybWlzc2lvblRlc3RIZWxwZXIuYXBrIi8+CisgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iRW5mb3JjZVBlcm1pc3Npb25UZXN0cy5hcGsiLz4KKyAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDxvcHRpb24gbmFtZT0idGVzdC10YWciIHZhbHVlPSJFbmZvcmNlUGVybWlzc2lvblRlc3RzIi8+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkFuZHJvaWRKVW5pdFRlc3QiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLnRlc3RzIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvRW5mb3JjZVBlcm1pc3Npb24vdGVzdC1hcHAvc3JjL2FuZHJvaWQvdGVzdHMvZW5mb3JjZXBlcm1pc3Npb24vdGVzdHMvU2VydmljZVRlc3QuamF2YSBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3Rlc3QtYXBwL3NyYy9hbmRyb2lkL3Rlc3RzL2VuZm9yY2VwZXJtaXNzaW9uL3Rlc3RzL1NlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNGEwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0VuZm9yY2VQZXJtaXNzaW9uL3Rlc3QtYXBwL3NyYy9hbmRyb2lkL3Rlc3RzL2VuZm9yY2VwZXJtaXNzaW9uL3Rlc3RzL1NlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLnRlc3RzOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRlc3RzLmVuZm9yY2VwZXJtaXNzaW9uLklQcm90ZWN0ZWQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGFuZHJvaWR4LnRlc3QuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CitpbXBvcnQgYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0NDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworCitAUnVuV2l0aChBbmRyb2lkSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFNlcnZpY2VUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRW5mb3JjZVBlcm1pc3Npb24uVGVzdHMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSAiYW5kcm9pZC50ZXN0cy5lbmZvcmNlcGVybWlzc2lvbi5zZXJ2aWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9USU1FT1VUX1NFQyA9IDU7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmluZFRlc3RTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExvZy5kKFRBRywgImJpbmRUZXN0U2VydmljZSIpOworICAgICAgICBtQ29udGV4dCA9IEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldFRhcmdldENvbnRleHQoKTsKKyAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uKCk7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoU0VSVklDRV9OQU1FLCBTRVJWSUNFX05BTUUgKyAiLlRlc3RTZXJ2aWNlIik7CisgICAgICAgIGFzc2VydFRydWUobUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSkpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHVuYmluZFRlc3RTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbiB7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQ29tcGxldGFibGVGdXR1cmU8SVByb3RlY3RlZD4gbUZ1dHVyZSA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIGNsYXNzTmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtRnV0dXJlLmNvbXBsZXRlKElQcm90ZWN0ZWQuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgY2xhc3NOYW1lKSB7CisgICAgICAgICAgICBtRnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJUHJvdGVjdGVkIGdldCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1GdXR1cmUuZ2V0KFNFUlZJQ0VfVElNRU9VVF9TRUMsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gfCBUaW1lb3V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlYWNoIFRlc3RTZXJ2aWNlOiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltbWVkaWF0ZVBlcm1pc3Npb25HcmFudGVkX3N1Y2NlZWRzKCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24uZ2V0KCkuUHJvdGVjdGVkQnlJbnRlcm5ldCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltbWVkaWF0ZVBlcm1pc3Npb25Ob3RHcmFudGVkX2ZhaWxzKCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBFeGNlcHRpb24gZXggPSBhc3NlcnRUaHJvd3MoU2VjdXJpdHlFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4gbVNlcnZpY2VDb25uZWN0aW9uLmdldCgpLlByb3RlY3RlZEJ5VmlicmF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChleC5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCJWSUJSQVRFIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltbWVkaWF0ZVBlcm1pc3Npb25HcmFudGVkQnV0SW1wbGljaXRMb2NhbE5vdEdyYW50ZWRfZmFpbHMoKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbiBleCA9IGFzc2VydFRocm93cyhTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBtU2VydmljZUNvbm5lY3Rpb24uZ2V0KCkuUHJvdGVjdGVkQnlJbnRlcm5ldEFuZFZpYnJhdGVJbXBsaWNpdGx5KCkpOworICAgICAgICBhc3NlcnRUaGF0KGV4LmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoIlZJQlJBVEUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1tZWRpYXRlUGVybWlzc2lvbkdyYW50ZWRCdXRJbXBsaWNpdE5lc3RlZE5vdEdyYW50ZWRfZmFpbHMoKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbiBleCA9IGFzc2VydFRocm93cyhTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAoKSAtPiBtU2VydmljZUNvbm5lY3Rpb24uZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAuUHJvdGVjdGVkQnlJbnRlcm5ldEFuZEFjY2Vzc05ldHdvcmtTdGF0ZUltcGxpY2l0bHkoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXguZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZygiQUNDRVNTX05FVFdPUktfU1RBVEUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1tZWRpYXRlUGVybWlzc2lvbkdyYW50ZWRBbmRJbXBsaWNpdE5lc3RlZEdyYW50ZWRfc3VjY2VlZHMoKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbi5nZXQoKS5Qcm90ZWN0ZWRCeUludGVybmV0QW5kUmVhZFN5bmNTZXR0aW5nc0ltcGxpY2l0bHkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2ltZS9DbG9zZUltZU9uRGlzbWlzc1BvcHVwRGlhbG9nVGVzdC5rdCBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL0Nsb3NlSW1lT25EaXNtaXNzUG9wdXBEaWFsb2dUZXN0Lmt0CmluZGV4IGMyM2NmMzQuLmQ3MmY1MjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL0Nsb3NlSW1lT25EaXNtaXNzUG9wdXBEaWFsb2dUZXN0Lmt0CisrKyBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL0Nsb3NlSW1lT25EaXNtaXNzUG9wdXBEaWFsb2dUZXN0Lmt0CkBAIC0zNyw3ICszNyw3IEBACiBAUnVuV2l0aChQYXJhbWV0ZXJpemVkOjpjbGFzcykKIEBQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCiBARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKLWNsYXNzIENsb3NlSW1lT25EaXNtaXNzUG9wdXBEaWFsb2dUZXN0KGZsaWNrZXI6IEZsaWNrZXJUZXN0KSA6IEJhc2VUZXN0KGZsaWNrZXIpIHsKK29wZW4gY2xhc3MgQ2xvc2VJbWVPbkRpc21pc3NQb3B1cERpYWxvZ1Rlc3QoZmxpY2tlcjogRmxpY2tlclRlc3QpIDogQmFzZVRlc3QoZmxpY2tlcikgewogICAgIHByaXZhdGUgdmFsIGltZVRlc3RBcHAgPSBJbWVFZGl0b3JQb3B1cERpYWxvZ0FwcEhlbHBlcihpbnN0cnVtZW50YXRpb24pCiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZU9uU3RhcnRXaGVuTGF1bmNoaW5nQXBwQ2ZBcm1UZXN0Lmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvQ2xvc2VJbWVPbkRpc21pc3NQb3B1cERpYWxvZ1Rlc3RDZkFybS5rdApzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZU9uU3RhcnRXaGVuTGF1bmNoaW5nQXBwQ2ZBcm1UZXN0Lmt0CmNvcHkgdG8gdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvQ2xvc2VJbWVPbkRpc21pc3NQb3B1cERpYWxvZ1Rlc3RDZkFybS5rdAppbmRleCAxOTRjODZiLi40MzJkZjIwIDEwMDY0NAotLS0gYS90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2ltZS9TaG93SW1lT25TdGFydFdoZW5MYXVuY2hpbmdBcHBDZkFybVRlc3Qua3QKKysrIGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvQ2xvc2VJbWVPbkRpc21pc3NQb3B1cERpYWxvZ1Rlc3RDZkFybS5rdApAQCAtMTYsOCArMTYsMTAgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIud20uZmxpY2tlci5pbWUKIAoraW1wb3J0IGFuZHJvaWQudG9vbHMuY29tbW9uLlJvdGF0aW9uCiBpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5qdW5pdC5GbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3RvcnkKIGltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmxlZ2FjeS5GbGlja2VyVGVzdAoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0RmFjdG9yeQogaW1wb3J0IG9yZy5qdW5pdC5GaXhNZXRob2RPcmRlcgogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLk1ldGhvZFNvcnRlcnMKQEAgLTI2LDUgKzI4LDE1IEBACiBAUnVuV2l0aChQYXJhbWV0ZXJpemVkOjpjbGFzcykKIEBQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCiBARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKLWNsYXNzIFNob3dJbWVPblN0YXJ0V2hlbkxhdW5jaGluZ0FwcENmQXJtVGVzdChmbGlja2VyOiBGbGlja2VyVGVzdCkgOgotICAgIFNob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcFRlc3QoZmxpY2tlcikKK2NsYXNzIENsb3NlSW1lT25EaXNtaXNzUG9wdXBEaWFsb2dUZXN0Q2ZBcm0oZmxpY2tlcjogRmxpY2tlclRlc3QpIDoKKyAgICBDbG9zZUltZU9uRGlzbWlzc1BvcHVwRGlhbG9nVGVzdChmbGlja2VyKSB7CisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgICAgICBASnZtU3RhdGljCisgICAgICAgIGZ1biBnZXRQYXJhbXMoKTogQ29sbGVjdGlvbjxGbGlja2VyVGVzdD4geworICAgICAgICAgICAgcmV0dXJuIEZsaWNrZXJUZXN0RmFjdG9yeS5ub25Sb3RhdGlvblRlc3RzKAorICAgICAgICAgICAgICAgIHN1cHBvcnRlZFJvdGF0aW9ucyA9IGxpc3RPZihSb3RhdGlvbi5ST1RBVElPTl8wKQorICAgICAgICAgICAgKQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVPblN0YXJ0V2hlbkxhdW5jaGluZ0FwcENmQXJtVGVzdC5rdCBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcENmQXJtVGVzdC5rdApzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSB0ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2ltZS9TaG93SW1lT25TdGFydFdoZW5MYXVuY2hpbmdBcHBDZkFybVRlc3Qua3QKcmVuYW1lIHRvIHRlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcENmQXJtVGVzdC5rdAppbmRleCAxOTRjODZiLi4wM2YyMWY5IDEwMDY0NAotLS0gYS90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2ltZS9TaG93SW1lT25TdGFydFdoZW5MYXVuY2hpbmdBcHBDZkFybVRlc3Qua3QKKysrIGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZU9uQXBwU3RhcnRXaGVuTGF1bmNoaW5nQXBwQ2ZBcm1UZXN0Lmt0CkBAIC0yNiw1ICsyNiw1IEBACiBAUnVuV2l0aChQYXJhbWV0ZXJpemVkOjpjbGFzcykKIEBQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCiBARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKLWNsYXNzIFNob3dJbWVPblN0YXJ0V2hlbkxhdW5jaGluZ0FwcENmQXJtVGVzdChmbGlja2VyOiBGbGlja2VyVGVzdCkgOgorY2xhc3MgU2hvd0ltZU9uQXBwU3RhcnRXaGVuTGF1bmNoaW5nQXBwQ2ZBcm1UZXN0KGZsaWNrZXI6IEZsaWNrZXJUZXN0KSA6CiAgICAgU2hvd0ltZU9uQXBwU3RhcnRXaGVuTGF1bmNoaW5nQXBwVGVzdChmbGlja2VyKQpkaWZmIC0tZ2l0IGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZU9uU3RhcnRXaGVuTGF1bmNoaW5nQXBwQ2ZBcm1UZXN0Lmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZU9uQXBwU3RhcnRXaGVuTGF1bmNoaW5nQXBwRnJvbU92ZXJ2aWV3VGVzdENmQXJtLmt0CnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSB0ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2ltZS9TaG93SW1lT25TdGFydFdoZW5MYXVuY2hpbmdBcHBDZkFybVRlc3Qua3QKY29weSB0byB0ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2ltZS9TaG93SW1lT25BcHBTdGFydFdoZW5MYXVuY2hpbmdBcHBGcm9tT3ZlcnZpZXdUZXN0Q2ZBcm0ua3QKaW5kZXggMTk0Yzg2Yi4uZWZkYTBmZiAxMDA2NDQKLS0tIGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZU9uU3RhcnRXaGVuTGF1bmNoaW5nQXBwQ2ZBcm1UZXN0Lmt0CisrKyBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcEZyb21PdmVydmlld1Rlc3RDZkFybS5rdApAQCAtMTYsOCArMTYsMTAgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIud20uZmxpY2tlci5pbWUKIAoraW1wb3J0IGFuZHJvaWQudG9vbHMuY29tbW9uLlJvdGF0aW9uCiBpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5qdW5pdC5GbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3RvcnkKIGltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmxlZ2FjeS5GbGlja2VyVGVzdAoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0RmFjdG9yeQogaW1wb3J0IG9yZy5qdW5pdC5GaXhNZXRob2RPcmRlcgogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLk1ldGhvZFNvcnRlcnMKQEAgLTI2LDUgKzI4LDE2IEBACiBAUnVuV2l0aChQYXJhbWV0ZXJpemVkOjpjbGFzcykKIEBQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCiBARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKLWNsYXNzIFNob3dJbWVPblN0YXJ0V2hlbkxhdW5jaGluZ0FwcENmQXJtVGVzdChmbGlja2VyOiBGbGlja2VyVGVzdCkgOgotICAgIFNob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcFRlc3QoZmxpY2tlcikKK2NsYXNzIFNob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcEZyb21PdmVydmlld1Rlc3RDZkFybShmbGlja2VyOiBGbGlja2VyVGVzdCkgOgorICAgIFNob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcEZyb21PdmVydmlld1Rlc3QoZmxpY2tlcikgeworCisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgICAgICBASnZtU3RhdGljCisgICAgICAgIGZ1biBnZXRQYXJhbXMoKTogQ29sbGVjdGlvbjxGbGlja2VyVGVzdD4geworICAgICAgICAgICAgcmV0dXJuIEZsaWNrZXJUZXN0RmFjdG9yeS5ub25Sb3RhdGlvblRlc3RzKAorICAgICAgICAgICAgICAgIHN1cHBvcnRlZFJvdGF0aW9ucyA9IGxpc3RPZihSb3RhdGlvbi5ST1RBVElPTl8wKQorICAgICAgICAgICAgKQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcEZyb21RdWlja1N3aXRjaFRlc3Qua3QgYi90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2ltZS9TaG93SW1lT25BcHBTdGFydFdoZW5MYXVuY2hpbmdBcHBGcm9tUXVpY2tTd2l0Y2hUZXN0Lmt0CmluZGV4IDk1NGY1ODkuLmRhZWUzMzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcEZyb21RdWlja1N3aXRjaFRlc3Qua3QKKysrIGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZU9uQXBwU3RhcnRXaGVuTGF1bmNoaW5nQXBwRnJvbVF1aWNrU3dpdGNoVGVzdC5rdApAQCAtMTYsMTMgKzE2LDExIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLndtLmZsaWNrZXIuaW1lCiAKLWltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuRmxha3lUZXN0CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdAogaW1wb3J0IGFuZHJvaWQudG9vbHMuY29tbW9uLk5hdkJhcgogaW1wb3J0IGFuZHJvaWQudG9vbHMuY29tbW9uLlJvdGF0aW9uCiBpbXBvcnQgYW5kcm9pZC50b29scy5jb21tb24uZGF0YXR5cGVzLmNvbXBvbmVudC5Db21wb25lbnROYW1lTWF0Y2hlcgogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLmhlbHBlcnMuSW1lU2hvd25PbkFwcFN0YXJ0SGVscGVyCi1pbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5pc1NoZWxsVHJhbnNpdGlvbnNFbmFibGVkCiBpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5qdW5pdC5GbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3RvcnkKIGltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmxlZ2FjeS5GbGlja2VyQnVpbGRlcgogaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0CkBAIC0zMSw4ICsyOSw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLmZsaWNrZXIuQmFzZVRlc3QKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20uZmxpY2tlci5oZWxwZXJzLlNpbXBsZUFwcEhlbHBlcgogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLmhlbHBlcnMuc2V0Um90YXRpb24KLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZQogaW1wb3J0IG9yZy5qdW5pdC5GaXhNZXRob2RPcmRlcgogaW1wb3J0IG9yZy5qdW5pdC5UZXN0CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCkBAIC01NCwxMSArNTAsNiBAQAogICAgIHByaXZhdGUgdmFsIGltZVRlc3RBcHAgPQogICAgICAgICBJbWVTaG93bk9uQXBwU3RhcnRIZWxwZXIoaW5zdHJ1bWVudGF0aW9uLCBmbGlja2VyLnNjZW5hcmlvLnN0YXJ0Um90YXRpb24pCiAKLSAgICBAQmVmb3JlCi0gICAgb3BlbiBmdW4gYmVmb3JlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZCkKLSAgICB9Ci0KICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIG92ZXJyaWRlIHZhbCB0cmFuc2l0aW9uOiBGbGlja2VyQnVpbGRlci4oKSAtPiBVbml0ID0gewogICAgICAgICBzZXR1cCB7CkBAIC05NSw3ICs4Niw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBARmxha3lUZXN0KGJ1Z0lkID0gMjY1MDE2MjAxKQorICAgIEBQcmVzdWJtaXQKICAgICBAVGVzdAogICAgIG92ZXJyaWRlIGZ1biBlbnRpcmVTY3JlZW5Db3ZlcmVkKCkgPSBzdXBlci5lbnRpcmVTY3JlZW5Db3ZlcmVkKCkKIApAQCAtMTE1LDcgKzEwNiw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBARmxha3lUZXN0KGJ1Z0lkID0gMjQ0NDE0MTEwKQorICAgIEBQcmVzdWJtaXQKICAgICBAVGVzdAogICAgIG9wZW4gZnVuIGltZUxheWVySXNWaXNpYmxlV2hlblN3aXRjaGluZ1RvSW1lQXBwKCkgewogICAgICAgICBmbGlja2VyLmFzc2VydExheWVyc1N0YXJ0IHsgaXNWaXNpYmxlKENvbXBvbmVudE5hbWVNYXRjaGVyLklNRSkgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZU9uQXBwU3RhcnRXaGVuTGF1bmNoaW5nQXBwRnJvbVF1aWNrU3dpdGNoVGVzdFNoZWxsVHJhbnNpdC5rdCBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcEZyb21RdWlja1N3aXRjaFRlc3RTaGVsbFRyYW5zaXQua3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjcxMDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZU9uQXBwU3RhcnRXaGVuTGF1bmNoaW5nQXBwRnJvbVF1aWNrU3dpdGNoVGVzdFNoZWxsVHJhbnNpdC5rdAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLmltZQotCi1pbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdAotaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZAotaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuanVuaXQuRmxpY2tlclBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5Ci1pbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlclRlc3QKLWltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuUmVxdWlyZXNEZXZpY2UKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZQotaW1wb3J0IG9yZy5qdW5pdC5GaXhNZXRob2RPcmRlcgotaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmUKLWltcG9ydCBvcmcuanVuaXQuVGVzdAotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLk1ldGhvZFNvcnRlcnMKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkCi0KLS8qKgotICogVGVzdCBJTUUgd2luZG93cyBzd2l0Y2hpbmcgd2l0aCAyLUJ1dHRvbnMgb3IgZ2VzdHVyYWwgbmF2aWdhdGlvbi4gVG8gcnVuIHRoaXMgdGVzdDogYGF0ZXN0Ci0gKiBGbGlja2VyVGVzdHM6U3dpdGNoSW1lV2luZG93c0Zyb21HZXN0dXJlTmF2VGVzdGAKLSAqLwotQFJlcXVpcmVzRGV2aWNlCi1AUnVuV2l0aChQYXJhbWV0ZXJpemVkOjpjbGFzcykKLUBQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCi1ARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKLWNsYXNzIFNob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcEZyb21RdWlja1N3aXRjaFRlc3RTaGVsbFRyYW5zaXQoZmxpY2tlcjogRmxpY2tlclRlc3QpIDoKLSAgICBTaG93SW1lT25BcHBTdGFydFdoZW5MYXVuY2hpbmdBcHBGcm9tUXVpY2tTd2l0Y2hUZXN0KGZsaWNrZXIpIHsKLSAgICBAQmVmb3JlCi0gICAgb3ZlcnJpZGUgZnVuIGJlZm9yZSgpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZCkKLSAgICB9Ci0KLSAgICBAUHJlc3VibWl0IEBUZXN0IG92ZXJyaWRlIGZ1biBlbnRpcmVTY3JlZW5Db3ZlcmVkKCkgPSBzdXBlci5lbnRpcmVTY3JlZW5Db3ZlcmVkKCkKLQotICAgIEBQcmVzdWJtaXQKLSAgICBAVGVzdAotICAgIG92ZXJyaWRlIGZ1biBpbWVMYXllcklzVmlzaWJsZVdoZW5Td2l0Y2hpbmdUb0ltZUFwcCgpID0KLSAgICAgICAgc3VwZXIuaW1lTGF5ZXJJc1Zpc2libGVXaGVuU3dpdGNoaW5nVG9JbWVBcHAoKQotCi0gICAgQFByZXN1Ym1pdAotICAgIEBUZXN0Ci0gICAgb3ZlcnJpZGUgZnVuIHZpc2libGVMYXllcnNTaG93bk1vcmVUaGFuT25lQ29uc2VjdXRpdmVFbnRyeSgpID0KLSAgICAgICAgc3VwZXIudmlzaWJsZUxheWVyc1Nob3duTW9yZVRoYW5PbmVDb25zZWN1dGl2ZUVudHJ5KCkKLQotICAgIEBQcmVzdWJtaXQKLSAgICBAVGVzdAotICAgIG92ZXJyaWRlIGZ1biB2aXNpYmxlV2luZG93c1Nob3duTW9yZVRoYW5PbmVDb25zZWN1dGl2ZUVudHJ5KCkgPQotICAgICAgICBzdXBlci52aXNpYmxlV2luZG93c1Nob3duTW9yZVRoYW5PbmVDb25zZWN1dGl2ZUVudHJ5KCkKLQotICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgQElnbm9yZSgiTmF2IGJhciB3aW5kb3cgYmVjb21lcyBpbnZpc2libGUgZHVyaW5nIHF1aWNrIHN3aXRjaCIpCi0gICAgQFRlc3QKLSAgICBvdmVycmlkZSBmdW4gbmF2QmFyV2luZG93SXNBbHdheXNWaXNpYmxlKCkgPSBzdXBlci5uYXZCYXJXaW5kb3dJc0Fsd2F5c1Zpc2libGUoKQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZVdoaWxlRGlzbWlzc2luZ1RoZW1lZFBvcHVwRGlhbG9nVGVzdC5rdCBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVXaGlsZURpc21pc3NpbmdUaGVtZWRQb3B1cERpYWxvZ1Rlc3Qua3QKaW5kZXggOTliOWJkMmJmYy4uYTU3YWE1YiAxMDA2NDQKLS0tIGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZVdoaWxlRGlzbWlzc2luZ1RoZW1lZFBvcHVwRGlhbG9nVGVzdC5rdAorKysgYi90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2ltZS9TaG93SW1lV2hpbGVEaXNtaXNzaW5nVGhlbWVkUG9wdXBEaWFsb2dUZXN0Lmt0CkBAIC00NSw3ICs0NSw3IEBACiBAUnVuV2l0aChQYXJhbWV0ZXJpemVkOjpjbGFzcykKIEBQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCiBARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKLWNsYXNzIFNob3dJbWVXaGlsZURpc21pc3NpbmdUaGVtZWRQb3B1cERpYWxvZ1Rlc3QoZmxpY2tlcjogRmxpY2tlclRlc3QpIDogQmFzZVRlc3QoZmxpY2tlcikgeworb3BlbiBjbGFzcyBTaG93SW1lV2hpbGVEaXNtaXNzaW5nVGhlbWVkUG9wdXBEaWFsb2dUZXN0KGZsaWNrZXI6IEZsaWNrZXJUZXN0KSA6IEJhc2VUZXN0KGZsaWNrZXIpIHsKICAgICBwcml2YXRlIHZhbCB0ZXN0QXBwID0gSW1lU2hvd25PbkFwcFN0YXJ0SGVscGVyKGluc3RydW1lbnRhdGlvbiwgZmxpY2tlci5zY2VuYXJpby5zdGFydFJvdGF0aW9uKQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KZGlmZiAtLWdpdCBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVXaGlsZURpc21pc3NpbmdUaGVtZWRQb3B1cERpYWxvZ1Rlc3RDZkFybS5rdCBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVXaGlsZURpc21pc3NpbmdUaGVtZWRQb3B1cERpYWxvZ1Rlc3RDZkFybS5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmZjMDVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9pbWUvU2hvd0ltZVdoaWxlRGlzbWlzc2luZ1RoZW1lZFBvcHVwRGlhbG9nVGVzdENmQXJtLmt0CkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLmltZQorCitpbXBvcnQgYW5kcm9pZC50b29scy5jb21tb24uUm90YXRpb24KK2ltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmp1bml0LkZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeQoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0CitpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlclRlc3RGYWN0b3J5CitpbXBvcnQgb3JnLmp1bml0LkZpeE1ldGhvZE9yZGVyCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuTWV0aG9kU29ydGVycworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQKKworQFJ1bldpdGgoUGFyYW1ldGVyaXplZDo6Y2xhc3MpCitAUGFyYW1ldGVyaXplZC5Vc2VQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeShGbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3Rvcnk6OmNsYXNzKQorQEZpeE1ldGhvZE9yZGVyKE1ldGhvZFNvcnRlcnMuTkFNRV9BU0NFTkRJTkcpCitjbGFzcyBTaG93SW1lV2hpbGVEaXNtaXNzaW5nVGhlbWVkUG9wdXBEaWFsb2dUZXN0Q2ZBcm0oZmxpY2tlcjogRmxpY2tlclRlc3QpIDoKKyAgICBTaG93SW1lV2hpbGVEaXNtaXNzaW5nVGhlbWVkUG9wdXBEaWFsb2dUZXN0KGZsaWNrZXIpIHsKKyAgICBjb21wYW5pb24gb2JqZWN0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgdGhlIHRlc3QgY29uZmlndXJhdGlvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIFNlZSBbRmxpY2tlclRlc3RGYWN0b3J5Lm5vblJvdGF0aW9uVGVzdHNdIGZvciBjb25maWd1cmluZyBzY3JlZW4gb3JpZW50YXRpb24gYW5kCisgICAgICAgICAqIG5hdmlnYXRpb24gbW9kZXMuCisgICAgICAgICAqLworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICAgICAgQEp2bVN0YXRpYworICAgICAgICBmdW4gZ2V0UGFyYW1zKCk6IENvbGxlY3Rpb248RmxpY2tlclRlc3Q+IHsKKyAgICAgICAgICAgIHJldHVybiBGbGlja2VyVGVzdEZhY3Rvcnkubm9uUm90YXRpb25UZXN0cygKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWRSb3RhdGlvbnMgPSBsaXN0T2YoUm90YXRpb24uUk9UQVRJT05fMCkKKyAgICAgICAgICAgICkKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2ltZS9TaG93SW1lT25TdGFydFdoZW5MYXVuY2hpbmdBcHBDZkFybVRlc3Qua3QgYi90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2xhdW5jaC9PcGVuQXBwQWZ0ZXJDYW1lcmFUZXN0Q2ZBcm0ua3QKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIHRlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvaW1lL1Nob3dJbWVPblN0YXJ0V2hlbkxhdW5jaGluZ0FwcENmQXJtVGVzdC5rdApjb3B5IHRvIHRlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBBZnRlckNhbWVyYVRlc3RDZkFybS5rdAppbmRleCAxOTRjODZiLi4zMjg5YmM2IDEwMDY0NAotLS0gYS90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2ltZS9TaG93SW1lT25TdGFydFdoZW5MYXVuY2hpbmdBcHBDZkFybVRlc3Qua3QKKysrIGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcEFmdGVyQ2FtZXJhVGVzdENmQXJtLmt0CkBAIC0xNCwxMCArMTQsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLndtLmZsaWNrZXIuaW1lCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLmxhdW5jaAogCiBpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5qdW5pdC5GbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3RvcnkKIGltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmxlZ2FjeS5GbGlja2VyVGVzdAoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0RmFjdG9yeQogaW1wb3J0IG9yZy5qdW5pdC5GaXhNZXRob2RPcmRlcgogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLk1ldGhvZFNvcnRlcnMKQEAgLTI2LDUgKzI3LDE4IEBACiBAUnVuV2l0aChQYXJhbWV0ZXJpemVkOjpjbGFzcykKIEBQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCiBARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKLWNsYXNzIFNob3dJbWVPblN0YXJ0V2hlbkxhdW5jaGluZ0FwcENmQXJtVGVzdChmbGlja2VyOiBGbGlja2VyVGVzdCkgOgotICAgIFNob3dJbWVPbkFwcFN0YXJ0V2hlbkxhdW5jaGluZ0FwcFRlc3QoZmxpY2tlcikKK2NsYXNzIE9wZW5BcHBBZnRlckNhbWVyYVRlc3RDZkFybShmbGlja2VyOiBGbGlja2VyVGVzdCkgOiBPcGVuQXBwQWZ0ZXJDYW1lcmFUZXN0KGZsaWNrZXIpIHsKKyAgICBjb21wYW5pb24gb2JqZWN0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgdGhlIHRlc3QgY29uZmlndXJhdGlvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIFNlZSBbRmxpY2tlclRlc3RGYWN0b3J5Lm5vblJvdGF0aW9uVGVzdHNdIGZvciBjb25maWd1cmluZyBzY3JlZW4gb3JpZW50YXRpb24gYW5kCisgICAgICAgICAqIG5hdmlnYXRpb24gbW9kZXMuCisgICAgICAgICAqLworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICAgICAgQEp2bVN0YXRpYworICAgICAgICBmdW4gZ2V0UGFyYW1zKCk6IENvbGxlY3Rpb248RmxpY2tlclRlc3Q+IHsKKyAgICAgICAgICAgIHJldHVybiBGbGlja2VyVGVzdEZhY3Rvcnkubm9uUm90YXRpb25UZXN0cygpCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcENvbGRGcm9tSWNvbkNmQXJtLmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcENvbGRGcm9tSWNvbkNmQXJtLmt0CmluZGV4IDQ2ODk5ZjMuLmNjYmU3NGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBDb2xkRnJvbUljb25DZkFybS5rdAorKysgYi90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2xhdW5jaC9PcGVuQXBwQ29sZEZyb21JY29uQ2ZBcm0ua3QKQEAgLTE2LDEyICsxNiwxNCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLmxhdW5jaAogCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkZsYWt5VGVzdAogaW1wb3J0IGFuZHJvaWQudG9vbHMuY29tbW9uLk5hdkJhcgogaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuYW5ub3RhdGlvbi5GbGlja2VyU2VydmljZUNvbXBhdGlibGUKIGltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmp1bml0LkZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeQogaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0CiBpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlclRlc3RGYWN0b3J5CiBpbXBvcnQgb3JnLmp1bml0LkZpeE1ldGhvZE9yZGVyCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGgKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5NZXRob2RTb3J0ZXJzCiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZApAQCAtMzIsNiArMzQsMTIgQEAKIEBQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCiBARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKIGNsYXNzIE9wZW5BcHBDb2xkRnJvbUljb25DZkFybShmbGlja2VyOiBGbGlja2VyVGVzdCkgOiBPcGVuQXBwQ29sZEZyb21JY29uKGZsaWNrZXIpIHsKKyAgICBAVGVzdAorICAgIEBGbGFreVRlc3QKKyAgICBvdmVycmlkZSBmdW4gdmlzaWJsZUxheWVyc1Nob3duTW9yZVRoYW5PbmVDb25zZWN1dGl2ZUVudHJ5KCkgeworICAgICAgICBzdXBlci52aXNpYmxlTGF5ZXJzU2hvd25Nb3JlVGhhbk9uZUNvbnNlY3V0aXZlRW50cnkoKQorICAgIH0KKwogICAgIGNvbXBhbmlvbiBvYmplY3QgewogICAgICAgICAvKioKICAgICAgICAgICogQ3JlYXRlcyB0aGUgdGVzdCBjb25maWd1cmF0aW9ucy4KQEAgLTQ0LDcgKzUyLDcgQEAKICAgICAgICAgZnVuIGdldFBhcmFtcygpOiBDb2xsZWN0aW9uPEZsaWNrZXJUZXN0PiB7CiAgICAgICAgICAgICAvLyBUQVBMIGZhaWxzIG9uIGxhbmRzY2FwZSBtb2RlIGIvMjQwOTE2MDI4CiAgICAgICAgICAgICByZXR1cm4gRmxpY2tlclRlc3RGYWN0b3J5Lm5vblJvdGF0aW9uVGVzdHMoCi0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZE5hdmlnYXRpb25Nb2RlcyA9IGxpc3RPZihOYXZCYXIuTU9ERV8zQlVUVE9OKQorICAgICAgICAgICAgICAgIHN1cHBvcnRlZE5hdmlnYXRpb25Nb2RlcyA9IGxpc3RPZihOYXZCYXIuTU9ERV8zQlVUVE9OKQogICAgICAgICAgICAgKQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcENvbGRUZXN0Lmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcENvbGRUZXN0Lmt0CmluZGV4IDhmZGJiNjQuLmQwZGM0MmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBDb2xkVGVzdC5rdAorKysgYi90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2xhdW5jaC9PcGVuQXBwQ29sZFRlc3Qua3QKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIud20uZmxpY2tlci5sYXVuY2gKIAoraW1wb3J0IGFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5Qb3N0c3VibWl0CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdAogaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuYW5ub3RhdGlvbi5GbGlja2VyU2VydmljZUNvbXBhdGlibGUKIGltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmp1bml0LkZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeQpAQCAtNzIsNiArNzMsMTAgQEAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIEBQcmVzdWJtaXQgQFRlc3Qgb3ZlcnJpZGUgZnVuIGFwcExheWVyUmVwbGFjZXNMYXVuY2hlcigpID0gc3VwZXIuYXBwTGF5ZXJSZXBsYWNlc0xhdW5jaGVyKCkKIAorICAgIEBQb3N0c3VibWl0CisgICAgQFRlc3QKKyAgICBvdmVycmlkZSBmdW4gbmF2QmFyTGF5ZXJQb3NpdGlvbkF0U3RhcnRBbmRFbmQoKSA9IHN1cGVyLm5hdkJhckxheWVyUG9zaXRpb25BdFN0YXJ0QW5kRW5kKCkKKwogICAgIGNvbXBhbmlvbiBvYmplY3QgewogICAgICAgICAvKioKICAgICAgICAgICogQ3JlYXRlcyB0aGUgdGVzdCBjb25maWd1cmF0aW9ucy4KZGlmZiAtLWdpdCBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBDb2xkVGVzdENmQXJtLmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcENvbGRUZXN0Q2ZBcm0ua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1ZDllZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBDb2xkVGVzdENmQXJtLmt0CkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLmxhdW5jaAorCitpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkZsYWt5VGVzdAoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuYW5ub3RhdGlvbi5GbGlja2VyU2VydmljZUNvbXBhdGlibGUKK2ltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmp1bml0LkZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeQoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIubGVnYWN5LkZsaWNrZXJUZXN0CitpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlclRlc3RGYWN0b3J5CitpbXBvcnQgb3JnLmp1bml0LkZpeE1ldGhvZE9yZGVyCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGgKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5NZXRob2RTb3J0ZXJzCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZAorCitARmxpY2tlclNlcnZpY2VDb21wYXRpYmxlCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkOjpjbGFzcykKK0BQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCitARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKK2NsYXNzIE9wZW5BcHBDb2xkVGVzdENmQXJtKGZsaWNrZXI6IEZsaWNrZXJUZXN0KSA6IE9wZW5BcHBDb2xkVGVzdChmbGlja2VyKSB7CisgICAgQEZsYWt5VGVzdChidWdJZCA9IDI3MzY5NjczMykKKyAgICBAVGVzdAorICAgIG92ZXJyaWRlIGZ1biBhcHBMYXllclJlcGxhY2VzTGF1bmNoZXIoKSA9IHN1cGVyLmFwcExheWVyUmVwbGFjZXNMYXVuY2hlcigpCisKKyAgICBjb21wYW5pb24gb2JqZWN0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgdGhlIHRlc3QgY29uZmlndXJhdGlvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIFNlZSBbRmxpY2tlclRlc3RGYWN0b3J5Lm5vblJvdGF0aW9uVGVzdHNdIGZvciBjb25maWd1cmluZyBzY3JlZW4gb3JpZW50YXRpb24gYW5kCisgICAgICAgICAqIG5hdmlnYXRpb24gbW9kZXMuCisgICAgICAgICAqLworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICAgICAgQEp2bVN0YXRpYworICAgICAgICBmdW4gZ2V0UGFyYW1zKCk6IENvbGxlY3Rpb248RmxpY2tlclRlc3Q+IHsKKyAgICAgICAgICAgIHJldHVybiBGbGlja2VyVGVzdEZhY3Rvcnkubm9uUm90YXRpb25UZXN0cygpCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcEZyb21Ob3RpZmljYXRpb25Db2xkQ2ZBcm0ua3QgYi90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL2xhdW5jaC9PcGVuQXBwRnJvbU5vdGlmaWNhdGlvbkNvbGRDZkFybS5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWE3OGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcEZyb21Ob3RpZmljYXRpb25Db2xkQ2ZBcm0ua3QKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLndtLmZsaWNrZXIubGF1bmNoCisKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUG9zdHN1Ym1pdAoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuanVuaXQuRmxpY2tlclBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5CitpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlclRlc3QKK2ltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmxlZ2FjeS5GbGlja2VyVGVzdEZhY3RvcnkKK2ltcG9ydCBvcmcuanVuaXQuRml4TWV0aG9kT3JkZXIKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGgKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5NZXRob2RTb3J0ZXJzCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZAorCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkOjpjbGFzcykKK0BQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCitARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKK0BQb3N0c3VibWl0CitjbGFzcyBPcGVuQXBwRnJvbU5vdGlmaWNhdGlvbkNvbGRDZkFybShmbGlja2VyOiBGbGlja2VyVGVzdCkgOgorICAgIE9wZW5BcHBGcm9tTm90aWZpY2F0aW9uQ29sZChmbGlja2VyKSB7CisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIHRoZSB0ZXN0IGNvbmZpZ3VyYXRpb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBTZWUgW0ZsaWNrZXJUZXN0RmFjdG9yeS5ub25Sb3RhdGlvblRlc3RzXSBmb3IgY29uZmlndXJpbmcgc2NyZWVuIG9yaWVudGF0aW9uIGFuZAorICAgICAgICAgKiBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAgICAgKi8KKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgICAgIEBKdm1TdGF0aWMKKyAgICAgICAgZnVuIGdldFBhcmFtcygpOiBDb2xsZWN0aW9uPEZsaWNrZXJUZXN0PiB7CisgICAgICAgICAgICByZXR1cm4gRmxpY2tlclRlc3RGYWN0b3J5Lm5vblJvdGF0aW9uVGVzdHMoKQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBXYXJtVGVzdENmQXJtLmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9sYXVuY2gvT3BlbkFwcFdhcm1UZXN0Q2ZBcm0ua3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3OTA1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvbGF1bmNoL09wZW5BcHBXYXJtVGVzdENmQXJtLmt0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLmxhdW5jaAorCitpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5hbm5vdGF0aW9uLkZsaWNrZXJTZXJ2aWNlQ29tcGF0aWJsZQoraW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuanVuaXQuRmxpY2tlclBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5CitpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlclRlc3QKK2ltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmxlZ2FjeS5GbGlja2VyVGVzdEZhY3RvcnkKK2ltcG9ydCBvcmcuanVuaXQuRml4TWV0aG9kT3JkZXIKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGgKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5NZXRob2RTb3J0ZXJzCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZAorCitARmxpY2tlclNlcnZpY2VDb21wYXRpYmxlCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkOjpjbGFzcykKK0BQYXJhbWV0ZXJpemVkLlVzZVBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5KEZsaWNrZXJQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeTo6Y2xhc3MpCitARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKK2NsYXNzIE9wZW5BcHBXYXJtVGVzdENmQXJtKGZsaWNrZXI6IEZsaWNrZXJUZXN0KSA6IE9wZW5BcHBXYXJtVGVzdChmbGlja2VyKSB7CisgICAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIHRoZSB0ZXN0IGNvbmZpZ3VyYXRpb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBTZWUgW0ZsaWNrZXJUZXN0RmFjdG9yeS5ub25Sb3RhdGlvblRlc3RzXSBmb3IgY29uZmlndXJpbmcgc2NyZWVuIG9yaWVudGF0aW9uIGFuZAorICAgICAgICAgKiBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAgICAgKi8KKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgICAgIEBKdm1TdGF0aWMKKyAgICAgICAgZnVuIGdldFBhcmFtcygpOiBDb2xsZWN0aW9uPEZsaWNrZXJUZXN0PiB7CisgICAgICAgICAgICByZXR1cm4gRmxpY2tlclRlc3RGYWN0b3J5Lm5vblJvdGF0aW9uVGVzdHMoKQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvcXVpY2tzd2l0Y2gvUXVpY2tTd2l0Y2hCZXR3ZWVuVHdvQXBwc0JhY2tUZXN0Lmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9xdWlja3N3aXRjaC9RdWlja1N3aXRjaEJldHdlZW5Ud29BcHBzQmFja1Rlc3Qua3QKaW5kZXggNzhjZWUzYy4uZWFkZWVmNSAxMDA2NDQKLS0tIGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9xdWlja3N3aXRjaC9RdWlja1N3aXRjaEJldHdlZW5Ud29BcHBzQmFja1Rlc3Qua3QKKysrIGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9xdWlja3N3aXRjaC9RdWlja1N3aXRjaEJldHdlZW5Ud29BcHBzQmFja1Rlc3Qua3QKQEAgLTE2LDExICsxNiwxMSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLnF1aWNrc3dpdGNoCiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuRmxha3lUZXN0CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdAogaW1wb3J0IGFuZHJvaWQudG9vbHMuY29tbW9uLk5hdkJhcgogaW1wb3J0IGFuZHJvaWQudG9vbHMuY29tbW9uLmRhdGF0eXBlcy5SZWN0CiBpbXBvcnQgYW5kcm9pZC50b29scy5jb21tb24uZGF0YXR5cGVzLmNvbXBvbmVudC5Db21wb25lbnROYW1lTWF0Y2hlcgotaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZAogaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuanVuaXQuRmxpY2tlclBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5CiBpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlckJ1aWxkZXIKIGltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmxlZ2FjeS5GbGlja2VyVGVzdApAQCAtMjksOSArMjksOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLkJhc2VUZXN0CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLmZsaWNrZXIuaGVscGVycy5Ob25SZXNpemVhYmxlQXBwSGVscGVyCiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLmZsaWNrZXIuaGVscGVycy5TaW1wbGVBcHBIZWxwZXIKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZQogaW1wb3J0IG9yZy5qdW5pdC5GaXhNZXRob2RPcmRlcgoraW1wb3J0IG9yZy5qdW5pdC5JZ25vcmUKIGltcG9ydCBvcmcuanVuaXQuVGVzdAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLk1ldGhvZFNvcnRlcnMKQEAgLTU3LDExICs1Niw2IEBACiAgICAgcHJpdmF0ZSB2YWwgdGVzdEFwcDEgPSBTaW1wbGVBcHBIZWxwZXIoaW5zdHJ1bWVudGF0aW9uKQogICAgIHByaXZhdGUgdmFsIHRlc3RBcHAyID0gTm9uUmVzaXplYWJsZUFwcEhlbHBlcihpbnN0cnVtZW50YXRpb24pCiAKLSAgICBAQmVmb3JlCi0gICAgb3BlbiBmdW4gYmVmb3JlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZCkKLSAgICB9Ci0KICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIG92ZXJyaWRlIHZhbCB0cmFuc2l0aW9uOiBGbGlja2VyQnVpbGRlci4oKSAtPiBVbml0ID0gewogICAgICAgICBzZXR1cCB7CkBAIC0xMDIsNyArOTYsNyBAQAogICAgICAqIENoZWNrcyB0aGF0IHRoZSB0cmFuc2l0aW9uIHN0YXJ0cyB3aXRoIFt0ZXN0QXBwMl0ncyBsYXllcnMgZmlsbGluZy9jb3ZlcmluZyBleGFjdGx5IHRoZQogICAgICAqIGVudGlyZXR5IG9mIHRoZSBkaXNwbGF5LgogICAgICAqLwotICAgIEBQcmVzdWJtaXQKKyAgICBARmxha3lUZXN0KGJ1Z0lkID0gMjUwNTIwODQwKQogICAgIEBUZXN0CiAgICAgb3BlbiBmdW4gc3RhcnRzV2l0aEFwcDJMYXllcnNDb3ZlckZ1bGxTY3JlZW4oKSB7CiAgICAgICAgIGZsaWNrZXIuYXNzZXJ0TGF5ZXJzU3RhcnQgeyB0aGlzLnZpc2libGVSZWdpb24odGVzdEFwcDIpLmNvdmVyc0V4YWN0bHkoc3RhcnREaXNwbGF5Qm91bmRzKSB9CkBAIC0yMzAsNiArMjI0LDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBJZ25vcmUoIk5hdiBiYXIgd2luZG93IGJlY29tZXMgaW52aXNpYmxlIGR1cmluZyBxdWljayBzd2l0Y2giKQorICAgIEBUZXN0CisgICAgb3ZlcnJpZGUgZnVuIG5hdkJhcldpbmRvd0lzQWx3YXlzVmlzaWJsZSgpID0gc3VwZXIubmF2QmFyV2luZG93SXNBbHdheXNWaXNpYmxlKCkKKworICAgIEBGbGFreVRlc3QoYnVnSWQgPSAyNDYyODQ3MDgpCisgICAgQFRlc3QKKyAgICBvdmVycmlkZSBmdW4gdmlzaWJsZUxheWVyc1Nob3duTW9yZVRoYW5PbmVDb25zZWN1dGl2ZUVudHJ5KCkgPQorICAgICAgICBzdXBlci52aXNpYmxlTGF5ZXJzU2hvd25Nb3JlVGhhbk9uZUNvbnNlY3V0aXZlRW50cnkoKQorCisgICAgQEZsYWt5VGVzdChidWdJZCA9IDI1MDUxODg3NykKKyAgICBAVGVzdAorICAgIG92ZXJyaWRlIGZ1biBuYXZCYXJMYXllclBvc2l0aW9uQXRTdGFydEFuZEVuZCgpID0gc3VwZXIubmF2QmFyTGF5ZXJQb3NpdGlvbkF0U3RhcnRBbmRFbmQoKQorCiAgICAgY29tcGFuaW9uIG9iamVjdCB7CiAgICAgICAgIHByaXZhdGUgdmFyIHN0YXJ0RGlzcGxheUJvdW5kcyA9IFJlY3QuRU1QVFkKIApkaWZmIC0tZ2l0IGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9xdWlja3N3aXRjaC9RdWlja1N3aXRjaEJldHdlZW5Ud29BcHBzQmFja1Rlc3RfU2hlbGxUcmFuc2l0Lmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9xdWlja3N3aXRjaC9RdWlja1N3aXRjaEJldHdlZW5Ud29BcHBzQmFja1Rlc3RfU2hlbGxUcmFuc2l0Lmt0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjY5ZTliLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvcXVpY2tzd2l0Y2gvUXVpY2tTd2l0Y2hCZXR3ZWVuVHdvQXBwc0JhY2tUZXN0X1NoZWxsVHJhbnNpdC5rdAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLnF1aWNrc3dpdGNoCi0KLWltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuRmxha3lUZXN0Ci1pbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5pc1NoZWxsVHJhbnNpdGlvbnNFbmFibGVkCi1pbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5qdW5pdC5GbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3RvcnkKLWltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmxlZ2FjeS5GbGlja2VyVGVzdAotaW1wb3J0IGFuZHJvaWR4LnRlc3QuZmlsdGVycy5SZXF1aXJlc0RldmljZQotaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWUKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlCi1pbXBvcnQgb3JnLmp1bml0LkZpeE1ldGhvZE9yZGVyCi1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoCi1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuTWV0aG9kU29ydGVycwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQKLQotLyoqCi0gKiBUZXN0IHF1aWNrIHN3aXRjaGluZyBiYWNrIHRvIHByZXZpb3VzIGFwcCBmcm9tIGxhc3Qgb3BlbmVkIGFwcAotICoKLSAqIFRvIHJ1biB0aGlzIHRlc3Q6IGBhdGVzdCBGbGlja2VyVGVzdHM6UXVpY2tTd2l0Y2hCZXR3ZWVuVHdvQXBwc0JhY2tUZXN0YAotICoKLSAqIEFjdGlvbnM6Ci0gKiBgYGAKLSAqICAgICBMYXVuY2ggYW4gYXBwIFt0ZXN0QXBwMV0KLSAqICAgICBMYXVuY2ggYW5vdGhlciBhcHAgW3Rlc3RBcHAyXQotICogICAgIFN3aXBlIHJpZ2h0IGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIHRvIHF1aWNrIHN3aXRjaCBiYWNrIHRvIHRoZSBmaXJzdCBhcHAgW3Rlc3RBcHAxXQotICogYGBgCi0gKi8KLUBSZXF1aXJlc0RldmljZQotQFJ1bldpdGgoUGFyYW1ldGVyaXplZDo6Y2xhc3MpCi1AUGFyYW1ldGVyaXplZC5Vc2VQYXJhbWV0ZXJzUnVubmVyRmFjdG9yeShGbGlja2VyUGFyYW1ldGVyc1J1bm5lckZhY3Rvcnk6OmNsYXNzKQotQEZpeE1ldGhvZE9yZGVyKE1ldGhvZFNvcnRlcnMuTkFNRV9BU0NFTkRJTkcpCi1vcGVuIGNsYXNzIFF1aWNrU3dpdGNoQmV0d2VlblR3b0FwcHNCYWNrVGVzdF9TaGVsbFRyYW5zaXQoZmxpY2tlcjogRmxpY2tlclRlc3QpIDoKLSAgICBRdWlja1N3aXRjaEJldHdlZW5Ud29BcHBzQmFja1Rlc3QoZmxpY2tlcikgewotICAgIEBCZWZvcmUKLSAgICBvdmVycmlkZSBmdW4gYmVmb3JlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShpc1NoZWxsVHJhbnNpdGlvbnNFbmFibGVkKQotICAgIH0KLQotICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgQElnbm9yZSgiTmF2IGJhciB3aW5kb3cgYmVjb21lcyBpbnZpc2libGUgZHVyaW5nIHF1aWNrIHN3aXRjaCIpCi0gICAgQFRlc3QKLSAgICBvdmVycmlkZSBmdW4gbmF2QmFyV2luZG93SXNBbHdheXNWaXNpYmxlKCkgPSBzdXBlci5uYXZCYXJXaW5kb3dJc0Fsd2F5c1Zpc2libGUoKQotCi0gICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBARmxha3lUZXN0KGJ1Z0lkID0gMjUwNTIwODQwKQotICAgIEBUZXN0Ci0gICAgb3ZlcnJpZGUgZnVuIHN0YXJ0c1dpdGhBcHAyTGF5ZXJzQ292ZXJGdWxsU2NyZWVuKCkgPSBzdXBlci5zdGFydHNXaXRoQXBwMkxheWVyc0NvdmVyRnVsbFNjcmVlbigpCi0KLSAgICBARmxha3lUZXN0KGJ1Z0lkID0gMjQ2Mjg0NzA4KQotICAgIEBUZXN0Ci0gICAgb3ZlcnJpZGUgZnVuIHZpc2libGVMYXllcnNTaG93bk1vcmVUaGFuT25lQ29uc2VjdXRpdmVFbnRyeSgpID0KLSAgICAgICAgc3VwZXIudmlzaWJsZUxheWVyc1Nob3duTW9yZVRoYW5PbmVDb25zZWN1dGl2ZUVudHJ5KCkKLQotICAgIEBGbGFreVRlc3QoYnVnSWQgPSAyNTA1MTg4NzcpCi0gICAgQFRlc3QKLSAgICBvdmVycmlkZSBmdW4gbmF2QmFyTGF5ZXJQb3NpdGlvbkF0U3RhcnRBbmRFbmQoKSA9IHN1cGVyLm5hdkJhckxheWVyUG9zaXRpb25BdFN0YXJ0QW5kRW5kKCkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvcXVpY2tzd2l0Y2gvUXVpY2tTd2l0Y2hCZXR3ZWVuVHdvQXBwc0ZvcndhcmRUZXN0Lmt0IGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9xdWlja3N3aXRjaC9RdWlja1N3aXRjaEJldHdlZW5Ud29BcHBzRm9yd2FyZFRlc3Qua3QKaW5kZXggY2Q3ZDZmYS4uMTM2MDQ5NSAxMDA2NDQKLS0tIGEvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9xdWlja3N3aXRjaC9RdWlja1N3aXRjaEJldHdlZW5Ud29BcHBzRm9yd2FyZFRlc3Qua3QKKysrIGIvdGVzdHMvRmxpY2tlclRlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vZmxpY2tlci9xdWlja3N3aXRjaC9RdWlja1N3aXRjaEJldHdlZW5Ud29BcHBzRm9yd2FyZFRlc3Qua3QKQEAgLTE2LDExICsxNiwxMSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLnF1aWNrc3dpdGNoCiAKK2ltcG9ydCBhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuRmxha3lUZXN0CiBpbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlByZXN1Ym1pdAogaW1wb3J0IGFuZHJvaWQudG9vbHMuY29tbW9uLk5hdkJhcgogaW1wb3J0IGFuZHJvaWQudG9vbHMuY29tbW9uLmRhdGF0eXBlcy5SZWN0CiBpbXBvcnQgYW5kcm9pZC50b29scy5jb21tb24uZGF0YXR5cGVzLmNvbXBvbmVudC5Db21wb25lbnROYW1lTWF0Y2hlcgotaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZAogaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuanVuaXQuRmxpY2tlclBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5CiBpbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlckJ1aWxkZXIKIGltcG9ydCBhbmRyb2lkLnRvb2xzLmRldmljZS5mbGlja2VyLmxlZ2FjeS5GbGlja2VyVGVzdApAQCAtMjksOSArMjksOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5mbGlja2VyLkJhc2VUZXN0CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLmZsaWNrZXIuaGVscGVycy5Ob25SZXNpemVhYmxlQXBwSGVscGVyCiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLmZsaWNrZXIuaGVscGVycy5TaW1wbGVBcHBIZWxwZXIKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZQogaW1wb3J0IG9yZy5qdW5pdC5GaXhNZXRob2RPcmRlcgoraW1wb3J0IG9yZy5qdW5pdC5JZ25vcmUKIGltcG9ydCBvcmcuanVuaXQuVGVzdAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLk1ldGhvZFNvcnRlcnMKQEAgLTU4LDExICs1Nyw2IEBACiAgICAgcHJpdmF0ZSB2YWwgdGVzdEFwcDEgPSBTaW1wbGVBcHBIZWxwZXIoaW5zdHJ1bWVudGF0aW9uKQogICAgIHByaXZhdGUgdmFsIHRlc3RBcHAyID0gTm9uUmVzaXplYWJsZUFwcEhlbHBlcihpbnN0cnVtZW50YXRpb24pCiAKLSAgICBAQmVmb3JlCi0gICAgb3BlbiBmdW4gYmVmb3JlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZCkKLSAgICB9Ci0KICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIG92ZXJyaWRlIHZhbCB0cmFuc2l0aW9uOiBGbGlja2VyQnVpbGRlci4oKSAtPiBVbml0ID0gewogICAgICAgICBzZXR1cCB7CkBAIC0xMTMsNyArMTA3LDcgQEAKICAgICAgKiBDaGVja3MgdGhhdCB0aGUgdHJhbnNpdGlvbiBzdGFydHMgd2l0aCBbdGVzdEFwcDFdJ3MgbGF5ZXJzIGZpbGxpbmcvY292ZXJpbmcgZXhhY3RseSB0aGUKICAgICAgKiBlbnRpcmV0eSBvZiB0aGUgZGlzcGxheS4KICAgICAgKi8KLSAgICBAUHJlc3VibWl0CisgICAgQEZsYWt5VGVzdChidWdJZCA9IDI1MDUyMjY5MSkKICAgICBAVGVzdAogICAgIG9wZW4gZnVuIHN0YXJ0c1dpdGhBcHAxTGF5ZXJzQ292ZXJGdWxsU2NyZWVuKCkgewogICAgICAgICBmbGlja2VyLmFzc2VydExheWVyc1N0YXJ0IHsgdGhpcy52aXNpYmxlUmVnaW9uKHRlc3RBcHAxKS5jb3ZlcnNFeGFjdGx5KHN0YXJ0RGlzcGxheUJvdW5kcykgfQpAQCAtMjQ4LDYgKzI0MiwyMCBAQAogICAgIEBUZXN0CiAgICAgb3ZlcnJpZGUgZnVuIHRhc2tCYXJMYXllcklzVmlzaWJsZUF0U3RhcnRBbmRFbmQoKSA9IHN1cGVyLnRhc2tCYXJMYXllcklzVmlzaWJsZUF0U3RhcnRBbmRFbmQoKQogCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBASWdub3JlKCJOYXYgYmFyIHdpbmRvdyBiZWNvbWVzIGludmlzaWJsZSBkdXJpbmcgcXVpY2sgc3dpdGNoIikKKyAgICBAVGVzdAorICAgIG92ZXJyaWRlIGZ1biBuYXZCYXJXaW5kb3dJc0Fsd2F5c1Zpc2libGUoKSA9IHN1cGVyLm5hdkJhcldpbmRvd0lzQWx3YXlzVmlzaWJsZSgpCisKKyAgICBARmxha3lUZXN0KGJ1Z0lkID0gMjQ2Mjg0NzA4KQorICAgIEBUZXN0CisgICAgb3ZlcnJpZGUgZnVuIHZpc2libGVMYXllcnNTaG93bk1vcmVUaGFuT25lQ29uc2VjdXRpdmVFbnRyeSgpID0KKyAgICAgICAgc3VwZXIudmlzaWJsZUxheWVyc1Nob3duTW9yZVRoYW5PbmVDb25zZWN1dGl2ZUVudHJ5KCkKKworICAgIEBGbGFreVRlc3QoYnVnSWQgPSAyNTA1MTg4NzcpCisgICAgQFRlc3QKKyAgICBvdmVycmlkZSBmdW4gbmF2QmFyTGF5ZXJQb3NpdGlvbkF0U3RhcnRBbmRFbmQoKSA9IHN1cGVyLm5hdkJhckxheWVyUG9zaXRpb25BdFN0YXJ0QW5kRW5kKCkKKwogICAgIGNvbXBhbmlvbiBvYmplY3QgewogICAgICAgICBwcml2YXRlIHZhciBzdGFydERpc3BsYXlCb3VuZHMgPSBSZWN0LkVNUFRZCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvcXVpY2tzd2l0Y2gvUXVpY2tTd2l0Y2hCZXR3ZWVuVHdvQXBwc0ZvcndhcmRUZXN0X1NoZWxsVHJhbnNpdC5rdCBiL3Rlc3RzL0ZsaWNrZXJUZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL3dtL2ZsaWNrZXIvcXVpY2tzd2l0Y2gvUXVpY2tTd2l0Y2hCZXR3ZWVuVHdvQXBwc0ZvcndhcmRUZXN0X1NoZWxsVHJhbnNpdC5rdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkNGUyNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9GbGlja2VyVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci93bS9mbGlja2VyL3F1aWNrc3dpdGNoL1F1aWNrU3dpdGNoQmV0d2VlblR3b0FwcHNGb3J3YXJkVGVzdF9TaGVsbFRyYW5zaXQua3QKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIud20uZmxpY2tlci5xdWlja3N3aXRjaAotCi1pbXBvcnQgYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLkZsYWt5VGVzdAotaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZAotaW1wb3J0IGFuZHJvaWQudG9vbHMuZGV2aWNlLmZsaWNrZXIuanVuaXQuRmxpY2tlclBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5Ci1pbXBvcnQgYW5kcm9pZC50b29scy5kZXZpY2UuZmxpY2tlci5sZWdhY3kuRmxpY2tlclRlc3QKLWltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuUmVxdWlyZXNEZXZpY2UKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZQotaW1wb3J0IG9yZy5qdW5pdC5GaXhNZXRob2RPcmRlcgotaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmUKLWltcG9ydCBvcmcuanVuaXQuVGVzdAotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aAotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLk1ldGhvZFNvcnRlcnMKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkCi0KLS8qKgotICogVGVzdCBxdWljayBzd2l0Y2hpbmcgYmFjayB0byBwcmV2aW91cyBhcHAgZnJvbSBsYXN0IG9wZW5lZCBhcHAKLSAqCi0gKiBUbyBydW4gdGhpcyB0ZXN0OiBgYXRlc3QgRmxpY2tlclRlc3RzOlF1aWNrU3dpdGNoQmV0d2VlblR3b0FwcHNGb3J3YXJkVGVzdGAKLSAqCi0gKiBBY3Rpb25zOgotICogYGBgCi0gKiAgICAgTGF1bmNoIGFuIGFwcCBbdGVzdEFwcDFdCi0gKiAgICAgTGF1bmNoIGFub3RoZXIgYXBwIFt0ZXN0QXBwMl0KLSAqICAgICBTd2lwZSByaWdodCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiB0byBxdWljayBzd2l0Y2ggYmFjayB0byB0aGUgZmlyc3QgYXBwIFt0ZXN0QXBwMV0KLSAqICAgICBTd2lwZSBsZWZ0IGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIHRvIHF1aWNrIHN3aXRjaCBmb3J3YXJkIHRvIHRoZSBzZWNvbmQgYXBwIFt0ZXN0QXBwMl0KLSAqIGBgYAotICovCi1AUmVxdWlyZXNEZXZpY2UKLUBSdW5XaXRoKFBhcmFtZXRlcml6ZWQ6OmNsYXNzKQotQFBhcmFtZXRlcml6ZWQuVXNlUGFyYW1ldGVyc1J1bm5lckZhY3RvcnkoRmxpY2tlclBhcmFtZXRlcnNSdW5uZXJGYWN0b3J5OjpjbGFzcykKLUBGaXhNZXRob2RPcmRlcihNZXRob2RTb3J0ZXJzLk5BTUVfQVNDRU5ESU5HKQotb3BlbiBjbGFzcyBRdWlja1N3aXRjaEJldHdlZW5Ud29BcHBzRm9yd2FyZFRlc3RfU2hlbGxUcmFuc2l0KGZsaWNrZXI6IEZsaWNrZXJUZXN0KSA6Ci0gICAgUXVpY2tTd2l0Y2hCZXR3ZWVuVHdvQXBwc0ZvcndhcmRUZXN0KGZsaWNrZXIpIHsKLSAgICBAQmVmb3JlCi0gICAgb3ZlcnJpZGUgZnVuIGJlZm9yZSgpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoaXNTaGVsbFRyYW5zaXRpb25zRW5hYmxlZCkKLSAgICB9Ci0KLSAgICAvKioge0Bpbmhlcml0RG9jfSAqLwotICAgIEBJZ25vcmUoIk5hdiBiYXIgd2luZG93IGJlY29tZXMgaW52aXNpYmxlIGR1cmluZyBxdWljayBzd2l0Y2giKQotICAgIEBUZXN0Ci0gICAgb3ZlcnJpZGUgZnVuIG5hdkJhcldpbmRvd0lzQWx3YXlzVmlzaWJsZSgpID0gc3VwZXIubmF2QmFyV2luZG93SXNBbHdheXNWaXNpYmxlKCkKLQotICAgIEBGbGFreVRlc3QoYnVnSWQgPSAyNDYyODQ3MDgpCi0gICAgQFRlc3QKLSAgICBvdmVycmlkZSBmdW4gdmlzaWJsZUxheWVyc1Nob3duTW9yZVRoYW5PbmVDb25zZWN1dGl2ZUVudHJ5KCkgPQotICAgICAgICBzdXBlci52aXNpYmxlTGF5ZXJzU2hvd25Nb3JlVGhhbk9uZUNvbnNlY3V0aXZlRW50cnkoKQotCi0gICAgQEZsYWt5VGVzdChidWdJZCA9IDI1MDUxODg3NykKLSAgICBAVGVzdAotICAgIG92ZXJyaWRlIGZ1biBuYXZCYXJMYXllclBvc2l0aW9uQXRTdGFydEFuZEVuZCgpID0gc3VwZXIubmF2QmFyTGF5ZXJQb3NpdGlvbkF0U3RhcnRBbmRFbmQoKQotCi0gICAgQEZsYWt5VGVzdChidWdJZCA9IDI1MDUyMjY5MSkKLSAgICBAVGVzdAotICAgIG92ZXJyaWRlIGZ1biBzdGFydHNXaXRoQXBwMUxheWVyc0NvdmVyRnVsbFNjcmVlbigpID0gc3VwZXIuc3RhcnRzV2l0aEFwcDFMYXllcnNDb3ZlckZ1bGxTY3JlZW4oKQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSW5wdXQvQW5kcm9pZC5icCBiL3Rlc3RzL0lucHV0L0FuZHJvaWQuYnAKaW5kZXggODM4OTNiYS4uYTRjNDhmZCAxMDA2NDQKLS0tIGEvdGVzdHMvSW5wdXQvQW5kcm9pZC5icAorKysgYi90ZXN0cy9JbnB1dC9BbmRyb2lkLmJwCkBAIC0xMyw2ICsxMyw5IEBACiAgICAgICAgICJzcmMvKiovKi5qYXZhIiwKICAgICAgICAgInNyYy8qKi8qLmt0IiwKICAgICBdLAorICAgIGtvdGxpbmNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKICAgICBwbGF0Zm9ybV9hcGlzOiB0cnVlLAogICAgIGNlcnRpZmljYXRlOiAicGxhdGZvcm0iLAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS90ZXN0cy9JbnB1dC9zcmMvY29tL2FuZHJvaWQvdGVzdC9pbnB1dC9BbnJUZXN0Lmt0IGIvdGVzdHMvSW5wdXQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaW5wdXQvQW5yVGVzdC5rdAppbmRleCAxZDY1Y2MzLi4wMjQ2NDI2IDEwMDY0NAotLS0gYS90ZXN0cy9JbnB1dC9zcmMvY29tL2FuZHJvaWQvdGVzdC9pbnB1dC9BbnJUZXN0Lmt0CisrKyBiL3Rlc3RzL0lucHV0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2lucHV0L0FuclRlc3Qua3QKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgdmFsIGNvbnRlbnRSZXNvbHZlciA9IGluc3RydW1lbnRhdGlvbi50YXJnZXRDb250ZXh0LmNvbnRlbnRSZXNvbHZlcgogICAgICAgICBoaWRlRXJyb3JEaWFsb2dzID0gU2V0dGluZ3MuR2xvYmFsLmdldEludChjb250ZW50UmVzb2x2ZXIsIEhJREVfRVJST1JfRElBTE9HUywgMCkKICAgICAgICAgU2V0dGluZ3MuR2xvYmFsLnB1dEludChjb250ZW50UmVzb2x2ZXIsIEhJREVfRVJST1JfRElBTE9HUywgMCkKLSAgICAgICAgUEFDS0FHRV9OQU1FID0gVW5yZXNwb25zaXZlR2VzdHVyZU1vbml0b3JBY3Rpdml0eTo6Y2xhc3MuamF2YS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpCisgICAgICAgIFBBQ0tBR0VfTkFNRSA9IFVucmVzcG9uc2l2ZUdlc3R1cmVNb25pdG9yQWN0aXZpdHk6OmNsYXNzLmphdmEuZ2V0UGFja2FnZSgpISEuZ2V0TmFtZSgpCiAgICAgfQogCiAgICAgQEFmdGVyCmRpZmYgLS1naXQgYS90ZXN0cy9JbnB1dC9zcmMvY29tL2FuZHJvaWQvdGVzdC9pbnB1dC9VbnJlc3BvbnNpdmVHZXN0dXJlTW9uaXRvckFjdGl2aXR5Lmt0IGIvdGVzdHMvSW5wdXQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaW5wdXQvVW5yZXNwb25zaXZlR2VzdHVyZU1vbml0b3JBY3Rpdml0eS5rdAppbmRleCBkODNhNDU3Li4zYTI0NDA2IDEwMDY0NAotLS0gYS90ZXN0cy9JbnB1dC9zcmMvY29tL2FuZHJvaWQvdGVzdC9pbnB1dC9VbnJlc3BvbnNpdmVHZXN0dXJlTW9uaXRvckFjdGl2aXR5Lmt0CisrKyBiL3Rlc3RzL0lucHV0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2lucHV0L1VucmVzcG9uc2l2ZUdlc3R1cmVNb25pdG9yQWN0aXZpdHkua3QKQEAgLTQ1LDcgKzQ1LDggQEAKICAgICBwcml2YXRlIGxhdGVpbml0IHZhciBtSW5wdXRNb25pdG9yOiBJbnB1dE1vbml0b3IKICAgICBvdmVycmlkZSBmdW4gb25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlOiBCdW5kbGU/KSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSkKLSAgICAgICAgbUlucHV0TW9uaXRvciA9IElucHV0TWFuYWdlci5nZXRJbnN0YW5jZSgpLm1vbml0b3JHZXN0dXJlSW5wdXQoTU9OSVRPUl9OQU1FLCBkaXNwbGF5SWQpCisgICAgICAgIHZhbCBpbnB1dE1hbmFnZXIgPSBnZXRTeXN0ZW1TZXJ2aWNlKElucHV0TWFuYWdlcjo6Y2xhc3MuamF2YSkKKyAgICAgICAgbUlucHV0TW9uaXRvciA9IGlucHV0TWFuYWdlci5tb25pdG9yR2VzdHVyZUlucHV0KE1PTklUT1JfTkFNRSwgZGlzcGxheUlkKQogICAgICAgICBtSW5wdXRFdmVudFJlY2VpdmVyID0gVW5yZXNwb25zaXZlUmVjZWl2ZXIoCiAgICAgICAgICAgICAgICAgbUlucHV0TW9uaXRvci5nZXRJbnB1dENoYW5uZWwoKSwgTG9vcGVyLm15TG9vcGVyKCkpCiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSW50ZXJuYWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVTdG9yZVRlc3QuamF2YSBiL3Rlc3RzL0ludGVybmFsL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlU3RvcmVUZXN0LmphdmEKaW5kZXggZTcwNGNjMi4uNDZlYmZlZCAxMDA2NDQKLS0tIGEvdGVzdHMvSW50ZXJuYWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVTdG9yZVRlc3QuamF2YQorKysgYi90ZXN0cy9JbnRlcm5hbC9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0xvY2FsZVN0b3JlVGVzdC5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSWxsZm9ybWVkTG9jYWxlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CkBAIC0xNDEsMTQgKzE0MiwxMTggQEAKIAogICAgICAgICBIYXNoTWFwPFN0cmluZywgTG9jYWxlSW5mbz4gcmVzdWx0ID0KICAgICAgICAgICAgICAgICBMb2NhbGVTdG9yZS5jb252ZXJ0RXhwbGljaXRMb2NhbGVzKGxvY2FsZXMsIHN1cHBvcnRlZExvY2FsZSk7Ci0KICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbiIsIHJlc3VsdC5nZXQoImVuIikuZ2V0SWQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZW4tVVMiLCByZXN1bHQuZ2V0KCJlbi1VUyIpLmdldElkKCkpOwogICAgICAgICBhc3NlcnROdWxsKHJlc3VsdC5nZXQoImVuLUxhdG4tVVMiKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRMZXZlbExvY2FsZXNfbGFuZ3VhZ2VUaWVyX3JldHVybkFsbFN1cHBvcnRMYW5ndWFnZXMoKSB7CisgICAgICAgIExvY2FsZUxpc3QgdGVzdFN1cHBvcnRlZExvY2FsZXMgPQorICAgICAgICAgICAgICAgIExvY2FsZUxpc3QuZm9yTGFuZ3VhZ2VUYWdzKAorICAgICAgICAgICAgICAgICAgICAgICAgImVuLVVTLHpoLUhhbnQtVFcsamEtSlAsZW4tR0IsYm4tSU4tdS1udS1hcmFiLGtzLUFyYWItSU4sYm4tSU4iKTsKKworICAgICAgICBTZXQ8U3RyaW5nPiBpZ25vcmFibGVMb2NhbGVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBpZ25vcmFibGVMb2NhbGVzLmFkZCgiemgtSGFudC1ISyIpOworICAgICAgICBMb2NhbGVJbmZvIHBhcmVudCA9IG51bGw7CisKKyAgICAgICAgU2V0PExvY2FsZUluZm8+IGxvY2FsZUluZm9zID0gTG9jYWxlU3RvcmUuZ2V0TGV2ZWxMb2NhbGVzKAorICAgICAgICAgICAgICAgIG51bGwsIGlnbm9yYWJsZUxvY2FsZXMsIHBhcmVudCwgZmFsc2UsIHRlc3RTdXBwb3J0ZWRMb2NhbGVzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbG9jYWxlSW5mb3Muc2l6ZSgpKTsKKyAgICAgICAgbG9jYWxlSW5mb3MuZm9yRWFjaChsb2NhbGVJbmZvIC0+IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobG9jYWxlSW5mby5nZXRMb2NhbGUoKS5nZXRDb3VudHJ5KCkuaXNFbXB0eSgpKTsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydFRydWUobG9jYWxlSW5mb3Muc3RyZWFtKCkuYW55TWF0Y2goCisgICAgICAgICAgICAgICAgaW5mbyAtPiBpbmZvLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKS5lcXVhbHMoImVuIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbGVJbmZvcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBpbmZvIC0+IGluZm8uZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLmVxdWFscygiemgtSGFudCIpKSk7CisgICAgICAgIGFzc2VydFRydWUobG9jYWxlSW5mb3Muc3RyZWFtKCkuYW55TWF0Y2goCisgICAgICAgICAgICAgICAgaW5mbyAtPiBpbmZvLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKS5lcXVhbHMoImphIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbGVJbmZvcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBpbmZvIC0+IGluZm8uZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLmVxdWFscygiYm4iKSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvY2FsZUluZm9zLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGluZm8gLT4gaW5mby5nZXRMb2NhbGUoKS50b0xhbmd1YWdlVGFnKCkuZXF1YWxzKCJrcy1BcmFiIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldExldmVsTG9jYWxlc19yZWdpb25UaWVyQW5kUGFyZW50SXNFbl9yZXR1cm5FbkxvY2FsZXMoKSB7CisgICAgICAgIExvY2FsZUxpc3QgdGVzdFN1cHBvcnRlZExvY2FsZXMgPQorICAgICAgICAgICAgICAgIExvY2FsZUxpc3QuZm9yTGFuZ3VhZ2VUYWdzKAorICAgICAgICAgICAgICAgICAgICAgICAgImVuLVVTLGVuLUdCLGJuLUlOLXUtbnUtYXJhYixrcy1BcmFiLUlOLGVuLVpBLGJuLUlOIik7CisgICAgICAgIFNldDxTdHJpbmc+IGlnbm9yYWJsZUxvY2FsZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGlnbm9yYWJsZUxvY2FsZXMuYWRkKCJ6aC1IYW50LUhLIik7CisgICAgICAgIExvY2FsZUluZm8gcGFyZW50ID0gTG9jYWxlU3RvcmUuZnJvbUxvY2FsZShMb2NhbGUuZm9yTGFuZ3VhZ2VUYWcoImVuIikpOworCisgICAgICAgIFNldDxMb2NhbGVJbmZvPiBsb2NhbGVJbmZvcyA9IExvY2FsZVN0b3JlLmdldExldmVsTG9jYWxlcygKKyAgICAgICAgICAgICAgICBudWxsLCBpZ25vcmFibGVMb2NhbGVzLCBwYXJlbnQsIGZhbHNlLCB0ZXN0U3VwcG9ydGVkTG9jYWxlcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGxvY2FsZUluZm9zLnNpemUoKSk7CisgICAgICAgIGxvY2FsZUluZm9zLmZvckVhY2gobG9jYWxlSW5mbyAtPiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgbG9jYWxlSW5mby5nZXRMb2NhbGUoKS5nZXRMYW5ndWFnZSgpKTsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydFRydWUobG9jYWxlSW5mb3Muc3RyZWFtKCkuYW55TWF0Y2goCisgICAgICAgICAgICAgICAgaW5mbyAtPiBpbmZvLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKS5lcXVhbHMoImVuLVVTIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbGVJbmZvcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBpbmZvIC0+IGluZm8uZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLmVxdWFscygiZW4tR0IiKSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvY2FsZUluZm9zLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGluZm8gLT4gaW5mby5nZXRMb2NhbGUoKS50b0xhbmd1YWdlVGFnKCkuZXF1YWxzKCJlbi1aQSIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRMZXZlbExvY2FsZXNfbnVtYmVyaW5nVGllckFuZFBhcmVudElzQm5Jbl9yZXR1cm5CbkluTG9jYWxlcygpIHsKKyAgICAgICAgTG9jYWxlTGlzdCB0ZXN0U3VwcG9ydGVkTG9jYWxlcyA9CisgICAgICAgICAgICAgICAgTG9jYWxlTGlzdC5mb3JMYW5ndWFnZVRhZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAiZW4tVVMsemgtSGFudC1UVyxibi1JTi11LW51LWFyYWIsa3MtQXJhYi1JTixlbi1aQSxibi1JTixibi1JTi11LW51LWFkbG0iKTsKKyAgICAgICAgU2V0PFN0cmluZz4gaWdub3JhYmxlTG9jYWxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgaWdub3JhYmxlTG9jYWxlcy5hZGQoInpoLUhhbnQtSEsiKTsKKyAgICAgICAgTG9jYWxlSW5mbyBwYXJlbnQgPSBMb2NhbGVTdG9yZS5mcm9tTG9jYWxlKExvY2FsZS5mb3JMYW5ndWFnZVRhZygiYm4iKSk7CisKKyAgICAgICAgU2V0PExvY2FsZUluZm8+IGxvY2FsZUluZm9zID0gTG9jYWxlU3RvcmUuZ2V0TGV2ZWxMb2NhbGVzKAorICAgICAgICAgICAgICAgIG51bGwsIGlnbm9yYWJsZUxvY2FsZXMsIHBhcmVudCwgZmFsc2UsIHRlc3RTdXBwb3J0ZWRMb2NhbGVzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbG9jYWxlSW5mb3Muc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJibi1JTiIsIGxvY2FsZUluZm9zLml0ZXJhdG9yKCkubmV4dCgpLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRMZXZlbExvY2FsZXNfcmVnaW9uVGllckFuZFBhcmVudElzQm5JbkFuZElnbm9yZUJuX3JldHVybkVtcHR5KCkgeworICAgICAgICBMb2NhbGVMaXN0IHRlc3RTdXBwb3J0ZWRMb2NhbGVzID0KKyAgICAgICAgICAgICAgICBMb2NhbGVMaXN0LmZvckxhbmd1YWdlVGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbi1VUyx6aC1IYW50LVRXLGJuLUlOLXUtbnUtYXJhYixrcy1BcmFiLUlOLGVuLVpBLGJuLUlOLGJuLUlOLXUtbnUtYWRsbSIpOworICAgICAgICBTZXQ8U3RyaW5nPiBpZ25vcmFibGVMb2NhbGVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBpZ25vcmFibGVMb2NhbGVzLmFkZCgiYm4tSU4iKTsKKyAgICAgICAgTG9jYWxlSW5mbyBwYXJlbnQgPSBMb2NhbGVTdG9yZS5mcm9tTG9jYWxlKExvY2FsZS5mb3JMYW5ndWFnZVRhZygiYm4tSU4iKSk7CisKKyAgICAgICAgU2V0PExvY2FsZUluZm8+IGxvY2FsZUluZm9zID0gTG9jYWxlU3RvcmUuZ2V0TGV2ZWxMb2NhbGVzKAorICAgICAgICAgICAgICAgIG51bGwsIGlnbm9yYWJsZUxvY2FsZXMsIHBhcmVudCwgZmFsc2UsIHRlc3RTdXBwb3J0ZWRMb2NhbGVzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbG9jYWxlSW5mb3Muc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldExldmVsTG9jYWxlc19yZWdpb25UaWVyQW5kUGFyZW50SXNCbkluX3JldHVybkJuTG9jYWxlRmFtaWx5KCkgeworICAgICAgICBMb2NhbGVMaXN0IHRlc3RTdXBwb3J0ZWRMb2NhbGVzID0KKyAgICAgICAgICAgICAgICBMb2NhbGVMaXN0LmZvckxhbmd1YWdlVGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbi1VUyx6aC1IYW50LVRXLGJuLUlOLXUtbnUtYXJhYixrcy1BcmFiLUlOLGVuLVpBLGJuLUlOLGJuLUlOLXUtbnUtYWRsbSIpOworICAgICAgICBTZXQ8U3RyaW5nPiBpZ25vcmFibGVMb2NhbGVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBpZ25vcmFibGVMb2NhbGVzLmFkZCgiZW4tVVMiKTsKKyAgICAgICAgTG9jYWxlSW5mbyBwYXJlbnQgPSBMb2NhbGVTdG9yZS5mcm9tTG9jYWxlKExvY2FsZS5mb3JMYW5ndWFnZVRhZygiYm4tSU4iKSk7CisKKyAgICAgICAgU2V0PExvY2FsZUluZm8+IGxvY2FsZUluZm9zID0gTG9jYWxlU3RvcmUuZ2V0TGV2ZWxMb2NhbGVzKAorICAgICAgICAgICAgICAgIG51bGwsIGlnbm9yYWJsZUxvY2FsZXMsIHBhcmVudCwgZmFsc2UsIHRlc3RTdXBwb3J0ZWRMb2NhbGVzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbG9jYWxlSW5mb3Muc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbGVJbmZvcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBpbmZvIC0+IGluZm8uZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLmVxdWFscygiYm4tSU4tdS1udS1hZGxtIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbGVJbmZvcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBpbmZvIC0+IGluZm8uZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLmVxdWFscygiYm4tSU4tdS1udS1hcmFiIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbGVJbmZvcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBpbmZvIC0+IGluZm8uZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLmVxdWFscygiYm4tSU4iKSkpOworICAgIH0KKwogICAgIHByaXZhdGUgQXJyYXlMaXN0PExvY2FsZUluZm8+IGdldEZha2VTdXBwb3J0ZWRMb2NhbGVzKCkgewotICAgICAgICBTdHJpbmdbXSBsb2NhbGVzID0geyJlbi1VUyIsICJ6aC1IYW50LVRXIiwgImphLUpQIiwgImVuLUdCIn07CisgICAgICAgIFN0cmluZ1tdIGxvY2FsZXMgPSB7ImVuLVVTIiwgInpoLUhhbnQtVFciLCAiamEtSlAiLCAiZW4tR0IiLCAiZW4tVVMtdS1udS1hcmFiIn07CiAgICAgICAgIEFycmF5TGlzdDxMb2NhbGVJbmZvPiBzdXBwb3J0ZWRMb2NhbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGZvciAoU3RyaW5nIGxvY2FsZVRhZyA6IGxvY2FsZXMpIHsKICAgICAgICAgICAgIHN1cHBvcnRlZExvY2FsZXMuYWRkKExvY2FsZVN0b3JlLmZyb21Mb2NhbGUoTG9jYWxlLmZvckxhbmd1YWdlVGFnKGxvY2FsZVRhZykpKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL1ZvaWNlSW50ZXJhY3Rpb24vc3JjL2NvbS9hbmRyb2lkL3Rlc3Qvdm9pY2VpbnRlcmFjdGlvbi9NYWluSW50ZXJhY3Rpb25TZXJ2aWNlLmphdmEgYi90ZXN0cy9Wb2ljZUludGVyYWN0aW9uL3NyYy9jb20vYW5kcm9pZC90ZXN0L3ZvaWNlaW50ZXJhY3Rpb24vTWFpbkludGVyYWN0aW9uU2VydmljZS5qYXZhCmluZGV4IGYxODNhOWIuLmI3ZjViMTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1ZvaWNlSW50ZXJhY3Rpb24vc3JjL2NvbS9hbmRyb2lkL3Rlc3Qvdm9pY2VpbnRlcmFjdGlvbi9NYWluSW50ZXJhY3Rpb25TZXJ2aWNlLmphdmEKKysrIGIvdGVzdHMvVm9pY2VJbnRlcmFjdGlvbi9zcmMvY29tL2FuZHJvaWQvdGVzdC92b2ljZWludGVyYWN0aW9uL01haW5JbnRlcmFjdGlvblNlcnZpY2UuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5BbHdheXNPbkhvdHdvcmREZXRlY3RvcjsKIGltcG9ydCBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLnZvaWNlLkFsd2F5c09uSG90d29yZERldGVjdG9yLkV2ZW50UGF5bG9hZDsKLWltcG9ydCBhbmRyb2lkLnNlcnZpY2Uudm9pY2UuSG90d29yZERldGVjdG9yOwogaW1wb3J0IGFuZHJvaWQuc2VydmljZS52b2ljZS5Wb2ljZUludGVyYWN0aW9uU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC04NCwyNCArODMsMTYgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuU1RBVEVfS0VZUEhSQVNFX1VORU5ST0xMRUQ6CiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiU1RBVEVfS0VZUEhSQVNFX1VORU5ST0xMRUQiKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJbnRlbnQgZW5yb2xsID0gbUhvdHdvcmREZXRlY3Rvci5jcmVhdGVFbnJvbGxJbnRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiTmVlZCB0byBlbnJvbGwgd2l0aCAiICsgZW5yb2xsKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChIb3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjcmVhdGVFbnJvbGxJbnRlbnQgZmFpbGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEludGVudCBlbnJvbGwgPSBtSG90d29yZERldGVjdG9yLmNyZWF0ZUVucm9sbEludGVudCgpOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIk5lZWQgdG8gZW5yb2xsIHdpdGggIiArIGVucm9sbCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFsd2F5c09uSG90d29yZERldGVjdG9yLlNUQVRFX0tFWVBIUkFTRV9FTlJPTExFRDoKICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTVEFURV9LRVlQSFJBU0VfRU5ST0xMRUQgLSBzdGFydGluZyByZWNvZ25pdGlvbiIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSG90d29yZERldGVjdG9yLnN0YXJ0UmVjb2duaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWx3YXlzT25Ib3R3b3JkRGV0ZWN0b3IuUkVDT0dOSVRJT05fRkxBR19OT05FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAic3RhcnRSZWNvZ25pdGlvbiBzdWNjZWVkZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgInN0YXJ0UmVjb2duaXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChIb3R3b3JkRGV0ZWN0b3IuSWxsZWdhbERldGVjdG9yU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzdGFydFJlY29nbml0aW9uIGZhaWxlZCIsIGUpOworICAgICAgICAgICAgICAgIGlmIChtSG90d29yZERldGVjdG9yLnN0YXJ0UmVjb2duaXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBBbHdheXNPbkhvdHdvcmREZXRlY3Rvci5SRUNPR05JVElPTl9GTEFHX05PTkUpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgInN0YXJ0UmVjb2duaXRpb24gc3VjY2VlZGVkIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAic3RhcnRSZWNvZ25pdGlvbiBmYWlsZWQiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQyL2NtZC9MaW5rLmggYi90b29scy9hYXB0Mi9jbWQvTGluay5oCmluZGV4IDVmZGZiNjYuLjJjZTIxNjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQyL2NtZC9MaW5rLmgKKysrIGIvdG9vbHMvYWFwdDIvY21kL0xpbmsuaApAQCAtMjA5LDYgKzIwOSw4IEBACiAgICAgQWRkT3B0aW9uYWxGbGFnKCItLWNvbXBpbGUtc2RrLXZlcnNpb24tbmFtZSIsCiAgICAgICAgICJWZXJzaW9uIG5hbWUgdG8gaW5qZWN0IGludG8gdGhlIEFuZHJvaWRNYW5pZmVzdC54bWwgaWYgbm9uZSBpcyBwcmVzZW50LiIsCiAgICAgICAgICZvcHRpb25zXy5tYW5pZmVzdF9maXhlcl9vcHRpb25zLmNvbXBpbGVfc2RrX3ZlcnNpb25fY29kZW5hbWUpOworICAgIEFkZE9wdGlvbmFsRmxhZ0xpc3QoIi0tZmluZ2VycHJpbnQtcHJlZml4IiwgIkZpbmdlcnByaW50IHByZWZpeCB0byBhZGQgdG8gaW5zdGFsbCBjb25zdHJhaW50cy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnNfLm1hbmlmZXN0X2ZpeGVyX29wdGlvbnMuZmluZ2VycHJpbnRfcHJlZml4ZXMpOwogICAgIEFkZE9wdGlvbmFsU3dpdGNoKCItLXNoYXJlZC1saWIiLCAiR2VuZXJhdGVzIGEgc2hhcmVkIEFuZHJvaWQgcnVudGltZSBsaWJyYXJ5LiIsCiAgICAgICAgICZzaGFyZWRfbGliXyk7CiAgICAgQWRkT3B0aW9uYWxTd2l0Y2goIi0tc3RhdGljLWxpYiIsICJHZW5lcmF0ZSBhIHN0YXRpYyBBbmRyb2lkIGxpYnJhcnkuIiwgJnN0YXRpY19saWJfKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQyL2R1bXAvRHVtcE1hbmlmZXN0LmNwcCBiL3Rvb2xzL2FhcHQyL2R1bXAvRHVtcE1hbmlmZXN0LmNwcAppbmRleCBjNjZmNGU1Li5hNDNiZjFiIDEwMDY0NAotLS0gYS90b29scy9hYXB0Mi9kdW1wL0R1bXBNYW5pZmVzdC5jcHAKKysrIGIvdG9vbHMvYWFwdDIvZHVtcC9EdW1wTWFuaWZlc3QuY3BwCkBAIC0yMTIwLDYgKzIxMjAsMzMgQEAKICAgfQogfTsKIAorLyoqIFJlcHJlc2VudHMgPGluc3RhbGwtY29uc3RyYWludHM+IGVsZW1lbnRzLiAqKi8KK2NsYXNzIEluc3RhbGxDb25zdHJhaW50cyA6IHB1YmxpYyBNYW5pZmVzdEV4dHJhY3Rvcjo6RWxlbWVudCB7CisgcHVibGljOgorICBJbnN0YWxsQ29uc3RyYWludHMoKSA9IGRlZmF1bHQ7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaW5nZXJwcmludF9wcmVmaXhlczsKKworICB2b2lkIEV4dHJhY3QoeG1sOjpFbGVtZW50KiBlbGVtZW50KSBvdmVycmlkZSB7CisgICAgZm9yICh4bWw6OkVsZW1lbnQqIGNoaWxkIDogZWxlbWVudC0+R2V0Q2hpbGRFbGVtZW50cygpKSB7CisgICAgICBpZiAoY2hpbGQtPm5hbWUgPT0gImZpbmdlcnByaW50LXByZWZpeCIpIHsKKyAgICAgICAgeG1sOjpBdHRyaWJ1dGUqIGF0dHIgPSBjaGlsZC0+RmluZEF0dHJpYnV0ZShrQW5kcm9pZE5hbWVzcGFjZSwgInZhbHVlIik7CisgICAgICAgIGlmIChhdHRyKSB7CisgICAgICAgICAgZmluZ2VycHJpbnRfcHJlZml4ZXMucHVzaF9iYWNrKGF0dHItPnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgUHJpbnQodGV4dDo6UHJpbnRlciogcHJpbnRlcikgb3ZlcnJpZGUgeworICAgIGlmICghZmluZ2VycHJpbnRfcHJlZml4ZXMuZW1wdHkoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoU3RyaW5nUHJpbnRmKCJpbnN0YWxsLWNvbnN0cmFpbnRzOlxuIikpOworICAgICAgZm9yIChjb25zdCBhdXRvJiBwcmVmaXggOiBmaW5nZXJwcmludF9wcmVmaXhlcykgeworICAgICAgICBwcmludGVyLT5QcmludChTdHJpbmdQcmludGYoIiAgZmluZ2VycHJpbnQtcHJlZml4PSclcydcbiIsIHByZWZpeC5jX3N0cigpKSk7CisgICAgICB9CisgICAgfQorICB9Cit9OworCiAvKiogUmVwcmVzZW50cyA8b3JpZ2luYWwtcGFja2FnZT4gZWxlbWVudHMuICoqLwogY2xhc3MgT3JpZ2luYWxQYWNrYWdlIDogcHVibGljIE1hbmlmZXN0RXh0cmFjdG9yOjpFbGVtZW50IHsKICBwdWJsaWM6CkBAIC0yODY5LDcgKzI4OTYsNyBAQAogY29uc3RleHByIGNvbnN0IGNoYXIqIEdldEV4cGVjdGVkVGFnRm9yVHlwZSgpIHsKICAgLy8gVGhpcyBhcnJheSBkb2VzIG5vdCBhcHBlYXIgYXQgcnVudGltZSwgYXMgR2V0RXhwZWN0ZWRUYWdGb3JUeXBlIGZ1bmN0aW9uIGlzIHVzZWQgYnkgY29tcGlsZXIKICAgLy8gdG8gaW5qZWN0IHByb3BlciAnZXhwZWN0ZWRfdGFnJyBpbnRvIEVsZW1lbnRDYXN0LgotICBzdGQ6OmFycmF5PHN0ZDo6cGFpcjxjb25zdCBjaGFyKiwgYm9vbD4sIDM3PiB0YWdzID0geworICBzdGQ6OmFycmF5PHN0ZDo6cGFpcjxjb25zdCBjaGFyKiwgYm9vbD4sIDM4PiB0YWdzID0gewogICAgICAgc3RkOjptYWtlX3BhaXIoImFjdGlvbiIsIHN0ZDo6aXNfc2FtZTxBY3Rpb24sIFQ+Ojp2YWx1ZSksCiAgICAgICBzdGQ6Om1ha2VfcGFpcigiYWN0aXZpdHkiLCBzdGQ6OmlzX3NhbWU8QWN0aXZpdHksIFQ+Ojp2YWx1ZSksCiAgICAgICBzdGQ6Om1ha2VfcGFpcigiYWRkaXRpb25hbC1jZXJ0aWZpY2F0ZSIsIHN0ZDo6aXNfc2FtZTxBZGRpdGlvbmFsQ2VydGlmaWNhdGUsIFQ+Ojp2YWx1ZSksCkBAIC0yODc4LDYgKzI5MDUsNyBAQAogICAgICAgc3RkOjptYWtlX3BhaXIoImNvbXBhdGlibGUtc2NyZWVucyIsIHN0ZDo6aXNfc2FtZTxDb21wYXRpYmxlU2NyZWVucywgVD46OnZhbHVlKSwKICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJmZWF0dXJlLWdyb3VwIiwgc3RkOjppc19zYW1lPEZlYXR1cmVHcm91cCwgVD46OnZhbHVlKSwKICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJpbnB1dC10eXBlIiwgc3RkOjppc19zYW1lPElucHV0VHlwZSwgVD46OnZhbHVlKSwKKyAgICAgIHN0ZDo6bWFrZV9wYWlyKCJpbnN0YWxsLWNvbnN0cmFpbnRzIiwgc3RkOjppc19zYW1lPEluc3RhbGxDb25zdHJhaW50cywgVD46OnZhbHVlKSwKICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJpbnRlbnQtZmlsdGVyIiwgc3RkOjppc19zYW1lPEludGVudEZpbHRlciwgVD46OnZhbHVlKSwKICAgICAgIHN0ZDo6bWFrZV9wYWlyKCJtZXRhLWRhdGEiLCBzdGQ6OmlzX3NhbWU8TWV0YURhdGEsIFQ+Ojp2YWx1ZSksCiAgICAgICBzdGQ6Om1ha2VfcGFpcigibWFuaWZlc3QiLCBzdGQ6OmlzX3NhbWU8TWFuaWZlc3QsIFQ+Ojp2YWx1ZSksCkBAIC0yOTQ4LDYgKzI5NzYsNyBAQAogICAgICAgICAgIHsiY29tcGF0aWJsZS1zY3JlZW5zIiwgJkNyZWF0ZVR5cGU8Q29tcGF0aWJsZVNjcmVlbnM+fSwKICAgICAgICAgICB7ImZlYXR1cmUtZ3JvdXAiLCAmQ3JlYXRlVHlwZTxGZWF0dXJlR3JvdXA+fSwKICAgICAgICAgICB7ImlucHV0LXR5cGUiLCAmQ3JlYXRlVHlwZTxJbnB1dFR5cGU+fSwKKyAgICAgICAgICB7Imluc3RhbGwtY29uc3RyYWludHMiLCAmQ3JlYXRlVHlwZTxJbnN0YWxsQ29uc3RyYWludHM+fSwKICAgICAgICAgICB7ImludGVudC1maWx0ZXIiLCAmQ3JlYXRlVHlwZTxJbnRlbnRGaWx0ZXI+fSwKICAgICAgICAgICB7Im1hbmlmZXN0IiwgJkNyZWF0ZVR5cGU8TWFuaWZlc3Q+fSwKICAgICAgICAgICB7Im1ldGEtZGF0YSIsICZDcmVhdGVUeXBlPE1ldGFEYXRhPn0sCmRpZmYgLS1naXQgYS90b29scy9hYXB0Mi9saW5rL01hbmlmZXN0Rml4ZXIuY3BwIGIvdG9vbHMvYWFwdDIvbGluay9NYW5pZmVzdEZpeGVyLmNwcAppbmRleCA1NmQ5MDc1Li41M2YwYWJlIDEwMDY0NAotLS0gYS90b29scy9hYXB0Mi9saW5rL01hbmlmZXN0Rml4ZXIuY3BwCisrKyBiL3Rvb2xzL2FhcHQyL2xpbmsvTWFuaWZlc3RGaXhlci5jcHAKQEAgLTc0OSw2ICs3NDksMjMgQEAKICAgICBhdHRyLT52YWx1ZSA9IG9wdGlvbnNfLmNvbXBpbGVfc2RrX3ZlcnNpb25fY29kZW5hbWUudmFsdWUoKTsKICAgfQogCisgIGlmICghb3B0aW9uc18uZmluZ2VycHJpbnRfcHJlZml4ZXMuZW1wdHkoKSkgeworICAgIHhtbDo6RWxlbWVudCogaW5zdGFsbF9jb25zdHJhaW50c19lbCA9IHJvb3QtPkZpbmRDaGlsZCh7fSwgImluc3RhbGwtY29uc3RyYWludHMiKTsKKyAgICBpZiAoaW5zdGFsbF9jb25zdHJhaW50c19lbCA9PSBudWxscHRyKSB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8eG1sOjpFbGVtZW50PiBpbnN0YWxsX2NvbnN0cmFpbnRzID0gc3RkOjptYWtlX3VuaXF1ZTx4bWw6OkVsZW1lbnQ+KCk7CisgICAgICBpbnN0YWxsX2NvbnN0cmFpbnRzLT5uYW1lID0gImluc3RhbGwtY29uc3RyYWludHMiOworICAgICAgaW5zdGFsbF9jb25zdHJhaW50c19lbCA9IGluc3RhbGxfY29uc3RyYWludHMuZ2V0KCk7CisgICAgICByb290LT5BcHBlbmRDaGlsZChzdGQ6Om1vdmUoaW5zdGFsbF9jb25zdHJhaW50cykpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXggOiBvcHRpb25zXy5maW5nZXJwcmludF9wcmVmaXhlcykgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPHhtbDo6RWxlbWVudD4gcHJlZml4X2VsID0gc3RkOjptYWtlX3VuaXF1ZTx4bWw6OkVsZW1lbnQ+KCk7CisgICAgICBwcmVmaXhfZWwtPm5hbWUgPSAiZmluZ2VycHJpbnQtcHJlZml4IjsKKyAgICAgIHhtbDo6QXR0cmlidXRlKiBhdHRyID0gcHJlZml4X2VsLT5GaW5kT3JDcmVhdGVBdHRyaWJ1dGUoeG1sOjprU2NoZW1hQW5kcm9pZCwgInZhbHVlIik7CisgICAgICBhdHRyLT52YWx1ZSA9IHByZWZpeDsKKyAgICAgIGluc3RhbGxfY29uc3RyYWludHNfZWwtPkFwcGVuZENoaWxkKHN0ZDo6bW92ZShwcmVmaXhfZWwpKTsKKyAgICB9CisgIH0KKwogICB4bWw6OlhtbEFjdGlvbkV4ZWN1dG9yIGV4ZWN1dG9yOwogICBpZiAoIUJ1aWxkUnVsZXMoJmV4ZWN1dG9yLCBjb250ZXh0LT5HZXREaWFnbm9zdGljcygpKSkgewogICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQyL2xpbmsvTWFuaWZlc3RGaXhlci5oIGIvdG9vbHMvYWFwdDIvbGluay9NYW5pZmVzdEZpeGVyLmgKaW5kZXggOTBmNTE3Ny4uMTc1YWI2ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdDIvbGluay9NYW5pZmVzdEZpeGVyLmgKKysrIGIvdG9vbHMvYWFwdDIvbGluay9NYW5pZmVzdEZpeGVyLmgKQEAgLTE4LDExICsxOCwxMCBAQAogI2RlZmluZSBBQVBUX0xJTktfTUFOSUZFU1RGSVhFUl9ICiAKICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL21hY3Jvcy5oIgotCiAjaW5jbHVkZSAicHJvY2Vzcy9JUmVzb3VyY2VUYWJsZUNvbnN1bWVyLmgiCi0KICNpbmNsdWRlICJ4bWwvWG1sQWN0aW9uRXhlY3V0b3IuaCIKICNpbmNsdWRlICJ4bWwvWG1sRG9tLmgiCiAKQEAgLTc1LDYgKzc0LDkgQEAKICAgLy8gJ2FuZHJvaWQ6Y29tcGlsZVNka1ZlcnNpb25Db2RlbmFtZScgaW4gdGhlIDxtYW5pZmVzdD4gdGFnLgogICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBjb21waWxlX3Nka192ZXJzaW9uX2NvZGVuYW1lOwogCisgIC8vIFRoZSBmaW5nZXJwcmludCBwcmVmaXhlcyB0byBiZSBhZGRlZCB0byB0aGUgPGluc3RhbGwtY29uc3RyYWludHM+IHRhZy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbmdlcnByaW50X3ByZWZpeGVzOworCiAgIC8vIFdoZXRoZXIgdmFsaWRhdGlvbiBlcnJvcnMgc2hvdWxkIGJlIHRyZWF0ZWQgb25seSBhcyB3YXJuaW5ncy4gSWYgdGhpcyBpcyAndHJ1ZScsIHRoZW4gYW4KICAgLy8gaW5jb3JyZWN0IG5vZGUgd2lsbCBub3QgcmVzdWx0IGluIGFuIGVycm9yLCBidXQgb25seSBhcyBhIHdhcm5pbmcsIGFuZCB0aGUgcGFyc2luZyB3aWxsCiAgIC8vIGNvbnRpbnVlLgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdDIvbGluay9NYW5pZmVzdEZpeGVyX3Rlc3QuY3BwIGIvdG9vbHMvYWFwdDIvbGluay9NYW5pZmVzdEZpeGVyX3Rlc3QuY3BwCmluZGV4IDcxODBhZTYuLjFiOGYwNWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQyL2xpbmsvTWFuaWZlc3RGaXhlcl90ZXN0LmNwcAorKysgYi90b29scy9hYXB0Mi9saW5rL01hbmlmZXN0Rml4ZXJfdGVzdC5jcHAKQEAgLTk2NSw2ICs5NjUsNjMgQEAKICAgQVNTRVJUX1RIQVQobWFuaWZlc3QsIElzTnVsbCgpKTsKIH0KIAorVEVTVF9GKE1hbmlmZXN0Rml4ZXJUZXN0LCBJbnNlcnRGaW5nZXJwcmludFByZWZpeElmTm90RXhpc3QpIHsKKyAgc3RkOjpzdHJpbmcgaW5wdXQgPSBSIigKKyAgICAgIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZCI+CisgICAgICA8L21hbmlmZXN0PikiOworICBNYW5pZmVzdEZpeGVyT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmZpbmdlcnByaW50X3ByZWZpeGVzID0geyJmb28iLCAiYmFyIn07CisKKyAgc3RkOjp1bmlxdWVfcHRyPHhtbDo6WG1sUmVzb3VyY2U+IG1hbmlmZXN0ID0gVmVyaWZ5V2l0aE9wdGlvbnMoaW5wdXQsIG9wdGlvbnMpOworICBBU1NFUlRfVEhBVChtYW5pZmVzdCwgTm90TnVsbCgpKTsKKyAgeG1sOjpFbGVtZW50KiBpbnN0YWxsX2NvbnN0cmFpbnRzID0gbWFuaWZlc3QtPnJvb3QuZ2V0KCktPkZpbmRDaGlsZCh7fSwgImluc3RhbGwtY29uc3RyYWludHMiKTsKKyAgQVNTRVJUX1RIQVQoaW5zdGFsbF9jb25zdHJhaW50cywgTm90TnVsbCgpKTsKKyAgc3RkOjp2ZWN0b3I8eG1sOjpFbGVtZW50Kj4gZmluZ2VycHJpbnRfcHJlZml4ZXMgPSBpbnN0YWxsX2NvbnN0cmFpbnRzLT5HZXRDaGlsZEVsZW1lbnRzKCk7CisgIEVYUEVDVF9FUShmaW5nZXJwcmludF9wcmVmaXhlcy5zaXplKCksIDIpOworICB4bWw6OkF0dHJpYnV0ZSogYXR0cjsKKyAgRVhQRUNUX1RIQVQoZmluZ2VycHJpbnRfcHJlZml4ZXNbMF0tPm5hbWUsIFN0ckVxKCJmaW5nZXJwcmludC1wcmVmaXgiKSk7CisgIGF0dHIgPSBmaW5nZXJwcmludF9wcmVmaXhlc1swXS0+RmluZEF0dHJpYnV0ZSh4bWw6OmtTY2hlbWFBbmRyb2lkLCAidmFsdWUiKTsKKyAgQVNTRVJUX1RIQVQoYXR0ciwgTm90TnVsbCgpKTsKKyAgRVhQRUNUX1RIQVQoYXR0ci0+dmFsdWUsIFN0ckVxKCJmb28iKSk7CisgIEVYUEVDVF9USEFUKGZpbmdlcnByaW50X3ByZWZpeGVzWzFdLT5uYW1lLCBTdHJFcSgiZmluZ2VycHJpbnQtcHJlZml4IikpOworICBhdHRyID0gZmluZ2VycHJpbnRfcHJlZml4ZXNbMV0tPkZpbmRBdHRyaWJ1dGUoeG1sOjprU2NoZW1hQW5kcm9pZCwgInZhbHVlIik7CisgIEFTU0VSVF9USEFUKGF0dHIsIE5vdE51bGwoKSk7CisgIEVYUEVDVF9USEFUKGF0dHItPnZhbHVlLCBTdHJFcSgiYmFyIikpOworfQorCitURVNUX0YoTWFuaWZlc3RGaXhlclRlc3QsIEFwcGVuZEZpbmdlcnByaW50UHJlZml4SWZFeGlzdHMpIHsKKyAgc3RkOjpzdHJpbmcgaW5wdXQgPSBSIigKKyAgICAgIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iYW5kcm9pZCI+CisgICAgICAgICAgPGluc3RhbGwtY29uc3RyYWludHM+CisgICAgICAgICAgICA8ZmluZ2VycHJpbnQtcHJlZml4IGFuZHJvaWQ6dmFsdWU9ImZvbyIgLz4KKyAgICAgICAgICA8L2luc3RhbGwtY29uc3RyYWludHM+CisgICAgICA8L21hbmlmZXN0PikiOworICBNYW5pZmVzdEZpeGVyT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmZpbmdlcnByaW50X3ByZWZpeGVzID0geyJiYXIiLCAiYmF6In07CisKKyAgc3RkOjp1bmlxdWVfcHRyPHhtbDo6WG1sUmVzb3VyY2U+IG1hbmlmZXN0ID0gVmVyaWZ5V2l0aE9wdGlvbnMoaW5wdXQsIG9wdGlvbnMpOworICBBU1NFUlRfVEhBVChtYW5pZmVzdCwgTm90TnVsbCgpKTsKKyAgeG1sOjpFbGVtZW50KiBpbnN0YWxsX2NvbnN0cmFpbnRzID0gbWFuaWZlc3QtPnJvb3QuZ2V0KCktPkZpbmRDaGlsZCh7fSwgImluc3RhbGwtY29uc3RyYWludHMiKTsKKyAgQVNTRVJUX1RIQVQoaW5zdGFsbF9jb25zdHJhaW50cywgTm90TnVsbCgpKTsKKyAgc3RkOjp2ZWN0b3I8eG1sOjpFbGVtZW50Kj4gZmluZ2VycHJpbnRfcHJlZml4ZXMgPSBpbnN0YWxsX2NvbnN0cmFpbnRzLT5HZXRDaGlsZEVsZW1lbnRzKCk7CisgIEVYUEVDVF9FUShmaW5nZXJwcmludF9wcmVmaXhlcy5zaXplKCksIDMpOworICB4bWw6OkF0dHJpYnV0ZSogYXR0cjsKKyAgRVhQRUNUX1RIQVQoZmluZ2VycHJpbnRfcHJlZml4ZXNbMF0tPm5hbWUsIFN0ckVxKCJmaW5nZXJwcmludC1wcmVmaXgiKSk7CisgIGF0dHIgPSBmaW5nZXJwcmludF9wcmVmaXhlc1swXS0+RmluZEF0dHJpYnV0ZSh4bWw6OmtTY2hlbWFBbmRyb2lkLCAidmFsdWUiKTsKKyAgQVNTRVJUX1RIQVQoYXR0ciwgTm90TnVsbCgpKTsKKyAgRVhQRUNUX1RIQVQoYXR0ci0+dmFsdWUsIFN0ckVxKCJmb28iKSk7CisgIEVYUEVDVF9USEFUKGZpbmdlcnByaW50X3ByZWZpeGVzWzFdLT5uYW1lLCBTdHJFcSgiZmluZ2VycHJpbnQtcHJlZml4IikpOworICBhdHRyID0gZmluZ2VycHJpbnRfcHJlZml4ZXNbMV0tPkZpbmRBdHRyaWJ1dGUoeG1sOjprU2NoZW1hQW5kcm9pZCwgInZhbHVlIik7CisgIEFTU0VSVF9USEFUKGF0dHIsIE5vdE51bGwoKSk7CisgIEVYUEVDVF9USEFUKGF0dHItPnZhbHVlLCBTdHJFcSgiYmFyIikpOworICBFWFBFQ1RfVEhBVChmaW5nZXJwcmludF9wcmVmaXhlc1syXS0+bmFtZSwgU3RyRXEoImZpbmdlcnByaW50LXByZWZpeCIpKTsKKyAgYXR0ciA9IGZpbmdlcnByaW50X3ByZWZpeGVzWzJdLT5GaW5kQXR0cmlidXRlKHhtbDo6a1NjaGVtYUFuZHJvaWQsICJ2YWx1ZSIpOworICBBU1NFUlRfVEhBVChhdHRyLCBOb3ROdWxsKCkpOworICBFWFBFQ1RfVEhBVChhdHRyLT52YWx1ZSwgU3RyRXEoImJheiIpKTsKK30KKwogVEVTVF9GKE1hbmlmZXN0Rml4ZXJUZXN0LCBVc2VzTGlicmFyeU11c3RIYXZlTm9uRW1wdHlOYW1lKSB7CiAgIHN0ZDo6c3RyaW5nIGlucHV0ID0gUiIoCiAgICAgICA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgpkaWZmIC0tZ2l0IGEvdG9vbHMvbGludC9mcmFtZXdvcmsvY2hlY2tzL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2xpbnQvQW5kcm9pZEZyYW1ld29ya0lzc3VlUmVnaXN0cnkua3QgYi90b29scy9saW50L2ZyYW1ld29yay9jaGVja3Mvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvbGludC9BbmRyb2lkRnJhbWV3b3JrSXNzdWVSZWdpc3RyeS5rdAppbmRleCA0MjNhNjg0Li5iNGY2YTFjIDEwMDY0NAotLS0gYS90b29scy9saW50L2ZyYW1ld29yay9jaGVja3Mvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvbGludC9BbmRyb2lkRnJhbWV3b3JrSXNzdWVSZWdpc3RyeS5rdAorKysgYi90b29scy9saW50L2ZyYW1ld29yay9jaGVja3Mvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvbGludC9BbmRyb2lkRnJhbWV3b3JrSXNzdWVSZWdpc3RyeS5rdApAQCAtMzYsNyArMzYsNiBAQAogICAgICAgICBDYWxsaW5nU2V0dGluZ3NOb25Vc2VyR2V0dGVyTWV0aG9kc0RldGVjdG9yLklTU1VFX05PTl9VU0VSX0dFVFRFUl9DQUxMRUQsCiAgICAgICAgIFNhZmVyUGFyY2VsQ2hlY2tlci5JU1NVRV9VTlNBRkVfQVBJX1VTQUdFLAogICAgICAgICBQYWNrYWdlVmlzaWJpbGl0eURldGVjdG9yLklTU1VFX1BBQ0tBR0VfTkFNRV9OT19QQUNLQUdFX1ZJU0lCSUxJVFlfRklMVEVSUywKLSAgICAgICAgUmVnaXN0ZXJSZWNlaXZlckZsYWdEZXRlY3Rvci5JU1NVRV9SRUNFSVZFUl9FWFBPUlRFRF9GTEFHLAogICAgICAgICBQZXJtaXNzaW9uTWV0aG9kRGV0ZWN0b3IuSVNTVUVfUEVSTUlTU0lPTl9NRVRIT0RfVVNBR0UsCiAgICAgICAgIFBlcm1pc3Npb25NZXRob2REZXRlY3Rvci5JU1NVRV9DQU5fQkVfUEVSTUlTU0lPTl9NRVRIT0QsCiAgICAgKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGludC9mcmFtZXdvcmsvY2hlY2tzL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2xpbnQvUmVnaXN0ZXJSZWNlaXZlckZsYWdEZXRlY3Rvci5rdCBiL3Rvb2xzL2xpbnQvZnJhbWV3b3JrL2NoZWNrcy9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9saW50L1JlZ2lzdGVyUmVjZWl2ZXJGbGFnRGV0ZWN0b3Iua3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTA0MjguLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGludC9mcmFtZXdvcmsvY2hlY2tzL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2xpbnQvUmVnaXN0ZXJSZWNlaXZlckZsYWdEZXRlY3Rvci5rdAorKysgL2Rldi9udWxsCkBAIC0xLDkyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQubGludAotCi1pbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5jaGVja3MuRGF0YUZsb3dBbmFseXplcgotaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLkNhdGVnb3J5Ci1pbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5kZXRlY3Rvci5hcGkuQ29uc3RhbnRFdmFsdWF0b3IKLWltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmRldGVjdG9yLmFwaS5EZXRlY3RvcgotaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLkltcGxlbWVudGF0aW9uCi1pbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5kZXRlY3Rvci5hcGkuSXNzdWUKLWltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmRldGVjdG9yLmFwaS5KYXZhQ29udGV4dAotaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLlNjb3BlCi1pbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5kZXRlY3Rvci5hcGkuU2V2ZXJpdHkKLWltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmRldGVjdG9yLmFwaS5Tb3VyY2VDb2RlU2Nhbm5lcgotaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLlVhc3RMaW50VXRpbHMuQ29tcGFuaW9uLmZpbmRMYXN0QXNzaWdubWVudAotaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLmdldE1ldGhvZE5hbWUKLWltcG9ydCBjb20uaW50ZWxsaWoucHNpLlBzaU1ldGhvZAotaW1wb3J0IGNvbS5pbnRlbGxpai5wc2kuUHNpVmFyaWFibGUKLWltcG9ydCBvcmcuamV0YnJhaW5zLmtvdGxpbi5wc2kucHNpVXRpbC5wYXJhbWV0ZXJJbmRleAotaW1wb3J0IG9yZy5qZXRicmFpbnMudWFzdC5VQ2FsbEV4cHJlc3Npb24KLWltcG9ydCBvcmcuamV0YnJhaW5zLnVhc3QuVUVsZW1lbnQKLWltcG9ydCBvcmcuamV0YnJhaW5zLnVhc3QuVUV4cHJlc3Npb24KLWltcG9ydCBvcmcuamV0YnJhaW5zLnVhc3QuVVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCi1pbXBvcnQgb3JnLmpldGJyYWlucy51YXN0LlVRdWFsaWZpZWRSZWZlcmVuY2VFeHByZXNzaW9uCi1pbXBvcnQgb3JnLmpldGJyYWlucy51YXN0LmdldENvbnRhaW5pbmdVTWV0aG9kCi1pbXBvcnQgb3JnLmpldGJyYWlucy51YXN0LmlzTnVsbExpdGVyYWwKLWltcG9ydCBvcmcuamV0YnJhaW5zLnVhc3Quc2tpcFBhcmVudGhlc2l6ZWRFeHByRG93bgotaW1wb3J0IG9yZy5qZXRicmFpbnMudWFzdC50cnlSZXNvbHZlCi0KLS8qKgotICogRGV0ZWN0b3IgdGhhdCBpZGVudGlmaWVzIGByZWdpc3RlclJlY2VpdmVyKClgIGNhbGxzIHdoaWNoIGFyZSBtaXNzaW5nIHRoZSBgUkVDRUlWRVJfRVhQT1JURURgIG9yCi0gKiBgUkVDRUlWRVJfTk9UX0VYUE9SVEVEYCBmbGFncyBvbiBUKy4KLSAqCi0gKiBUT0RPOiBBZGQgQVBJIGxldmVsIGNvbmRpdGlvbnMgdG8gYmV0dGVyIHN1cHBvcnQgbm9uLXBsYXRmb3JtIGNvZGUuCi0gKiAxLiBDaGVjayBpZiByZWdpc3RlclJlY2VpdmVyKCkgY2FsbCBpcyByZWFjaGFibGUgb24gVCsuCi0gKiAyLiBDaGVjayBpZiB0YXJnZXRTZGtWZXJzaW9uIGlzIFQrLgotICoKLSAqIGVnOiBpc1dpdGhpblZlcnNpb25DaGVja0NvbmRpdGlvbmFsKGNvbnRleHQsIG5vZGUsIDMxLCBmYWxzZSkKLSAqIGVnOiBpc1ByZWNlZGVkQnlWZXJzaW9uQ2hlY2tFeGl0KGNvbnRleHQsIG5vZGUsIDMxKSA/Ci0gKi8KLUBTdXBwcmVzcygiVW5zdGFibGVBcGlVc2FnZSIpCi1jbGFzcyBSZWdpc3RlclJlY2VpdmVyRmxhZ0RldGVjdG9yIDogRGV0ZWN0b3IoKSwgU291cmNlQ29kZVNjYW5uZXIgewotCi0gICAgb3ZlcnJpZGUgZnVuIGdldEFwcGxpY2FibGVNZXRob2ROYW1lcygpOiBMaXN0PFN0cmluZz4gPSBsaXN0T2YoCi0gICAgICAgICAgICAicmVnaXN0ZXJSZWNlaXZlciIsCi0gICAgICAgICAgICAicmVnaXN0ZXJSZWNlaXZlckFzVXNlciIsCi0gICAgICAgICAgICAicmVnaXN0ZXJSZWNlaXZlckZvckFsbFVzZXJzIgotICAgICkKLQotICAgIHByaXZhdGUgZnVuIGNoZWNrSXNQcm90ZWN0ZWRSZWNlaXZlckFuZFJldHVyblVucHJvdGVjdGVkQWN0aW9ucygKLSAgICAgICAgICAgIGZpbHRlckFyZzogVUV4cHJlc3Npb24sCi0gICAgICAgICAgICBub2RlOiBVQ2FsbEV4cHJlc3Npb24sCi0gICAgICAgICAgICBldmFsdWF0b3I6IENvbnN0YW50RXZhbHVhdG9yCi0gICAgICAgICk6IFBhaXI8Qm9vbGVhbiwgTGlzdDxTdHJpbmc+PiB7IC8vIGlzUHJvdGVjdGVkLCB1bnByb3RlY3RlZEFjdGlvbnMKLSAgICAgICAgICAgIHZhbCBhY3Rpb25zID0gbXV0YWJsZVNldE9mPFN0cmluZz4oKQotICAgICAgICAgICAgdmFsIGNvbnN0cnVjdGlvbiA9IGZpbmRJbnRlbnRGaWx0ZXJDb25zdHJ1Y3Rpb24oZmlsdGVyQXJnLCBub2RlKQotCi0gICAgICAgICAgICBpZiAoY29uc3RydWN0aW9uID09IG51bGwpIHJldHVybiBQYWlyKGZhbHNlLCBsaXN0T2Y8U3RyaW5nPigpKQotICAgICAgICAgICAgdmFsIGNvbnN0cnVjdG9yQWN0aW9uQXJnID0gY29uc3RydWN0aW9uLmdldEFyZ3VtZW50Rm9yUGFyYW1ldGVyKDApCi0gICAgICAgICAgICAoY29uc3RydWN0b3JBY3Rpb25Bcmc/LmxldChldmFsdWF0b3I6OmV2YWx1YXRlKSBhcz8gU3RyaW5nKT8ubGV0KGFjdGlvbnM6OmFkZCkKLQotICAgICAgICAgICAgdmFsIGFjdGlvbkNvbGxlY3RvclZpc2l0b3IgPQotICAgICAgICAgICAgICAgIEFjdGlvbkNvbGxlY3RvclZpc2l0b3Ioc2V0T2YoY29uc3RydWN0aW9uKSwgbm9kZSwgZXZhbHVhdG9yKQotCi0gICAgICAgICAgICB2YWwgcGFyZW50ID0gbm9kZS5nZXRDb250YWluaW5nVU1ldGhvZCgpCi0gICAgICAgICAgICBwYXJlbnQ/LmFjY2VwdChhY3Rpb25Db2xsZWN0b3JWaXNpdG9yKQotICAgICAgICAgICAgYWN0aW9ucy5hZGRBbGwoYWN0aW9uQ29sbGVjdG9yVmlzaXRvci5hY3Rpb25zKQotCi0gICAgICAgICAgICAvLyBJZiB3ZSBmYWlsZWQgdG8gZXZhbHVhdGUgYW55IGFjdGlvbnMsIHRoZXJlIHdpbGwgYmUgYSBudWxsIGFjdGlvbiBpbiB0aGUgc2V0LgotICAgICAgICAgICAgdmFsIGlzUHJvdGVjdGVkID0KLSAgICAgICAgICAgICAgYWN0aW9ucy5hbGwoUFJPVEVDVEVEX0JST0FEQ0FTVFM6OmNvbnRhaW5zKSAmJgotICAgICAgICAgICAgICAgICFhY3Rpb25Db2xsZWN0b3JWaXNpdG9yLmludGVudEZpbHRlckVzY2FwZXNTY29wZQotICAgICAgICAgICAgdmFsIHVucHJvdGVjdGVkQWN0aW9uc0xpc3QgPSBhY3Rpb25zLmZpbHRlck5vdChQUk9URUNURURfQlJPQURDQVNUUzo6Y29udGFpbnMpCi0gICAgICAgICAgICByZXR1cm4gUGFpcihpc1Byb3RlY3RlZCwgdW5wcm90ZWN0ZWRBY3Rpb25zTGlzdCkKLSAgICAgICAgfQotCi0gICAgb3ZlcnJpZGUgZnVuIHZpc2l0TWV0aG9kQ2FsbChjb250ZXh0OiBKYXZhQ29udGV4dCwgbm9kZTogVUNhbGxFeHByZXNzaW9uLCBtZXRob2Q6IFBzaU1ldGhvZCkgewotICAgICAgICBpZiAoIWNvbnRleHQuZXZhbHVhdG9yLmlzTWVtYmVySW5TdWJDbGFzc09mKG1ldGhvZCwgImFuZHJvaWQuY29udGVudC5Db250ZXh0IikpIHJldHVybgotCi0gICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgcG9zaXRpb25zIHZhcnkgYWNyb3NzIHRoZSB2YXJpb3VzIHJlZ2lzdGVyUmVjZWl2ZXIqKCkgbWV0aG9kcywgc28gcmF0aGVyCi0gICAgICAgIC8vIHRoYW4gaGFyZGNvZGUgdGhlbSB3ZSBzaW1wbHkgbG9vayB0aGVtIHVwIGJhc2VkIG9uIHRoZSBwYXJhbWV0ZXIgbmFtZSBhbmQgdHlwZS4KLSAgICAgICAgdmFsIHJlY2VpdmVyQXJnID0KLSAgICAgICAgICAgIGZpbmRBcmd1bWVudChub2RlLCBtZXRob2QsICJhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIiLCAicmVjZWl2ZXIiKQotICAgICAgICB2YWwgZmlsdGVyQXJnID0gZmluZEFyZ3VtZW50KG5vZGUsIG1ldGhvZCwgImFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIiLCAiZmlsdGVyIikKLSAgICAgICAgdmFsIGZsYWdzQXJnID0gZmluZEFyZ3VtZW50KG5vZGUsIG1ldGhvZCwgImludCIsICJmbGFncyIpCi0KLSAgICAgICAgaWYgKHJlY2VpdmVyQXJnID09IG51bGwgfHwgcmVjZWl2ZXJBcmcuaXNOdWxsTGl0ZXJhbCgpIHx8IGZpbHRlckFyZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgfQotCi0gICAgICAgIHZhbCBldmFsdWF0b3IgPSBDb25zdGFudEV2YWx1YXRvcigpLmFsbG93RmllbGRJbml0aWFsaXplcnMoKQotCi0gICAgICAgIHZhbCAoaXNQcm90ZWN0ZWQsIHVucHJvdGVjdGVkQWN0aW9uc0xpc3QpID0KLSAgICAgICAgICBjaGVja0lzUHJvdGVjdGVkUmVjZWl2ZXJBbmRSZXR1cm5VbnByb3RlY3RlZEFjdGlvbnMoZmlsdGVyQXJnLCBub2RlLCBldmFsdWF0b3IpCi0KLSAgICAgICAgdmFsIGZsYWdzID0gZXZhbHVhdG9yLmV2YWx1YXRlKGZsYWdzQXJnKSBhcz8gSW50Ci0KLSAgICAgICAgaWYgKCFpc1Byb3RlY3RlZCkgewotICAgICAgICAgICAgdmFsIGFjdGlvbnNMaXN0ID0gdW5wcm90ZWN0ZWRBY3Rpb25zTGlzdC5qb2luVG9TdHJpbmcoIiwgIiwgIiIsICIiLCAtMSwgIiIpCi0gICAgICAgICAgICB2YWwgbWVzc2FnZSA9ICIkcmVjZWl2ZXJBcmcgaXMgbWlzc2luZyAnUkVDRUlWRURfRVhQT1JURURgIG9yICdSRUNFSVZFX05PVF9FWFBPUlRFRCcgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsYWcgZm9yIHVucHJvdGVjdGVkIGJyb2FkY2FzdChzKSByZWdpc3RlcmVkIGZvciAkYWN0aW9uc0xpc3QuIgotICAgICAgICAgICAgaWYgKGZsYWdzQXJnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydCgKLSAgICAgICAgICAgICAgICAgIElTU1VFX1JFQ0VJVkVSX0VYUE9SVEVEX0ZMQUcsIG5vZGUsIGNvbnRleHQuZ2V0TG9jYXRpb24obm9kZSksIG1lc3NhZ2UpCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICE9IG51bGwgJiYgKGZsYWdzIGFuZCBSRUNFSVZFUl9FWFBPUlRFRF9GTEFHX1BSRVNFTlRfTUFTSykgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KAotICAgICAgICAgICAgICAgICAgSVNTVUVfUkVDRUlWRVJfRVhQT1JURURfRkxBRywgbm9kZSwgY29udGV4dC5nZXRMb2NhdGlvbihmbGFnc0FyZyksIG1lc3NhZ2UpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIHByaW50bG4obm9kZS5hc1JlbmRlclN0cmluZygpKQotICAgICAgICAgICAgcHJpbnRsbigiVW5wcm90ZWN0ZWQgQWN0aW9uczogJHVucHJvdGVjdGVkQWN0aW9uc0xpc3QiKQotICAgICAgICAgICAgcHJpbnRsbigiUHJvdGVjdGVkOiAkaXNQcm90ZWN0ZWQiKQotICAgICAgICAgICAgcHJpbnRsbigiRmxhZ3M6ICRmbGFncyIpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogRmluZHMgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGEgbWV0aG9kIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcGFyYW1ldGVyIHR5cGUgYW5kIG5hbWUuICovCi0gICAgcHJpdmF0ZSBmdW4gZmluZEFyZ3VtZW50KAotICAgICAgICAgICAgbm9kZTogVUNhbGxFeHByZXNzaW9uLAotICAgICAgICAgICAgbWV0aG9kOiBQc2lNZXRob2QsCi0gICAgICAgICAgICB0eXBlOiBTdHJpbmcsCi0gICAgICAgICAgICBuYW1lOiBTdHJpbmcKLSAgICApOiBVRXhwcmVzc2lvbj8gewotICAgICAgICB2YWwgcHNpUGFyYW1ldGVyID0gbWV0aG9kLnBhcmFtZXRlckxpc3QucGFyYW1ldGVycy5maXJzdE9yTnVsbCB7Ci0gICAgICAgICAgICBpdC50eXBlLmNhbm9uaWNhbFRleHQgPT0gdHlwZSAmJiBpdC5uYW1lID09IG5hbWUKLSAgICAgICAgfSA/OiByZXR1cm4gbnVsbAotICAgICAgICB2YWwgYXJndW1lbnQgPSBub2RlLmdldEFyZ3VtZW50Rm9yUGFyYW1ldGVyKHBzaVBhcmFtZXRlci5wYXJhbWV0ZXJJbmRleCgpKQotICAgICAgICByZXR1cm4gYXJndW1lbnQ/LnNraXBQYXJlbnRoZXNpemVkRXhwckRvd24oKQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciB0aGUgc3VwcGxpZWQgZXhwcmVzc2lvbiAoZWcuIGludGVudCBmaWx0ZXIgYXJndW1lbnQpLCBhdHRlbXB0cyB0byBmaW5kIGl0cyBjb25zdHJ1Y3Rpb24uCi0gICAgICogVGhpcyB3aWxsIGJlIGFuIGBJbnRlbnRGaWx0ZXIoKWAgY29uc3RydWN0b3IsIGFuIGBJbnRlbnRGaWx0ZXIuY3JlYXRlKClgIGNhbGwsIG9yIGBudWxsYC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZ1biBmaW5kSW50ZW50RmlsdGVyQ29uc3RydWN0aW9uKAotICAgICAgICAgICAgZXhwcmVzc2lvbjogVUV4cHJlc3Npb24sCi0gICAgICAgICAgICBub2RlOiBVQ2FsbEV4cHJlc3Npb24KLSAgICApOiBVQ2FsbEV4cHJlc3Npb24/IHsKLSAgICAgICAgdmFsIHJlc29sdmVkID0gZXhwcmVzc2lvbi50cnlSZXNvbHZlKCkKLQotICAgICAgICBpZiAocmVzb2x2ZWQgaXMgUHNpVmFyaWFibGUpIHsKLSAgICAgICAgICAgIHZhbCBhc3NpZ25tZW50ID0gZmluZExhc3RBc3NpZ25tZW50KHJlc29sdmVkLCBub2RlKSA/OiByZXR1cm4gbnVsbAotICAgICAgICAgICAgcmV0dXJuIGZpbmRJbnRlbnRGaWx0ZXJDb25zdHJ1Y3Rpb24oYXNzaWdubWVudCwgbm9kZSkKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHByZXNzaW9uIGlzIFVQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgewotICAgICAgICAgICAgcmV0dXJuIGZpbmRJbnRlbnRGaWx0ZXJDb25zdHJ1Y3Rpb24oZXhwcmVzc2lvbi5leHByZXNzaW9uLCBub2RlKQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cHJlc3Npb24gaXMgVVF1YWxpZmllZFJlZmVyZW5jZUV4cHJlc3Npb24pIHsKLSAgICAgICAgICAgIHZhbCBjYWxsID0gZXhwcmVzc2lvbi5zZWxlY3RvciBhcz8gVUNhbGxFeHByZXNzaW9uID86IHJldHVybiBudWxsCi0gICAgICAgICAgICByZXR1cm4gaWYgKGlzUmV0dXJuaW5nQ29udGV4dChjYWxsKSkgewotICAgICAgICAgICAgICAgIC8vIGVnLiBmaWx0ZXIuYXBwbHkgeyBhZGRBY3Rpb24oImFiYyIpIH0gLS0+IHVzZSBmaWx0ZXIgdmFyaWFibGUuCi0gICAgICAgICAgICAgICAgZmluZEludGVudEZpbHRlckNvbnN0cnVjdGlvbihleHByZXNzaW9uLnJlY2VpdmVyLCBub2RlKQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBlZy4gSW50ZW50RmlsdGVyLmNyZWF0ZSgiYWJjIikgLS0+IHVzZSBjcmVhdGUoImFiYyIpIFVDYWxsRXhwcmVzc2lvbi4KLSAgICAgICAgICAgICAgICBmaW5kSW50ZW50RmlsdGVyQ29uc3RydWN0aW9uKGNhbGwsIG5vZGUpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgbWV0aG9kID0gcmVzb2x2ZWQgYXM/IFBzaU1ldGhvZCA/OiByZXR1cm4gbnVsbAotICAgICAgICByZXR1cm4gaWYgKGlzSW50ZW50RmlsdGVyRmFjdG9yeU1ldGhvZChtZXRob2QpKSB7Ci0gICAgICAgICAgICBleHByZXNzaW9uIGFzPyBVQ2FsbEV4cHJlc3Npb24KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bGwKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuIGlzSW50ZW50RmlsdGVyRmFjdG9yeU1ldGhvZChtZXRob2Q6IFBzaU1ldGhvZCkgPQotICAgICAgICAgICAgKG1ldGhvZC5jb250YWluaW5nQ2xhc3M/LnF1YWxpZmllZE5hbWUgPT0gImFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIiICYmCi0gICAgICAgICAgICAgICAobWV0aG9kLnJldHVyblR5cGU/LmNhbm9uaWNhbFRleHQgPT0gImFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIiIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5pc0NvbnN0cnVjdG9yKSkKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2FsbCByZXByZXNlbnRzIGEgS290bGluIHNjb3BlIGZ1bmN0aW9uIHdoZXJlIHRoZSByZXR1cm4gdmFsdWUgaXMKLSAgICAgKiB0aGUgY29udGV4dCBvYmplY3Q7IHNlZSBodHRwczovL2tvdGxpbmxhbmcub3JnL2RvY3Mvc2NvcGUtZnVuY3Rpb25zLmh0bWwjZnVuY3Rpb24tc2VsZWN0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgZnVuIGlzUmV0dXJuaW5nQ29udGV4dChub2RlOiBVQ2FsbEV4cHJlc3Npb24pOiBCb29sZWFuIHsKLSAgICAgICAgdmFsIG5hbWUgPSBnZXRNZXRob2ROYW1lKG5vZGUpCi0gICAgICAgIGlmIChuYW1lID09ICJhcHBseSIgfHwgbmFtZSA9PSAiYWxzbyIpIHsKLSAgICAgICAgICAgIHJldHVybiBpc1Njb3BpbmdGdW5jdGlvbihub2RlKQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbm9kZSBhcHBlYXJzIHRvIGJlIG9uZSBvZiB0aGUgc2NvcGUgZnVuY3Rpb25zLiBPbmx5IGNoZWNrcyBwYXJlbnQKLSAgICAgKiBjbGFzczsgY2FsbGVyIHNob3VsZCBpbnRlbmQgdGhhdCBpdCdzIGFjdHVhbGx5IG9uZSBvZiBsZXQsIHdpdGgsIGFwcGx5LCBldGMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmdW4gaXNTY29waW5nRnVuY3Rpb24obm9kZTogVUNhbGxFeHByZXNzaW9uKTogQm9vbGVhbiB7Ci0gICAgICAgIHZhbCBjYWxsZWQgPSBub2RlLnJlc29sdmUoKSA/OiByZXR1cm4gdHJ1ZQotICAgICAgICAvLyBTZWUgbGlicmFyaWVzL3N0ZGxpYi9qdm0vYnVpbGQvc3RkbGliLWRlY2xhcmF0aW9ucy5qc29uCi0gICAgICAgIHJldHVybiBjYWxsZWQuY29udGFpbmluZ0NsYXNzPy5xdWFsaWZpZWROYW1lID09ICJrb3RsaW4uU3RhbmRhcmRLdF9fU3RhbmRhcmRLdCIKLSAgICB9Ci0KLSAgICBpbm5lciBjbGFzcyBBY3Rpb25Db2xsZWN0b3JWaXNpdG9yKAotICAgICAgICBzdGFydDogQ29sbGVjdGlvbjxVRWxlbWVudD4sCi0gICAgICAgIHZhbCBmdW5jdGlvbkNhbGw6IFVDYWxsRXhwcmVzc2lvbiwKLSAgICAgICAgdmFsIGV2YWx1YXRvcjogQ29uc3RhbnRFdmFsdWF0b3IsCi0gICAgKSA6IERhdGFGbG93QW5hbHl6ZXIoc3RhcnQpIHsKLSAgICAgICBwcml2YXRlIHZhciBmaW5pc2hlZCA9IGZhbHNlCi0gICAgICAgdmFyIGludGVudEZpbHRlckVzY2FwZXNTY29wZSA9IGZhbHNlOyBwcml2YXRlIHNldAotICAgICAgIHZhbCBhY3Rpb25zID0gbXV0YWJsZVNldE9mPFN0cmluZz4oKQotCi0gICAgICAgb3ZlcnJpZGUgZnVuIGFyZ3VtZW50KGNhbGw6IFVDYWxsRXhwcmVzc2lvbiwgcmVmZXJlbmNlOiBVRWxlbWVudCkgewotICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB0ZW1wb3JhcnkgZml4IGZvciBEYXRhRmxvd0FuYWx5emVyIGJ1ZyAoYWcvMTU3ODc1NTApOgotICAgICAgICAgICBpZiAocmVmZXJlbmNlICFpbiBjYWxsLnZhbHVlQXJndW1lbnRzKSByZXR1cm4KLSAgICAgICAgICAgdmFsIG1ldGhvZE5hbWVzID0gc3VwZXJAUmVnaXN0ZXJSZWNlaXZlckZsYWdEZXRlY3Rvci5nZXRBcHBsaWNhYmxlTWV0aG9kTmFtZXMoKQotICAgICAgICAgICB3aGVuIHsKLSAgICAgICAgICAgICAgIGZpbmlzaGVkIC0+IHJldHVybgotICAgICAgICAgICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgcmVnaXN0ZXJSZWNlaXZlciooKSBjYWxsIGluIHF1ZXN0aW9uLgotICAgICAgICAgICAgICAgY2FsbCA9PSBmdW5jdGlvbkNhbGwgLT4gZmluaXNoZWQgPSB0cnVlCi0gICAgICAgICAgICAgICAvLyBUaGUgZmlsdGVyICdpbnRlbnRGaWx0ZXJFc2NhcGVzU2NvcGUnIHRvIGEgbWV0aG9kIHdoaWNoIGNvdWxkIG1vZGlmeSBpdC4KLSAgICAgICAgICAgICAgIG1ldGhvZE5hbWVzICE9IG51bGwgJiYgZ2V0TWV0aG9kTmFtZShjYWxsKSEhICFpbiBtZXRob2ROYW1lcyAtPgotICAgICAgICAgICAgICAgICBpbnRlbnRGaWx0ZXJFc2NhcGVzU2NvcGUgPSB0cnVlCi0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgICAvLyBGaXhlZCBpbiBiLzE5OTE2MzkxNTogRGF0YUZsb3dBbmFseXplciBkb2Vzbid0IGNhbGwgdGhpcyBmb3IgS290bGluIHByb3BlcnRpZXMuCi0gICAgICAgb3ZlcnJpZGUgZnVuIGZpZWxkKGZpZWxkOiBVRWxlbWVudCkgewotICAgICAgICAgICBpZiAoIWZpbmlzaGVkKSBpbnRlbnRGaWx0ZXJFc2NhcGVzU2NvcGUgPSB0cnVlCi0gICAgICAgfQotCi0gICAgICAgb3ZlcnJpZGUgZnVuIHJlY2VpdmVyKGNhbGw6IFVDYWxsRXhwcmVzc2lvbikgewotICAgICAgICAgICBpZiAoIWZpbmlzaGVkICYmIGdldE1ldGhvZE5hbWUoY2FsbCkgPT0gImFkZEFjdGlvbiIpIHsKLSAgICAgICAgICAgICAgIHZhbCBhY3Rpb25BcmcgPSBjYWxsLmdldEFyZ3VtZW50Rm9yUGFyYW1ldGVyKDApCi0gICAgICAgICAgICAgICBpZiAoYWN0aW9uQXJnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICB2YWwgYWN0aW9uID0gZXZhbHVhdG9yLmV2YWx1YXRlKGFjdGlvbkFyZykgYXM/IFN0cmluZwotICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgYWN0aW9ucy5hZGQoYWN0aW9uKQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLQotICAgIGNvbXBhbmlvbiBvYmplY3QgewotICAgICAgICBjb25zdCB2YWwgREVCVUcgPSBmYWxzZQotCi0gICAgICAgIHByaXZhdGUgY29uc3QgdmFsIFJFQ0VJVkVSX0VYUE9SVEVEID0gMHgyCi0gICAgICAgIHByaXZhdGUgY29uc3QgdmFsIFJFQ0VJVkVSX05PVF9FWFBPUlRFRCA9IDB4NAotICAgICAgICBwcml2YXRlIGNvbnN0IHZhbCBSRUNFSVZFUl9FWFBPUlRFRF9GTEFHX1BSRVNFTlRfTUFTSyA9Ci0gICAgICAgICAgUkVDRUlWRVJfRVhQT1JURUQgb3IgUkVDRUlWRVJfTk9UX0VYUE9SVEVECi0KLSAgICAgICAgQEp2bUZpZWxkCi0gICAgICAgIHZhbCBJU1NVRV9SRUNFSVZFUl9FWFBPUlRFRF9GTEFHOiBJc3N1ZSA9IElzc3VlLmNyZWF0ZSgKLSAgICAgICAgICAgICAgICBpZCA9ICJVbnNwZWNpZmllZFJlZ2lzdGVyUmVjZWl2ZXJGbGFnIiwKLSAgICAgICAgICAgICAgICBicmllZkRlc2NyaXB0aW9uID0gIk1pc3NpbmcgYHJlZ2lzdGVyUmVjZWl2ZXIoKWAgZXhwb3J0ZWQgZmxhZyIsCi0gICAgICAgICAgICAgICAgZXhwbGFuYXRpb24gPSAiIiIKLSAgICAgICAgICAgICAgICAgICAgQXBwcyB0YXJnZXRpbmcgQW5kcm9pZCBUIChTREsgMzMpIGFuZCBoaWdoZXIgbXVzdCBzcGVjaWZ5IGVpdGhlciBgUkVDRUlWRVJfRVhQT1JURURgIFwKLSAgICAgICAgICAgICAgICAgICAgb3IgYFJFQ0VJVkVSX05PVF9FWFBPUlRFRGAgd2hlbiByZWdpc3RlcmluZyBhIGJyb2FkY2FzdCByZWNlaXZlciwgdW5sZXNzIHRoZSBcCi0gICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyIGlzIG9ubHkgcmVnaXN0ZXJlZCBmb3IgcHJvdGVjdGVkIHN5c3RlbSBicm9hZGNhc3QgYWN0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgIiIiLAotICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gQ2F0ZWdvcnkuU0VDVVJJVFksCi0gICAgICAgICAgICAgICAgcHJpb3JpdHkgPSA1LAotICAgICAgICAgICAgICAgIHNldmVyaXR5ID0gU2V2ZXJpdHkuV0FSTklORywKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiA9IEltcGxlbWVudGF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJSZWNlaXZlckZsYWdEZXRlY3Rvcjo6Y2xhc3MuamF2YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlLkpBVkFfRklMRV9TQ09QRQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgKQotCi0gICAgICAgIHZhbCBQUk9URUNURURfQlJPQURDQVNUUyA9IGxpc3RPZigKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlNDUkVFTl9PRkYiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uU0NSRUVOX09OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVTRVJfUFJFU0VOVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5USU1FX1NFVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5USU1FX1RJQ0siLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uVElNRVpPTkVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5EQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUFJFX0JPT1RfQ09NUExFVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkJPT1RfQ09NUExFVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBQ0tBR0VfSU5TVEFMTCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QQUNLQUdFX0FEREVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBQ0tBR0VfUkVQTEFDRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uTVlfUEFDS0FHRV9SRVBMQUNFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QQUNLQUdFX1JFTU9WRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUEFDS0FHRV9SRU1PVkVEX0lOVEVSTkFMIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBQ0tBR0VfRlVMTFlfUkVNT1ZFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QQUNLQUdFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUEFDS0FHRV9GVUxMWV9MT0FERUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUEFDS0FHRV9FTkFCTEVfUk9MTEJBQ0siLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQ0FOQ0VMX0VOQUJMRV9ST0xMQkFDSyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5ST0xMQkFDS19DT01NSVRURUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUEFDS0FHRV9SRVNUQVJURUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUEFDS0FHRV9EQVRBX0NMRUFSRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUEFDS0FHRV9GSVJTVF9MQVVOQ0giLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUEFDS0FHRV9ORUVEU19JTlRFR1JJVFlfVkVSSUZJQ0FUSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBQ0tBR0VfTkVFRFNfVkVSSUZJQ0FUSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBQ0tBR0VfVkVSSUZJRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUEFDS0FHRVNfU1VTUEVOREVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBQ0tBR0VTX1VOU1VTUEVOREVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBQ0tBR0VTX1NVU1BFTlNJT05fQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QQUNLQUdFX1VOU1VTUEVOREVEX01BTlVBTExZIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRJU1RSQUNUSU5HX1BBQ0tBR0VTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQUNUSU9OX1BSRUZFUlJFRF9BQ1RJVklUWV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVJRF9SRU1PVkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlFVRVJZX1BBQ0tBR0VfUkVTVEFSVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5DT05GSUdVUkFUSU9OX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uU1BMSVRfQ09ORklHVVJBVElPTl9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkxPQ0FMRV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFQUExJQ0FUSU9OX0xPQ0FMRV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkJBVFRFUllfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5CQVRURVJZX0xFVkVMX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQkFUVEVSWV9MT1ciLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQkFUVEVSWV9PS0FZIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFDVElPTl9QT1dFUl9DT05ORUNURUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQUNUSU9OX1BPV0VSX0RJU0NPTk5FQ1RFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5BQ1RJT05fU0hVVERPV04iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQ0hBUkdJTkciLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uRElTQ0hBUkdJTkciLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uREVWSUNFX1NUT1JBR0VfTE9XIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRFVklDRV9TVE9SQUdFX09LIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRFVklDRV9TVE9SQUdFX0ZVTEwiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uREVWSUNFX1NUT1JBR0VfTk9UX0ZVTEwiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uTkVXX09VVEdPSU5HX0NBTEwiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUkVCT09UIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRPQ0tfRVZFTlQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uVEhFUk1BTF9FVkVOVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQVNURVJfQ0xFQVJfTk9USUZJQ0FUSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVTRVJfQURERUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uVVNFUl9SRU1PVkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVTRVJfU1RBUlRJTkciLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uVVNFUl9TVEFSVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVTRVJfU1RPUFBJTkciLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uVVNFUl9TVE9QUEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVTRVJfQkFDS0dST1VORCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5VU0VSX0ZPUkVHUk9VTkQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uVVNFUl9TV0lUQ0hFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5VU0VSX0lOSVRJQUxJWkUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uSU5URU5UX0ZJTFRFUl9ORUVEU19WRVJJRklDQVRJT04iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uRE9NQUlOU19ORUVEX1ZFUklGSUNBVElPTiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5PVkVSTEFZX0FEREVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk9WRVJMQVlfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5PVkVSTEFZX1JFTU9WRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uT1ZFUkxBWV9QUklPUklUWV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1ZX1BBQ0tBR0VfU1VTUEVOREVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1ZX1BBQ0tBR0VfVU5TVVNQRU5ERUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLmFjdGlvbi5QT1dFUl9TQVZFX01PREVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQub3MuYWN0aW9uLkRFVklDRV9JRExFX01PREVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQub3MuYWN0aW9uLlBPV0VSX1NBVkVfV0hJVEVMSVNUX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLmFjdGlvbi5QT1dFUl9TQVZFX1RFTVBfV0hJVEVMSVNUX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLmFjdGlvbi5QT1dFUl9TQVZFX01PREVfQ0hBTkdFRF9JTlRFUk5BTCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQub3MuYWN0aW9uLkxPV19QT1dFUl9TVEFOREJZX0VOQUJMRURfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQub3MuYWN0aW9uLkVOSEFOQ0VEX0RJU0NIQVJHRV9QUkVESUNUSU9OX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLmFjdGlvbi5TQ1JFRU5fQlJJR0hUTkVTU19CT09TVF9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLkNMT1NFX05PVElGSUNBVElPTl9IQU5ETEVSX1BBTkVMIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLkVOVEVSX0NBUl9NT0RFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLkVYSVRfQ0FSX01PREUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uRU5URVJfQ0FSX01PREVfUFJJT1JJVElaRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uRVhJVF9DQVJfTU9ERV9QUklPUklUSVpFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5FTlRFUl9ERVNLX01PREUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uRVhJVF9ERVNLX01PREUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uTkVYVF9BTEFSTV9DTE9DS19DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLlVTRVJfQURERUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uVVNFUl9SRU1PVkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLlVTRVJfU1RBUlRFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5VU0VSX1NUT1BQRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uVVNFUl9TV0lUQ0hFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5CVUdSRVBPUlRfU0hBUklOR19ERUNMSU5FRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5CVUdSRVBPUlRfRkFJTEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLkJVR1JFUE9SVF9TSEFSRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5TSE9XX0RFVklDRV9NT05JVE9SSU5HX0RJQUxPRyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QRU5ESU5HX0lOQ0lERU5UX1JFUE9SVFNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5JTkNJREVOVF9SRVBPUlRfUkVBRFkiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcHdpZGdldC5hY3Rpb24uQVBQV0lER0VUX1VQREFURV9PUFRJT05TIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHB3aWRnZXQuYWN0aW9uLkFQUFdJREdFVF9ERUxFVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHB3aWRnZXQuYWN0aW9uLkFQUFdJREdFVF9ESVNBQkxFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwd2lkZ2V0LmFjdGlvbi5BUFBXSURHRVRfRU5BQkxFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwd2lkZ2V0LmFjdGlvbi5BUFBXSURHRVRfSE9TVF9SRVNUT1JFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwd2lkZ2V0LmFjdGlvbi5BUFBXSURHRVRfUkVTVE9SRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcHdpZGdldC5hY3Rpb24uQVBQV0lER0VUX0VOQUJMRV9BTkRfVVBEQVRFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5vcy5hY3Rpb24uU0VUVElOR19SRVNUT1JFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmJhY2t1cC5pbnRlbnQuQ0xFQVIiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5iYWNrdXAuaW50ZW50LklOSVQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnRlbnQuRElTQ09WRVJBQkxFX1RJTUVPVVQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hZGFwdGVyLmFjdGlvbi5TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYWRhcHRlci5hY3Rpb24uU0NBTl9NT0RFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hZGFwdGVyLmFjdGlvbi5ESVNDT1ZFUllfU1RBUlRFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmFkYXB0ZXIuYWN0aW9uLkRJU0NPVkVSWV9GSU5JU0hFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmFkYXB0ZXIuYWN0aW9uLkxPQ0FMX05BTUVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmFkYXB0ZXIuYWN0aW9uLkJMVUVUT09USF9BRERSRVNTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hZGFwdGVyLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5kZXZpY2UuYWN0aW9uLlVVSUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5kZXZpY2UuYWN0aW9uLk1BU19JTlNUQU5DRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmRldmljZS5hY3Rpb24uQUxJQVNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmRldmljZS5hY3Rpb24uRk9VTkQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5kZXZpY2UuYWN0aW9uLkNMQVNTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5kZXZpY2UuYWN0aW9uLkFDTF9DT05ORUNURUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5kZXZpY2UuYWN0aW9uLkFDTF9ESVNDT05ORUNUX1JFUVVFU1RFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmRldmljZS5hY3Rpb24uQUNMX0RJU0NPTk5FQ1RFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmRldmljZS5hY3Rpb24uTkFNRV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguZGV2aWNlLmFjdGlvbi5CT05EX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5kZXZpY2UuYWN0aW9uLk5BTUVfRkFJTEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguZGV2aWNlLmFjdGlvbi5QQUlSSU5HX1JFUVVFU1QiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5kZXZpY2UuYWN0aW9uLlBBSVJJTkdfQ0FOQ0VMIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguZGV2aWNlLmFjdGlvbi5DT05ORUNUSU9OX0FDQ0VTU19SRVBMWSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmRldmljZS5hY3Rpb24uQ09OTkVDVElPTl9BQ0NFU1NfQ0FOQ0VMIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguZGV2aWNlLmFjdGlvbi5DT05ORUNUSU9OX0FDQ0VTU19SRVFVRVNUIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguZGV2aWNlLmFjdGlvbi5TRFBfUkVDT1JEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguZGV2aWNlLmFjdGlvbi5CQVRURVJZX0xFVkVMX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5kZXZpY2VwaWNrZXIuYWN0aW9uLkxBVU5DSCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmRldmljZXBpY2tlci5hY3Rpb24uREVWSUNFX1NFTEVDVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYWN0aW9uLkNTSVNfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYWN0aW9uLkNTSVNfREVWSUNFX0FWQUlMQUJMRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmFjdGlvbi5DU0lTX1NFVF9NRU1CRVJfQVZBSUxBQkxFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgubWFwbWNlLnByb2ZpbGUuYWN0aW9uLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLm1hcG1jZS5wcm9maWxlLmFjdGlvbi5NRVNTQUdFX1JFQ0VJVkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgubWFwbWNlLnByb2ZpbGUuYWN0aW9uLk1FU1NBR0VfU0VOVF9TVUNDRVNTRlVMTFkiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5tYXBtY2UucHJvZmlsZS5hY3Rpb24uTUVTU0FHRV9ERUxJVkVSRURfU1VDQ0VTU0ZVTExZIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgubWFwbWNlLnByb2ZpbGUuYWN0aW9uLk1FU1NBR0VfUkVBRF9TVEFUVVNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLm1hcG1jZS5wcm9maWxlLmFjdGlvbi5NRVNTQUdFX0RFTEVURURfU1RBVFVTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hY3Rpb24uTEVfQVVESU9fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYWN0aW9uLkxFX0FVRElPX0FDVElWRV9ERVZJQ0VfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmFjdGlvbi5MRV9BVURJT19DT05GX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hY3Rpb24uTEVfQVVESU9fR1JPVVBfTk9ERV9TVEFUVVNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmFjdGlvbi5MRV9BVURJT19HUk9VUF9TVEFUVVNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLnBiYXAucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgucGJhcGNsaWVudC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5zYXAucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5idG9wcC5pbnRlbnQuYWN0aW9uLklOQ09NSU5HX0ZJTEVfTk9USUZJQ0FUSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5idG9wcC5pbnRlbnQuYWN0aW9uLlVTRVJfQ09ORklSTUFUSU9OX1RJTUVPVVQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJ0b3BwLmludGVudC5hY3Rpb24uTElTVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYnRvcHAuaW50ZW50LmFjdGlvbi5PUEVOX09VVEJPVU5EIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5idG9wcC5pbnRlbnQuYWN0aW9uLkhJREVfQ09NUExFVEUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJ0b3BwLmludGVudC5hY3Rpb24uQ09ORklSTSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYnRvcHAuaW50ZW50LmFjdGlvbi5ISURFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5idG9wcC5pbnRlbnQuYWN0aW9uLlJFVFJZIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5idG9wcC5pbnRlbnQuYWN0aW9uLk9QRU4iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJ0b3BwLmludGVudC5hY3Rpb24uT1BFTl9JTkJPVU5EIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5idG9wcC5pbnRlbnQuYWN0aW9uLlRSQU5TRkVSX0NPTVBMRVRFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5idG9wcC5pbnRlbnQuYWN0aW9uLkFDQ0VQVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYnRvcHAuaW50ZW50LmFjdGlvbi5ERUNMSU5FIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmdhdHQuUkVGUkVTSF9CQVRDSEVEX1NDQU4iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgucGJhcC5hdXRoY2hhbGwiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgucGJhcC51c2VyY29uZmlybXRpbWVvdXQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgucGJhcC5hdXRocmVzcG9uc2UiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgucGJhcC5hdXRoY2FuY2VsbGVkIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnNhcC5VU0VSX0NPTkZJUk1fVElNRU9VVCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC5zYXAuYWN0aW9uLkRJU0NPTk5FQ1RfQUNUSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LmFjdGlvbi5XSUZJX0RJU1BMQVlfU1RBVFVTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnVzYi5hY3Rpb24uVVNCX1NUQVRFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS51c2IuYWN0aW9uLlVTQl9QT1JUX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnVzYi5hY3Rpb24uVVNCX0FDQ0VTU09SWV9BVFRBQ0hFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUudXNiLmFjdGlvbi5VU0JfQUNDRVNTT1JZX0RFVEFDSEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS51c2IuYWN0aW9uLlVTQl9BQ0NFU1NPUllfSEFORFNIQUtFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS51c2IuYWN0aW9uLlVTQl9ERVZJQ0VfQVRUQUNIRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnVzYi5hY3Rpb24uVVNCX0RFVklDRV9ERVRBQ0hFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5IRUFEU0VUX1BMVUciLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmFjdGlvbi5IRE1JX0FVRElPX1BMVUciLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmFjdGlvbi5NSUNST1BIT05FX01VVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuYWN0aW9uLlNQRUFLRVJQSE9ORV9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5BVURJT19CRUNPTUlOR19OT0lTWSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuUklOR0VSX01PREVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuVklCUkFURV9TRVRUSU5HX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLlZPTFVNRV9DSEFOR0VEX0FDVElPTiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuTUFTVEVSX1ZPTFVNRV9DSEFOR0VEX0FDVElPTiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuTUFTVEVSX01VVEVfQ0hBTkdFRF9BQ1RJT04iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLk1BU1RFUl9NT05PX0NIQU5HRURfQUNUSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5NQVNURVJfQkFMQU5DRV9DSEFOR0VEX0FDVElPTiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuU0NPX0FVRElPX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLkFDVElPTl9TQ09fQVVESU9fU1RBVEVfVVBEQVRFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NRURJQV9SRU1PVkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1FRElBX1VOTU9VTlRFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NRURJQV9DSEVDS0lORyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NRURJQV9OT0ZTIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1FRElBX01PVU5URUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uTUVESUFfU0hBUkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1FRElBX1VOU0hBUkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1FRElBX0JBRF9SRU1PVkFMIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1FRElBX1VOTU9VTlRBQkxFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1FRElBX0VKRUNUIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQuY29ubi5DQVBUSVZFX1BPUlRBTCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LmNvbm4uQ09OTkVDVElWSVRZX0NIQU5HRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LmNvbm4uQ09OTkVDVElWSVRZX0NIQU5HRV9JTU1FRElBVEUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC5jb25uLkRBVEFfQUNUSVZJVFlfQ0hBTkdFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQuY29ubi5SRVNUUklDVF9CQUNLR1JPVU5EX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC5jb25uLkJBQ0tHUk9VTkRfREFUQV9TRVRUSU5HX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC5jb25uLkNBUFRJVkVfUE9SVEFMX1RFU1RfQ09NUExFVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQubnNkLlNUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlLm9tYXBpLmFjdGlvbi5TRUNVUkVfRUxFTUVOVF9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZmMuYWN0aW9uLkFEQVBURVJfU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmZjLmFjdGlvbi5QUkVGRVJSRURfUEFZTUVOVF9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZmMuYWN0aW9uLlRSQU5TQUNUSU9OX0RFVEVDVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZmMuYWN0aW9uLlJFUVVJUkVfVU5MT0NLX0ZPUl9ORkMiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5uZmMuYWN0aW9uLkxMQ1BfVVAiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5uZmMuYWN0aW9uLkxMQ1BfRE9XTiIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm5mYy5jYXJkZW11bGF0aW9uLmFjdGlvbi5DTE9TRV9UQVBfRElBTE9HIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubmZjLmhhbmRvdmVyLmFjdGlvbi5BTExPV19DT05ORUNUIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubmZjLmhhbmRvdmVyLmFjdGlvbi5ERU5ZX0NPTk5FQ1QiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5uZmMuaGFuZG92ZXIuYWN0aW9uLlRJTUVPVVRfQ09OTkVDVCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm5mY19leHRyYXMuYWN0aW9uLlJGX0ZJRUxEX09OX0RFVEVDVEVEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubmZjX2V4dHJhcy5hY3Rpb24uUkZfRklFTERfT0ZGX0RFVEVDVEVEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubmZjX2V4dHJhcy5hY3Rpb24uQUlEX1NFTEVDVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5idG9wcC5pbnRlbnQuYWN0aW9uLldISVRFTElTVF9ERVZJQ0UiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJ0b3BwLmludGVudC5hY3Rpb24uU1RPUF9IQU5ET1ZFUl9UUkFOU0ZFUiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmZjLmhhbmRvdmVyLmludGVudC5hY3Rpb24uSEFORE9WRVJfU0VORCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmZjLmhhbmRvdmVyLmludGVudC5hY3Rpb24uSEFORE9WRVJfU0VORF9NVUxUSVBMRSIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm5mYy5oYW5kb3Zlci5hY3Rpb24uQ0FOQ0VMX0hBTkRPVkVSX1RSQU5TRkVSIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQuYWN0aW9uLkNMRUFSX0ROU19DQUNIRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QUk9YWV9DSEFOR0UiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLlVwZGF0ZUxvY2suVVBEQVRFX0xPQ0tfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5EUkVBTUlOR19TVEFSVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRSRUFNSU5HX1NUT1BQRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQU5ZX0RBVEFfU1RBVEUiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuc3RhdHMuYWN0aW9uLlRSSUdHRVJfQ09MTEVDVElPTiIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5XaWZpTWFuYWdlci5hY3Rpb24uU1RBUlRfU0NBTiIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5XaWZpTWFuYWdlci5hY3Rpb24uU1RBUlRfUE5PIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLldpZmlNYW5hZ2VyLmFjdGlvbi5ERUxBWUVEX0RSSVZFUl9TVE9QIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLldpZmlNYW5hZ2VyLmFjdGlvbi5ERVZJQ0VfSURMRSIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5hY3Rpb24uUkVNT1RFX0JVR1JFUE9SVF9TSEFSSU5HX0FDQ0VQVEVEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmFjdGlvbi5SRU1PVEVfQlVHUkVQT1JUX1NIQVJJTkdfREVDTElORUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbnRlcm5hbC5hY3Rpb24uRVVJQ0NfRkFDVE9SWV9SRVNFVCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci51c2IuQUNUSU9OX09QRU5fSU5fQVBQUyIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5hbS5ERUxFVEVfRFVNUEhFQVAiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIubmV0LmFjdGlvbi5TTk9PWkVfV0FSTklORyIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5uZXQuYWN0aW9uLlNOT09aRV9SQVBJRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci53aWZpLkFDVElPTl9TSE9XX1NFVF9SQU5ET01JWkFUSU9OX0RFVEFJTFMiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIud2lmaS5hY3Rpb24uTmV0d29ya1N1Z2dlc3Rpb24uVVNFUl9BTExPV0VEX0FQUCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci53aWZpLmFjdGlvbi5OZXR3b3JrU3VnZ2VzdGlvbi5VU0VSX0RJU0FMTE9XRURfQVBQIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLndpZmkuYWN0aW9uLk5ldHdvcmtTdWdnZXN0aW9uLlVTRVJfRElTTUlTU0VEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLndpZmkuYWN0aW9uLkNhcnJpZXJOZXR3b3JrLlVTRVJfQUxMT1dFRF9DQVJSSUVSIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLndpZmkuYWN0aW9uLkNhcnJpZXJOZXR3b3JrLlVTRVJfRElTQUxMT1dFRF9DQVJSSUVSIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLndpZmkuYWN0aW9uLkNhcnJpZXJOZXR3b3JrLlVTRVJfRElTTUlTU0VEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLndpZmkuQ29ubmVjdFRvTmV0d29ya05vdGlmaWNhdGlvbi5VU0VSX0RJU01JU1NFRF9OT1RJRklDQVRJT04iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIud2lmaS5Db25uZWN0VG9OZXR3b3JrTm90aWZpY2F0aW9uLkNPTk5FQ1RfVE9fTkVUV09SSyIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci53aWZpLkNvbm5lY3RUb05ldHdvcmtOb3RpZmljYXRpb24uUElDS19XSUZJX05FVFdPUksiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIud2lmaS5Db25uZWN0VG9OZXR3b3JrTm90aWZpY2F0aW9uLlBJQ0tfTkVUV09SS19BRlRFUl9GQUlMVVJFIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLndpZmkud2FrZXVwLkRJU01JU1NfTk9USUZJQ0FUSU9OIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLndpZmkud2FrZXVwLk9QRU5fV0lGSV9QUkVGRVJFTkNFUyIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci53aWZpLndha2V1cC5PUEVOX1dJRklfU0VUVElOR1MiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIud2lmaS53YWtldXAuVFVSTl9PRkZfV0lGSV9XQUtFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQud2lmaS5XSUZJX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLldJRklfQVBfU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LndpZmkuV0lGSV9DUkVERU5USUFMX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLmF3YXJlLmFjdGlvbi5XSUZJX0FXQVJFX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLmF3YXJlLmFjdGlvbi5XSUZJX0FXQVJFX1JFU09VUkNFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLnJ0dC5hY3Rpb24uV0lGSV9SVFRfU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LndpZmkuU0NBTl9SRVNVTFRTIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQud2lmaS5SU1NJX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLlNUQVRFX0NIQU5HRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LndpZmkuTElOS19DT05GSUdVUkFUSU9OX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLkNPTkZJR1VSRURfTkVUV09SS1NfQ0hBTkdFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQud2lmaS5hY3Rpb24uTkVUV09SS19TRVRUSU5HU19SRVNFVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LndpZmkuYWN0aW9uLlBBU1NQT0lOVF9ERUFVVEhfSU1NSU5FTlQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLmFjdGlvbi5QQVNTUE9JTlRfSUNPTiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LndpZmkuYWN0aW9uLlBBU1NQT0lOVF9PU1VfUFJPVklERVJTX0xJU1QiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLmFjdGlvbi5QQVNTUE9JTlRfU1VCU0NSSVBUSU9OX1JFTUVESUFUSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQud2lmaS5hY3Rpb24uUEFTU1BPSU5UX0xBVU5DSF9PU1VfVklFVyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LndpZmkuYWN0aW9uLlJFRlJFU0hfVVNFUl9QUk9WSVNJT05JTkciLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLmFjdGlvbi5XSUZJX05FVFdPUktfU1VHR0VTVElPTl9QT1NUX0NPTk5FQ1RJT04iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLmFjdGlvbi5XSUZJX1NDQU5fQVZBSUxBQklMSVRZX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLnN1cHBsaWNhbnQuQ09OTkVDVElPTl9DSEFOR0UiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLnN1cHBsaWNhbnQuU1RBVEVfQ0hBTkdFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQud2lmaS5wMnAuU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LndpZmkucDJwLkRJU0NPVkVSWV9TVEFURV9DSEFOR0UiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLnAycC5USElTX0RFVklDRV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQud2lmaS5wMnAuUEVFUlNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LndpZmkucDJwLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQud2lmaS5wMnAuYWN0aW9uLldJRklfUDJQX1BFUlNJU1RFTlRfR1JPVVBTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC5jb25uLlRFVEhFUl9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQuY29ubi5JTkVUX0NPTkRJVElPTl9BQ1RJT04iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC5jb25uLk5FVFdPUktfQ09ORElUSU9OU19NRUFTVVJFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LnNjb3JpbmcuU0NPUkVfTkVUV09SS1MiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC5zY29yaW5nLlNDT1JFUl9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkVYVEVSTkFMX0FQUExJQ0FUSU9OU19BVkFJTEFCTEUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uRVhURVJOQUxfQVBQTElDQVRJT05TX1VOQVZBSUxBQkxFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFJUlBMQU5FX01PREUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQURWQU5DRURfU0VUVElOR1MiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQVBQTElDQVRJT05fUkVTVFJJQ1RJT05TX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuYWRiLldJUkVMRVNTX0RFQlVHX1BBSVJFRF9ERVZJQ0VTIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmFkYi5XSVJFTEVTU19ERUJVR19QQUlSSU5HX1JFU1VMVCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5hZGIuV0lSRUxFU1NfREVCVUdfU1RBVFVTIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFDVElPTl9JRExFX01BSU5URU5BTkNFX1NUQVJUIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFDVElPTl9JRExFX01BSU5URU5BTkNFX0VORCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5BQ1RJT05fVFJJR0dFUl9JRExFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkhETUlfUExVR0dFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QSE9ORV9TVEFURSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5TVUJfREVGQVVMVF9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5sb2NhdGlvbi5QUk9WSURFUlNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubG9jYXRpb24uTU9ERV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5sb2NhdGlvbi5hY3Rpb24uR05TU19DQVBBQklMSVRJRVNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LnByb3h5LlBBQ19SRUZSRVNIIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlY29tLmFjdGlvbi5ERUZBVUxUX0RJQUxFUl9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5wcm92aWRlci5hY3Rpb24uREVGQVVMVF9TTVNfUEFDS0FHRV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5wcm92aWRlci5hY3Rpb24uU01TX01NU19EQl9DUkVBVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5wcm92aWRlci5hY3Rpb24uU01TX01NU19EQl9MT1NUIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkNPTlRFTlRfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255Lk1NU19ET1dOTE9BREVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LmFjdGlvbi5QRVJNSVNTSU9OX1JFU1BPTlNFX1JFQ0VJVkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LmFjdGlvbi5SRVFVRVNUX1BFUk1JU1NJT04iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5mYy5oYW5kb3Zlci5pbnRlbnQuYWN0aW9uLkhBTkRPVkVSX1NUQVJURUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5mYy5oYW5kb3Zlci5pbnRlbnQuYWN0aW9uLlRSQU5TRkVSX0RPTkUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5mYy5oYW5kb3Zlci5pbnRlbnQuYWN0aW9uLlRSQU5TRkVSX1BST0dSRVNTIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZmMuaGFuZG92ZXIuaW50ZW50LmFjdGlvbi5UUkFOU0ZFUl9ET05FIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFDVElPTl9ERUZBVUxUX0RBVEFfU1VCU0NSSVBUSU9OX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQUNUSU9OX0RFRkFVTFRfVk9JQ0VfU1VCU0NSSVBUSU9OX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQUNUSU9OX1NFVF9SQURJT19DQVBBQklMSVRZX0RPTkUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQUNUSU9OX1NFVF9SQURJT19DQVBBQklMSVRZX0ZBSUxFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZXJuYWwucG9saWN5LmFjdGlvbi5CVVJOX0lOX1BST1RFQ1RJT04iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uU1lTVEVNX1VQREFURV9QT0xJQ1lfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5SRVNFVF9QUk9URUNUSU9OX1BPTElDWV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLkRFVklDRV9PV05FUl9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLk1BTkFHRURfVVNFUl9DUkVBVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFOUiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5DQUxMIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkNBTExfUFJJVklMRUdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5EUk9QQk9YX0VOVFJZX0FEREVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLklOUFVUX01FVEhPRF9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLmludGVybmFsX3NpbV9zdGF0ZV9jaGFuZ2VkIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkxPQ0tFRF9CT09UX0NPTVBMRVRFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QUkVDSVNFX0NBTExfU1RBVEUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uU1VCU0NSSVBUSU9OX1BIT05FX1NUQVRFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVTRVJfSU5GT19DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVTRVJfVU5MT0NLRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uV0FMTFBBUEVSX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uREVWSUNFX1BPTElDWV9NQU5BR0VSX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uQ0hPT1NFX1BSSVZBVEVfS0VZX0FMSUFTIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLkRFVklDRV9BRE1JTl9ESVNBQkxFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5ERVZJQ0VfQURNSU5fRElTQUJMRV9SRVFVRVNURUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uREVWSUNFX0FETUlOX0VOQUJMRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uTE9DS19UQVNLX0VOVEVSSU5HIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLkxPQ0tfVEFTS19FWElUSU5HIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLk5PVElGWV9QRU5ESU5HX1NZU1RFTV9VUERBVEUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uQUNUSU9OX1BBU1NXT1JEX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uQUNUSU9OX1BBU1NXT1JEX0VYUElSSU5HIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLkFDVElPTl9QQVNTV09SRF9GQUlMRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uQUNUSU9OX1BBU1NXT1JEX1NVQ0NFRURFRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5BQ1RJT05fRVhQSVJFRF9QQVNTV09SRF9OT1RJRklDQVRJT04iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuQUNUSU9OX1BST0ZJTEVfT0ZGX0RFQURMSU5FIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLkFDVElPTl9UVVJOX1BST0ZJTEVfT05fTk9USUZJQ0FUSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BTkFHRURfUFJPRklMRV9BRERFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQU5BR0VEX1BST0ZJTEVfVU5MT0NLRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFOQUdFRF9QUk9GSUxFX1JFTU9WRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uTUFOQUdFRF9QUk9GSUxFX1BST1ZJU0lPTkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYWRhcHRlci5hY3Rpb24uQkxFX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgubWFwLlVTRVJfQ09ORklSTV9USU1FT1VUIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aE1hcENvbnRlbnRPYnNlcnZlci5hY3Rpb24uTUVTU0FHRV9TRU5UIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aE1hcENvbnRlbnRPYnNlcnZlci5hY3Rpb24uTUVTU0FHRV9ERUxJVkVSWSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuY29udGVudC5qb2JzY2hlZHVsZXIuSk9CX0RFTEFZX0VYUElSRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuU1lOQ19BTEFSTSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuSU5URVJOQUxfUklOR0VSX01PREVfQ0hBTkdFRF9BQ1RJT04iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLlNUUkVBTV9ERVZJQ0VTX0NIQU5HRURfQUNUSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5TVFJFQU1fTVVURV9DSEFOR0VEX0FDVElPTiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LnNpcC5TSVBfU0VSVklDRV9VUCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmZjLmFjdGlvbi5BREFQVEVSX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLmFjdGlvbi5DSEFSR0lORyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQub3MuYWN0aW9uLkRJU0NIQVJHSU5HIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZWFyY2guYWN0aW9uLlNFQVJDSEFCTEVTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlY3VyaXR5LlNUT1JBR0VfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuc2VjdXJpdHkuYWN0aW9uLlRSVVNUX1NUT1JFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlY3VyaXR5LmFjdGlvbi5LRVlDSEFJTl9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZWN1cml0eS5hY3Rpb24uS0VZX0FDQ0VTU19DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlY29tLmFjdGlvbi5OVUlTQU5DRV9DQUxMX1NUQVRVU19DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlY29tLmFjdGlvbi5QSE9ORV9BQ0NPVU5UX1JFR0lTVEVSRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVjb20uYWN0aW9uLlBIT05FX0FDQ09VTlRfVU5SRUdJU1RFUkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlY29tLmFjdGlvbi5QT1NUX0NBTEwiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVjb20uYWN0aW9uLlNIT1dfTUlTU0VEX0NBTExTX05PVElGSUNBVElPTiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQudGVsZXBob255LmFjdGlvbi5DQVJSSUVSX0NPTkZJR19DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYWN0aW9uLkRFRkFVTFRfU1VCU0NSSVBUSU9OX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uREVGQVVMVF9TTVNfU1VCU0NSSVBUSU9OX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uU0VDUkVUX0NPREUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uU0hPV19WT0lDRU1BSUxfTk9USUZJQ0FUSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYWN0aW9uLlNVQlNDUklQVElPTl9QTEFOU19DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLmJ0c2VydmljZS5hY3Rpb24uQUxBUk1fV0FLRVVQIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmFjdGlvbi5ORVRXT1JLX1NUQVRTX1BPTEwiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuYWN0aW9uLk5FVFdPUktfU1RBVFNfVVBEQVRFRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci50aW1lZGV0ZWN0b3IuTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlLmFjdGlvbi5QT0xMIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLnRlbGVjb20uaW50ZW50LmFjdGlvbi5DQUxMU19BRERfRU5UUlkiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXR0aW5ncy5sb2NhdGlvbi5NT0RFX0NIQU5HSU5HIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2V0dGluZ3MuYmx1ZXRvb3RoLkFDVElPTl9ESVNNSVNTX1BBSVJJTkciLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXR0aW5ncy5uZXR3b3JrLkRFTEVURV9TVUJTQ1JJUFRJT04iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXR0aW5ncy5uZXR3b3JrLlNXSVRDSF9UT19TVUJTQ1JJUFRJT04iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXR0aW5ncy53aWZpLmFjdGlvbi5ORVRXT1JLX1JFUVVFU1QiLAotICAgICAgICAgICAgICAgICJOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5USU1FT1VUIiwKLSAgICAgICAgICAgICAgICAiTm90aWZpY2F0aW9uSGlzdG9yeURhdGFiYXNlLkNMRUFOVVAiLAotICAgICAgICAgICAgICAgICJTY2hlZHVsZUNvbmRpdGlvblByb3ZpZGVyLkVWQUxVQVRFIiwKLSAgICAgICAgICAgICAgICAiRXZlbnRDb25kaXRpb25Qcm92aWRlci5FVkFMVUFURSIsCi0gICAgICAgICAgICAgICAgIlNub296ZUhlbHBlci5FVkFMVUFURSIsCi0gICAgICAgICAgICAgICAgIndpZmlfc2Nhbl9hdmFpbGFibGUiLAotICAgICAgICAgICAgICAgICJhY3Rpb24uY25lLnN0YXJ0ZWQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmNvbnRlbnQuam9ic2NoZWR1bGVyLkpPQl9ERUFETElORV9FWFBJUkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFDVElPTl9VTlNPTF9SRVNQT05TRV9PRU1fSE9PS19SQVciLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC5jb25uLkNPTk5FQ1RJVklUWV9DSEFOR0VfU1VQTCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQub3MuYWN0aW9uLkxJR0hUX0RFVklDRV9JRExFX01PREVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQub3Muc3RvcmFnZS5hY3Rpb24uVk9MVU1FX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLnN0b3JhZ2UuYWN0aW9uLkRJU0tfU0NBTk5FRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5hY3Rpb24uVVBEQVRFX1RXSUxJR0hUX1NUQVRFIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmFjdGlvbi5SRVNFVF9UV0lMSUdIVF9BVVRPIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmRldmljZV9pZGxlLlNURVBfSURMRV9TVEFURSIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5kZXZpY2VfaWRsZS5TVEVQX0xJR0hUX0lETEVfU1RBVEUiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuV2lmaS5hY3Rpb24uVE9HR0xFX1BOTyIsCi0gICAgICAgICAgICAgICAgImludGVudC5hY3Rpb24uQUNUSU9OX1JGX0JBTkRfSU5GTyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NRURJQV9SRVNPVVJDRV9HUkFOVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLk5FVFdPUktfTE9HU19BVkFJTEFCTEUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uU0VDVVJJVFlfTE9HU19BVkFJTEFCTEUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uQ09NUExJQU5DRV9BQ0tOT1dMRURHRU1FTlRfUkVRVUlSRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uSU5URVJSVVBUSU9OX0ZJTFRFUl9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLklOVEVSUlVQVElPTl9GSUxURVJfQ0hBTkdFRF9JTlRFUk5BTCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5OT1RJRklDQVRJT05fUE9MSUNZX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uTk9USUZJQ0FUSU9OX1BPTElDWV9BQ0NFU1NfR1JBTlRFRF9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLkFVVE9NQVRJQ19aRU5fUlVMRV9TVEFUVVNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQub3MuYWN0aW9uLkFDVElPTl9FRkZFQ1RTX1NVUFBSRVNTT1JfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5OT1RJRklDQVRJT05fQ0hBTk5FTF9CTE9DS19TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLk5PVElGSUNBVElPTl9DSEFOTkVMX0dST1VQX0JMT0NLX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uTk9USUZJQ0FUSU9OX0xJU1RFTkVSX0VOQUJMRURfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5BUFBfQkxPQ0tfU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQucGVybWlzc2lvbi5HRVRfQVBQX0dSQU5URURfVVJJX1BFUk1JU1NJT05TIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5wZXJtaXNzaW9uLkNMRUFSX0FQUF9HUkFOVEVEX1VSSV9QRVJNSVNTSU9OUyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5EWU5BTUlDX1NFTlNPUl9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hY2NvdW50cy5MT0dJTl9BQ0NPVU5UU19DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hY2NvdW50cy5hY3Rpb24uQUNDT1VOVF9SRU1PVkVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hY2NvdW50cy5hY3Rpb24uVklTSUJMRV9BQ0NPVU5UU19DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc3luYy5TWU5DX0NPTk5fU1RBVFVTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC5zaXAuYWN0aW9uLlNJUF9JTkNPTUlOR19DQUxMIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQucGhvbmUuU0lQX0FERF9QSE9ORSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LnNpcC5hY3Rpb24uU0lQX1JFTU9WRV9QUk9GSUxFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQuc2lwLmFjdGlvbi5TSVBfU0VSVklDRV9VUCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LnNpcC5hY3Rpb24uU0lQX0NBTExfT1BUSU9OX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm5ldC5zaXAuYWN0aW9uLlNUQVJUX1NJUCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmFkYXB0ZXIuYWN0aW9uLkJMRV9BQ0xfQ09OTkVDVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYWRhcHRlci5hY3Rpb24uQkxFX0FDTF9ESVNDT05ORUNURUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dC5wcm9maWxlLmFjdGlvbi5IQU5EU0hBS0UiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dC5wcm9maWxlLmFjdGlvbi5SRVBPUlQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uVFdJTElHSFRfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5maW5nZXJwcmludC5BQ1RJT05fTE9DS09VVF9SRVNFVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubmV0LndpZmkuUEFTU1BPSU5UX0lDT05fUkVDRUlWRUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIubm90aWZpY2F0aW9uLkNvdW50ZG93bkNvbmRpdGlvblByb3ZpZGVyIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZXJ2ZXIubm90aWZpY2F0aW9uLmFjdGlvbi5FTkFCTEVfTkFTIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZXJ2ZXIubm90aWZpY2F0aW9uLmFjdGlvbi5ESVNBQkxFX05BUyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuc2VydmVyLm5vdGlmaWNhdGlvbi5hY3Rpb24uTEVBUk5NT1JFX05BUyIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkFMQVJNX1dBS0VVUCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVybmFsLmxvY2F0aW9uLkFMQVJNX1RJTUVPVVQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uR0xPQkFMX0JVVFRPTiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQU5BR0VEX1BST0ZJTEVfQVZBSUxBQkxFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BTkFHRURfUFJPRklMRV9VTkFWQUlMQUJMRSIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5wbS5ESVNBQkxFX1FVSUVUX01PREVfQUZURVJfVU5MT0NLIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBST0ZJTEVfQUNDRVNTSUJMRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QUk9GSUxFX0lOQUNDRVNTSUJMRSIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5yZXRhaWxkZW1vLkFDVElPTl9SRVNFVF9ERU1PIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRFVklDRV9MT0NLRURfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRlbnQucG0uYWN0aW9uLkNBTl9JTlRFUkFDVF9BQ1JPU1NfUFJPRklMRVNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5BUFBMSUNBVElPTl9ERUxFR0FUSU9OX1NDT1BFU19DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLndtLkFDVElPTl9SRVZPS0VfU1lTVEVNX0FMRVJUX1dJTkRPV19QRVJNSVNTSU9OIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS50di5hY3Rpb24uUEFSRU5UQUxfQ09OVFJPTFNfRU5BQkxFRF9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnBtLmFjdGlvbi5TRVNTSU9OX0NPTU1JVFRFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQub3MuYWN0aW9uLlVTRVJfUkVTVFJJQ1RJT05TX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnR2LmFjdGlvbi5QUkVWSUVXX1BST0dSQU1fQURERURfVE9fV0FUQ0hfTkVYVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEudHYuYWN0aW9uLlBSRVZJRVdfUFJPR1JBTV9CUk9XU0FCTEVfRElTQUJMRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnR2LmFjdGlvbi5XQVRDSF9ORVhUX1BST0dSQU1fQlJPV1NBQkxFX0RJU0FCTEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS50di5hY3Rpb24uQ0hBTk5FTF9CUk9XU0FCTEVfUkVRVUVTVEVEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuU0hPV19JTlBVVF9NRVRIT0RfUElDS0VSIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZW50LmFjdGlvbi50aW1lem9uZS5SVUxFU19VUERBVEVfT1BFUkFUSU9OIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZW50LmFjdGlvbi50aW1lem9uZS5UUklHR0VSX1JVTEVTX1VQREFURV9DSEVDSyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5HRVRfUkVTVFJJQ1RJT05fRU5UUklFUyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQudGVsZXBob255LmV1aWNjLmFjdGlvbi5PVEFfU1RBVFVTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uUFJPRklMRV9PV05FUl9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLlRSQU5TRkVSX09XTkVSU0hJUF9DT01QTEVURSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5BRkZJTElBVEVEX1BST0ZJTEVfVFJBTlNGRVJfT1dORVJTSElQX0NPTVBMRVRFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLlNUQVRTRF9TVEFSVEVEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmJpb21ldHJpY3MuZmluZ2VycHJpbnQuQUNUSU9OX0xPQ0tPVVRfUkVTRVQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuYmlvbWV0cmljcy5mYWNlLkFDVElPTl9MT0NLT1VUX1JFU0VUIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRPQ0tfSURMRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5ET0NLX0FDVElWRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuY29udGVudC5wbS5hY3Rpb24uU0VTU0lPTl9VUERBVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZXR0aW5ncy5hY3Rpb24uR1JBWVNDQUxFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuam9ic2NoZWR1bGVyLkdBUkFHRV9NT0RFX09OIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmpvYnNjaGVkdWxlci5HQVJBR0VfTU9ERV9PRkYiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuam9ic2NoZWR1bGVyLkZPUkNFX0lETEUiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuam9ic2NoZWR1bGVyLlVORk9SQ0VfSURMRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQucHJvdmlkZXIuYWN0aW9uLkRFRkFVTFRfU01TX1BBQ0tBR0VfQ0hBTkdFRF9JTlRFUk5BTCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5ERVZJQ0VfQ1VTVE9NSVpBVElPTl9SRUFEWSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5SRVNFVF9QUk9URUNUSU9OX1BPTElDWV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwuaW50ZW50LmFjdGlvbi5CVUdSRVBPUlRfUkVRVUVTVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zY2hlZHVsaW5nLmFjdGlvbi5SRUJPT1RfUkVBRFkiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uREVWSUNFX1BPTElDWV9DT05TVEFOVFNfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5TQ0hFRFVMRV9FWEFDVF9BTEFSTV9QRVJNSVNTSU9OX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uU0hPV19ORVdfVVNFUl9ESVNDTEFJTUVSIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlY29tLmFjdGlvbi5DVVJSRU5UX1RUWV9NT0RFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uU0VSVklDRV9TVEFURSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5SQURJT19URUNITk9MT0dZIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkVNRVJHRU5DWV9DQUxMQkFDS19NT0RFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uRU1FUkdFTkNZX0NBTExfU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5TSUdfU1RSIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFOWV9EQVRBX1NUQVRFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRBVEFfU1RBTExfREVURUNURUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uU0lNX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uVVNFUl9BQ1RJVklUWV9OT1RJRklDQVRJT04iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uU0hPV19OT1RJQ0VfRUNNX0JMT0NLX09USEVSUyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5BQ1RJT05fTUROX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uU0VSVklDRV9QUk9WSURFUlNfVVBEQVRFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlNJTV9GVUxMIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNhcnJpZXJfa2V5X2Rvd25sb2FkX2FsYXJtIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmRhdGEtcmVzdGFydC10cnlzZXR1cCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5kYXRhLXN0YWxsIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnByb3Zpc2lvbmluZ19hcG5fYWxhcm0iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uREFUQV9TTVNfUkVDRUlWRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TTVNfUkVDRUlWRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TTVNfREVMSVZFUiIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlNNU19SRUpFQ1RFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LldBUF9QVVNIX0RFTElWRVIiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5XQVBfUFVTSF9SRUNFSVZFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LlNNU19DQl9SRUNFSVZFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQucHJvdmlkZXIuYWN0aW9uLlNNU19FTUVSR0VOQ1lfQ0JfUkVDRUlWRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TTVNfU0VSVklDRV9DQVRFR09SWV9QUk9HUkFNX0RBVEFfUkVDRUlWRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TRUNSRVRfQ09ERSIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVybmFsLnN0ay5jb21tYW5kIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RrLnNlc3Npb25fZW5kIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RrLmljY19zdGF0dXNfY2hhbmdlIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RrLmFscGhhX25vdGlmeSIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DQVJSSUVSX1NJR05BTF9SRURJUkVDVEVEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNBUlJJRVJfU0lHTkFMX1JFUVVFU1RfTkVUV09SS19GQUlMRUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ0FSUklFUl9TSUdOQUxfUENPX1ZBTFVFIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNBUlJJRVJfU0lHTkFMX1JFU0VUIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNBUlJJRVJfU0lHTkFMX0RFRkFVTFRfTkVUV09SS19BVkFJTEFCTEUiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUFJPVklTSU9OIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkFDVElPTl9MSU5FMV9OVU1CRVJfRVJST1JfREVURUNURUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbnRlcm5hbC5wcm92aWRlci5hY3Rpb24uVk9JQ0VNQUlMX1NNU19SRUNFSVZFRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVudC5pc2ltX3JlZnJlc2giLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbXMuQUNUSU9OX1JDU19TRVJWSUNFX0FWQUlMQUJMRSIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmltcy5BQ1RJT05fUkNTX1NFUlZJQ0VfVU5BVkFJTEFCTEUiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbXMuQUNUSU9OX1JDU19TRVJWSUNFX0RJRUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbXMuQUNUSU9OX1BSRVNFTkNFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbXMuQUNUSU9OX1BVQkxJU0hfU1RBVFVTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbXMuSU1TX1NFUlZJQ0VfVVAiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbXMuSU1TX1NFUlZJQ0VfRE9XTiIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmltcy5JTVNfSU5DT01JTkdfQ0FMTCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmltcy5pbnRlcm5hbC51Y2UuVUNFX1NFUlZJQ0VfVVAiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbXMuaW50ZXJuYWwudWNlLlVDRV9TRVJWSUNFX0RPV04iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbXNjb25uZWN0aW9uLkRJU0NPTk5FQ1RFRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVudC5hY3Rpb24uSU1TX0ZFQVRVUkVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVudC5hY3Rpb24uSU1TX0NPTkZJR19DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuaW1zLmFjdGlvbi5XRkNfSU1TX1JFR0lTVFJBVElPTl9FUlJPUiIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnBob25lLnZ2bS5vbXRwLnNtcy5SRVFVRVNUX1NFTlQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5waG9uZS52dm0uQUNUSU9OX1ZJU1VBTF9WT0lDRU1BSUxfU0VSVklDRV9FVkVOVCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5DQVJSSUVSX1ZWTV9QQUNLQUdFX0lOU1RBTExFRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNlbGxicm9hZGNhc3RyZWNlaXZlci5HRVRfTEFURVNUX0NCX0FSRUFfSU5GTyIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5BQ1RJT05fQ0FSUklFUl9DRVJUSUZJQ0FURV9ET1dOTE9BRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5hY3Rpb24uQ09VTlRSWV9PVkVSUklERSIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5PUEVOX0RFRkFVTFRfU01TX0FQUCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5BQ1RJT05fVEVTVF9PVkVSUklERV9DQVJSSUVSX0lEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYWN0aW9uLlNJTV9DQVJEX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uU0lNX0FQUExJQ0FUSU9OX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uU0lNX1NMT1RfU1RBVFVTX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uU1VCU0NSSVBUSU9OX0NBUlJJRVJfSURFTlRJVFlfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQudGVsZXBob255LmFjdGlvbi5TVUJTQ1JJUFRJT05fU1BFQ0lGSUNfQ0FSUklFUl9JREVOVElUWV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYWN0aW9uLlRPR0dMRV9QUk9WSVNJT04iLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uTkVUV09SS19DT1VOVFJZX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uUFJJTUFSWV9TVUJTQ1JJUFRJT05fTElTVF9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYWN0aW9uLk1VTFRJX1NJTV9DT05GSUdfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQudGVsZXBob255LmFjdGlvbi5DQVJSSUVSX1NJR05BTF9SRVNFVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQudGVsZXBob255LmFjdGlvbi5DQVJSSUVSX1NJR05BTF9QQ09fVkFMVUUiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hY3Rpb24uQ0FSUklFUl9TSUdOQUxfREVGQVVMVF9ORVRXT1JLX0FWQUlMQUJMRSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQudGVsZXBob255LmFjdGlvbi5DQVJSSUVSX1NJR05BTF9SRURJUkVDVEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYWN0aW9uLkNBUlJJRVJfU0lHTkFMX1JFUVVFU1RfTkVUV09SS19GQUlMRUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5waG9uZS5zZXR0aW5ncy5DQVJSSUVSX1BST1ZJU0lPTklORyIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnBob25lLnNldHRpbmdzLlRSSUdHRVJfQ0FSUklFUl9QUk9WSVNJT05JTkciLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQUNUSU9OX1ZPV0lGSV9FTkFCTEVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYWN0aW9uLkFOT01BTFlfUkVQT1JURUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uU1VCU0NSSVBUSU9OX0lORk9fUkVDT1JEX0FEREVEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFDVElPTl9NQU5BR0VEX1JPQU1JTkdfSU5EIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuaW1zLmFjdGlvbi5SQ1NfU0lOR0xFX1JFR0lTVFJBVElPTl9DQVBBQklMSVRZX1VQREFURSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuc2FmZXR5Y2VudGVyLmFjdGlvbi5SRUZSRVNIX1NBRkVUWV9TT1VSQ0VTIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zYWZldHljZW50ZXIuYWN0aW9uLlNBRkVUWV9DRU5URVJfRU5BQkxFRF9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5hcHAuYWN0aW9uLkRFVklDRV9QT0xJQ1lfUkVTT1VSQ0VfVVBEQVRFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5TSE9XX0ZPUkVHUk9VTkRfU0VSVklDRV9NQU5BR0VSIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZXJ2aWNlLmF1dG9maWxsLmFjdGlvbi5ERUxBWUVEX0ZJTEwiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmFwcC5hY3Rpb24uUFJPVklTSU9OSU5HX0NPTVBMRVRFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYXBwLmFjdGlvbi5MT1NUX01PREVfTE9DQVRJT05fVVBEQVRFIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LnByb2ZpbGUuYWN0aW9uLkFVRElPX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmFjdGlvbi5WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuYWN0aW9uLkhGX0lORElDQVRPUlNfVkFMVUVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQucHJvZmlsZS5hY3Rpb24uQUNUSVZFX0RFVklDRV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldGNsaWVudC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0Y2xpZW50LnByb2ZpbGUuYWN0aW9uLkFVRElPX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0Y2xpZW50LnByb2ZpbGUuYWN0aW9uLkFHX0VWRU5UIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldGNsaWVudC5wcm9maWxlLmFjdGlvbi5BR19DQUxMX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0Y2xpZW50LnByb2ZpbGUuYWN0aW9uLlJFU1VMVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXRjbGllbnQucHJvZmlsZS5hY3Rpb24uTEFTVF9WVEFHIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldGNsaWVudC5wcm9maWxlLmFjdGlvbi5ORVRXT1JLX1NFUlZJQ0VfU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYXJpbmdhaWQucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhcmluZ2FpZC5wcm9maWxlLmFjdGlvbi5QTEFZSU5HX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFyaW5nYWlkLnByb2ZpbGUuYWN0aW9uLkFDVElWRV9ERVZJQ0VfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLnZvbHVtZS1jb250cm9sLnByb2ZpbGUuYWN0aW9uLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYTJkcC5wcm9maWxlLmFjdGlvbi5BQ1RJVkVfREVWSUNFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hMmRwLnByb2ZpbGUuYWN0aW9uLlBMQVlJTkdfU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAucHJvZmlsZS5hY3Rpb24uQ09ERUNfQ09ORklHX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hMmRwLXNpbmsucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYTJkcC1zaW5rLnByb2ZpbGUuYWN0aW9uLlBMQVlJTkdfU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAtc2luay5wcm9maWxlLmFjdGlvbi5BVURJT19DT05GSUdfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmF2cmNwLWNvbnRyb2xsZXIucHJvZmlsZS5hY3Rpb24uQlJPV1NFX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmF2cmNwLWNvbnRyb2xsZXIucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYXZyY3AtY29udHJvbGxlci5wcm9maWxlLmFjdGlvbi5GT0xERVJfTElTVCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmF2cmNwLWNvbnRyb2xsZXIucHJvZmlsZS5hY3Rpb24uVFJBQ0tfRVZFTlQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dC5wcm9maWxlLmFjdGlvbi5JRExFX1RJTUVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmlucHV0LnByb2ZpbGUuYWN0aW9uLlBST1RPQ09MX01PREVfQ0hBTkdFRCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmlucHV0LnByb2ZpbGUuYWN0aW9uLlZJUlRVQUxfVU5QTFVHX1NUQVRVUyIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhpZGRldmljZS5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5tYXAucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aE1hcENvbnRlbnRPYnNlcnZlci5hY3Rpb24uTUVTU0FHRV9TRU5UIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aE1hcENvbnRlbnRPYnNlcnZlci5hY3Rpb24uTUVTU0FHRV9ERUxJVkVSWSIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLnBhbi5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hY3Rpb24uVEVUSEVSSU5HX1NUQVRFX0NIQU5HRUQiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5pbnRlcm5hbC5hY3Rpb24uRVVJQ0NfUkVNT1ZFX0lOVklTSUJMRV9TVUJTQ1JJUFRJT05TIiwKLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5U2VydmljZS5hY3Rpb24uUEtUX0NOVF9TQU1QTEVfSU5URVJWQUxfRUxBUFNFRCIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5jb25uZWN0aXZpdHlzZXJ2aWNlLkNPTk5FQ1RFRF9UT19QUk9WSVNJT05JTkdfTkVUV09SS19BQ1RJT04iLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuY29ubmVjdGl2aXR5LnRldGhlcmluZy5QUk9WSVNJT05JTkdfUkVDSEVDS19BTEFSTSIKLSAgICAgICAgKQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xpbnQvZnJhbWV3b3JrL2NoZWNrcy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9saW50L1JlZ2lzdGVyUmVjZWl2ZXJGbGFnRGV0ZWN0b3JUZXN0Lmt0IGIvdG9vbHMvbGludC9mcmFtZXdvcmsvY2hlY2tzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2xpbnQvUmVnaXN0ZXJSZWNlaXZlckZsYWdEZXRlY3RvclRlc3Qua3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMGViY2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbGludC9mcmFtZXdvcmsvY2hlY2tzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2xpbnQvUmVnaXN0ZXJSZWNlaXZlckZsYWdEZXRlY3RvclRlc3Qua3QKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLmxpbnQKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuY2hlY2tzLmluZnJhc3RydWN0dXJlLkxpbnREZXRlY3RvclRlc3QKLWltcG9ydCBjb20uYW5kcm9pZC50b29scy5saW50LmNoZWNrcy5pbmZyYXN0cnVjdHVyZS5UZXN0RmlsZQotaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuY2hlY2tzLmluZnJhc3RydWN0dXJlLlRlc3RMaW50VGFzawotaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxpbnQuZGV0ZWN0b3IuYXBpLkRldGVjdG9yCi1pbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGludC5kZXRlY3Rvci5hcGkuSXNzdWUKLQotQFN1cHByZXNzKCJVbnN0YWJsZUFwaVVzYWdlIikKLWNsYXNzIFJlZ2lzdGVyUmVjZWl2ZXJGbGFnRGV0ZWN0b3JUZXN0IDogTGludERldGVjdG9yVGVzdCgpIHsKLQotICAgIG92ZXJyaWRlIGZ1biBnZXREZXRlY3RvcigpOiBEZXRlY3RvciA9IFJlZ2lzdGVyUmVjZWl2ZXJGbGFnRGV0ZWN0b3IoKQotCi0gICAgb3ZlcnJpZGUgZnVuIGdldElzc3VlcygpOiBMaXN0PElzc3VlPiA9IGxpc3RPZigKLSAgICAgICAgICAgIFJlZ2lzdGVyUmVjZWl2ZXJGbGFnRGV0ZWN0b3IuSVNTVUVfUkVDRUlWRVJfRVhQT1JURURfRkxBRwotICAgICkKLQotICAgIG92ZXJyaWRlIGZ1biBsaW50KCk6IFRlc3RMaW50VGFzayA9IHN1cGVyLmxpbnQoKS5hbGxvd01pc3NpbmdTZGsodHJ1ZSkKLQotICAgIGZ1biB0ZXN0UHJvdGVjdGVkQnJvYWRjYXN0KCkgewotICAgICAgICBsaW50KCkuZmlsZXMoCi0gICAgICAgICAgICAgICAgamF2YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICIiIgotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlIHRlc3QucGtnOwotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGNsYXNzIFRlc3RDbGFzczEgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZChDb250ZXh0IGNvbnRleHQsIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9CQVRURVJZX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICIiIgotICAgICAgICAgICAgICAgICkuaW5kZW50ZWQoKSwKLSAgICAgICAgICAgICAgICAqc3R1YnMKLSAgICAgICAgKQotICAgICAgICAgICAgICAgIC5ydW4oKQotICAgICAgICAgICAgICAgIC5leHBlY3RDbGVhbigpCi0gICAgfQotCi0gICAgZnVuIHRlc3RQcm90ZWN0ZWRCcm9hZGNhc3RDcmVhdGUoKSB7Ci0gICAgICAgIGxpbnQoKS5maWxlcygKLSAgICAgICAgICAgICAgICBqYXZhKAotICAgICAgICAgICAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgdGVzdC5wa2c7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdENsYXNzMSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kKENvbnRleHQgY29udGV4dCwgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudEZpbHRlci5jcmVhdGUoSW50ZW50LkFDVElPTl9CQVRURVJZX0NIQU5HRUQsICJmb28vYmFyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgICAgKS5pbmRlbnRlZCgpLAotICAgICAgICAgICAgICAgICpzdHVicwotICAgICAgICApCi0gICAgICAgICAgICAgICAgLnJ1bigpCi0gICAgICAgICAgICAgICAgLmV4cGVjdENsZWFuKCkKLSAgICB9Ci0KLSAgICBmdW4gdGVzdE11bHRpcGxlUHJvdGVjdGVkQnJvYWRjYXN0cygpIHsKLSAgICAgICAgbGludCgpLmZpbGVzKAotICAgICAgICAgICAgICAgIGphdmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiIiIKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZSB0ZXN0LnBrZzsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xhc3MxIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QoQ29udGV4dCBjb250ZXh0LCBCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQkFUVEVSWV9MT1cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9CQVRURVJZX09LQVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICIiIgotICAgICAgICAgICAgICAgICkuaW5kZW50ZWQoKSwKLSAgICAgICAgICAgICAgICAqc3R1YnMKLSAgICAgICAgKQotICAgICAgICAgICAgICAgIC5ydW4oKQotICAgICAgICAgICAgICAgIC5leHBlY3RDbGVhbigpCi0gICAgfQotCi0gICAgLy8gVE9ETyhiLzI2NzUxMDM0MSk6IFJlZW5hYmxlIHRoaXMgdGVzdAotICAgIC8vIGZ1biB0ZXN0U3Vic2VxdWVudEZpbHRlck1vZGlmaWNhdGlvbigpIHsKLSAgICAvLyAgICAgbGludCgpLmZpbGVzKAotICAgIC8vICAgICAgICAgICAgIGphdmEoCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAiIiIKLSAgICAvLyAgICAgICAgICAgICAgICAgcGFja2FnZSB0ZXN0LnBrZzsKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotICAgIC8vICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci0gICAgLy8gICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xhc3MxIHsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QoQ29udGV4dCBjb250ZXh0LCBCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlcikgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKTsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQkFUVEVSWV9MT1cpOwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9CQVRURVJZX09LQVkpOwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyKTsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKCJxdWVydHkiKTsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlcik7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgLy8gICAgICAgICAgICAgICAgIH0KLSAgICAvLyAgICAgICAgICAgICAgICAiIiIKLSAgICAvLyAgICAgICAgICAgICApLmluZGVudGVkKCksCi0gICAgLy8gICAgICAgICAgICAgKnN0dWJzCi0gICAgLy8gICAgICkKLSAgICAvLyAgICAgICAgICAgICAucnVuKCkKLSAgICAvLyAgICAgICAgICAgICAuZXhwZWN0KCIiIgotICAgIC8vICAgICAgICAgICAgIHNyYy90ZXN0L3BrZy9UZXN0Q2xhc3MxLmphdmE6MTM6IFdhcm5pbmc6IE1pc3NpbmcgUkVDRUlWRVJfRVhQT1JURUQgb3IgUkVDRUlWRVJfTk9UX0VYUE9SVEVEIGZsYWcgW1Vuc3BlY2lmaWVkUmVnaXN0ZXJSZWNlaXZlckZsYWddCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlcik7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAgICAvLyAgICAgICAgICAgICAwIGVycm9ycywgMSB3YXJuaW5ncwotICAgIC8vICAgICAgICAgIiIiLnRyaW1JbmRlbnQoKSkKLSAgICAvLyB9Ci0KLSAgICBmdW4gdGVzdE51bGxSZWNlaXZlcigpIHsKLSAgICAgICAgbGludCgpLmZpbGVzKAotICAgICAgICAgICAgICAgIGphdmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiIiIKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZSB0ZXN0LnBrZzsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xhc3MxIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoInF3ZXJ0eSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihudWxsLCBmaWx0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgICAgKS5pbmRlbnRlZCgpLAotICAgICAgICAgICAgICAgICpzdHVicwotICAgICAgICApCi0gICAgICAgICAgICAgICAgLnJ1bigpCi0gICAgICAgICAgICAgICAgLmV4cGVjdENsZWFuKCkKLSAgICB9Ci0KLSAgICBmdW4gdGVzdEV4cG9ydGVkRmxhZ1ByZXNlbnQoKSB7Ci0gICAgICAgIGxpbnQoKS5maWxlcygKLSAgICAgICAgICAgICAgICBqYXZhKAotICAgICAgICAgICAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgdGVzdC5wa2c7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdENsYXNzMSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kKENvbnRleHQgY29udGV4dCwgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigicXdlcnR5Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIsIENvbnRleHQuUkVDRUlWRVJfRVhQT1JURUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgICAgKS5pbmRlbnRlZCgpLAotICAgICAgICAgICAgICAgICpzdHVicwotICAgICAgICApCi0gICAgICAgICAgICAgICAgLnJ1bigpCi0gICAgICAgICAgICAgICAgLmV4cGVjdENsZWFuKCkKLSAgICB9Ci0KLSAgICBmdW4gdGVzdE5vdEV4cG9ydGVkRmxhZ1ByZXNlbnQoKSB7Ci0gICAgICAgIGxpbnQoKS5maWxlcygKLSAgICAgICAgICAgICAgICBqYXZhKAotICAgICAgICAgICAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgdGVzdC5wa2c7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdENsYXNzMSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kKENvbnRleHQgY29udGV4dCwgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigicXdlcnR5Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LlJFQ0VJVkVSX05PVF9FWFBPUlRFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAiIiIKLSAgICAgICAgICAgICAgICApLmluZGVudGVkKCksCi0gICAgICAgICAgICAgICAgKnN0dWJzCi0gICAgICAgICkKLSAgICAgICAgICAgICAgICAucnVuKCkKLSAgICAgICAgICAgICAgICAuZXhwZWN0Q2xlYW4oKQotICAgIH0KLQotICAgIC8vIFRPRE8oYi8yNjc1MTAzNDEpOiBSZWVuYWJsZSB0aGlzIHRlc3QKLSAgICAvLyBmdW4gdGVzdEZsYWdBcmd1bWVudEFic2VudCgpIHsKLSAgICAvLyAgICAgbGludCgpLmZpbGVzKAotICAgIC8vICAgICAgICAgICAgIGphdmEoCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAiIiIKLSAgICAvLyAgICAgICAgICAgICAgICAgcGFja2FnZSB0ZXN0LnBrZzsKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotICAgIC8vICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci0gICAgLy8gICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xhc3MxIHsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QoQ29udGV4dCBjb250ZXh0LCBCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlcikgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCJxd2VydHkiKTsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlcik7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgLy8gICAgICAgICAgICAgICAgIH0KLSAgICAvLyAgICAgICAgICAgICAgICAiIiIKLSAgICAvLyAgICAgICAgICAgICApLmluZGVudGVkKCksCi0gICAgLy8gICAgICAgICAgICAgKnN0dWJzCi0gICAgLy8gICAgICkKLSAgICAvLyAgICAgICAgICAgICAucnVuKCkKLSAgICAvLyAgICAgICAgICAgICAuZXhwZWN0KCIiIgotICAgIC8vICAgICAgICAgICAgIHNyYy90ZXN0L3BrZy9UZXN0Q2xhc3MxLmphdmE6OTogV2FybmluZzogTWlzc2luZyBSRUNFSVZFUl9FWFBPUlRFRCBvciBSRUNFSVZFUl9OT1RfRVhQT1JURUQgZmxhZyBbVW5zcGVjaWZpZWRSZWdpc3RlclJlY2VpdmVyRmxhZ10KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyKTsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgIC8vICAgICAgICAgICAgIDAgZXJyb3JzLCAxIHdhcm5pbmdzCi0gICAgLy8gICAgICAgICAiIiIudHJpbUluZGVudCgpKQotICAgIC8vIH0KLQotICAgIC8vIFRPRE8oYi8yNjc1MTAzNDEpOiBSZWVuYWJsZSB0aGlzIHRlc3QKLSAgICAvLyBmdW4gdGVzdEV4cG9ydGVkRmxhZ3NBYnNlbnQoKSB7Ci0gICAgLy8gICAgIGxpbnQoKS5maWxlcygKLSAgICAvLyAgICAgICAgICAgICBqYXZhKAotICAgIC8vICAgICAgICAgICAgICAgICAgICAgIiIiCi0gICAgLy8gICAgICAgICAgICAgICAgIHBhY2thZ2UgdGVzdC5wa2c7Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotICAgIC8vICAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdENsYXNzMSB7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kKENvbnRleHQgY29udGV4dCwgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigicXdlcnR5Iik7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIsIDApOwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgfQotICAgIC8vICAgICAgICAgICAgICAgICB9Ci0gICAgLy8gICAgICAgICAgICAgICAgIiIiCi0gICAgLy8gICAgICAgICAgICAgKS5pbmRlbnRlZCgpLAotICAgIC8vICAgICAgICAgICAgICpzdHVicwotICAgIC8vICAgICApCi0gICAgLy8gICAgICAgICAgICAgLnJ1bigpCi0gICAgLy8gICAgICAgICAgICAgLmV4cGVjdCgiIiIKLSAgICAvLyAgICAgICAgICAgICBzcmMvdGVzdC9wa2cvVGVzdENsYXNzMS5qYXZhOjk6IFdhcm5pbmc6IE1pc3NpbmcgUkVDRUlWRVJfRVhQT1JURUQgb3IgUkVDRUlWRVJfTk9UX0VYUE9SVEVEIGZsYWcgW1Vuc3BlY2lmaWVkUmVnaXN0ZXJSZWNlaXZlckZsYWddCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlciwgMCk7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfgotICAgIC8vICAgICAgICAgICAgIDAgZXJyb3JzLCAxIHdhcm5pbmdzCi0gICAgLy8gICAgICAgICAiIiIudHJpbUluZGVudCgpKQotICAgIC8vIH0KLQotICAgIGZ1biB0ZXN0RXhwb3J0ZWRGbGFnVmFyaWFibGUoKSB7Ci0gICAgICAgIGxpbnQoKS5maWxlcygKLSAgICAgICAgICAgICAgICBqYXZhKAotICAgICAgICAgICAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgdGVzdC5wa2c7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdENsYXNzMSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kKENvbnRleHQgY29udGV4dCwgQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigicXdlcnR5Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZsYWdzID0gQ29udGV4dC5SRUNFSVZFUl9FWFBPUlRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlciwgZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgICAgKS5pbmRlbnRlZCgpLAotICAgICAgICAgICAgICAgICpzdHVicwotICAgICAgICApCi0gICAgICAgICAgICAgICAgLnJ1bigpCi0gICAgICAgICAgICAgICAgLmV4cGVjdENsZWFuKCkKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGIvMjY3NTEwMzQxKTogUmVlbmFibGUgdGhpcyB0ZXN0Ci0gICAgLy8gZnVuIHRlc3RVbmtub3duRmlsdGVyKCkgewotICAgIC8vICAgICBsaW50KCkuZmlsZXMoCi0gICAgLy8gICAgICAgICAgICAgamF2YSgKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICIiIgotICAgIC8vICAgICAgICAgICAgICAgICBwYWNrYWdlIHRlc3QucGtnOwotICAgIC8vICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotICAgIC8vICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotICAgIC8vICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLSAgICAvLyAgICAgICAgICAgICAgICAgcHVibGljIGNsYXNzIFRlc3RDbGFzczEgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZChDb250ZXh0IGNvbnRleHQsIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyLAotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIpOwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgfQotICAgIC8vICAgICAgICAgICAgICAgICB9Ci0gICAgLy8gICAgICAgICAgICAgICAgIiIiCi0gICAgLy8gICAgICAgICAgICAgKS5pbmRlbnRlZCgpLAotICAgIC8vICAgICAgICAgICAgICpzdHVicwotICAgIC8vICAgICApCi0gICAgLy8gICAgICAgICAgICAgLnJ1bigpCi0gICAgLy8gICAgICAgICAgICAgLmV4cGVjdCgiIiIKLSAgICAvLyAgICAgICAgICAgICBzcmMvdGVzdC9wa2cvVGVzdENsYXNzMS5qYXZhOjk6IFdhcm5pbmc6IE1pc3NpbmcgUkVDRUlWRVJfRVhQT1JURUQgb3IgUkVDRUlWRVJfTk9UX0VYUE9SVEVEIGZsYWcgW1Vuc3BlY2lmaWVkUmVnaXN0ZXJSZWNlaXZlckZsYWddCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlcik7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAgICAvLyAgICAgICAgICAgICAwIGVycm9ycywgMSB3YXJuaW5ncwotICAgIC8vICAgICAgICAgIiIiLnRyaW1JbmRlbnQoKSkKLSAgICAvLyB9Ci0KLSAgICAvLyBUT0RPKGIvMjY3NTEwMzQxKTogUmVlbmFibGUgdGhpcyB0ZXN0Ci0gICAgLy8gZnVuIHRlc3RGaWx0ZXJFc2NhcGVzKCkgewotICAgIC8vICAgICBsaW50KCkuZmlsZXMoCi0gICAgLy8gICAgICAgICAgICAgamF2YSgKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICIiIgotICAgIC8vICAgICAgICAgICAgICAgICBwYWNrYWdlIHRlc3QucGtnOwotICAgIC8vICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotICAgIC8vICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotICAgIC8vICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLSAgICAvLyAgICAgICAgICAgICAgICAgcHVibGljIGNsYXNzIFRlc3RDbGFzczEgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZChDb250ZXh0IGNvbnRleHQsIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9CQVRURVJZX0NIQU5HRUQpOwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcihmaWx0ZXIpOwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyKTsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAvLyAgICAgICAgICAgICAgICAgfQotICAgIC8vICAgICAgICAgICAgICAgICIiIgotICAgIC8vICAgICAgICAgICAgICkuaW5kZW50ZWQoKSwKLSAgICAvLyAgICAgICAgICAgICAqc3R1YnMKLSAgICAvLyAgICAgKQotICAgIC8vICAgICAgICAgICAgIC5ydW4oKQotICAgIC8vICAgICAgICAgICAgIC5leHBlY3QoIiIiCi0gICAgLy8gICAgICAgICAgICAgc3JjL3Rlc3QvcGtnL1Rlc3RDbGFzczEuamF2YToxMDogV2FybmluZzogTWlzc2luZyBSRUNFSVZFUl9FWFBPUlRFRCBvciBSRUNFSVZFUl9OT1RfRVhQT1JURUQgZmxhZyBbVW5zcGVjaWZpZWRSZWdpc3RlclJlY2VpdmVyRmxhZ10KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyKTsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICAgIC8vICAgICAgICAgICAgIDAgZXJyb3JzLCAxIHdhcm5pbmdzCi0gICAgLy8gICAgICAgICAiIiIudHJpbUluZGVudCgpKQotICAgIC8vIH0KLQotICAgIGZ1biB0ZXN0SW5saW5lRmlsdGVyKCkgewotICAgICAgICBsaW50KCkuZmlsZXMoCi0gICAgICAgICAgICAgICAgamF2YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICIiIgotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlIHRlc3QucGtnOwotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGNsYXNzIFRlc3RDbGFzczEgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZChDb250ZXh0IGNvbnRleHQsIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgICAgKS5pbmRlbnRlZCgpLAotICAgICAgICAgICAgICAgICpzdHVicwotICAgICAgICApCi0gICAgICAgICAgICAgICAgLnJ1bigpCi0gICAgICAgICAgICAgICAgLmV4cGVjdENsZWFuKCkKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGIvMjY3NTEwMzQxKTogUmVlbmFibGUgdGhpcyB0ZXN0Ci0gICAgLy8gZnVuIHRlc3RJbmxpbmVGaWx0ZXJBcHBseSgpIHsKLSAgICAvLyAgICAgbGludCgpLmZpbGVzKAotICAgIC8vICAgICAgICAgICAgIGtvdGxpbigKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICIiIgotICAgIC8vICAgICAgICAgICAgICAgICBwYWNrYWdlIHRlc3QucGtnCi0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCi0gICAgLy8gICAgICAgICAgICAgICAgIGNsYXNzIFRlc3RDbGFzczEgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgZnVuIHRlc3QoY29udGV4dDogQ29udGV4dCwgcmVjZWl2ZXI6IEJyb2FkY2FzdFJlY2VpdmVyKSB7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLAotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKS5hcHBseSB7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWN0aW9uKCJxd2VydHkiKQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAvLyAgICAgICAgICAgICAgICAgfQotICAgIC8vICAgICAgICAgICAgICAgICIiIgotICAgIC8vICAgICAgICAgICAgICkuaW5kZW50ZWQoKSwKLSAgICAvLyAgICAgICAgICAgICAqc3R1YnMKLSAgICAvLyAgICAgKQotICAgIC8vICAgICAgICAgICAgIC5ydW4oKQotICAgIC8vICAgICAgICAgICAgIC5leHBlY3QoIiIiCi0gICAgLy8gICAgICAgICAgICAgc3JjL3Rlc3QvcGtnL1Rlc3RDbGFzczEua3Q6ODogV2FybmluZzogTWlzc2luZyBSRUNFSVZFUl9FWFBPUlRFRCBvciBSRUNFSVZFUl9OT1RfRVhQT1JURUQgZmxhZyBbVW5zcGVjaWZpZWRSZWdpc3RlclJlY2VpdmVyRmxhZ10KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIF4KLSAgICAvLyAgICAgICAgICAgICAwIGVycm9ycywgMSB3YXJuaW5ncwotICAgIC8vICAgICAgICAgIiIiLnRyaW1JbmRlbnQoKSkKLSAgICAvLyB9Ci0KLSAgICAvLyBUT0RPKGIvMjY3NTEwMzQxKTogUmVlbmFibGUgdGhpcyB0ZXN0Ci0gICAgLy8gZnVuIHRlc3RGaWx0ZXJWYXJpYWJsZUFwcGx5KCkgewotICAgIC8vICAgICBsaW50KCkuZmlsZXMoCi0gICAgLy8gICAgICAgICAgICAga290bGluKAotICAgIC8vICAgICAgICAgICAgICAgICAgICAgIiIiCi0gICAgLy8gICAgICAgICAgICAgICAgIHBhY2thZ2UgdGVzdC5wa2cKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcgotICAgIC8vICAgICAgICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIKLSAgICAvLyAgICAgICAgICAgICAgICAgY2xhc3MgVGVzdENsYXNzMSB7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICBmdW4gdGVzdChjb250ZXh0OiBDb250ZXh0LCByZWNlaXZlcjogQnJvYWRjYXN0UmVjZWl2ZXIpIHsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgZmlsdGVyID0gSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKS5hcHBseSB7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEFjdGlvbigicXdlcnR5IikKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIpCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgLy8gICAgICAgICAgICAgICAgIH0KLSAgICAvLyAgICAgICAgICAgICAgICAiIiIKLSAgICAvLyAgICAgICAgICAgICApLmluZGVudGVkKCksCi0gICAgLy8gICAgICAgICAgICAgKnN0dWJzCi0gICAgLy8gICAgICkKLSAgICAvLyAgICAgICAgICAgICAucnVuKCkKLSAgICAvLyAgICAgICAgICAgICAuZXhwZWN0KCIiIgotICAgIC8vICAgICAgICAgICAgIHNyYy90ZXN0L3BrZy9UZXN0Q2xhc3MxLmt0OjExOiBXYXJuaW5nOiBNaXNzaW5nIFJFQ0VJVkVSX0VYUE9SVEVEIG9yIFJFQ0VJVkVSX05PVF9FWFBPUlRFRCBmbGFnIFtVbnNwZWNpZmllZFJlZ2lzdGVyUmVjZWl2ZXJGbGFnXQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIpCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAgICAvLyAgICAgICAgICAgICAwIGVycm9ycywgMSB3YXJuaW5ncwotICAgIC8vICAgICAgICAgIiIiLnRyaW1JbmRlbnQoKSkKLSAgICAvLyB9Ci0KLSAgICAvLyBUT0RPKGIvMjY3NTEwMzQxKTogUmVlbmFibGUgdGhpcyB0ZXN0Ci0gICAgLy8gZnVuIHRlc3RGaWx0ZXJWYXJpYWJsZUFwcGx5MigpIHsKLSAgICAvLyAgICAgbGludCgpLmZpbGVzKAotICAgIC8vICAgICAgICAgICAgIGtvdGxpbigKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICIiIgotICAgIC8vICAgICAgICAgICAgICAgICBwYWNrYWdlIHRlc3QucGtnCi0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCi0gICAgLy8gICAgICAgICAgICAgICAgIGNsYXNzIFRlc3RDbGFzczEgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgZnVuIHRlc3QoY29udGV4dDogQ29udGV4dCwgcmVjZWl2ZXI6IEJyb2FkY2FzdFJlY2VpdmVyKSB7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdmFsIGZpbHRlciA9IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCkuYXBwbHkgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBY3Rpb24oSW50ZW50LkFDVElPTl9CQVRURVJZX09LQVkpCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyLmFwcGx5IHsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWN0aW9uKCJxd2VydHkiKQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgLy8gICAgICAgICAgICAgICAgIH0KLSAgICAvLyAgICAgICAgICAgICAgICAiIiIKLSAgICAvLyAgICAgICAgICAgICApLmluZGVudGVkKCksCi0gICAgLy8gICAgICAgICAgICAgKnN0dWJzCi0gICAgLy8gICAgICkKLSAgICAvLyAgICAgICAgICAgICAucnVuKCkKLSAgICAvLyAgICAgICAgICAgICAuZXhwZWN0KCIiIgotICAgIC8vICAgICAgICAgICAgIHNyYy90ZXN0L3BrZy9UZXN0Q2xhc3MxLmt0OjExOiBXYXJuaW5nOiBNaXNzaW5nIFJFQ0VJVkVSX0VYUE9SVEVEIG9yIFJFQ0VJVkVSX05PVF9FWFBPUlRFRCBmbGFnIFtVbnNwZWNpZmllZFJlZ2lzdGVyUmVjZWl2ZXJGbGFnXQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIuYXBwbHkgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgXgotICAgIC8vICAgICAgICAgICAgIDAgZXJyb3JzLCAxIHdhcm5pbmdzCi0gICAgLy8gICAgICAgICAiIiIudHJpbUluZGVudCgpKQotICAgIC8vIH0KLQotICAgIC8vIFRPRE8oYi8yNjc1MTAzNDEpOiBSZWVuYWJsZSB0aGlzIHRlc3QKLSAgICAvLyBmdW4gdGVzdEZpbHRlckNvbXBsZXhDaGFpbigpIHsKLSAgICAvLyAgICAgbGludCgpLmZpbGVzKAotICAgIC8vICAgICAgICAgICAgIGtvdGxpbigKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICIiIgotICAgIC8vICAgICAgICAgICAgICAgICBwYWNrYWdlIHRlc3QucGtnCi0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXIKLSAgICAvLyAgICAgICAgICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ci0gICAgLy8gICAgICAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyCi0gICAgLy8gICAgICAgICAgICAgICAgIGNsYXNzIFRlc3RDbGFzczEgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgZnVuIHRlc3QoY29udGV4dDogQ29udGV4dCwgcmVjZWl2ZXI6IEJyb2FkY2FzdFJlY2VpdmVyKSB7Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdmFsIGZpbHRlciA9IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCkuYXBwbHkgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBY3Rpb24oSW50ZW50LkFDVElPTl9CQVRURVJZX09LQVkpCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCBmaWx0ZXIyID0gZmlsdGVyCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdmFsIGZpbHRlcjMgPSBmaWx0ZXIyLmFwcGx5IHsKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQkFUVEVSWV9MT1cpCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyMykKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgZmlsdGVyNCA9IGZpbHRlcjMuYXBwbHkgewotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBY3Rpb24oInF3ZXJ0eSIpCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlciwgZmlsdGVyNCkKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAvLyAgICAgICAgICAgICAgICAgfQotICAgIC8vICAgICAgICAgICAgICAgICIiIgotICAgIC8vICAgICAgICAgICAgICkuaW5kZW50ZWQoKSwKLSAgICAvLyAgICAgICAgICAgICAqc3R1YnMKLSAgICAvLyAgICAgKQotICAgIC8vICAgICAgICAgICAgIC5ydW4oKQotICAgIC8vICAgICAgICAgICAgIC5leHBlY3QoIiIiCi0gICAgLy8gICAgICAgICAgICAgc3JjL3Rlc3QvcGtnL1Rlc3RDbGFzczEua3Q6MTk6IFdhcm5pbmc6IE1pc3NpbmcgUkVDRUlWRVJfRVhQT1JURUQgb3IgUkVDRUlWRVJfTk9UX0VYUE9SVEVEIGZsYWcgW1Vuc3BlY2lmaWVkUmVnaXN0ZXJSZWNlaXZlckZsYWddCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlcjQpCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gICAgLy8gICAgICAgICAgICAgMCBlcnJvcnMsIDEgd2FybmluZ3MKLSAgICAvLyAgICAgICAgICIiIi50cmltSW5kZW50KCkpCi0gICAgLy8gfQotCi0gICAgcHJpdmF0ZSB2YWwgYnJvYWRjYXN0UmVjZWl2ZXJTdHViOiBUZXN0RmlsZSA9IGphdmEoCi0gICAgICAgICAgICAiIiIKLSAgICAgICAgICAgIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwotICAgICAgICAgICAgcHVibGljIGNsYXNzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgICAgICAgICAvLyBTdHViCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAiIiIKLSAgICApLmluZGVudGVkKCkKLQotICAgIHByaXZhdGUgdmFsIGNvbnRleHRTdHViOiBUZXN0RmlsZSA9IGphdmEoCi0gICAgICAgICAgICAiIiIKLSAgICAgICAgICAgIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwotICAgICAgICAgICAgcHVibGljIGNsYXNzIENvbnRleHQgewotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQ0VJVkVSX0VYUE9SVEVEID0gMHgyOwotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQ0VJVkVSX05PVF9FWFBPUlRFRCA9IDB4NDsKLSAgICAgICAgICAgICAgICBATnVsbGFibGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSW50ZW50IHJlZ2lzdGVyUmVjZWl2ZXIoQE51bGxhYmxlIEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUmVnaXN0ZXJSZWNlaXZlckZsYWdzIGludCBmbGFncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAiIiIKLSAgICApLmluZGVudGVkKCkKLQotICAgIHByaXZhdGUgdmFsIGludGVudFN0dWI6IFRlc3RGaWxlID0gamF2YSgKLSAgICAgICAgICAgICIiIgotICAgICAgICAgICAgcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7Ci0gICAgICAgICAgICBwdWJsaWMgY2xhc3MgSW50ZW50IHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQkFUVEVSWV9DSEFOR0VEID0KLSAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQkFUVEVSWV9DSEFOR0VEIjsKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQkFUVEVSWV9MT1cgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkJBVFRFUllfTE9XIjsKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQkFUVEVSWV9PS0FZID0KLSAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uQkFUVEVSWV9PS0FZIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICIiIgotICAgICkuaW5kZW50ZWQoKQotCi0gICAgcHJpdmF0ZSB2YWwgaW50ZW50RmlsdGVyU3R1YjogVGVzdEZpbGUgPSBqYXZhKAotICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICBwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKLSAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBJbnRlbnRGaWx0ZXIgewotICAgICAgICAgICAgICAgIHB1YmxpYyBJbnRlbnRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN0dWIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIEludGVudEZpbHRlcihTdHJpbmcgYWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN0dWIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIEludGVudEZpbHRlcihTdHJpbmcgYWN0aW9uLCBTdHJpbmcgZGF0YVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3R1YgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEludGVudEZpbHRlciBjcmVhdGUoU3RyaW5nIGFjdGlvbiwgU3RyaW5nIGRhdGFUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRBY3Rpb24oU3RyaW5nIGFjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAvLyBTdHViCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgIiIiCi0gICAgKS5pbmRlbnRlZCgpCi0KLSAgICBwcml2YXRlIHZhbCBzdHVicyA9IGFycmF5T2YoYnJvYWRjYXN0UmVjZWl2ZXJTdHViLCBjb250ZXh0U3R1YiwgaW50ZW50U3R1YiwgaW50ZW50RmlsdGVyU3R1YikKLX0KZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL0hvdHNwb3ROZXR3b3JrLmphdmEgYi93aWZpL2phdmEvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9Ib3RzcG90TmV0d29yay5qYXZhCmluZGV4IDliZmViNjMuLmZlMzk3ZDkgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL0hvdHNwb3ROZXR3b3JrLmphdmEKKysrIGIvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvSG90c3BvdE5ldHdvcmsuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU3lzdGVtQXBpOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuc2hhcmVkY29ubmVjdGl2aXR5LnNlcnZpY2UuU2hhcmVkQ29ubmVjdGl2aXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5U2V0OwpAQCAtODYsNiArODcsNyBAQAogICAgIEBOdWxsYWJsZQogICAgIEBTZWN1cml0eVR5cGUKICAgICBwcml2YXRlIGZpbmFsIEFycmF5U2V0PEludGVnZXI+IG1Ib3RzcG90U2VjdXJpdHlUeXBlczsKKyAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwogCiAgICAgLyoqCiAgICAgICogQnVpbGRlciBjbGFzcyBmb3Ige0BsaW5rIEhvdHNwb3ROZXR3b3JrfS4KQEAgLTEwMiw4ICsxMDQsOCBAQAogICAgICAgICBwcml2YXRlIFN0cmluZyBtSG90c3BvdEJzc2lkOwogICAgICAgICBATnVsbGFibGUKICAgICAgICAgQFNlY3VyaXR5VHlwZQotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5U2V0PEludGVnZXI+IG1Ib3RzcG90U2VjdXJpdHlUeXBlcyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5U2V0PD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheVNldDxJbnRlZ2VyPiBtSG90c3BvdFNlY3VyaXR5VHlwZXMgPSBuZXcgQXJyYXlTZXQ8PigpOworICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzID0gQnVuZGxlLkVNUFRZOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTZXQgdGhlIHJlbW90ZSBkZXZpY2UgSUQuCkBAIC0xOTAsNiArMTkyLDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgZXh0cmFzIGJ1bmRsZQorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIEJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEBOb25OdWxsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBIb3RzcG90TmV0d29ya30gb2JqZWN0LgogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGJ1aWx0IHtAbGluayBIb3RzcG90TmV0d29ya30gb2JqZWN0LgpAQCAtMjAzLDcgKzIxNiw4IEBACiAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrTmFtZSwKICAgICAgICAgICAgICAgICAgICAgbUhvdHNwb3RTc2lkLAogICAgICAgICAgICAgICAgICAgICBtSG90c3BvdEJzc2lkLAotICAgICAgICAgICAgICAgICAgICBtSG90c3BvdFNlY3VyaXR5VHlwZXMpOworICAgICAgICAgICAgICAgICAgICBtSG90c3BvdFNlY3VyaXR5VHlwZXMsCisgICAgICAgICAgICAgICAgICAgIG1FeHRyYXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMzEsNyArMjQ1LDggQEAKICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBuZXR3b3JrTmFtZSwKICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgaG90c3BvdFNzaWQsCiAgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIGhvdHNwb3RCc3NpZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBAU2VjdXJpdHlUeXBlIEFycmF5U2V0PEludGVnZXI+IGhvdHNwb3RTZWN1cml0eVR5cGVzKSB7CisgICAgICAgICAgICBATnVsbGFibGUgQFNlY3VyaXR5VHlwZSBBcnJheVNldDxJbnRlZ2VyPiBob3RzcG90U2VjdXJpdHlUeXBlcywKKyAgICAgICAgICAgIEBOb25OdWxsIEJ1bmRsZSBleHRyYXMpIHsKICAgICAgICAgdmFsaWRhdGUoZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgbmV0d29ya1R5cGUsCiAgICAgICAgICAgICAgICAgbmV0d29ya05hbWUsCkBAIC0yNDMsNiArMjU4LDcgQEAKICAgICAgICAgbUhvdHNwb3RTc2lkID0gaG90c3BvdFNzaWQ7CiAgICAgICAgIG1Ib3RzcG90QnNzaWQgPSBob3RzcG90QnNzaWQ7CiAgICAgICAgIG1Ib3RzcG90U2VjdXJpdHlUeXBlcyA9IG5ldyBBcnJheVNldDw+KGhvdHNwb3RTZWN1cml0eVR5cGVzKTsKKyAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKICAgICB9CiAKICAgICAvKioKQEAgLTMxNSw2ICszMzEsMTYgQEAKICAgICAgICAgcmV0dXJuIG1Ib3RzcG90U2VjdXJpdHlUeXBlczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBleHRyYXMgQnVuZGxlLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgQnVuZGxlIG9iamVjdC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBIb3RzcG90TmV0d29yaykpIHJldHVybiBmYWxzZTsKQEAgLTM0OCw2ICszNzQsNyBAQAogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1Ib3RzcG90U3NpZCk7CiAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUhvdHNwb3RCc3NpZCk7CiAgICAgICAgIGRlc3Qud3JpdGVBcnJheVNldChtSG90c3BvdFNlY3VyaXR5VHlwZXMpOworICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1FeHRyYXMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzU5LDcgKzM4Niw3IEBACiAgICAgcHVibGljIHN0YXRpYyBIb3RzcG90TmV0d29yayByZWFkRnJvbVBhcmNlbChATm9uTnVsbCBQYXJjZWwgaW4pIHsKICAgICAgICAgcmV0dXJuIG5ldyBIb3RzcG90TmV0d29yayhpbi5yZWFkTG9uZygpLCBOZXR3b3JrUHJvdmlkZXJJbmZvLnJlYWRGcm9tUGFyY2VsKGluKSwKICAgICAgICAgICAgICAgICBpbi5yZWFkSW50KCksIGluLnJlYWRTdHJpbmcoKSwgaW4ucmVhZFN0cmluZygpLCBpbi5yZWFkU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgKEFycmF5U2V0PEludGVnZXI+KSBpbi5yZWFkQXJyYXlTZXQobnVsbCkpOworICAgICAgICAgICAgICAgIChBcnJheVNldDxJbnRlZ2VyPikgaW4ucmVhZEFycmF5U2V0KG51bGwpLCBpbi5yZWFkQnVuZGxlKCkpOwogICAgIH0KIAogICAgIEBOb25OdWxsCkBAIC0zODUsNiArNDEyLDcgQEAKICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIGhvdHNwb3RTc2lkPSIpLmFwcGVuZChtSG90c3BvdFNzaWQpCiAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBob3RzcG90QnNzaWQ9IikuYXBwZW5kKG1Ib3RzcG90QnNzaWQpCiAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBob3RzcG90U2VjdXJpdHlUeXBlcz0iKS5hcHBlbmQobUhvdHNwb3RTZWN1cml0eVR5cGVzLnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKG1FeHRyYXMudG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgICAuYXBwZW5kKCJdIikudG9TdHJpbmcoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS93aWZpL2phdmEvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9Ib3RzcG90TmV0d29ya0Nvbm5lY3Rpb25TdGF0dXMuamF2YSBiL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL0hvdHNwb3ROZXR3b3JrQ29ubmVjdGlvblN0YXR1cy5qYXZhCmluZGV4IDY5NzY3ZjMuLjcyYWNmMmMgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL0hvdHNwb3ROZXR3b3JrQ29ubmVjdGlvblN0YXR1cy5qYXZhCisrKyBiL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL0hvdHNwb3ROZXR3b3JrQ29ubmVjdGlvblN0YXR1cy5qYXZhCkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgQENvbm5lY3Rpb25TdGF0dXMKICAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXR1czsKICAgICAgICAgcHJpdmF0ZSBIb3RzcG90TmV0d29yayBtSG90c3BvdE5ldHdvcms7Ci0gICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7CisgICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXMgPSBCdW5kbGUuRU1QVFk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIHN0YXR1cyBvZiB0aGUgY29ubmVjdGlvbgpAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBIb3RzcG90TmV0d29ya0Nvbm5lY3Rpb25TdGF0dXMoQENvbm5lY3Rpb25TdGF0dXMgaW50IHN0YXR1cywKLSAgICAgICAgICAgIEhvdHNwb3ROZXR3b3JrIGhvdHNwb3ROZXR3b3JrLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBIb3RzcG90TmV0d29yayBob3RzcG90TmV0d29yaywgQE5vbk51bGwgQnVuZGxlIGV4dHJhcykgewogICAgICAgICB2YWxpZGF0ZShzdGF0dXMpOwogICAgICAgICBtU3RhdHVzID0gc3RhdHVzOwogICAgICAgICBtSG90c3BvdE5ldHdvcmsgPSBob3RzcG90TmV0d29yazsKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL0tub3duTmV0d29yay5qYXZhIGIvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvS25vd25OZXR3b3JrLmphdmEKaW5kZXggNjQ0MTJiYy4uYzM5MGU0MiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvS25vd25OZXR3b3JrLmphdmEKKysrIGIvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvS25vd25OZXR3b3JrLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlN5c3RlbUFwaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKQEAgLTczLDYgKzc0LDcgQEAKICAgICBAU2VjdXJpdHlUeXBlCiAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheVNldDxJbnRlZ2VyPiBtU2VjdXJpdHlUeXBlczsKICAgICBwcml2YXRlIGZpbmFsIE5ldHdvcmtQcm92aWRlckluZm8gbU5ldHdvcmtQcm92aWRlckluZm87CisgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKIAogICAgIC8qKgogICAgICAqIEJ1aWxkZXIgY2xhc3MgZm9yIHtAbGluayBLbm93bk5ldHdvcmt9LgpAQCAtODQsNiArODYsNyBAQAogICAgICAgICBAU2VjdXJpdHlUeXBlCiAgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlTZXQ8SW50ZWdlcj4gbVNlY3VyaXR5VHlwZXMgPSBuZXcgQXJyYXlTZXQ8PigpOwogICAgICAgICBwcml2YXRlIE5ldHdvcmtQcm92aWRlckluZm8gbU5ldHdvcmtQcm92aWRlckluZm87CisgICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXMgPSBCdW5kbGUuRU1QVFk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIGluZGljYXRlZCBzb3VyY2Ugb2YgdGhlIGtub3duIG5ldHdvcmsuCkBAIC0xMzUsNiArMTM4LDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgZXh0cmFzIGJ1bmRsZQorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIEJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEBOb25OdWxsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBLbm93bk5ldHdvcmt9IG9iamVjdC4KICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBidWlsdCB7QGxpbmsgS25vd25OZXR3b3JrfSBvYmplY3QuCkBAIC0xNDUsNyArMTU5LDggQEAKICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgIG1Tc2lkLAogICAgICAgICAgICAgICAgICAgICBtU2VjdXJpdHlUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtQcm92aWRlckluZm8pOworICAgICAgICAgICAgICAgICAgICBtTmV0d29ya1Byb3ZpZGVySW5mbywKKyAgICAgICAgICAgICAgICAgICAgbUV4dHJhcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE3MywxMiArMTg4LDE0IEBACiAgICAgICAgICAgICBATmV0d29ya1NvdXJjZSBpbnQgbmV0d29ya1NvdXJjZSwKICAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBzc2lkLAogICAgICAgICAgICAgQE5vbk51bGwgQFNlY3VyaXR5VHlwZSBBcnJheVNldDxJbnRlZ2VyPiBzZWN1cml0eVR5cGVzLAotICAgICAgICAgICAgQE51bGxhYmxlIE5ldHdvcmtQcm92aWRlckluZm8gbmV0d29ya1Byb3ZpZGVySW5mbykgeworICAgICAgICAgICAgQE51bGxhYmxlIE5ldHdvcmtQcm92aWRlckluZm8gbmV0d29ya1Byb3ZpZGVySW5mbywKKyAgICAgICAgICAgIEBOb25OdWxsIEJ1bmRsZSBleHRyYXMpIHsKICAgICAgICAgdmFsaWRhdGUobmV0d29ya1NvdXJjZSwgc3NpZCwgc2VjdXJpdHlUeXBlcywgbmV0d29ya1Byb3ZpZGVySW5mbyk7CiAgICAgICAgIG1OZXR3b3JrU291cmNlID0gbmV0d29ya1NvdXJjZTsKICAgICAgICAgbVNzaWQgPSBzc2lkOwogICAgICAgICBtU2VjdXJpdHlUeXBlcyA9IG5ldyBBcnJheVNldDw+KHNlY3VyaXR5VHlwZXMpOwogICAgICAgICBtTmV0d29ya1Byb3ZpZGVySW5mbyA9IG5ldHdvcmtQcm92aWRlckluZm87CisgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMjMsNiArMjQwLDE2IEBACiAgICAgICAgIHJldHVybiBtTmV0d29ya1Byb3ZpZGVySW5mbzsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBleHRyYXMgQnVuZGxlLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgQnVuZGxlIG9iamVjdC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBLbm93bk5ldHdvcmspKSByZXR1cm4gZmFsc2U7CkBAIC0yNDksNiArMjc2LDcgQEAKICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3NpZCk7CiAgICAgICAgIGRlc3Qud3JpdGVBcnJheVNldChtU2VjdXJpdHlUeXBlcyk7CiAgICAgICAgIG1OZXR3b3JrUHJvdmlkZXJJbmZvLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1FeHRyYXMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjYwLDcgKzI4OCw3IEBACiAgICAgcHVibGljIHN0YXRpYyBLbm93bk5ldHdvcmsgcmVhZEZyb21QYXJjZWwoQE5vbk51bGwgUGFyY2VsIGluKSB7CiAgICAgICAgIHJldHVybiBuZXcgS25vd25OZXR3b3JrKGluLnJlYWRJbnQoKSwgaW4ucmVhZFN0cmluZygpLAogICAgICAgICAgICAgICAgIChBcnJheVNldDxJbnRlZ2VyPikgaW4ucmVhZEFycmF5U2V0KG51bGwpLAotICAgICAgICAgICAgICAgIE5ldHdvcmtQcm92aWRlckluZm8ucmVhZEZyb21QYXJjZWwoaW4pKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrUHJvdmlkZXJJbmZvLnJlYWRGcm9tUGFyY2VsKGluKSwgaW4ucmVhZEJ1bmRsZSgpKTsKICAgICB9CiAKICAgICBATm9uTnVsbApAQCAtMjgzLDYgKzMxMSw3IEBACiAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBzc2lkPSIpLmFwcGVuZChtU3NpZCkKICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIHNlY3VyaXR5VHlwZXM9IikuYXBwZW5kKG1TZWN1cml0eVR5cGVzLnRvU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBuZXR3b3JrUHJvdmlkZXJJbmZvPSIpLmFwcGVuZChtTmV0d29ya1Byb3ZpZGVySW5mby50b1N0cmluZygpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChtRXh0cmFzLnRvU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXSIpLnRvU3RyaW5nKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvS25vd25OZXR3b3JrQ29ubmVjdGlvblN0YXR1cy5qYXZhIGIvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvS25vd25OZXR3b3JrQ29ubmVjdGlvblN0YXR1cy5qYXZhCmluZGV4IDZiZDBhNWUuLmIzMGRjM2YgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL0tub3duTmV0d29ya0Nvbm5lY3Rpb25TdGF0dXMuamF2YQorKysgYi93aWZpL2phdmEvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9Lbm93bk5ldHdvcmtDb25uZWN0aW9uU3RhdHVzLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBAQ29ubmVjdGlvblN0YXR1cyBwcml2YXRlIGludCBtU3RhdHVzOwogICAgICAgICBwcml2YXRlIEtub3duTmV0d29yayBtS25vd25OZXR3b3JrOwotICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOworICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzID0gQnVuZGxlLkVNUFRZOwogCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkge30KIApAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBLbm93bk5ldHdvcmtDb25uZWN0aW9uU3RhdHVzKEBDb25uZWN0aW9uU3RhdHVzIGludCBzdGF0dXMsIEtub3duTmV0d29yayBrbm93bk5ldHdvcmssCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBATm9uTnVsbCBCdW5kbGUgZXh0cmFzKSB7CiAgICAgICAgIHZhbGlkYXRlKHN0YXR1cyk7CiAgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgIG1Lbm93bk5ldHdvcmsgPSBrbm93bk5ldHdvcms7CmRpZmYgLS1naXQgYS93aWZpL2phdmEvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9OZXR3b3JrUHJvdmlkZXJJbmZvLmphdmEgYi93aWZpL2phdmEvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9OZXR3b3JrUHJvdmlkZXJJbmZvLmphdmEKaW5kZXggZWQ0ZDY5OS4uMjVmYmFiYyAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvTmV0d29ya1Byb3ZpZGVySW5mby5qYXZhCisrKyBiL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL05ldHdvcmtQcm92aWRlckluZm8uamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TeXN0ZW1BcGk7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5zaGFyZWRjb25uZWN0aXZpdHkuc2VydmljZS5TaGFyZWRDb25uZWN0aXZpdHlTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIApAQCAtODksNiArOTAsNyBAQAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Nb2RlbE5hbWU7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUJhdHRlcnlQZXJjZW50YWdlOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1Db25uZWN0aW9uU3RyZW5ndGg7CisgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKIAogICAgIC8qKgogICAgICAqIEJ1aWxkZXIgY2xhc3MgZm9yIHtAbGluayBOZXR3b3JrUHJvdmlkZXJJbmZvfS4KQEAgLTk5LDYgKzEwMSw3IEBACiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Nb2RlbE5hbWU7CiAgICAgICAgIHByaXZhdGUgaW50IG1CYXR0ZXJ5UGVyY2VudGFnZTsKICAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3Rpb25TdHJlbmd0aDsKKyAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhcyA9IEJ1bmRsZS5FTVBUWTsKIAogICAgICAgICBwdWJsaWMgQnVpbGRlcihATm9uTnVsbCBTdHJpbmcgZGV2aWNlTmFtZSwgQE5vbk51bGwgU3RyaW5nIG1vZGVsTmFtZSkgewogICAgICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChkZXZpY2VOYW1lKTsKQEAgLTE3MCw2ICsxNzMsMTcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBleHRyYXMgYnVuZGxlCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgQnVpbGRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQE5vbk51bGwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE5ldHdvcmtQcm92aWRlckluZm99IG9iamVjdC4KICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBidWlsdCB7QGxpbmsgTmV0d29ya1Byb3ZpZGVySW5mb30gb2JqZWN0LgpAQCAtMTc3LDcgKzE5MSw3IEBACiAgICAgICAgIEBOb25OdWxsCiAgICAgICAgIHB1YmxpYyBOZXR3b3JrUHJvdmlkZXJJbmZvIGJ1aWxkKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXR3b3JrUHJvdmlkZXJJbmZvKG1EZXZpY2VUeXBlLCBtRGV2aWNlTmFtZSwgbU1vZGVsTmFtZSwgbUJhdHRlcnlQZXJjZW50YWdlLAotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblN0cmVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25TdHJlbmd0aCwgbUV4dHJhcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5NywxMyArMjExLDE1IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBOZXR3b3JrUHJvdmlkZXJJbmZvKEBEZXZpY2VUeXBlIGludCBkZXZpY2VUeXBlLCBATm9uTnVsbCBTdHJpbmcgZGV2aWNlTmFtZSwKLSAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyBtb2RlbE5hbWUsIGludCBiYXR0ZXJ5UGVyY2VudGFnZSwgaW50IGNvbm5lY3Rpb25TdHJlbmd0aCkgeworICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIG1vZGVsTmFtZSwgaW50IGJhdHRlcnlQZXJjZW50YWdlLCBpbnQgY29ubmVjdGlvblN0cmVuZ3RoLAorICAgICAgICAgICAgQE5vbk51bGwgQnVuZGxlIGV4dHJhcykgewogICAgICAgICB2YWxpZGF0ZShkZXZpY2VUeXBlLCBkZXZpY2VOYW1lLCBtb2RlbE5hbWUsIGJhdHRlcnlQZXJjZW50YWdlLCBjb25uZWN0aW9uU3RyZW5ndGgpOwogICAgICAgICBtRGV2aWNlVHlwZSA9IGRldmljZVR5cGU7CiAgICAgICAgIG1EZXZpY2VOYW1lID0gZGV2aWNlTmFtZTsKICAgICAgICAgbU1vZGVsTmFtZSA9IG1vZGVsTmFtZTsKICAgICAgICAgbUJhdHRlcnlQZXJjZW50YWdlID0gYmF0dGVyeVBlcmNlbnRhZ2U7CiAgICAgICAgIG1Db25uZWN0aW9uU3RyZW5ndGggPSBjb25uZWN0aW9uU3RyZW5ndGg7CisgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTYsNiArMjcyLDE2IEBACiAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvblN0cmVuZ3RoOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGV4dHJhcyBCdW5kbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBCdW5kbGUgb2JqZWN0LgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE5ldHdvcmtQcm92aWRlckluZm8pKSByZXR1cm4gZmFsc2U7CkBAIC0yODAsNiArMzA2LDcgQEAKICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtTW9kZWxOYW1lKTsKICAgICAgICAgZGVzdC53cml0ZUludChtQmF0dGVyeVBlcmNlbnRhZ2UpOwogICAgICAgICBkZXN0LndyaXRlSW50KG1Db25uZWN0aW9uU3RyZW5ndGgpOworICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1FeHRyYXMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjk1LDcgKzMyMiw3IEBACiAgICAgQE5vbk51bGwKICAgICBwdWJsaWMgc3RhdGljIE5ldHdvcmtQcm92aWRlckluZm8gcmVhZEZyb21QYXJjZWwoQE5vbk51bGwgUGFyY2VsIGluKSB7CiAgICAgICAgIHJldHVybiBuZXcgTmV0d29ya1Byb3ZpZGVySW5mbyhpbi5yZWFkSW50KCksIGluLnJlYWRTdHJpbmcoKSwgaW4ucmVhZFN0cmluZygpLCBpbi5yZWFkSW50KCksCi0gICAgICAgICAgICAgICAgaW4ucmVhZEludCgpKTsKKyAgICAgICAgICAgICAgICBpbi5yZWFkSW50KCksIGluLnJlYWRCdW5kbGUoKSk7CiAgICAgfQogCiAgICAgQE5vbk51bGwKQEAgLTMxOSw2ICszNDYsNyBAQAogICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgbW9kZWxOYW1lPSIpLmFwcGVuZChtTW9kZWxOYW1lKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgYmF0dGVyeVBlcmNlbnRhZ2U9IikuYXBwZW5kKG1CYXR0ZXJ5UGVyY2VudGFnZSkKICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIGNvbm5lY3Rpb25TdHJlbmd0aD0iKS5hcHBlbmQobUNvbm5lY3Rpb25TdHJlbmd0aCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQobUV4dHJhcy50b1N0cmluZygpKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoIl0iKS50b1N0cmluZygpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuamF2YSBiL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuamF2YQppbmRleCA0ODA5YmVmLi4zMGJiOTg5IDEwMDY0NAotLS0gYS93aWZpL2phdmEvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9TaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLmphdmEKKysrIGIvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5qYXZhCkBAIC0xNyw3ICsxNywxMSBAQAogcGFja2FnZSBhbmRyb2lkLm5ldC53aWZpLnNoYXJlZGNvbm5lY3Rpdml0eS5hcHA7CiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlN5c3RlbUFwaTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwpAQCAtMzcsNiArNDEsNyBAQAogcHVibGljIGZpbmFsIGNsYXNzIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKIAogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSW5zdGFudFRldGhlckVuYWJsZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1JbnN0YW50VGV0aGVyU2V0dGluZ3NQZW5kaW5nSW50ZW50OwogICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7CiAKICAgICAvKioKQEAgLTQ0LDkgKzQ5LDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1JbnN0YW50VGV0aGVyRW5hYmxlZDsKLSAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKKyAgICAgICAgcHJpdmF0ZSBJbnRlbnQgbUluc3RhbnRUZXRoZXJTZXR0aW5nc0ludGVudDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzID0gQnVuZGxlLkVNUFRZOwogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKCkge30KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUgc3RhdGUgb2YgSW5zdGFudCBUZXRoZXIgaW4gc2V0dGluZ3MKQEAgLTYwLDYgKzY5LDIwIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgaW50ZW50IHRoYXQgd2lsbCBvcGVuIHRoZSBJbnN0YW50IFRldGhlciBzZXR0aW5ncyBwYWdlLgorICAgICAgICAgKiBUaGUgaW50ZW50IHdpbGwgYmUgc3RvcmVkIGFzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGluIHRoZSBzZXR0aW5ncyBvYmplY3QuIFRoZSBwZW5kaW5nCisgICAgICAgICAqIGludGVudCB3aWxsIGJlIHNldCBhcyB7QGxpbmsgUGVuZGluZ0ludGVudCNGTEFHX0lNTVVUQUJMRX0gYW5kCisgICAgICAgICAqIHtAbGluayBQZW5kaW5nSW50ZW50I0ZMQUdfT05FX1NIT1R9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIEJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudChATm9uTnVsbCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBtSW5zdGFudFRldGhlclNldHRpbmdzSW50ZW50ID0gaW50ZW50OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUgZXh0cmFzIGJ1bmRsZQogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIEJ1aWxkZXIgb2JqZWN0LgpAQCAtNzcsMTIgKzEwMCwyMSBAQAogICAgICAgICAgKi8KICAgICAgICAgQE5vbk51bGwKICAgICAgICAgcHVibGljIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUgYnVpbGQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUobUluc3RhbnRUZXRoZXJFbmFibGVkLCBtRXh0cmFzKTsKKyAgICAgICAgICAgIGlmIChtSW5zdGFudFRldGhlclNldHRpbmdzSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KG1Db250ZXh0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbnRUZXRoZXJTZXR0aW5nc0ludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQuRkxBR19JTU1VVEFCTEUgfCBQZW5kaW5nSW50ZW50LkZMQUdfT05FX1NIT1QpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZShtSW5zdGFudFRldGhlckVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW50ZW50LCBtRXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZShtSW5zdGFudFRldGhlckVuYWJsZWQsIG51bGwsIG1FeHRyYXMpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlKGJvb2xlYW4gaW5zdGFudFRldGhlckVuYWJsZWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICBwcml2YXRlIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUoYm9vbGVhbiBpbnN0YW50VGV0aGVyRW5hYmxlZCwKKyAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGVuZGluZ0ludGVudCwgQE5vbk51bGwgQnVuZGxlIGV4dHJhcykgewogICAgICAgICBtSW5zdGFudFRldGhlckVuYWJsZWQgPSBpbnN0YW50VGV0aGVyRW5hYmxlZDsKKyAgICAgICAgbUluc3RhbnRUZXRoZXJTZXR0aW5nc1BlbmRpbmdJbnRlbnQgPSBwZW5kaW5nSW50ZW50OwogICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwogICAgIH0KIApAQCAtOTYsNiArMTI4LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogR2V0cyB0aGUgcGVuZGluZyBpbnRlbnQgdG8gb3BlbiBJbnN0YW50IFRldGhlciBzZXR0aW5ncyBwYWdlLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwZW5kaW5nIGludGVudCB0aGF0IG9wZW5zIHRoZSBzZXR0aW5ncyBwYWdlLCBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgZ2V0SW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnN0YW50VGV0aGVyU2V0dGluZ3NQZW5kaW5nSW50ZW50OworICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIGV4dHJhcyBCdW5kbGUuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBCdW5kbGUgb2JqZWN0LgpAQCAtMTA5LDEyICsxNTEsMTQgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIG90aGVyID0gKFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUpIG9iajsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW50VGV0aGVyRW5hYmxlZCA9PSBvdGhlci5pc0luc3RhbnRUZXRoZXJFbmFibGVkKCk7CisgICAgICAgIHJldHVybiBtSW5zdGFudFRldGhlckVuYWJsZWQgPT0gb3RoZXIuaXNJbnN0YW50VGV0aGVyRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMobUluc3RhbnRUZXRoZXJTZXR0aW5nc1BlbmRpbmdJbnRlbnQsCisgICAgICAgICAgICAgICAgb3RoZXIuZ2V0SW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudCgpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1JbnN0YW50VGV0aGVyRW5hYmxlZCk7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobUluc3RhbnRUZXRoZXJFbmFibGVkLCBtSW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMjQsNiArMTY4LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoQE5vbk51bGwgUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBtSW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudC53cml0ZVRvUGFyY2VsKGRlc3QsIDApOwogICAgICAgICBkZXN0LndyaXRlQm9vbGVhbihtSW5zdGFudFRldGhlckVuYWJsZWQpOwogICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1FeHRyYXMpOwogICAgIH0KQEAgLTEzNSw4ICsxODAsMTAgQEAKICAgICAgKi8KICAgICBATm9uTnVsbAogICAgIHB1YmxpYyBzdGF0aWMgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSByZWFkRnJvbVBhcmNlbChATm9uTnVsbCBQYXJjZWwgaW4pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlKGluLnJlYWRCb29sZWFuKCksCi0gICAgICAgICAgICAgICAgaW4ucmVhZEJ1bmRsZSgpKTsKKyAgICAgICAgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICBib29sZWFuIGluc3RhbnRUZXRoZXJFbmFibGVkID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgQnVuZGxlIGV4dHJhcyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlKGluc3RhbnRUZXRoZXJFbmFibGVkLCBwZW5kaW5nSW50ZW50LCBleHRyYXMpOwogICAgIH0KIAogICAgIEBOb25OdWxsCkBAIC0xNTYsNiArMjAzLDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoIlNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGVbIikKICAgICAgICAgICAgICAgICAuYXBwZW5kKCJpbnN0YW50VGV0aGVyRW5hYmxlZD0iKS5hcHBlbmQobUluc3RhbnRUZXRoZXJFbmFibGVkKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIlBlbmRpbmdJbnRlbnQ9IikuYXBwZW5kKG1JbnN0YW50VGV0aGVyU2V0dGluZ3NQZW5kaW5nSW50ZW50LnRvU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAgLmFwcGVuZCgiZXh0cmFzPSIpLmFwcGVuZChtRXh0cmFzLnRvU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXSIpLnRvU3RyaW5nKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9zZXJ2aWNlL1NoYXJlZENvbm5lY3Rpdml0eVNlcnZpY2UuamF2YSBiL3dpZmkvamF2YS9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvc2VydmljZS9TaGFyZWRDb25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKaW5kZXggNTcxMDhlNC4uODdjYTk5ZiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9zZXJ2aWNlL1NoYXJlZENvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQorKysgYi93aWZpL2phdmEvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L3NlcnZpY2UvU2hhcmVkQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCkBAIC02OCw5ICs2OCw3IEBACiAgICAgICAgICAgICBuZXcgUmVtb3RlQ2FsbGJhY2tMaXN0PD4oKTsKICAgICBwcml2YXRlIExpc3Q8SG90c3BvdE5ldHdvcms+IG1Ib3RzcG90TmV0d29ya3MgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICBwcml2YXRlIExpc3Q8S25vd25OZXR3b3JrPiBtS25vd25OZXR3b3JrcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIHByaXZhdGUgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBtU2V0dGluZ3NTdGF0ZSA9Ci0gICAgICAgICAgICBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyKCkuc2V0SW5zdGFudFRldGhlckVuYWJsZWQoZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoQnVuZGxlLkVNUFRZKS5idWlsZCgpOworICAgIHByaXZhdGUgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBtU2V0dGluZ3NTdGF0ZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBIb3RzcG90TmV0d29ya0Nvbm5lY3Rpb25TdGF0dXMgbUhvdHNwb3ROZXR3b3JrQ29ubmVjdGlvblN0YXR1cyA9CiAgICAgICAgICAgICBuZXcgSG90c3BvdE5ldHdvcmtDb25uZWN0aW9uU3RhdHVzLkJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAuc2V0U3RhdHVzKEhvdHNwb3ROZXR3b3JrQ29ubmVjdGlvblN0YXR1cy5DT05ORUNUSU9OX1NUQVRVU19VTktOT1dOKQpAQCAtMjAyLDYgKzIwMCwxMyBAQAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBnZXRTZXR0aW5nc1N0YXRlKCkgewogICAgICAgICAgICAgICAgIGNoZWNrUGVybWlzc2lvbnMoKTsKKyAgICAgICAgICAgICAgICAvLyBEb25lIGxhemlseSBzaW5jZSBjcmVhdGluZyBpdCBuZWVkcyBhIGNvbnRleHQuCisgICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5nc1N0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3RhdGUgPSBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CdWlsZGVyKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnN0YW50VGV0aGVyRW5hYmxlZChmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKEJ1bmRsZS5FTVBUWSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXR0aW5nc1N0YXRlOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS93aWZpL3Rlc3RzL0FuZHJvaWQuYnAgYi93aWZpL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYzkxMDVmNy4uN2EyOTk2OSAxMDA2NDQKLS0tIGEvd2lmaS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3dpZmkvdGVzdHMvQW5kcm9pZC5icApAQCAtMzYsNiArMzYsNyBAQAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWR4LnRlc3QucnVsZXMiLAorICAgICAgICAiYW5kcm9pZHgudGVzdC5jb3JlIiwKICAgICAgICAgImZyYW1ld29ya3MtYmFzZS10ZXN0dXRpbHMiLAogICAgICAgICAiZ3VhdmEiLAogICAgICAgICAibW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IiwKZGlmZiAtLWdpdCBhL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9Ib3RzcG90TmV0d29ya1Rlc3QuamF2YSBiL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9Ib3RzcG90TmV0d29ya1Rlc3QuamF2YQppbmRleCA4MzAyMDk0Li4wODI3ZmZhIDEwMDY0NAotLS0gYS93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvSG90c3BvdE5ldHdvcmtUZXN0LmphdmEKKysrIGIvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL0hvdHNwb3ROZXR3b3JrVGVzdC5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CiAKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlTZXQ7CiAKQEAgLTU1LDYgKzU2LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9UU1BPVF9TU0lEID0gIlRFU1RfU1NJRCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPVFNQT1RfQlNTSUQgPSAiVEVTVCBfQlNTSUQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEhPVFNQT1RfU0VDVVJJVFlfVFlQRVMgPSB7U0VDVVJJVFlfVFlQRV9XRVAsIFNFQ1VSSVRZX1RZUEVfRUFQfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0tFWSA9ICJJTlQtS0VZIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVORExFX1ZBTFVFID0gMTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVWSUNFX0lEXzEgPSAxMTFMOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5ldHdvcmtQcm92aWRlckluZm8gTkVUV09SS19QUk9WSURFUl9JTkZPMSA9CkBAIC0xMzgsNiArMTQxLDcgQEAKICAgICAgICAgYXNzZXJ0VGhhdChuZXR3b3JrLmdldEhvdHNwb3RTc2lkKCkpLmlzRXF1YWxUbyhIT1RTUE9UX1NTSUQpOwogICAgICAgICBhc3NlcnRUaGF0KG5ldHdvcmsuZ2V0SG90c3BvdEJzc2lkKCkpLmlzRXF1YWxUbyhIT1RTUE9UX0JTU0lEKTsKICAgICAgICAgYXNzZXJ0VGhhdChuZXR3b3JrLmdldEhvdHNwb3RTZWN1cml0eVR5cGVzKCkpLmNvbnRhaW5zRXhhY3RseUVsZW1lbnRzSW4oc2VjdXJpdHlUeXBlcyk7CisgICAgICAgIGFzc2VydFRoYXQobmV0d29yay5nZXRFeHRyYXMoKS5nZXRJbnQoQlVORExFX0tFWSkpLmlzRXF1YWxUbyhCVU5ETEVfVkFMVUUpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNjEsMTEgKzE2NSwxOCBAQAogICAgICAgICAgICAgICAgIC5zZXRIb3N0TmV0d29ya1R5cGUoTkVUV09SS19UWVBFKQogICAgICAgICAgICAgICAgIC5zZXROZXR3b3JrTmFtZShORVRXT1JLX05BTUUpCiAgICAgICAgICAgICAgICAgLnNldEhvdHNwb3RTc2lkKEhPVFNQT1RfU1NJRCkKLSAgICAgICAgICAgICAgICAuc2V0SG90c3BvdEJzc2lkKEhPVFNQT1RfQlNTSUQpOworICAgICAgICAgICAgICAgIC5zZXRIb3RzcG90QnNzaWQoSE9UU1BPVF9CU1NJRCkKKyAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKGJ1aWxkQnVuZGxlKCkpOwogICAgICAgICBBcnJheXMuc3RyZWFtKEhPVFNQT1RfU0VDVVJJVFlfVFlQRVMpLmZvckVhY2goYnVpbGRlcjo6YWRkSG90c3BvdFNlY3VyaXR5VHlwZSk7CiAgICAgICAgIGlmICh3aXRoTmV0d29ya1Byb3ZpZGVySW5mbykgewogICAgICAgICAgICAgYnVpbGRlci5zZXROZXR3b3JrUHJvdmlkZXJJbmZvKE5FVFdPUktfUFJPVklERVJfSU5GTyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CiAgICAgfQorCisgICAgcHJpdmF0ZSBCdW5kbGUgYnVpbGRCdW5kbGUoKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoQlVORExFX0tFWSwgQlVORExFX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvS25vd25OZXR3b3JrVGVzdC5qYXZhIGIvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL0tub3duTmV0d29ya1Rlc3QuamF2YQppbmRleCAxZWNiYTc2Li44MWQ3YjQ0IDEwMDY0NAotLS0gYS93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvS25vd25OZXR3b3JrVGVzdC5qYXZhCisrKyBiL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9Lbm93bk5ldHdvcmtUZXN0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OwogCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5U2V0OwogCkBAIC00Nyw2ICs0OCw5IEBACiAgICAgICAgICAgICBuZXcgTmV0d29ya1Byb3ZpZGVySW5mby5CdWlsZGVyKCJURVNUX05BTUUiLCAiVEVTVF9NT0RFTCIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXREZXZpY2VUeXBlKERFVklDRV9UWVBFX1RBQkxFVCkuc2V0Q29ubmVjdGlvblN0cmVuZ3RoKDIpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRCYXR0ZXJ5UGVyY2VudGFnZSg1MCkuYnVpbGQoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0tFWSA9ICJJTlQtS0VZIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVORExFX1ZBTFVFID0gMTsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1NPVVJDRV8xID0gTkVUV09SS19TT1VSQ0VfQ0xPVURfU0VMRjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJRF8xID0gIlRFU1RfU1NJRDEiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFNFQ1VSSVRZX1RZUEVTXzEgPSB7U0VDVVJJVFlfVFlQRV9QU0t9OwpAQCAtMTEzLDYgKzExNyw3IEBACiAgICAgICAgIGFzc2VydFRoYXQobmV0d29yay5nZXRTc2lkKCkpLmlzRXF1YWxUbyhTU0lEKTsKICAgICAgICAgYXNzZXJ0VGhhdChuZXR3b3JrLmdldFNlY3VyaXR5VHlwZXMoKSkuY29udGFpbnNFeGFjdGx5RWxlbWVudHNJbihzZWN1cml0eVR5cGVzKTsKICAgICAgICAgYXNzZXJ0VGhhdChuZXR3b3JrLmdldE5ldHdvcmtQcm92aWRlckluZm8oKSkuaXNFcXVhbFRvKE5FVFdPUktfUFJPVklERVJfSU5GTyk7CisgICAgICAgIGFzc2VydFRoYXQobmV0d29yay5nZXRFeHRyYXMoKS5nZXRJbnQoQlVORExFX0tFWSkpLmlzRXF1YWxUbyhCVU5ETEVfVkFMVUUpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMjUsOCArMTMwLDE1IEBACiAKICAgICBwcml2YXRlIEtub3duTmV0d29yay5CdWlsZGVyIGJ1aWxkS25vd25OZXR3b3JrQnVpbGRlcigpIHsKICAgICAgICAgS25vd25OZXR3b3JrLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBLbm93bk5ldHdvcmsuQnVpbGRlcigpLnNldE5ldHdvcmtTb3VyY2UoTkVUV09SS19TT1VSQ0UpCi0gICAgICAgICAgICAgICAgLnNldFNzaWQoU1NJRCkuc2V0TmV0d29ya1Byb3ZpZGVySW5mbyhORVRXT1JLX1BST1ZJREVSX0lORk8pOworICAgICAgICAgICAgICAgIC5zZXRTc2lkKFNTSUQpLnNldE5ldHdvcmtQcm92aWRlckluZm8oTkVUV09SS19QUk9WSURFUl9JTkZPKQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoYnVpbGRCdW5kbGUoKSk7CiAgICAgICAgIEFycmF5cy5zdHJlYW0oU0VDVVJJVFlfVFlQRVMpLmZvckVhY2goYnVpbGRlcjo6YWRkU2VjdXJpdHlUeXBlKTsKICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CiAgICAgfQorCisgICAgcHJpdmF0ZSBCdW5kbGUgYnVpbGRCdW5kbGUoKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoQlVORExFX0tFWSwgQlVORExFX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvTmV0d29ya1Byb3ZpZGVySW5mb1Rlc3QuamF2YSBiL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9OZXR3b3JrUHJvdmlkZXJJbmZvVGVzdC5qYXZhCmluZGV4IDhmMzVkOGQuLjRhYTljYTYgMTAwNjQ0Ci0tLSBhL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9OZXR3b3JrUHJvdmlkZXJJbmZvVGVzdC5qYXZhCisrKyBiL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L2FwcC9OZXR3b3JrUHJvdmlkZXJJbmZvVGVzdC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGguYXNzZXJ0VGhhdDsKIAoraW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogCiBpbXBvcnQgYW5kcm9pZHgudGVzdC5maWx0ZXJzLlNtYWxsVGVzdDsKQEAgLTM4LDYgKzM5LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX01PREVMID0gIlRFU1RfTU9ERUwiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQVRURVJZX1BFUkNFTlRBR0UgPSA1MDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVFJFTkdUSCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9LRVkgPSAiSU5ULUtFWSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVTkRMRV9WQUxVRSA9IDE7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfMSA9IERFVklDRV9UWVBFX0xBUFRPUDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX05BTUVfMSA9ICJURVNUX05BTUUxIjsKQEAgLTEwNSw2ICsxMDgsNyBAQAogICAgICAgICBhc3NlcnRUaGF0KGluZm8uZ2V0TW9kZWxOYW1lKCkpLmlzRXF1YWxUbyhERVZJQ0VfTU9ERUwpOwogICAgICAgICBhc3NlcnRUaGF0KGluZm8uZ2V0QmF0dGVyeVBlcmNlbnRhZ2UoKSkuaXNFcXVhbFRvKEJBVFRFUllfUEVSQ0VOVEFHRSk7CiAgICAgICAgIGFzc2VydFRoYXQoaW5mby5nZXRDb25uZWN0aW9uU3RyZW5ndGgoKSkuaXNFcXVhbFRvKENPTk5FQ1RJT05fU1RSRU5HVEgpOworICAgICAgICBhc3NlcnRUaGF0KGluZm8uZ2V0RXh0cmFzKCkuZ2V0SW50KEJVTkRMRV9LRVkpKS5pc0VxdWFsVG8oQlVORExFX1ZBTFVFKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTE4LDYgKzEyMiwxMyBAQAogICAgIHByaXZhdGUgTmV0d29ya1Byb3ZpZGVySW5mby5CdWlsZGVyIGJ1aWxkTmV0d29ya1Byb3ZpZGVySW5mb0J1aWxkZXIoKSB7CiAgICAgICAgIHJldHVybiBuZXcgTmV0d29ya1Byb3ZpZGVySW5mby5CdWlsZGVyKERFVklDRV9OQU1FLCBERVZJQ0VfTU9ERUwpLnNldERldmljZVR5cGUoREVWSUNFX1RZUEUpCiAgICAgICAgICAgICAgICAgLnNldEJhdHRlcnlQZXJjZW50YWdlKEJBVFRFUllfUEVSQ0VOVEFHRSkKLSAgICAgICAgICAgICAgICAuc2V0Q29ubmVjdGlvblN0cmVuZ3RoKENPTk5FQ1RJT05fU1RSRU5HVEgpOworICAgICAgICAgICAgICAgIC5zZXRDb25uZWN0aW9uU3RyZW5ndGgoQ09OTkVDVElPTl9TVFJFTkdUSCkKKyAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKGJ1aWxkQnVuZGxlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgQnVuZGxlIGJ1aWxkQnVuZGxlKCkgeworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0SW50KEJVTkRMRV9LRVksIEJVTkRMRV9WQUxVRSk7CisgICAgICAgIHJldHVybiBidW5kbGU7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eU1hbmFnZXJUZXN0LmphdmEgYi93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvU2hhcmVkQ29ubmVjdGl2aXR5TWFuYWdlclRlc3QuamF2YQppbmRleCA3NTc4ZGZkLi43MTIzOTA4NyAxMDA2NDQKLS0tIGEvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eU1hbmFnZXJUZXN0LmphdmEKKysrIGIvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eU1hbmFnZXJUZXN0LmphdmEKQEAgLTQ5Nyw4ICs0OTcsOSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgZ2V0U2V0dGluZ3NTdGF0ZV9zZXJ2aWNlQ29ubmVjdGVkX3Nob3VsZFJldHVyblN0YXRlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFNoYXJlZENvbm5lY3Rpdml0eU1hbmFnZXIgbWFuYWdlciA9IFNoYXJlZENvbm5lY3Rpdml0eU1hbmFnZXIuY3JlYXRlKG1Db250ZXh0KTsKLSAgICAgICAgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZSBzdGF0ZSA9IG5ldyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRJbnN0YW50VGV0aGVyRW5hYmxlZCh0cnVlKS5zZXRFeHRyYXMobmV3IEJ1bmRsZSgpKS5idWlsZCgpOworICAgICAgICBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIHN0YXRlID0KKyAgICAgICAgICAgICAgICBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyKG1Db250ZXh0KS5zZXRJbnN0YW50VGV0aGVyRW5hYmxlZCh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEV4dHJhcyhuZXcgQnVuZGxlKCkpLmJ1aWxkKCk7CiAgICAgICAgIG1hbmFnZXIuc2V0U2VydmljZShtU2VydmljZSk7CiAgICAgICAgIHdoZW4obVNlcnZpY2UuZ2V0U2V0dGluZ3NTdGF0ZSgpKS50aGVuUmV0dXJuKHN0YXRlKTsKIApkaWZmIC0tZ2l0IGEvd2lmaS90ZXN0cy9zcmMvYW5kcm9pZC9uZXQvd2lmaS9zaGFyZWRjb25uZWN0aXZpdHkvYXBwL1NoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGVUZXN0LmphdmEgYi93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZVRlc3QuamF2YQppbmRleCA3NTJiNzQ5Li41ZTE3ZGZiIDEwMDY0NAotLS0gYS93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZVRlc3QuamF2YQorKysgYi93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9hcHAvU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZVRlc3QuamF2YQpAQCAtMTgsOCArMTgsMTAgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIAoraW1wb3J0IGFuZHJvaWR4LnRlc3QuY29yZS5hcHAuQXBwbGljYXRpb25Qcm92aWRlcjsKIGltcG9ydCBhbmRyb2lkeC50ZXN0LmZpbHRlcnMuU21hbGxUZXN0OwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0zMCw4ICszMiwxMiBAQAogQFNtYWxsVGVzdAogcHVibGljIGNsYXNzIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGVUZXN0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElOU1RBTlRfVEVUSEVSX1NUQVRFID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URU5UX0FDVElPTiA9ICJpbnN0YW50LnRldGhlci5zZXR0aW5ncyI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElOU1RBTlRfVEVUSEVSX1NUQVRFXzEgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URU5UX0FDVElPTl8xID0gImluc3RhbnQudGV0aGVyLnNldHRpbmdzMSI7CisKKwogICAgIC8qKgogICAgICAqIFZlcmlmaWVzIHBhcmNlbCBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi4KICAgICAgKi8KQEAgLTM5LDE2ICs0NSwxMSBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJjZWxPcGVyYXRpb24oKSB7CiAgICAgICAgIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUgc3RhdGUgPSBidWlsZFNldHRpbmdzU3RhdGVCdWlsZGVyKCkuYnVpbGQoKTsKIAotICAgICAgICBQYXJjZWwgcGFyY2VsVyA9IFBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgc3RhdGUud3JpdGVUb1BhcmNlbChwYXJjZWxXLCAwKTsKLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gcGFyY2VsVy5tYXJzaGFsbCgpOwotICAgICAgICBwYXJjZWxXLnJlY3ljbGUoKTsKLQotICAgICAgICBQYXJjZWwgcGFyY2VsUiA9IFBhcmNlbC5vYnRhaW4oKTsKLSAgICAgICAgcGFyY2VsUi51bm1hcnNoYWxsKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotICAgICAgICBwYXJjZWxSLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgUGFyY2VsIHBhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgc3RhdGUud3JpdGVUb1BhcmNlbChwYXJjZWwsIDApOworICAgICAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOwogICAgICAgICBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIGZyb21QYXJjZWwgPQotICAgICAgICAgICAgICAgIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbFIpOworICAgICAgICAgICAgICAgIFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChmcm9tUGFyY2VsKS5pc0VxdWFsVG8oc3RhdGUpOwogICAgICAgICBhc3NlcnRUaGF0KGZyb21QYXJjZWwuaGFzaENvZGUoKSkuaXNFcXVhbFRvKHN0YXRlLmhhc2hDb2RlKCkpOwpAQCAtNjYsNiArNjcsMTAgQEAKICAgICAgICAgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBidWlsZFNldHRpbmdzU3RhdGVCdWlsZGVyKCkKICAgICAgICAgICAgICAgICAuc2V0SW5zdGFudFRldGhlckVuYWJsZWQoSU5TVEFOVF9URVRIRVJfU1RBVEVfMSk7CiAgICAgICAgIGFzc2VydFRoYXQoYnVpbGRlci5idWlsZCgpKS5pc05vdEVxdWFsVG8oc3RhdGUxKTsKKworICAgICAgICBidWlsZGVyID0gYnVpbGRTZXR0aW5nc1N0YXRlQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldEluc3RhbnRUZXRoZXJTZXR0aW5nc1BlbmRpbmdJbnRlbnQobmV3IEludGVudChJTlRFTlRfQUNUSU9OXzEpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZGVyLmJ1aWxkKCkpLmlzTm90RXF1YWxUbyhzdGF0ZTEpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODYsNyArOTEsOSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyIGJ1aWxkU2V0dGluZ3NTdGF0ZUJ1aWxkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2hhcmVkQ29ubmVjdGl2aXR5U2V0dGluZ3NTdGF0ZS5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0SW5zdGFudFRldGhlckVuYWJsZWQoSU5TVEFOVF9URVRIRVJfU1RBVEUpOworICAgICAgICByZXR1cm4gbmV3IFNoYXJlZENvbm5lY3Rpdml0eVNldHRpbmdzU3RhdGUuQnVpbGRlcigKKyAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblByb3ZpZGVyLmdldEFwcGxpY2F0aW9uQ29udGV4dCgpKQorICAgICAgICAgICAgICAgIC5zZXRJbnN0YW50VGV0aGVyRW5hYmxlZChJTlNUQU5UX1RFVEhFUl9TVEFURSkKKyAgICAgICAgICAgICAgICAuc2V0SW5zdGFudFRldGhlclNldHRpbmdzUGVuZGluZ0ludGVudChuZXcgSW50ZW50KElOVEVOVF9BQ1RJT04pKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9zZXJ2aWNlL1NoYXJlZENvbm5lY3Rpdml0eVNlcnZpY2VUZXN0LmphdmEgYi93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9zZXJ2aWNlL1NoYXJlZENvbm5lY3Rpdml0eVNlcnZpY2VUZXN0LmphdmEKaW5kZXggYjhiNmI3NjcuLjUxNGJhM2MgMTAwNjQ0Ci0tLSBhL3dpZmkvdGVzdHMvc3JjL2FuZHJvaWQvbmV0L3dpZmkvc2hhcmVkY29ubmVjdGl2aXR5L3NlcnZpY2UvU2hhcmVkQ29ubmVjdGl2aXR5U2VydmljZVRlc3QuamF2YQorKysgYi93aWZpL3Rlc3RzL3NyYy9hbmRyb2lkL25ldC93aWZpL3NoYXJlZGNvbm5lY3Rpdml0eS9zZXJ2aWNlL1NoYXJlZENvbm5lY3Rpdml0eVNlcnZpY2VUZXN0LmphdmEKQEAgLTc1LDkgKzc1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgLmFkZFNlY3VyaXR5VHlwZShTRUNVUklUWV9UWVBFX0VBUCkuc2V0TmV0d29ya1Byb3ZpZGVySW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRXT1JLX1BST1ZJREVSX0lORk8pLmJ1aWxkKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxLbm93bk5ldHdvcms+IEtOT1dOX05FVFdPUktTID0gTGlzdC5vZihLTk9XTl9ORVRXT1JLKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIFNFVFRJTkdTX1NUQVRFID0KLSAgICAgICAgICAgIG5ldyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLkJ1aWxkZXIoKS5zZXRJbnN0YW50VGV0aGVyRW5hYmxlZCh0cnVlKQotICAgICAgICAgICAgICAgICAgICAuc2V0RXh0cmFzKEJ1bmRsZS5FTVBUWSkuYnVpbGQoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIb3RzcG90TmV0d29ya0Nvbm5lY3Rpb25TdGF0dXMgVEVUSEVSX05FVFdPUktfQ09OTkVDVElPTl9TVEFUVVMgPQogICAgICAgICAgICAgbmV3IEhvdHNwb3ROZXR3b3JrQ29ubmVjdGlvblN0YXR1cy5CdWlsZGVyKCkuc2V0U3RhdHVzKENPTk5FQ1RJT05fU1RBVFVTX1VOS05PV04pCiAgICAgICAgICAgICAgICAgICAgIC5zZXRIb3RzcG90TmV0d29yayhIT1RTUE9UX05FVFdPUkspLnNldEV4dHJhcyhCdW5kbGUuRU1QVFkpLmJ1aWxkKCk7CkBAIC0xNTUsMTAgKzE1MiwxMSBAQAogICAgICAgICBTaGFyZWRDb25uZWN0aXZpdHlTZXJ2aWNlIHNlcnZpY2UgPSBjcmVhdGVTZXJ2aWNlKCk7CiAgICAgICAgIElTaGFyZWRDb25uZWN0aXZpdHlTZXJ2aWNlLlN0dWIgYmluZGVyID0KICAgICAgICAgICAgICAgICAoSVNoYXJlZENvbm5lY3Rpdml0eVNlcnZpY2UuU3R1Yikgc2VydmljZS5vbkJpbmQobmV3IEludGVudCgpKTsKKyAgICAgICAgd2hlbihtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKS50aGVuUmV0dXJuKCJhbmRyb2lkLm5ldC53aWZpLm5vbnVwZGF0YWJsZS50ZXN0Iik7CiAKLSAgICAgICAgc2VydmljZS5zZXRTZXR0aW5nc1N0YXRlKFNFVFRJTkdTX1NUQVRFKTsKKyAgICAgICAgc2VydmljZS5zZXRTZXR0aW5nc1N0YXRlKGJ1aWxkU2V0dGluZ3NTdGF0ZSgpKTsKIAotICAgICAgICBhc3NlcnRUaGF0KGJpbmRlci5nZXRTZXR0aW5nc1N0YXRlKCkpLmlzRXF1YWxUbyhTRVRUSU5HU19TVEFURSk7CisgICAgICAgIGFzc2VydFRoYXQoYmluZGVyLmdldFNldHRpbmdzU3RhdGUoKSkuaXNFcXVhbFRvKGJ1aWxkU2V0dGluZ3NTdGF0ZSgpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjMyLDQgKzIzMCwxMCBAQAogICAgICAgICBzZXJ2aWNlLmF0dGFjaEJhc2VDb250ZXh0KG1Db250ZXh0KTsKICAgICAgICAgcmV0dXJuIHNlcnZpY2U7CiAgICAgfQorCisgICAgcHJpdmF0ZSBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlIGJ1aWxkU2V0dGluZ3NTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRDb25uZWN0aXZpdHlTZXR0aW5nc1N0YXRlLkJ1aWxkZXIobUNvbnRleHQpLnNldEluc3RhbnRUZXRoZXJFbmFibGVkKHRydWUpCisgICAgICAgICAgICAgICAgLnNldEluc3RhbnRUZXRoZXJTZXR0aW5nc1BlbmRpbmdJbnRlbnQobmV3IEludGVudCgpKQorICAgICAgICAgICAgICAgIC5zZXRFeHRyYXMoQnVuZGxlLkVNUFRZKS5idWlsZCgpOworICAgIH0KIH0K