ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDU2ODM1MmUuLjc1MjBhZmUgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTE3LDYgKzExNyw3IEBACiAJY29yZS9qYXZhL2FuZHJvaWQvb3MvSVBhcmVudGFsQ29udHJvbENhbGxiYWNrLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL29zL0lQZXJtaXNzaW9uQ29udHJvbGxlci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9vcy9JUG93ZXJNYW5hZ2VyLmFpZGwgXAorICAgIGNvcmUvamF2YS9hbmRyb2lkL29zL0lSZW1vdGVDYWxsYmFjay5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9vcy9JVmlicmF0b3JTZXJ2aWNlLmFpZGwgXAogICAgIGNvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL0lXYWxscGFwZXJDb25uZWN0aW9uLmFpZGwgXAogICAgIGNvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL0lXYWxscGFwZXJFbmdpbmUuYWlkbCBcCkBAIC0xMzYsNiArMTM3LDcgQEAKIAljb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL0lUdHNDYWxsYmFjay5haWRsIFwKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0lCYXR0ZXJ5U3RhdHMuYWlkbCBcCiAJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9JVXNhZ2VTdGF0cy5haWRsIFwKKwljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0lNZWRpYUNvbnRhaW5lclNlcnZpY2UuYWlkbCBcCiAJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0U2VydmljZS5haWRsIFwKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRIb3N0LmFpZGwgXAogCWNvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9iYWNrdXAvSUJhY2t1cFRyYW5zcG9ydC5haWRsIFwKZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnhtbCBiL2FwaS9jdXJyZW50LnhtbAppbmRleCBjZDIwMGMxLi4xMjUwNDYxIDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC54bWwKKysrIGIvYXBpL2N1cnJlbnQueG1sCkBAIC0zMTg0LDcgKzMxODQsNyBAQAogIHZhbHVlPSIxNjg0MzM5NSIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgpAQCAtMzI2MSw3ICszMjYxLDcgQEAKICB2YWx1ZT0iMTY4NDMzNjIiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KQEAgLTUxMzEsNyArNTEzMSw3IEBACiAgdmFsdWU9IjE2ODQyOTk3IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+CkBAIC01MjUyLDcgKzUyNTIsNyBAQAogIHZhbHVlPSIxNjg0Mjk5NiIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgpAQCAtMTYxNzYsMTEgKzE2MTc2LDI2IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZURpYWxvZyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkRpYWxvZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25DcmVhdGVPcHRpb25zTWVudSIKICByZXR1cm49ImJvb2xlYW4iCkBAIC0xNjQ3Niw2ICsxNjQ5MSwyMSBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRpYWxvZyIgdHlwZT0iYW5kcm9pZC5hcHAuRGlhbG9nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlcGFyZURpYWxvZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CkBAIC0xNjQ4Myw2ICsxNjUxMyw4IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0iZGlhbG9nIiB0eXBlPSJhbmRyb2lkLmFwcC5EaWFsb2ciPgogPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uUHJlcGFyZU9wdGlvbnNNZW51IgogIHJldHVybj0iYm9vbGVhbiIKQEAgLTE3MTEwLDYgKzE3MTQyLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd0RpYWxvZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUZvclJlc3VsdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk4OTUsNiArMTk5NDIsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EaXNhYmxlUmVxdWVzdGVkIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkRpc2FibGVkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTk5Niw2ICsyMDA1OCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX0RFVklDRV9BRE1JTl9ESVNBQkxFX1JFUVVFU1RFRCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmFwcC5hY3Rpb24uREVWSUNFX0FETUlOX0RJU0FCTEVfUkVRVUVTVEVEJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkFDVElPTl9ERVZJQ0VfQURNSU5fRU5BQkxFRCIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMDA1MSw2ICsyMDEyNCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhUUkFfRElTQUJMRV9XQVJOSU5HIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuYXBwLmV4dHJhLkRJU0FCTEVfV0FSTklORyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iRGV2aWNlQWRtaW5JbmZvIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0yMDQyMCw2ICsyMDUwNCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibnVtIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TWF4aW11bVRpbWVUb0xvY2siCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNTAwLDYgKzIwNTk5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9BRERfRVhQTEFOQVRJT04iCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5hcHAuZXh0cmEuQUREX0VYUExBTkFUSU9OJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkVYVFJBX0RFVklDRV9BRE1JTiIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xMTk5NjAsNiArMTIwMDcwLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9IRUFERVJTX0tFWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtjb20uYW5kcm9pZC5icm93c2VyLmhlYWRlcnNfa2V5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYVFJBX0hFQURFUlNfVkFMVUUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7Y29tLmFuZHJvaWQuYnJvd3Nlci5oZWFkZXJzX3ZhbHVlJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkhJU1RPUllfUFJPSkVDVElPTiIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE4OTg1MCw2ICsxODk5ODIsMjEgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0idXJsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJleHRyYUhlYWRlcnMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZFVybCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVybCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkNoaWxkVmlld0FkZGVkIgogIHJldHVybj0idm9pZCIKZGlmZiAtLWdpdCBhL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggYThlMjE3ZS4uODFkNjBkYyAxMDA2NDQKLS0tIGEvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTExOTEsMTQgKzExOTEsNiBAQAogCiAgICAgQ2FtZXJhUGFyYW1ldGVycyBwKHBhcmFtcyk7CiAKLSAgICAvLyBUaGUgb3JpZW50YXRpb24gcGFyYW1ldGVyIGlzIGFjdHVhbGx5IGZvciBDYW1lcmFTZXJ2aWNlLCBub3QgZm9yIHRoZSBjYW1lcmEgZHJpdmVyLgotICAgIGlmIChwLmdldE9yaWVudGF0aW9uKCkgPT0gQ2FtZXJhUGFyYW1ldGVyczo6Q0FNRVJBX09SSUVOVEFUSU9OX1BPUlRSQUlUKSB7Ci0gICAgICAgIExPR1YoInBvcnRyYWl0IG1vZGUiKTsKLSAgICAgICAgbU9yaWVudGF0aW9uID0gSVN1cmZhY2U6OkJ1ZmZlckhlYXA6OlJPVF85MDsKLSAgICB9IGVsc2UgewotICAgICAgICBtT3JpZW50YXRpb24gPSAwOwotICAgIH0KLQogICAgIHJldHVybiBtSGFyZHdhcmUtPnNldFBhcmFtZXRlcnMocCk7CiB9CiAKQEAgLTEyMjQsNiArMTIxNiwzMCBAQAogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKIAorICAgIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9TRVRfRElTUExBWV9PUklFTlRBVElPTikgeworICAgICAgICAvLyBUaGUgb3JpZW50YXRpb24gY2Fubm90IGJlIHNldCBkdXJpbmcgcHJldmlldy4KKyAgICAgICAgaWYgKG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYXJnMSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbiA9IElTdXJmYWNlOjpCdWZmZXJIZWFwOjpST1RfMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uID0gSVN1cmZhY2U6OkJ1ZmZlckhlYXA6OlJPVF85MDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTgwOgorICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbiA9IElTdXJmYWNlOjpCdWZmZXJIZWFwOjpST1RfMTgwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uID0gSVN1cmZhY2U6OkJ1ZmZlckhlYXA6OlJPVF8yNzA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewogICAgICAgICBMT0dFKCJtSGFyZHdhcmUgaXMgTlVMTCwgcmV0dXJuaW5nLiIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCmluZGV4IDkzMDA5MTUuLjc4ZjkwYTEgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCisrKyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCkBAIC0xMjksNyArMTI5LDcgQEAKICAgICBkdW1wX2ZpbGUoIkxBU1QgUEFOSUMgQ09OU09MRSIsICIvZGF0YS9kb250cGFuaWMvYXBhbmljX2NvbnNvbGUiKTsKICAgICBkdW1wX2ZpbGUoIkxBU1QgUEFOSUMgVEhSRUFEUyIsICIvZGF0YS9kb250cGFuaWMvYXBhbmljX3RocmVhZHMiKTsKIAotICAgIHByaW50ZigiLS0tLS0gQkFDS0xJR0hUUyAtLS0tLVxuIik7CisgICAgcHJpbnRmKCItLS0tLS0gQkFDS0xJR0hUUyAtLS0tLS1cbiIpOwogICAgIHByaW50ZigiTENEIGJyaWdodG5lc3M9Iik7CiAgICAgZHVtcF9maWxlKE5VTEwsICIvc3lzL2NsYXNzL2xlZHMvbGNkLWJhY2tsaWdodC9icmlnaHRuZXNzIik7CiAgICAgcHJpbnRmKCJCdXR0b24gYnJpZ2h0bmVzcz0iKTsKZGlmZiAtLWdpdCBhL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMgYi9jbWRzL2R1bXBzdGF0ZS91dGlscy5jCmluZGV4IGZkYTYxOGMuLjM5ZTE0ZTQgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMKKysrIGIvY21kcy9kdW1wc3RhdGUvdXRpbHMuYwpAQCAtNDMsMTMgKzQzLDEzIEBACiAgICAgaW50IGZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICBpbnQgZXJyID0gZXJybm87Ci0gICAgICAgIGlmICh0aXRsZSkgcHJpbnRmKCItLS0tLSAlcyAoJXMpIC0tLS0tXG4iLCB0aXRsZSwgcGF0aCk7CisgICAgICAgIGlmICh0aXRsZSkgcHJpbnRmKCItLS0tLS0gJXMgKCVzKSAtLS0tLS1cbiIsIHRpdGxlLCBwYXRoKTsKICAgICAgICAgcHJpbnRmKCIqKiogJXM6ICVzXG4iLCBwYXRoLCBzdHJlcnJvcihlcnIpKTsKICAgICAgICAgaWYgKHRpdGxlKSBwcmludGYoIlxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAodGl0bGUpIHByaW50ZigiLS0tLS0gJXMgKCVzIiwgdGl0bGUsIHBhdGgpOworICAgIGlmICh0aXRsZSkgcHJpbnRmKCItLS0tLS0gJXMgKCVzIiwgdGl0bGUsIHBhdGgpOwogCiAgICAgaWYgKHRpdGxlKSB7CiAgICAgICAgIHN0cnVjdCBzdGF0IHN0OwpAQCAtNTksNyArNTksNyBAQAogICAgICAgICAgICAgc3RyZnRpbWUoc3RhbXAsIHNpemVvZihzdGFtcCksICIlWS0lbS0lZCAlSDolTTolUyIsIGxvY2FsdGltZSgmbXRpbWUpKTsKICAgICAgICAgICAgIHByaW50ZigiOiAlcyIsIHN0YW1wKTsKICAgICAgICAgfQotICAgICAgICBwcmludGYoIikgLS0tLS1cbiIpOworICAgICAgICBwcmludGYoIikgLS0tLS0tXG4iKTsKICAgICB9CiAKICAgICBpbnQgbmV3bGluZSA9IDA7CkBAIC05NywxMyArOTcsMTMgQEAKIAogICAgICAgICB2YV9saXN0IGFwOwogICAgICAgICB2YV9zdGFydChhcCwgY29tbWFuZCk7Ci0gICAgICAgIGlmICh0aXRsZSkgcHJpbnRmKCItLS0tLSAlcyAoJXMiLCB0aXRsZSwgY29tbWFuZCk7CisgICAgICAgIGlmICh0aXRsZSkgcHJpbnRmKCItLS0tLS0gJXMgKCVzIiwgdGl0bGUsIGNvbW1hbmQpOwogICAgICAgICBmb3IgKGFyZyA9IDE7IGFyZyA8IHNpemVvZihhcmdzKSAvIHNpemVvZihhcmdzWzBdKTsgKythcmcpIHsKICAgICAgICAgICAgIGFyZ3NbYXJnXSA9IHZhX2FyZyhhcCwgY29uc3QgY2hhciAqKTsKICAgICAgICAgICAgIGlmIChhcmdzW2FyZ10gPT0gTlVMTCkgYnJlYWs7CiAgICAgICAgICAgICBpZiAodGl0bGUpIHByaW50ZigiICVzIiwgYXJnc1thcmddKTsKICAgICAgICAgfQotICAgICAgICBpZiAodGl0bGUpIHByaW50ZigiKSAtLS0tLVxuIik7CisgICAgICAgIGlmICh0aXRsZSkgcHJpbnRmKCIpIC0tLS0tLVxuIik7CiAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogCiAgICAgICAgIGV4ZWN2cChjb21tYW5kLCAoY2hhcioqKSBhcmdzKTsKQEAgLTE1OSw3ICsxNTksNyBAQAogICAgIHByb3BlcnR5X2xpc3QocHJpbnRfcHJvcCwgTlVMTCk7CiAgICAgcXNvcnQoJnByb3BzLCBudW1fcHJvcHMsIHNpemVvZihwcm9wc1swXSksIGNvbXBhcmVfcHJvcCk7CiAKLSAgICBwcmludGYoIi0tLS0tIFNZU1RFTSBQUk9QRVJUSUVTIC0tLS0tXG4iKTsKKyAgICBwcmludGYoIi0tLS0tLSBTWVNURU0gUFJPUEVSVElFUyAtLS0tLS1cbiIpOwogICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcHJvcHM7ICsraSkgewogICAgICAgICBmcHV0cyhwcm9wc1tpXSwgc3Rkb3V0KTsKICAgICAgICAgZnJlZShwcm9wc1tpXSk7CmRpZmYgLS1naXQgYS9jbWRzL2luc3RhbGxkL3V0aWxzLmMgYi9jbWRzL2luc3RhbGxkL3V0aWxzLmMKaW5kZXggNWRiNTU0NS4uNTU1YzE5ZSAxMDA2NDQKLS0tIGEvY21kcy9pbnN0YWxsZC91dGlscy5jCisrKyBiL2NtZHMvaW5zdGFsbGQvdXRpbHMuYwpAQCAtMzMsNiArMzMsNyBAQAogICAgIH0KIAogICAgIHggPSBwa2duYW1lOworICAgIGludCBhbHBoYSA9IC0xOwogICAgIHdoaWxlICgqeCkgewogICAgICAgICBpZiAoaXNhbG51bSgqeCkgfHwgKCp4ID09ICdfJykpIHsKICAgICAgICAgICAgICAgICAvKiBhbHBoYW51bWVyaWMgb3IgdW5kZXJzY29yZSBhcmUgZmluZSAqLwpAQCAtNDIsMTMgKzQzLDI4IEBACiAgICAgICAgICAgICAgICAgTE9HRSgiaW52YWxpZCBwYWNrYWdlIG5hbWUgJyVzJ1xuIiwgcGtnbmFtZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworICAgICAgICB9IGVsc2UgaWYgKCp4ID09ICctJykgeworICAgICAgICAgICAgLyogU3VmZml4IC1YIGlzIGZpbmUgdG8gbGV0IHZlcnNpb25pbmcgb2YgcGFja2FnZXMuCisgICAgICAgICAgICAgICBCdXQgd2hhdGV2ZXIgZm9sbG93cyBzaG91bGQgYmUgYWxwaGFudW1lcmljLiovCisgICAgICAgICAgICBhbHBoYSA9IDE7CisgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgICAgICAvKiBhbnl0aGluZyBub3QgQS1aLCBhLXosIDAtOSwgXywgb3IgLiBpcyBpbnZhbGlkICovCiAgICAgICAgICAgICBMT0dFKCJpbnZhbGlkIHBhY2thZ2UgbmFtZSAnJXMnXG4iLCBwa2duYW1lKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICB4Kys7CiAgICAgfQorICAgIGlmIChhbHBoYSA9PSAxKSB7CisgICAgICAgIC8vIFNraXAgY3VycmVudCBjaGFyYWN0ZXIKKyAgICAgICAgeCsrOworICAgICAgICB3aGlsZSAoKngpIHsKKyAgICAgICAgICAgIGlmICghaXNhbG51bSgqeCkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJpbnZhbGlkIHBhY2thZ2UgbmFtZSAnJXMnIHNob3VsZCBpbmNsdWRlIG9ubHkgbnVtYmVycyBhZnRlciAtXG4iLCBwa2duYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4Kys7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBzcHJpbnRmKHBhdGgsICIlcyVzJXMiLCBwcmVmaXgsIHBrZ25hbWUsIHBvc3RmaXgpOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQppbmRleCAxYzM0MTRkLi45NTE0MmUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQpAQCAtMzksNiArMzksNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKQEAgLTYwOCw4ICs2MDksMTMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HX0lEU19LRVkgPSAiYW5kcm9pZDpzYXZlZERpYWxvZ0lkcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0RJQUxPR1NfVEFHID0gImFuZHJvaWQ6c2F2ZWREaWFsb2dzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HX0tFWV9QUkVGSVggPSAiYW5kcm9pZDpkaWFsb2dfIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HX0FSR1NfS0VZX1BSRUZJWCA9ICJhbmRyb2lkOmRpYWxvZ19hcmdzXyI7CiAKLSAgICBwcml2YXRlIFNwYXJzZUFycmF5PERpYWxvZz4gbU1hbmFnZWREaWFsb2dzOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hbmFnZWREaWFsb2cgeworICAgICAgICBEaWFsb2cgbURpYWxvZzsKKyAgICAgICAgQnVuZGxlIG1BcmdzOworICAgIH0KKyAgICBwcml2YXRlIFNwYXJzZUFycmF5PE1hbmFnZWREaWFsb2c+IG1NYW5hZ2VkRGlhbG9nczsKIAogICAgIC8vIHNldCBieSB0aGUgdGhyZWFkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciBhbmQgYmVmb3JlIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIGlzIGNhbGxlZC4KICAgICBwcml2YXRlIEluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uOwpAQCAtODUwLDM1ICs4NTYsNDEgQEAKIAogICAgICAgICBmaW5hbCBpbnRbXSBpZHMgPSBiLmdldEludEFycmF5KFNBVkVEX0RJQUxPR19JRFNfS0VZKTsKICAgICAgICAgZmluYWwgaW50IG51bURpYWxvZ3MgPSBpZHMubGVuZ3RoOwotICAgICAgICBtTWFuYWdlZERpYWxvZ3MgPSBuZXcgU3BhcnNlQXJyYXk8RGlhbG9nPihudW1EaWFsb2dzKTsKKyAgICAgICAgbU1hbmFnZWREaWFsb2dzID0gbmV3IFNwYXJzZUFycmF5PE1hbmFnZWREaWFsb2c+KG51bURpYWxvZ3MpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bURpYWxvZ3M7IGkrKykgewogICAgICAgICAgICAgZmluYWwgSW50ZWdlciBkaWFsb2dJZCA9IGlkc1tpXTsKICAgICAgICAgICAgIEJ1bmRsZSBkaWFsb2dTdGF0ZSA9IGIuZ2V0QnVuZGxlKHNhdmVkRGlhbG9nS2V5Rm9yKGRpYWxvZ0lkKSk7CiAgICAgICAgICAgICBpZiAoZGlhbG9nU3RhdGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIENhbGxpbmcgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZSgpIGJlbG93IHdpbGwgaW52b2tlIGRpc3BhdGNoT25DcmVhdGUKICAgICAgICAgICAgICAgICAvLyBzbyB0ZWxsIGNyZWF0ZURpYWxvZygpIG5vdCB0byBkbyBpdCwgb3RoZXJ3aXNlIHdlIGdldCBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBmaW5hbCBEaWFsb2cgZGlhbG9nID0gY3JlYXRlRGlhbG9nKGRpYWxvZ0lkLCBkaWFsb2dTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZWREaWFsb2dzLnB1dChkaWFsb2dJZCwgZGlhbG9nKTsKLSAgICAgICAgICAgICAgICBvblByZXBhcmVEaWFsb2coZGlhbG9nSWQsIGRpYWxvZyk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoZGlhbG9nU3RhdGUpOworICAgICAgICAgICAgICAgIGZpbmFsIE1hbmFnZWREaWFsb2cgbWQgPSBuZXcgTWFuYWdlZERpYWxvZygpOworICAgICAgICAgICAgICAgIG1kLm1BcmdzID0gYi5nZXRCdW5kbGUoc2F2ZWREaWFsb2dBcmdzS2V5Rm9yKGRpYWxvZ0lkKSk7CisgICAgICAgICAgICAgICAgbWQubURpYWxvZyA9IGNyZWF0ZURpYWxvZyhkaWFsb2dJZCwgZGlhbG9nU3RhdGUsIG1kLm1BcmdzKTsKKyAgICAgICAgICAgICAgICBpZiAobWQubURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VkRGlhbG9ncy5wdXQoZGlhbG9nSWQsIG1kKTsKKyAgICAgICAgICAgICAgICAgICAgb25QcmVwYXJlRGlhbG9nKGRpYWxvZ0lkLCBtZC5tRGlhbG9nLCBtZC5tQXJncyk7CisgICAgICAgICAgICAgICAgICAgIG1kLm1EaWFsb2cub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShkaWFsb2dTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBEaWFsb2cgY3JlYXRlRGlhbG9nKEludGVnZXIgZGlhbG9nSWQsIEJ1bmRsZSBzdGF0ZSkgewotICAgICAgICBmaW5hbCBEaWFsb2cgZGlhbG9nID0gb25DcmVhdGVEaWFsb2coZGlhbG9nSWQpOworICAgIHByaXZhdGUgRGlhbG9nIGNyZWF0ZURpYWxvZyhJbnRlZ2VyIGRpYWxvZ0lkLCBCdW5kbGUgc3RhdGUsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIGZpbmFsIERpYWxvZyBkaWFsb2cgPSBvbkNyZWF0ZURpYWxvZyhkaWFsb2dJZCwgYXJncyk7CiAgICAgICAgIGlmIChkaWFsb2cgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWN0aXZpdHkjb25DcmVhdGVEaWFsb2cgZGlkICIKLSAgICAgICAgICAgICAgICAgICAgKyAibm90IGNyZWF0ZSBhIGRpYWxvZyBmb3IgaWQgIiArIGRpYWxvZ0lkKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIGRpYWxvZy5kaXNwYXRjaE9uQ3JlYXRlKHN0YXRlKTsKICAgICAgICAgcmV0dXJuIGRpYWxvZzsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBzYXZlZERpYWxvZ0tleUZvcihpbnQga2V5KSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNhdmVkRGlhbG9nS2V5Rm9yKGludCBrZXkpIHsKICAgICAgICAgcmV0dXJuIFNBVkVEX0RJQUxPR19LRVlfUFJFRklYICsga2V5OwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzYXZlZERpYWxvZ0FyZ3NLZXlGb3IoaW50IGtleSkgeworICAgICAgICByZXR1cm4gU0FWRURfRElBTE9HX0FSR1NfS0VZX1BSRUZJWCArIGtleTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiBhY3Rpdml0eSBzdGFydC11cCBpcyBjb21wbGV0ZSAoYWZ0ZXIge0BsaW5rICNvblN0YXJ0fQpAQCAtMTA5NSw4ICsxMTA3LDExIEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGlhbG9nczsgaSsrKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQga2V5ID0gbU1hbmFnZWREaWFsb2dzLmtleUF0KGkpOwogICAgICAgICAgICAgaWRzW2ldID0ga2V5OwotICAgICAgICAgICAgZmluYWwgRGlhbG9nIGRpYWxvZyA9IG1NYW5hZ2VkRGlhbG9ncy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZGlhbG9nU3RhdGUucHV0QnVuZGxlKHNhdmVkRGlhbG9nS2V5Rm9yKGtleSksIGRpYWxvZy5vblNhdmVJbnN0YW5jZVN0YXRlKCkpOworICAgICAgICAgICAgZmluYWwgTWFuYWdlZERpYWxvZyBtZCA9IG1NYW5hZ2VkRGlhbG9ncy52YWx1ZUF0KGkpOworICAgICAgICAgICAgZGlhbG9nU3RhdGUucHV0QnVuZGxlKHNhdmVkRGlhbG9nS2V5Rm9yKGtleSksIG1kLm1EaWFsb2cub25TYXZlSW5zdGFuY2VTdGF0ZSgpKTsKKyAgICAgICAgICAgIGlmIChtZC5tQXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGlhbG9nU3RhdGUucHV0QnVuZGxlKHNhdmVkRGlhbG9nQXJnc0tleUZvcihrZXkpLCBtZC5tQXJncyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBkaWFsb2dTdGF0ZS5wdXRJbnRBcnJheShTQVZFRF9ESUFMT0dfSURTX0tFWSwgaWRzKTsKQEAgLTEyODIsMTQgKzEyOTcsMTQgQEAKIAogICAgICAgICAvLyBkaXNtaXNzIGFueSBkaWFsb2dzIHdlIGFyZSBtYW5hZ2luZy4KICAgICAgICAgaWYgKG1NYW5hZ2VkRGlhbG9ncyAhPSBudWxsKSB7Ci0KICAgICAgICAgICAgIGZpbmFsIGludCBudW1EaWFsb2dzID0gbU1hbmFnZWREaWFsb2dzLnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGlhbG9nczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRGlhbG9nIGRpYWxvZyA9IG1NYW5hZ2VkRGlhbG9ncy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChkaWFsb2cuaXNTaG93aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBNYW5hZ2VkRGlhbG9nIG1kID0gbU1hbmFnZWREaWFsb2dzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKG1kLm1EaWFsb2cuaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWQubURpYWxvZy5kaXNtaXNzKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hbmFnZWREaWFsb2dzID0gbnVsbDsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNsb3NlIGFueSBjdXJzb3JzIHdlIGFyZSBtYW5hZ2luZy4KQEAgLTEzMDAsNiArMTMxNSw3IEBACiAgICAgICAgICAgICAgICAgYy5tQ3Vyc29yLmNsb3NlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgbU1hbmFnZWRDdXJzb3JzLmNsZWFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDEwLDM2ICsyNDI2LDU3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2FsbGJhY2sgZm9yIGNyZWF0aW5nIGRpYWxvZ3MgdGhhdCBhcmUgbWFuYWdlZCAoc2F2ZWQgYW5kIHJlc3RvcmVkKSBmb3IgeW91Ci0gICAgICogYnkgdGhlIGFjdGl2aXR5LgotICAgICAqCi0gICAgICogSWYgeW91IHVzZSB7QGxpbmsgI3Nob3dEaWFsb2coaW50KX0sIHRoZSBhY3Rpdml0eSB3aWxsIGNhbGwgdGhyb3VnaCB0bwotICAgICAqIHRoaXMgbWV0aG9kIHRoZSBmaXJzdCB0aW1lLCBhbmQgaGFuZyBvbnRvIGl0IHRoZXJlYWZ0ZXIuICBBbnkgZGlhbG9nCi0gICAgICogdGhhdCBpcyBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBiZSBzYXZlZCBhbmQgcmVzdG9yZWQKLSAgICAgKiBmb3IgeW91LCBpbmNsdWRpbmcgd2hldGhlciBpdCBpcyBzaG93aW5nLgotICAgICAqCi0gICAgICogSWYgeW91IHdvdWxkIGxpa2UgdGhlIGFjdGl2aXR5IHRvIG1hbmFnZSB0aGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgZGlhbG9ncwotICAgICAqIGZvciB5b3UsIHlvdSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGhhbmRsZSBhbnkgaWRzIHRoYXQgYXJlCi0gICAgICogcGFzc2VkIHRvIHtAbGluayAjc2hvd0RpYWxvZ30uCi0gICAgICoKLSAgICAgKiBJZiB5b3Ugd291bGQgbGlrZSBhbiBvcHBvcnR1bml0eSB0byBwcmVwYXJlIHlvdXIgZGlhbG9nIGJlZm9yZSBpdCBpcyBzaG93biwKLSAgICAgKiBvdmVycmlkZSB7QGxpbmsgI29uUHJlcGFyZURpYWxvZyhpbnQsIERpYWxvZyl9LgotICAgICAqCi0gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZGlhbG9nLgotICAgICAqIEByZXR1cm4gVGhlIGRpYWxvZwotICAgICAqCi0gICAgICogQHNlZSAjb25QcmVwYXJlRGlhbG9nKGludCwgRGlhbG9nKQotICAgICAqIEBzZWUgI3Nob3dEaWFsb2coaW50KQotICAgICAqIEBzZWUgI2Rpc21pc3NEaWFsb2coaW50KQotICAgICAqIEBzZWUgI3JlbW92ZURpYWxvZyhpbnQpCisgICAgICogQGRlcHJlY2F0ZWQgT2xkIG5vLWFyZ3VtZW50cyB2ZXJzaW9uIG9mIHtAbGluayAjb25DcmVhdGVEaWFsb2coaW50LCBCdW5kbGUpfS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBEaWFsb2cgb25DcmVhdGVEaWFsb2coaW50IGlkKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciBjcmVhdGluZyBkaWFsb2dzIHRoYXQgYXJlIG1hbmFnZWQgKHNhdmVkIGFuZCByZXN0b3JlZCkgZm9yIHlvdQorICAgICAqIGJ5IHRoZSBhY3Rpdml0eS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIHRocm91Z2ggdG8KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlRGlhbG9nKGludCl9IGZvciBjb21wYXRpYmlsaXR5LgorICAgICAqCisgICAgICogPHA+SWYgeW91IHVzZSB7QGxpbmsgI3Nob3dEaWFsb2coaW50KX0sIHRoZSBhY3Rpdml0eSB3aWxsIGNhbGwgdGhyb3VnaCB0bworICAgICAqIHRoaXMgbWV0aG9kIHRoZSBmaXJzdCB0aW1lLCBhbmQgaGFuZyBvbnRvIGl0IHRoZXJlYWZ0ZXIuICBBbnkgZGlhbG9nCisgICAgICogdGhhdCBpcyBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBiZSBzYXZlZCBhbmQgcmVzdG9yZWQKKyAgICAgKiBmb3IgeW91LCBpbmNsdWRpbmcgd2hldGhlciBpdCBpcyBzaG93aW5nLgorICAgICAqCisgICAgICogPHA+SWYgeW91IHdvdWxkIGxpa2UgdGhlIGFjdGl2aXR5IHRvIG1hbmFnZSBzYXZpbmcgYW5kIHJlc3RvcmluZyBkaWFsb2dzCisgICAgICogZm9yIHlvdSwgeW91IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgaGFuZGxlIGFueSBpZHMgdGhhdCBhcmUKKyAgICAgKiBwYXNzZWQgdG8ge0BsaW5rICNzaG93RGlhbG9nfS4KKyAgICAgKgorICAgICAqIDxwPklmIHlvdSB3b3VsZCBsaWtlIGFuIG9wcG9ydHVuaXR5IHRvIHByZXBhcmUgeW91ciBkaWFsb2cgYmVmb3JlIGl0IGlzIHNob3duLAorICAgICAqIG92ZXJyaWRlIHtAbGluayAjb25QcmVwYXJlRGlhbG9nKGludCwgRGlhbG9nLCBCdW5kbGUpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGRpYWxvZy4KKyAgICAgKiBAcGFyYW0gYXJncyBUaGUgZGlhbG9nIGFyZ3VtZW50cyBwcm92aWRlZCB0byB7QGxpbmsgI3Nob3dEaWFsb2coaW50LCBCdW5kbGUpfS4KKyAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cuICBJZiB5b3UgcmV0dXJuIG51bGwsIHRoZSBkaWFsb2cgd2lsbCBub3QgYmUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI29uUHJlcGFyZURpYWxvZyhpbnQsIERpYWxvZywgQnVuZGxlKQorICAgICAqIEBzZWUgI3Nob3dEaWFsb2coaW50LCBCdW5kbGUpCisgICAgICogQHNlZSAjZGlzbWlzc0RpYWxvZyhpbnQpCisgICAgICogQHNlZSAjcmVtb3ZlRGlhbG9nKGludCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKGludCBpZCwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIG9uQ3JlYXRlRGlhbG9nKGlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBPbGQgbm8tYXJndW1lbnRzIHZlcnNpb24gb2YKKyAgICAgKiB7QGxpbmsgI29uUHJlcGFyZURpYWxvZyhpbnQsIERpYWxvZywgQnVuZGxlKX0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblByZXBhcmVEaWFsb2coaW50IGlkLCBEaWFsb2cgZGlhbG9nKSB7CisgICAgICAgIGRpYWxvZy5zZXRPd25lckFjdGl2aXR5KHRoaXMpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIHByZXBhcmUgYSBtYW5hZ2VkIGRpYWxvZyBiZWZvcmUgaXQgaXMgYmVpbmcKLSAgICAgKiBzaG93bi4KKyAgICAgKiBzaG93bi4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIHRocm91Z2ggdG8KKyAgICAgKiB7QGxpbmsgI29uUHJlcGFyZURpYWxvZyhpbnQsIERpYWxvZyl9IGZvciBjb21wYXRpYmlsaXR5LgorICAgICAqIAogICAgICAqIDxwPgogICAgICAqIE92ZXJyaWRlIHRoaXMgaWYgeW91IG5lZWQgdG8gdXBkYXRlIGEgbWFuYWdlZCBkaWFsb2cgYmFzZWQgb24gdGhlIHN0YXRlCiAgICAgICogb2YgdGhlIGFwcGxpY2F0aW9uIGVhY2ggdGltZSBpdCBpcyBzaG93bi4gRm9yIGV4YW1wbGUsIGEgdGltZSBwaWNrZXIKQEAgLTI0NDksNDMgKzI0ODYsNjYgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBtYW5hZ2VkIGRpYWxvZy4KICAgICAgKiBAcGFyYW0gZGlhbG9nIFRoZSBkaWFsb2cuCi0gICAgICogQHNlZSAjb25DcmVhdGVEaWFsb2coaW50KQorICAgICAqIEBwYXJhbSBhcmdzIFRoZSBkaWFsb2cgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHtAbGluayAjc2hvd0RpYWxvZyhpbnQsIEJ1bmRsZSl9LgorICAgICAqIEBzZWUgI29uQ3JlYXRlRGlhbG9nKGludCwgQnVuZGxlKQogICAgICAqIEBzZWUgI3Nob3dEaWFsb2coaW50KQogICAgICAqIEBzZWUgI2Rpc21pc3NEaWFsb2coaW50KQogICAgICAqIEBzZWUgI3JlbW92ZURpYWxvZyhpbnQpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVwYXJlRGlhbG9nKGludCBpZCwgRGlhbG9nIGRpYWxvZykgewotICAgICAgICBkaWFsb2cuc2V0T3duZXJBY3Rpdml0eSh0aGlzKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblByZXBhcmVEaWFsb2coaW50IGlkLCBEaWFsb2cgZGlhbG9nLCBCdW5kbGUgYXJncykgeworICAgICAgICBvblByZXBhcmVEaWFsb2coaWQsIGRpYWxvZyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2hvdyBhIGRpYWxvZyBtYW5hZ2VkIGJ5IHRoaXMgYWN0aXZpdHkuICBBIGNhbGwgdG8ge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhpbnQpfQorICAgICAqIFNpbXBsZSB2ZXJzaW9uIG9mIHtAbGluayAjc2hvd0RpYWxvZyhpbnQsIEJ1bmRsZSl9IHRoYXQgZG9lcyBub3QKKyAgICAgKiB0YWtlIGFueSBhcmd1bWVudHMuICBTaW1wbHkgY2FsbHMge0BsaW5rICNzaG93RGlhbG9nKGludCwgQnVuZGxlKX0KKyAgICAgKiB3aXRoIG51bGwgYXJndW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNob3dEaWFsb2coaW50IGlkKSB7CisgICAgICAgIHNob3dEaWFsb2coaWQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgYSBkaWFsb2cgbWFuYWdlZCBieSB0aGlzIGFjdGl2aXR5LiAgQSBjYWxsIHRvIHtAbGluayAjb25DcmVhdGVEaWFsb2coaW50LCBCdW5kbGUpfQogICAgICAqIHdpbGwgYmUgbWFkZSB3aXRoIHRoZSBzYW1lIGlkIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkIGZvciBhIGdpdmVuCiAgICAgICogaWQuICBGcm9tIHRoZXJlYWZ0ZXIsIHRoZSBkaWFsb2cgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNhdmVkIGFuZCByZXN0b3JlZC4KICAgICAgKgotICAgICAqIEVhY2ggdGltZSBhIGRpYWxvZyBpcyBzaG93biwge0BsaW5rICNvblByZXBhcmVEaWFsb2coaW50LCBEaWFsb2cpfSB3aWxsCisgICAgICogPHA+RWFjaCB0aW1lIGEgZGlhbG9nIGlzIHNob3duLCB7QGxpbmsgI29uUHJlcGFyZURpYWxvZyhpbnQsIERpYWxvZywgQnVuZGxlKX0gd2lsbAogICAgICAqIGJlIG1hZGUgdG8gcHJvdmlkZSBhbiBvcHBvcnR1bml0eSB0byBkbyBhbnkgdGltZWx5IHByZXBhcmF0aW9uLgogICAgICAqCiAgICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbWFuYWdlZCBkaWFsb2cuCi0gICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSBkaWFsb2cuICBUaGVzZSB3aWxsIGJlIHNhdmVkCisgICAgICogYW5kIHJlc3RvcmVkIGZvciB5b3UuICBOb3RlIHRoYXQgaWYgdGhlIGRpYWxvZyBpcyBhbHJlYWR5IGNyZWF0ZWQsCisgICAgICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhpbnQsIEJ1bmRsZSl9IHdpbGwgbm90IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcKKyAgICAgKiBhcmd1bWVudHMgYnV0IHtAbGluayAjb25QcmVwYXJlRGlhbG9nKGludCwgRGlhbG9nLCBCdW5kbGUpfSB3aWxsIGJlLgorICAgICAqIElmIHlvdSBuZWVkIHRvIHJlYnVpbGQgdGhlIGRpYWxvZywgY2FsbCB7QGxpbmsgI3JlbW92ZURpYWxvZyhpbnQpfcpmaXJzdC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgRGlhbG9nIHdhcyBjcmVhdGVkOyBmYWxzZSBpcyByZXR1cm5lZCBpZgorICAgICAqIGl0IGlzIG5vdCBjcmVhdGVkIGJlY2F1c2Uge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhpbnQsIEJ1bmRsZSl9IHJldHVybnMgZmFsc2UuCisgICAgICogCiAgICAgICogQHNlZSBEaWFsb2cKLSAgICAgKiBAc2VlICNvbkNyZWF0ZURpYWxvZyhpbnQpCi0gICAgICogQHNlZSAjb25QcmVwYXJlRGlhbG9nKGludCwgRGlhbG9nKQorICAgICAqIEBzZWUgI29uQ3JlYXRlRGlhbG9nKGludCwgQnVuZGxlKQorICAgICAqIEBzZWUgI29uUHJlcGFyZURpYWxvZyhpbnQsIERpYWxvZywgQnVuZGxlKQogICAgICAqIEBzZWUgI2Rpc21pc3NEaWFsb2coaW50KQogICAgICAqIEBzZWUgI3JlbW92ZURpYWxvZyhpbnQpCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2hvd0RpYWxvZyhpbnQgaWQpIHsKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG93RGlhbG9nKGludCBpZCwgQnVuZGxlIGFyZ3MpIHsKICAgICAgICAgaWYgKG1NYW5hZ2VkRGlhbG9ncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTWFuYWdlZERpYWxvZ3MgPSBuZXcgU3BhcnNlQXJyYXk8RGlhbG9nPigpOworICAgICAgICAgICAgbU1hbmFnZWREaWFsb2dzID0gbmV3IFNwYXJzZUFycmF5PE1hbmFnZWREaWFsb2c+KCk7CiAgICAgICAgIH0KLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG1NYW5hZ2VkRGlhbG9ncy5nZXQoaWQpOwotICAgICAgICBpZiAoZGlhbG9nID09IG51bGwpIHsKLSAgICAgICAgICAgIGRpYWxvZyA9IGNyZWF0ZURpYWxvZyhpZCwgbnVsbCk7Ci0gICAgICAgICAgICBtTWFuYWdlZERpYWxvZ3MucHV0KGlkLCBkaWFsb2cpOworICAgICAgICBNYW5hZ2VkRGlhbG9nIG1kID0gbU1hbmFnZWREaWFsb2dzLmdldChpZCk7CisgICAgICAgIGlmIChtZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtZCA9IG5ldyBNYW5hZ2VkRGlhbG9nKCk7CisgICAgICAgICAgICBtZC5tRGlhbG9nID0gY3JlYXRlRGlhbG9nKGlkLCBudWxsLCBhcmdzKTsKKyAgICAgICAgICAgIGlmIChtZC5tRGlhbG9nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWFuYWdlZERpYWxvZ3MucHV0KGlkLCBtZCk7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIG9uUHJlcGFyZURpYWxvZyhpZCwgZGlhbG9nKTsKLSAgICAgICAgZGlhbG9nLnNob3coKTsKKyAgICAgICAgbWQubUFyZ3MgPSBhcmdzOworICAgICAgICBvblByZXBhcmVEaWFsb2coaWQsIG1kLm1EaWFsb2csIGFyZ3MpOworICAgICAgICBtZC5tRGlhbG9nLnNob3coKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDk2LDIxICsyNTU2LDIxIEBACiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGlkIHdhcyBub3QgcHJldmlvdXNseSBzaG93biB2aWEKICAgICAgKiAgIHtAbGluayAjc2hvd0RpYWxvZyhpbnQpfS4KICAgICAgKgotICAgICAqIEBzZWUgI29uQ3JlYXRlRGlhbG9nKGludCkKLSAgICAgKiBAc2VlICNvblByZXBhcmVEaWFsb2coaW50LCBEaWFsb2cpCisgICAgICogQHNlZSAjb25DcmVhdGVEaWFsb2coaW50LCBCdW5kbGUpCisgICAgICogQHNlZSAjb25QcmVwYXJlRGlhbG9nKGludCwgRGlhbG9nLCBCdW5kbGUpCiAgICAgICogQHNlZSAjc2hvd0RpYWxvZyhpbnQpCiAgICAgICogQHNlZSAjcmVtb3ZlRGlhbG9nKGludCkKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBkaXNtaXNzRGlhbG9nKGludCBpZCkgewogICAgICAgICBpZiAobU1hbmFnZWREaWFsb2dzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG1pc3NpbmdEaWFsb2coaWQpOwotCiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgRGlhbG9nIGRpYWxvZyA9IG1NYW5hZ2VkRGlhbG9ncy5nZXQoaWQpOwotICAgICAgICBpZiAoZGlhbG9nID09IG51bGwpIHsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIE1hbmFnZWREaWFsb2cgbWQgPSBtTWFuYWdlZERpYWxvZ3MuZ2V0KGlkKTsKKyAgICAgICAgaWYgKG1kID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG1pc3NpbmdEaWFsb2coaWQpOwogICAgICAgICB9Ci0gICAgICAgIGRpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgIG1kLm1EaWFsb2cuZGlzbWlzcygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjUyNiwyOCArMjU4NiwyNyBAQAogICAgICAqIFJlbW92ZXMgYW55IGludGVybmFsIHJlZmVyZW5jZXMgdG8gYSBkaWFsb2cgbWFuYWdlZCBieSB0aGlzIEFjdGl2aXR5LgogICAgICAqIElmIHRoZSBkaWFsb2cgaXMgc2hvd2luZywgaXQgd2lsbCBkaXNtaXNzIGl0IGFzIHBhcnQgb2YgdGhlIGNsZWFuIHVwLgogICAgICAqCi0gICAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBrbm93IHRoYXQgeW91IHdpbGwgbmV2ZXIgc2hvdyBhIGRpYWxvZyBhZ2FpbiBhbmQKKyAgICAgKiA8cD5UaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGtub3cgdGhhdCB5b3Ugd2lsbCBuZXZlciBzaG93IGEgZGlhbG9nIGFnYWluIGFuZAogICAgICAqIHdhbnQgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIHNhdmluZyBhbmQgcmVzdG9yaW5nIGl0IGluIHRoZSBmdXR1cmUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBtYW5hZ2VkIGRpYWxvZy4KICAgICAgKgotICAgICAqIEBzZWUgI29uQ3JlYXRlRGlhbG9nKGludCkKLSAgICAgKiBAc2VlICNvblByZXBhcmVEaWFsb2coaW50LCBEaWFsb2cpCisgICAgICogQHNlZSAjb25DcmVhdGVEaWFsb2coaW50LCBCdW5kbGUpCisgICAgICogQHNlZSAjb25QcmVwYXJlRGlhbG9nKGludCwgRGlhbG9nLCBCdW5kbGUpCiAgICAgICogQHNlZSAjc2hvd0RpYWxvZyhpbnQpCiAgICAgICogQHNlZSAjZGlzbWlzc0RpYWxvZyhpbnQpCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlRGlhbG9nKGludCBpZCkgewotCiAgICAgICAgIGlmIChtTWFuYWdlZERpYWxvZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgRGlhbG9nIGRpYWxvZyA9IG1NYW5hZ2VkRGlhbG9ncy5nZXQoaWQpOwotICAgICAgICBpZiAoZGlhbG9nID09IG51bGwpIHsKKyAgICAgICAgZmluYWwgTWFuYWdlZERpYWxvZyBtZCA9IG1NYW5hZ2VkRGlhbG9ncy5nZXQoaWQpOworICAgICAgICBpZiAobWQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgZGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgbWQubURpYWxvZy5kaXNtaXNzKCk7CiAgICAgICAgIG1NYW5hZ2VkRGlhbG9ncy5yZW1vdmUoaWQpOwogICAgIH0KIApAQCAtMzQ0OSwxNyArMzUwOCw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIC8vIHVzZXMgc3VwZXIuZ2V0U3lzdGVtU2VydmljZSgpIHNpbmNlIHRoaXMuZ2V0U3lzdGVtU2VydmljZSgpIGxvb2tzIGF0IHRoZQotICAgICAgICAvLyBtU2VhcmNoTWFuYWdlciBmaWVsZC4KLSAgICAgICAgbVNlYXJjaE1hbmFnZXIgPSAoU2VhcmNoTWFuYWdlcikgc3VwZXIuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFKTsKLSAgICAgICAgaW50IGlkZW50ID0gbUlkZW50OwotICAgICAgICBpZiAoaWRlbnQgPT0gMCkgewotICAgICAgICAgICAgaWYgKG1QYXJlbnQgIT0gbnVsbCkgaWRlbnQgPSBtUGFyZW50Lm1JZGVudDsKLSAgICAgICAgICAgIGlmIChpZGVudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gaWRlbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtU2VhcmNoTWFuYWdlci5zZXRJZGVudChpZGVudCwgZ2V0Q29tcG9uZW50TmFtZSgpKTsKKyAgICAgICAgbVNlYXJjaE1hbmFnZXIgPSBuZXcgU2VhcmNoTWFuYWdlcih0aGlzLCBudWxsKTsKICAgICB9CiAgICAgCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGV2aWNlQWRtaW4uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EZXZpY2VBZG1pbi5qYXZhCmluZGV4IDk3NTBkNmUuLjg4ZmRhYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EZXZpY2VBZG1pbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EZXZpY2VBZG1pbi5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIAogLyoqCiAgKiBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgYSBkZXZpY2UgYWRtaW5pc3RyYXRpb24gY29tcG9uZW50LiAgVGhpcwpAQCAtNjIsNiArNjMsMjcgQEAKICAgICAgICAgICAgID0gImFuZHJvaWQuYXBwLmFjdGlvbi5ERVZJQ0VfQURNSU5fRU5BQkxFRCI7CiAKICAgICAvKioKKyAgICAgKiBBY3Rpb24gc2VudCB0byBhIGRldmljZSBhZG1pbmlzdHJhdG9yIHdoZW4gdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0bworICAgICAqIGRpc2FibGUgaXQsIGJ1dCBiZWZvcmUgdGhpcyBoYXMgYWN0dWFsbHkgYmVlbiBkb25lLiAgVGhpcyBnaXZlcyB5b3UKKyAgICAgKiBhIGNoYW5jZSB0byBzdXBwbHkgYSBtZXNzYWdlIHRvIHRoZSB1c2VyIGFib3V0IHRoZSBpbXBhY3Qgb2YKKyAgICAgKiBkaXNhYmxpbmcgeW91ciBhZG1pbiwgYnkgc2V0dGluZyB0aGUgZXh0cmEgZmllbGQKKyAgICAgKiB7QGxpbmsgI0VYVFJBX0RJU0FCTEVfV0FSTklOR30gaW4gdGhlIHJlc3VsdCBJbnRlbnQuICBJZiBub3Qgc2V0LAorICAgICAqIG5vIHdhcm5pbmcgd2lsbCBiZSBkaXNwbGF5ZWQuICBJZiBzZXQsIHRoZSBnaXZlbiB0ZXh0IHdpbGwgYmUgc2hvd24KKyAgICAgKiB0byB0aGUgdXNlciBiZWZvcmUgdGhleSBkaXNhYmxlIHlvdXIgYWRtaW4uCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVWSUNFX0FETUlOX0RJU0FCTEVfUkVRVUVTVEVECisgICAgICAgICAgICA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uREVWSUNFX0FETUlOX0RJU0FCTEVfUkVRVUVTVEVEIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIENoYXJTZXF1ZW5jZSB0aGF0IGNhbiBiZSBzaG93biB0byB0aGUgdXNlciBpbmZvcm1pbmcgdGhlbSBvZiB0aGUKKyAgICAgKiBpbXBhY3Qgb2YgZGlzYWJsaW5nIHlvdXIgYWRtaW4uCisgICAgICoKKyAgICAgKiBAc2VlICNBQ1RJT05fREVWSUNFX0FETUlOX0RJU0FCTEVfUkVRVUVTVEVECisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRElTQUJMRV9XQVJOSU5HID0gImFuZHJvaWQuYXBwLmV4dHJhLkRJU0FCTEVfV0FSTklORyI7CisgICAgCisgICAgLyoqCiAgICAgICogQWN0aW9uIHNlbnQgdG8gYSBkZXZpY2UgYWRtaW5pc3RyYXRvciB3aGVuIHRoZSB1c2VyIGhhcyBkaXNhYmxlZAogICAgICAqIGl0LiAgVXBvbiByZXR1cm4sIHRoZSBhcHBsaWNhdGlvbiBubyBsb25nZXIgaGFzIGFjY2VzcyB0byB0aGUKICAgICAgKiBwcm90ZWN0ZWQgZGV2aWNlIHBvbGljeSBtYW5hZ2VyIEFQSXMuICBZb3Ugd2lsbCBnZW5lcmFsbHkKQEAgLTE2Niw2ICsxODgsMjEgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkIHRvIGRpc2FibGUgdGhlIGFkbWluaXN0cmF0b3IsIGFzIGEgcmVzdWx0IG9mCisgICAgICogcmVjZWl2aW5nIHtAbGluayAjQUNUSU9OX0RFVklDRV9BRE1JTl9ESVNBQkxFX1JFUVVFU1RFRH0sIGdpdmluZyB5b3UKKyAgICAgKiBhIGNoYW5jZSB0byBwcmVzZW50IGEgd2FybmluZyBtZXNzYWdlIHRvIHRoZW0uICBUaGUgbWVzc2FnZSBpcyByZXR1cm5lZAorICAgICAqIGFzIHRoZSByZXN1bHQ7IGlmIG51bGwgaXMgcmV0dXJuZWQgKHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uKSwgbm8KKyAgICAgKiBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBydW5uaW5nIGNvbnRleHQgYXMgcGVyIHtAbGluayAjb25SZWNlaXZlfS4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSByZWNlaXZlZCBpbnRlbnQgYXMgcGVyIHtAbGluayAjb25SZWNlaXZlfS4KKyAgICAgKiBAcmV0dXJuIFJldHVybiB0aGUgd2FybmluZyBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIgYmVmb3JlCisgICAgICogYmVpbmcgZGlzYWJsZWQ7IGlmIG51bGwgaXMgcmV0dXJuZWQsIG5vIG1lc3NhZ2UgaXMgZGlzcGxheWVkLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2Ugb25EaXNhYmxlUmVxdWVzdGVkKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogQ2FsbGVkIHByaW9yIHRvIHRoZSBhZG1pbmlzdHJhdG9yIGJlaW5nIGRpc2FibGVkLCBhcyBhIHJlc3VsdCBvZgogICAgICAqIHJlY2VpdmluZyB7QGxpbmsgI0FDVElPTl9ERVZJQ0VfQURNSU5fRElTQUJMRUR9LiAgVXBvbiByZXR1cm4sIHlvdQogICAgICAqIGNhbiBubyBsb25nZXIgdXNlIHRoZSBwcm90ZWN0ZWQgcGFydHMgb2YgdGhlIHtAbGluayBEZXZpY2VQb2xpY3lNYW5hZ2VyfQpAQCAtMjI2LDYgKzI2MywxMiBAQAogICAgICAgICAgICAgb25QYXNzd29yZFN1Y2NlZWRlZChjb250ZXh0LCBpbnRlbnQpOwogICAgICAgICB9IGVsc2UgaWYgKEFDVElPTl9ERVZJQ0VfQURNSU5fRU5BQkxFRC5lcXVhbHMoYWN0aW9uKSkgewogICAgICAgICAgICAgb25FbmFibGVkKGNvbnRleHQsIGludGVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoQUNUSU9OX0RFVklDRV9BRE1JTl9ESVNBQkxFX1JFUVVFU1RFRC5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHJlcyA9IG9uRGlzYWJsZVJlcXVlc3RlZChjb250ZXh0LCBpbnRlbnQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IGdldFJlc3VsdEV4dHJhcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBleHRyYXMucHV0Q2hhclNlcXVlbmNlKEVYVFJBX0RJU0FCTEVfV0FSTklORywgcmVzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChBQ1RJT05fREVWSUNFX0FETUlOX0RJU0FCTEVELmVxdWFscyhhY3Rpb24pKSB7CiAgICAgICAgICAgICBvbkRpc2FibGVkKGNvbnRleHQsIGludGVudCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EZXZpY2VBZG1pbkluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EZXZpY2VBZG1pbkluZm8uamF2YQppbmRleCA5MmZkYmM4Li5lNTBkYjg5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGV2aWNlQWRtaW5JbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RldmljZUFkbWluSW5mby5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCi1pbXBvcnQgYW5kcm9pZC5SOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CkBAIC0xMTEsNDggKzExMCw0NyBAQAogCiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb2xpY3lJbmZvIHsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBpZGVudDsKICAgICAgICAgZmluYWwgcHVibGljIFN0cmluZyB0YWc7CiAgICAgICAgIGZpbmFsIHB1YmxpYyBpbnQgbGFiZWw7CiAgICAgICAgIGZpbmFsIHB1YmxpYyBpbnQgZGVzY3JpcHRpb247CiAgICAgICAgIAotICAgICAgICBwdWJsaWMgUG9saWN5SW5mbyhTdHJpbmcgdGFnSW4sIGludCBsYWJlbEluLCBpbnQgZGVzY3JpcHRpb25JbikgeworICAgICAgICBwdWJsaWMgUG9saWN5SW5mbyhpbnQgaWRlbnRJbiwgU3RyaW5nIHRhZ0luLCBpbnQgbGFiZWxJbiwgaW50IGRlc2NyaXB0aW9uSW4pIHsKKyAgICAgICAgICAgIGlkZW50ID0gaWRlbnRJbjsKICAgICAgICAgICAgIHRhZyA9IHRhZ0luOwogICAgICAgICAgICAgbGFiZWwgPSBsYWJlbEluOwogICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbkluOwogICAgICAgICB9CiAgICAgfQogICAgIAorICAgIHN0YXRpYyBBcnJheUxpc3Q8UG9saWN5SW5mbz4gc1BvbGljaWVzRGlzcGxheU9yZGVyID0gbmV3IEFycmF5TGlzdDxQb2xpY3lJbmZvPigpOwogICAgIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc0tub3duUG9saWNpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CiAgICAgc3RhdGljIFNwYXJzZUFycmF5PFBvbGljeUluZm8+IHNSZXZLbm93blBvbGljaWVzID0gbmV3IFNwYXJzZUFycmF5PFBvbGljeUluZm8+KCk7CiAgICAgCiAgICAgc3RhdGljIHsKLSAgICAgICAgc1Jldktub3duUG9saWNpZXMucHV0KFVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JELAotICAgICAgICAgICAgICAgIG5ldyBQb2xpY3lJbmZvKCJsaW1pdC1wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lsYWJfbGltaXRQYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWRlc2NfbGltaXRQYXNzd29yZCkpOwotICAgICAgICBzUmV2S25vd25Qb2xpY2llcy5wdXQoVVNFU19QT0xJQ1lfV0FUQ0hfTE9HSU4sCi0gICAgICAgICAgICAgICAgbmV3IFBvbGljeUluZm8oIndhdGNoLWxvZ2luIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl93YXRjaExvZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5ZGVzY193YXRjaExvZ2luKSk7Ci0gICAgICAgIHNSZXZLbm93blBvbGljaWVzLnB1dChVU0VTX1BPTElDWV9SRVNFVF9QQVNTV09SRCwKLSAgICAgICAgICAgICAgICBuZXcgUG9saWN5SW5mbygicmVzZXQtcGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQpKTsKLSAgICAgICAgc1Jldktub3duUG9saWNpZXMucHV0KFVTRVNfUE9MSUNZX0xJTUlUX1VOTE9DSywKLSAgICAgICAgICAgICAgICBuZXcgUG9saWN5SW5mbygibGltaXQtdW5sb2NrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9saW1pdFVubG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWRlc2NfbGltaXRVbmxvY2spKTsKLSAgICAgICAgc1Jldktub3duUG9saWNpZXMucHV0KFVTRVNfUE9MSUNZX0ZPUkNFX0xPQ0ssCi0gICAgICAgICAgICAgICAgbmV3IFBvbGljeUluZm8oImZvcmNlLWxvY2siLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5bGFiX2ZvcmNlTG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWRlc2NfZm9yY2VMb2NrKSk7Ci0gICAgICAgIHNSZXZLbm93blBvbGljaWVzLnB1dChVU0VTX1BPTElDWV9XSVBFX0RBVEEsCi0gICAgICAgICAgICAgICAgbmV3IFBvbGljeUluZm8oIndpcGUtZGF0YSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lsYWJfd2lwZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lkZXNjX3dpcGVEYXRhKSk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzUmV2S25vd25Qb2xpY2llcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc0tub3duUG9saWNpZXMucHV0KHNSZXZLbm93blBvbGljaWVzLnZhbHVlQXQoaSkudGFnLAotICAgICAgICAgICAgICAgICAgICBzUmV2S25vd25Qb2xpY2llcy5rZXlBdChpKSk7CisgICAgICAgIHNQb2xpY2llc0Rpc3BsYXlPcmRlci5hZGQobmV3IFBvbGljeUluZm8oVVNFU19QT0xJQ1lfV0lQRV9EQVRBLCAid2lwZS1kYXRhIiwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lsYWJfd2lwZURhdGEsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5ZGVzY193aXBlRGF0YSkpOworICAgICAgICBzUG9saWNpZXNEaXNwbGF5T3JkZXIuYWRkKG5ldyBQb2xpY3lJbmZvKFVTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JELCAicmVzZXQtcGFzc3dvcmQiLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9yZXNldFBhc3N3b3JkLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCkpOworICAgICAgICBzUG9saWNpZXNEaXNwbGF5T3JkZXIuYWRkKG5ldyBQb2xpY3lJbmZvKFVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JELCAibGltaXQtcGFzc3dvcmQiLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9saW1pdFBhc3N3b3JkLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWRlc2NfbGltaXRQYXNzd29yZCkpOworICAgICAgICBzUG9saWNpZXNEaXNwbGF5T3JkZXIuYWRkKG5ldyBQb2xpY3lJbmZvKFVTRVNfUE9MSUNZX1dBVENIX0xPR0lOLCAid2F0Y2gtbG9naW4iLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl93YXRjaExvZ2luLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWRlc2Nfd2F0Y2hMb2dpbikpOworICAgICAgICBzUG9saWNpZXNEaXNwbGF5T3JkZXIuYWRkKG5ldyBQb2xpY3lJbmZvKFVTRVNfUE9MSUNZX0xJTUlUX1VOTE9DSywgImxpbWl0LXVubG9jayIsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5bGFiX2xpbWl0VW5sb2NrLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWRlc2NfbGltaXRVbmxvY2spKTsKKyAgICAgICAgc1BvbGljaWVzRGlzcGxheU9yZGVyLmFkZChuZXcgUG9saWN5SW5mbyhVU0VTX1BPTElDWV9GT1JDRV9MT0NLLCAiZm9yY2UtbG9jayIsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5bGFiX2ZvcmNlTG9jaywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lkZXNjX2ZvcmNlTG9jaykpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNQb2xpY2llc0Rpc3BsYXlPcmRlci5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgUG9saWN5SW5mbyBwaSA9IHNQb2xpY2llc0Rpc3BsYXlPcmRlci5nZXQoaSk7CisgICAgICAgICAgICBzUmV2S25vd25Qb2xpY2llcy5wdXQocGkuaWRlbnQsIHBpKTsKKyAgICAgICAgICAgIHNLbm93blBvbGljaWVzLnB1dChwaS50YWcsIHBpLmlkZW50KTsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTMzNSwxMCArMzMzLDEwIEBACiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIEFycmF5TGlzdDxQb2xpY3lJbmZvPiBnZXRVc2VkUG9saWNpZXMoKSB7CiAgICAgICAgIEFycmF5TGlzdDxQb2xpY3lJbmZvPiByZXMgPSBuZXcgQXJyYXlMaXN0PFBvbGljeUluZm8+KCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzUmV2S25vd25Qb2xpY2llcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaW50IGlkZW50ID0gc1Jldktub3duUG9saWNpZXMua2V5QXQoaSk7Ci0gICAgICAgICAgICBpZiAodXNlc1BvbGljeShpZGVudCkpIHsKLSAgICAgICAgICAgICAgICByZXMuYWRkKHNSZXZLbm93blBvbGljaWVzLnZhbHVlQXQoaSkpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8c1BvbGljaWVzRGlzcGxheU9yZGVyLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBQb2xpY3lJbmZvIHBpID0gc1BvbGljaWVzRGlzcGxheU9yZGVyLmdldChpKTsKKyAgICAgICAgICAgIGlmICh1c2VzUG9saWN5KHBpLmlkZW50KSkgeworICAgICAgICAgICAgICAgIHJlcy5hZGQocGkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXM7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RldmljZVBvbGljeU1hbmFnZXIuamF2YQppbmRleCAyNWUzMjMwLi45ZGU3MzM2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTQzLDggKzQ0LDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGxvY2FsTE9HViA9IERFQlVHIHx8IGFuZHJvaWQudXRpbC5Db25maWcuTE9HVjsKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBJRGV2aWNlUG9saWN5TWFuYWdlciBtU2VydmljZTsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CiAKICAgICAvKnBhY2thZ2UqLyBEZXZpY2VQb2xpY3lNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKQEAgLTYwLDYgKzYyLDEwIEBACiAgICAgICogYnJpbmcgdGhlIHVzZXIgdGhyb3VnaCBhZGRpbmcgdGhlIGRldmljZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzeXN0ZW0gKG9yCiAgICAgICogYWxsb3dpbmcgdGhlbSB0byByZWplY3QgaXQpLgogICAgICAqIAorICAgICAqIDxwPllvdSBjYW4gb3B0aW9uYWxseSBpbmNsdWRlIHRoZSB7QGxpbmsgI0VYVFJBX0FERF9FWFBMQU5BVElPTn0KKyAgICAgKiBmaWVsZCB0byBwcm92aWRlIHRoZSB1c2VyIHdpdGggYWRkaXRpb25hbCBleHBsYW5hdGlvbiAoaW4gYWRkaXRpb24KKyAgICAgKiB0byB5b3VyIGNvbXBvbmVudCdzIGRlc2NyaXB0aW9uKSBhYm91dCB3aGF0IGlzIGJlaW5nIGFkZGVkLgorICAgICAqIAogICAgICAqIDxwPk5vdGU6IHRoZSBjdXJyZW50IHBsYXRmb3JtIGNhbiBvbmx5IGhhdmUgb25lIGRldmljZSBhZG1pbmlzdHJhdG9yCiAgICAgICogYWN0aXZlIGF0IGEgdGltZS4gIElmIHlvdSBtYWtlIHRoaXMgcmVxdWVzdCB3aGlsZSB0aGVyZSBpcyBhbHJlYWR5CiAgICAgICogYW4gYWN0aXZlIGFkbWluaXN0cmF0b3IsIHRoaXMgbmV3IHJlcXVlc3Qgd2lsbCBiZSBjYW5jZWxlZCBhdXRvbWF0aWNhbGx5LgpAQCAtNzYsNiArODIsMTQgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9ERVZJQ0VfQURNSU4gPSAiYW5kcm9pZC5hcHAuZXh0cmEuREVWSUNFX0FETUlOIjsKICAgICAKICAgICAvKioKKyAgICAgKiBBbiBvcHRpb25hbCBDaGFyU2VxdWVuY2UgcHJvdmlkaW5nIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gZm9yIHdoeSB0aGUKKyAgICAgKiBhZG1pbiBpcyBiZWluZyBhZGRlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI0FDVElPTl9BRERfREVWSUNFX0FETUlOCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQUREX0VYUExBTkFUSU9OID0gImFuZHJvaWQuYXBwLmV4dHJhLkFERF9FWFBMQU5BVElPTiI7CisgICAgCisgICAgLyoqCiAgICAgICogQWN0aXZpdHkgYWN0aW9uOiBoYXZlIHRoZSB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkLiAgVGhpcyBhY3Rpdml0eQogICAgICAqIHNob3VsZCBiZSBsYXVuY2hlZCBhZnRlciB1c2luZyB7QGxpbmsgI3NldFBhc3N3b3JkTW9kZShDb21wb25lbnROYW1lLCBpbnQpfQogICAgICAqIG9yIHtAbGluayAjc2V0TWluaW11bVBhc3N3b3JkTGVuZ3RoKENvbXBvbmVudE5hbWUsIGludCl9IHRvIGhhdmUgdGhlCkBAIC0yODUsNiArMjk5LDI5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBmYWlsZWQgcGFzc3dvcmQgYXR0ZW1wdHMgdGhhdCBhcmUgYWxsb3dlZAorICAgICAqIGJlZm9yZSB0aGUgZGV2aWNlIHdpcGVzIGl0cyBkYXRhLiAgVGhpcyBpcyBjb252ZW5pZW5jZSBmb3IgaW1wbGVtZW50aW5nCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25hbGl0eSB3aXRoIGEgY29tYmluYXRpb24gb2Ygd2F0Y2hpbmcgZmFpbGVkCisgICAgICogcGFzc3dvcmQgYXR0ZW1wdHMgYW5kIGNhbGxpbmcge0BsaW5rICN3aXBlRGF0YX0gdXBvbiByZWFjaGluZyBhIGNlcnRhaW4KKyAgICAgKiBjb3VudCwgYW5kIGFzIHN1Y2ggcmVxdWlyZXMgdGhhdCB5b3UgcmVxdWVzdCBib3RoCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9XQVRDSF9MT0dJTn0gYW5kCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9XSVBFX0RBVEF9fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWlufSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqIEBwYXJhbSBudW0gVGhlIG51bWJlciBvZiBmYWlsZWQgcGFzc3dvcmQgYXR0ZW1wdHMgYXQgd2hpY2ggcG9pbnQgdGhlCisgICAgICogZGV2aWNlIHdpbGwgd2lwZSBpdHMgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbnVtKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKGFkbWluLCBudW0pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIEZvcmNlIGEgbmV3IHBhc3N3b3JkIG9uIHRoZSB1c2VyLiAgVGhpcyB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuICBUaGUKICAgICAgKiBnaXZlbiBwYXNzd29yZCBtdXN0IG1lZXQgdGhlIGN1cnJlbnQgcGFzc3dvcmQgbWluaW11bSBsZW5ndGggY29uc3RyYWludAogICAgICAqIG9yIGl0IHdpbGwgYmUgcmVqZWN0ZWQuICBUaGUgZ2l2ZW4gcGFzc3dvcmQgd2lsbCBiZSBhY2NlcHRlZCByZWdhcmRsZXNzCkBAIC00NTEsNiArNDg4LDE5IEBACiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRSZW1vdmVXYXJuaW5nKENvbXBvbmVudE5hbWUgYWRtaW4sIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5nZXRSZW1vdmVXYXJuaW5nKGFkbWluLCByZXN1bHQpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBtb2RlLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lEZXZpY2VQb2xpY3lNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSURldmljZVBvbGljeU1hbmFnZXIuYWlkbAppbmRleCA3ZTM4MTk0Li5lZGI4NjAzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSURldmljZVBvbGljeU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSURldmljZVBvbGljeU1hbmFnZXIuYWlkbApAQCAtMTgsNiArMTgsNyBAQAogcGFja2FnZSBhbmRyb2lkLmFwcDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlQ2FsbGJhY2s7CiAKIC8qKgogICogSW50ZXJuYWwgSVBDIGludGVyZmFjZSB0byB0aGUgZGV2aWNlIHBvbGljeSBzZXJ2aWNlLgpAQCAtMzIsNiArMzMsNyBAQAogICAgIAogICAgIGJvb2xlYW4gaXNBY3RpdmVQYXNzd29yZFN1ZmZpY2llbnQoKTsKICAgICBpbnQgZ2V0Q3VycmVudEZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMoKTsKKyAgICB2b2lkIHNldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKGluIENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBudW0pOwogICAgIAogICAgIGJvb2xlYW4gcmVzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpOwogICAgIApAQCAtNDQsNiArNDYsNyBAQAogICAgIAogICAgIHZvaWQgc2V0QWN0aXZlQWRtaW4oaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CiAgICAgQ29tcG9uZW50TmFtZSBnZXRBY3RpdmVBZG1pbigpOworICAgIHZvaWQgZ2V0UmVtb3ZlV2FybmluZyhpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyLCBpbiBSZW1vdGVDYWxsYmFjayByZXN1bHQpOwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW4oaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CiAgICAgCiAgICAgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBtb2RlLCBpbnQgbGVuZ3RoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JU2VhcmNoTWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lTZWFyY2hNYW5hZ2VyLmFpZGwKaW5kZXggMDkyMDQ2Ny4uOWJhNzg2MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lTZWFyY2hNYW5hZ2VyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lTZWFyY2hNYW5hZ2VyLmFpZGwKQEAgLTI5LDIzICsyOSw0IEBACiAgICBMaXN0PFNlYXJjaGFibGVJbmZvPiBnZXRTZWFyY2hhYmxlc0ZvcldlYlNlYXJjaCgpOwogICAgU2VhcmNoYWJsZUluZm8gZ2V0RGVmYXVsdFNlYXJjaGFibGVGb3JXZWJTZWFyY2goKTsKICAgIHZvaWQgc2V0RGVmYXVsdFdlYlNlYXJjaChpbiBDb21wb25lbnROYW1lIGNvbXBvbmVudCk7Ci0gICB2b2lkIHN0YXJ0U2VhcmNoKGluIFN0cmluZyBpbml0aWFsUXVlcnksCi0gICAgICAgICAgICBib29sZWFuIHNlbGVjdEluaXRpYWxRdWVyeSwKLSAgICAgICAgICAgIGluIENvbXBvbmVudE5hbWUgbGF1bmNoQWN0aXZpdHksCi0gICAgICAgICAgICBpbiBCdW5kbGUgYXBwU2VhcmNoRGF0YSwKLSAgICAgICAgICAgIGJvb2xlYW4gZ2xvYmFsU2VhcmNoLAotICAgICAgICAgICAgSVNlYXJjaE1hbmFnZXJDYWxsYmFjayBzZWFyY2hNYW5hZ2VyQ2FsbGJhY2ssCi0gICAgICAgICAgICBpbnQgaWRlbnQpOwotCi0gICAgdm9pZCB0cmlnZ2VyU2VhcmNoKGluIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGluIENvbXBvbmVudE5hbWUgbGF1bmNoQWN0aXZpdHksCi0gICAgICAgICAgICBpbiBCdW5kbGUgYXBwU2VhcmNoRGF0YSwKLSAgICAgICAgICAgIElTZWFyY2hNYW5hZ2VyQ2FsbGJhY2sgc2VhcmNoTWFuYWdlckNhbGxiYWNrLAotICAgICAgICAgICAgaW50IGlkZW50KTsKLQotICAgIHZvaWQgc3RvcFNlYXJjaCgpOwotCi0KLSAgICBib29sZWFuIGlzVmlzaWJsZSgpOwotCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VhcmNoRGlhbG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VhcmNoRGlhbG9nLmphdmEKaW5kZXggYjM5NjM5Ni4uM2RmYmU3MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaERpYWxvZy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2cuamF2YQpAQCAtNzMsOCArNzMsOCBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwogCiAvKioKLSAqIFN5c3RlbSBzZWFyY2ggZGlhbG9nLiBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIAotICogU2VhcmNoTWFuYWdlclNlcnZpY2UgYW5kIHJ1bnMgaW4gdGhlIHN5c3RlbSBwcm9jZXNzLgorICogU2VhcmNoIGRpYWxvZy4gVGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSAKKyAqIFNlYXJjaE1hbmFnZXIgYW5kIHJ1bnMgaW4gdGhlIGN1cnJlbnQgZm9yZWdyb3VuZCBwcm9jZXNzLgogICogCiAgKiBAaGlkZQogICovCkBAIC0xMTgsNiArMTE4LDcgQEAKICAgICBwcml2YXRlIEJ1bmRsZSBtQXBwU2VhcmNoRGF0YTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUdsb2JhbFNlYXJjaE1vZGU7CiAgICAgcHJpdmF0ZSBDb250ZXh0IG1BY3Rpdml0eUNvbnRleHQ7CisgICAgcHJpdmF0ZSBTZWFyY2hNYW5hZ2VyIG1TZWFyY2hNYW5hZ2VyOwogICAgIAogICAgIC8vIFZhbHVlcyB3ZSBzdG9yZSB0byBhbGxvdyB1c2VyIHRvIHRvZ2dsZSBiZXR3ZWVuIGluLWFwcCBzZWFyY2ggYW5kIGdsb2JhbCBzZWFyY2guCiAgICAgcHJpdmF0ZSBDb21wb25lbnROYW1lIG1TdG9yZWRDb21wb25lbnROYW1lOwpAQCAtMTU3LDcgKzE1OCw3IEBACiAgICAgICogCiAgICAgICogQHBhcmFtIGNvbnRleHQgQXBwbGljYXRpb24gQ29udGV4dCB3ZSBjYW4gdXNlIGZvciBzeXN0ZW0gYWNlc3MKICAgICAgKi8KLSAgICBwdWJsaWMgU2VhcmNoRGlhbG9nKENvbnRleHQgY29udGV4dCkgeworICAgIHB1YmxpYyBTZWFyY2hEaWFsb2coQ29udGV4dCBjb250ZXh0LCBTZWFyY2hNYW5hZ2VyIHNlYXJjaE1hbmFnZXIpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9HbG9iYWxTZWFyY2hCYXIpOwogCiAgICAgICAgIC8vIFNhdmUgdm9pY2UgaW50ZW50IGZvciBsYXRlciBxdWVyaWVzL2xhdW5jaGluZwpAQCAtMTY4LDYgKzE2OSw3IEBACiAKICAgICAgICAgbVZvaWNlQXBwU2VhcmNoSW50ZW50ID0gbmV3IEludGVudChSZWNvZ25pemVySW50ZW50LkFDVElPTl9SRUNPR05JWkVfU1BFRUNIKTsKICAgICAgICAgbVZvaWNlQXBwU2VhcmNoSW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgbVNlYXJjaE1hbmFnZXIgPSBzZWFyY2hNYW5hZ2VyOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTgwLDcgKzE4Miw2IEBACiAKICAgICAgICAgV2luZG93IHRoZVdpbmRvdyA9IGdldFdpbmRvdygpOwogICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9IHRoZVdpbmRvdy5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGxwLnR5cGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NFQVJDSF9CQVI7CiAgICAgICAgIGxwLndpZHRoID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CiAgICAgICAgIC8vIHRha2luZyB1cCB0aGUgd2hvbGUgd2luZG93IChldmVuIHdoZW4gdHJhbnNwYXJlbnQpIGlzIGxlc3MgdGhhbiBpZGVhbCwKICAgICAgICAgLy8gYnV0IG5lY2Vzc2FyeSB0byBzaG93IHRoZSBwb3B1cCB3aW5kb3cgdW50aWwgdGhlIHdpbmRvdyBtYW5hZ2VyIHN1cHBvcnRzCkBAIC0yOTEsOCArMjkyLDEwIEBACiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gVE9ETzogV2hlbiB0aGUgYnJvd3NlciBpY29uIGlzc3VlIGlzIHJlY29uY2lsZWQgaW4gRWNsYWlyLCByZW1vdmUgdGhpcyBzcGVjaWFsIGNhc2UuCiAgICAgICAgICAgICBpZiAoaXNCcm93c2VyU2VhcmNoKCkpIGN1cnJlbnRTZWFyY2hUZXh0ID0gIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBkb1Nob3coY3VycmVudFNlYXJjaFRleHQsIGZhbHNlLCBudWxsLCBtQXBwU2VhcmNoRGF0YSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGNhbmNlbCgpOworICAgICAgICAgICAgbVNlYXJjaE1hbmFnZXIuc3RhcnRHbG9iYWxTZWFyY2goY3VycmVudFNlYXJjaFRleHQsIGZhbHNlLCBtU3RvcmVkQXBwU2VhcmNoRGF0YSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtU3RvcmVkQ29tcG9uZW50TmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBzaG91bGQgdG9nZ2xlICpiYWNrKiB0byBhbiBpbi1hcHAgc2VhcmNoIGNvbnRleHQgZnJvbQpAQCAtMTMxNCw4ICsxMzE3LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMYXVuY2hlcyBhbiBpbnRlbnQsIGluY2x1ZGluZyBhbnkgc3BlY2lhbCBpbnRlbnQgaGFuZGxpbmcuICBEb2Vzbid0IGRpc21pc3MgdGhlIGRpYWxvZwotICAgICAqIHNpbmNlIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGluIHtAbGluayBTZWFyY2hEaWFsb2dXcmFwcGVyI3BlcmZvcm1BY3Rpdml0eVJlc3VtaW5nfQorICAgICAqIExhdW5jaGVzIGFuIGludGVudCwgaW5jbHVkaW5nIGFueSBzcGVjaWFsIGludGVudCBoYW5kbGluZy4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgbGF1bmNoSW50ZW50KEludGVudCBpbnRlbnQpIHsKICAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VhcmNoTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXIuamF2YQppbmRleCBkMjVkNjcwLi4xMmE0MzQ3OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VhcmNoTWFuYWdlci5qYXZhCkBAIC0xNzA5LDcgKzE3MDksNyBAQAogICAgIC8qIHBhY2thZ2UgKi8gT25EaXNtaXNzTGlzdGVuZXIgbURpc21pc3NMaXN0ZW5lciA9IG51bGw7CiAgICAgLyogcGFja2FnZSAqLyBPbkNhbmNlbExpc3RlbmVyIG1DYW5jZWxMaXN0ZW5lciA9IG51bGw7CiAKLSAgICBwcml2YXRlIGZpbmFsIFNlYXJjaE1hbmFnZXJDYWxsYmFjayBtU2VhcmNoTWFuYWdlckNhbGxiYWNrID0gbmV3IFNlYXJjaE1hbmFnZXJDYWxsYmFjaygpOworICAgIHByaXZhdGUgU2VhcmNoRGlhbG9nIG1TZWFyY2hEaWFsb2c7CiAKICAgICAvKnBhY2thZ2UqLyBTZWFyY2hNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSAgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CkBAIC0xNzc4LDMxICsxNzc4LDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBsYXVuY2hBY3Rpdml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYXBwU2VhcmNoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGdsb2JhbFNlYXJjaCkgewotICAgICAgICBpZiAobUlkZW50ID09IDApIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkNhbGxlZCBmcm9tIG91dHNpZGUgb2YgYW4gQWN0aXZpdHkgY29udGV4dCIpOworICAgICAgICBlbnN1cmVTZWFyY2hEaWFsb2coKTsKIAogICAgICAgICBpZiAoZ2xvYmFsU2VhcmNoKSB7CiAgICAgICAgICAgICBzdGFydEdsb2JhbFNlYXJjaChpbml0aWFsUXVlcnksIHNlbGVjdEluaXRpYWxRdWVyeSwgYXBwU2VhcmNoRGF0YSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Bc3NvY2lhdGVkUGFja2FnZS5lcXVhbHMobGF1bmNoQWN0aXZpdHkuZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImludm9raW5nIGFwcCBzZWFyY2ggb24gYSBkaWZmZXJlbnQgcGFja2FnZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIm5vdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZWFyY2ggbWFuYWdlciIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBhY3RpdmF0ZSB0aGUgc2VhcmNoIG1hbmFnZXIgYW5kIHN0YXJ0IGl0IHVwIQotICAgICAgICAgICAgbVNlcnZpY2Uuc3RhcnRTZWFyY2goaW5pdGlhbFF1ZXJ5LCBzZWxlY3RJbml0aWFsUXVlcnksIGxhdW5jaEFjdGl2aXR5LCBhcHBTZWFyY2hEYXRhLAotICAgICAgICAgICAgICAgICAgICBnbG9iYWxTZWFyY2gsIG1TZWFyY2hNYW5hZ2VyQ2FsbGJhY2ssIG1JZGVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAic3RhcnRTZWFyY2goKSBmYWlsZWQuIiwgZXgpOworICAgICAgICBtU2VhcmNoRGlhbG9nLnNob3coaW5pdGlhbFF1ZXJ5LCBzZWxlY3RJbml0aWFsUXVlcnksIGxhdW5jaEFjdGl2aXR5LCBhcHBTZWFyY2hEYXRhLAorICAgICAgICAgICAgICAgIGdsb2JhbFNlYXJjaCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVNlYXJjaERpYWxvZygpIHsKKyAgICAgICAgaWYgKG1TZWFyY2hEaWFsb2cgPT0gbnVsbCkgeworICAgICAgICAgICAgbVNlYXJjaERpYWxvZyA9IG5ldyBTZWFyY2hEaWFsb2cobUNvbnRleHQsIHRoaXMpOworICAgICAgICAgICAgbVNlYXJjaERpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgbVNlYXJjaERpYWxvZy5zZXRPbkRpc21pc3NMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFN0YXJ0cyB0aGUgZ2xvYmFsIHNlYXJjaCBhY3Rpdml0eS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RhcnRHbG9iYWxTZWFyY2goU3RyaW5nIGluaXRpYWxRdWVyeSwgYm9vbGVhbiBzZWxlY3RJbml0aWFsUXVlcnksCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHN0YXJ0R2xvYmFsU2VhcmNoKFN0cmluZyBpbml0aWFsUXVlcnksIGJvb2xlYW4gc2VsZWN0SW5pdGlhbFF1ZXJ5LAogICAgICAgICAgICAgQnVuZGxlIGFwcFNlYXJjaERhdGEpIHsKICAgICAgICAgQ29tcG9uZW50TmFtZSBnbG9iYWxTZWFyY2hBY3Rpdml0eSA9IGdldEdsb2JhbFNlYXJjaEFjdGl2aXR5KCk7CiAgICAgICAgIGlmIChnbG9iYWxTZWFyY2hBY3Rpdml0eSA9PSBudWxsKSB7CkBAIC0xODc2LDggKzE4NzQsNiBAQAogICAgIHB1YmxpYyB2b2lkIHRyaWdnZXJTZWFyY2goU3RyaW5nIHF1ZXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBsYXVuY2hBY3Rpdml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBhcHBTZWFyY2hEYXRhKSB7Ci0gICAgICAgIGlmIChtSWRlbnQgPT0gMCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ2FsbGVkIGZyb20gb3V0c2lkZSBvZiBhbiBBY3Rpdml0eSBjb250ZXh0Iik7CiAgICAgICAgIGlmICghbUFzc29jaWF0ZWRQYWNrYWdlLmVxdWFscyhsYXVuY2hBY3Rpdml0eS5nZXRQYWNrYWdlTmFtZSgpKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52b2tpbmcgYXBwIHNlYXJjaCBvbiBhIGRpZmZlcmVudCBwYWNrYWdlICIgKwogICAgICAgICAgICAgICAgICAgICAibm90IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlYXJjaCBtYW5hZ2VyIik7CkBAIC0xODg2LDEyICsxODgyLDggQEAKICAgICAgICAgICAgIExvZy53KFRBRywgInRyaWdnZXJTZWFyY2ggY2FsbGVkIHdpdGggZW1wdHkgcXVlcnksIGlnbm9yaW5nLiIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtU2VydmljZS50cmlnZ2VyU2VhcmNoKHF1ZXJ5LCBsYXVuY2hBY3Rpdml0eSwgYXBwU2VhcmNoRGF0YSwgbVNlYXJjaE1hbmFnZXJDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgbUlkZW50KTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJ0cmlnZ2VyU2VhcmNoKCkgZmFpbGVkLiIsIGV4KTsKLSAgICAgICAgfQorICAgICAgICBzdGFydFNlYXJjaChxdWVyeSwgZmFsc2UsIGxhdW5jaEFjdGl2aXR5LCBhcHBTZWFyY2hEYXRhLCBmYWxzZSk7CisgICAgICAgIG1TZWFyY2hEaWFsb2cubGF1bmNoUXVlcnlTZWFyY2goKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5MDYsMTAgKzE4OTgsOCBAQAogICAgICAqIEBzZWUgI3N0YXJ0U2VhcmNoCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RvcFNlYXJjaCgpIHsKLSAgICAgICAgaWYgKERCRykgZGVidWcoInN0b3BTZWFyY2goKSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVNlcnZpY2Uuc3RvcFNlYXJjaCgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgaWYgKG1TZWFyY2hEaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlYXJjaERpYWxvZy5jYW5jZWwoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTkyMywxMyArMTkxMyw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIGlmIChEQkcpIGRlYnVnKCJpc1Zpc2libGUoKSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmlzVmlzaWJsZSgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiaXNWaXNpYmxlKCkgZmFpbGVkOiAiICsgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TZWFyY2hEaWFsb2cgPT0gbnVsbD8gZmFsc2UgOiBtU2VhcmNoRGlhbG9nLmlzU2hvd2luZygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk3Niw0NCArMTk2MCwxNCBAQAogICAgICAgICBtQ2FuY2VsTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIFNlYXJjaE1hbmFnZXJDYWxsYmFjayBleHRlbmRzIElTZWFyY2hNYW5hZ2VyQ2FsbGJhY2suU3R1YiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtRmlyZU9uRGlzbWlzcyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSBkZWJ1ZygibUZpcmVPbkRpc21pc3MiKTsKLSAgICAgICAgICAgICAgICBpZiAobURpc21pc3NMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EaXNtaXNzTGlzdGVuZXIub25EaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbUZpcmVPbkNhbmNlbCA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSBkZWJ1ZygibUZpcmVPbkNhbmNlbCIpOwotICAgICAgICAgICAgICAgIGlmIChtQ2FuY2VsTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ2FuY2VsTGlzdGVuZXIub25DYW5jZWwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25EaXNtaXNzKCkgewotICAgICAgICAgICAgaWYgKERCRykgZGVidWcoIm9uRGlzbWlzcygpIik7Ci0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KG1GaXJlT25EaXNtaXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsKCkgewotICAgICAgICAgICAgaWYgKERCRykgZGVidWcoIm9uQ2FuY2VsKCkiKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobUZpcmVPbkNhbmNlbCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQogICAgIC8qKgogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGFuIG9ic29sZXRlIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbC4gRG8gbm90IHVzZS4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsKERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIGlmIChtQ2FuY2VsTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhbmNlbExpc3RlbmVyLm9uQ2FuY2VsKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIwMjEsNyArMTk3NSw5IEBACiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKG1EaXNtaXNzTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbURpc21pc3NMaXN0ZW5lci5vbkRpc21pc3MoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjIwOCw0ICsyMTY0LDQgQEAKICAgICAgICAgVGhyZWFkIHRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CiAgICAgICAgIExvZy5kKFRBRywgbXNnICsgIiAoIiArIHRocmVhZC5nZXROYW1lKCkgKyAiLSIgKyB0aHJlYWQuZ2V0SWQoKSArICIpIik7CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhLmphdmEKaW5kZXggZDkwNTM2Yy4uNGM0NDU1YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhLmphdmEKQEAgLTU0Myw2ICs1NDMsMjEgQEAKICAgICBwdWJsaWMgbmF0aXZlIGZpbmFsIHZvaWQgc3RvcFNtb290aFpvb20oKTsKIAogICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlzcGxheSBvcmllbnRhdGlvbi4gVGhpcyBhZmZlY3RzIHRoZSBwcmV2aWV3IGZyYW1lcyBhbmQgdGhlCisgICAgICogcGljdHVyZSBkaXNwbGF5ZWQgYWZ0ZXIgc25hcHNob3QuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgcG9ydHJhaXQKKyAgICAgKiBtb2RlIGFwcGxpY2F0aW9ucy4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBvcmRlciBvZiBieXRlIGFycmF5IHBhc3NlZCBpbgorICAgICAqIHtAbGluayBQcmV2aWV3Q2FsbGJhY2sjb25QcmV2aWV3RnJhbWV9LiBUaGlzIG1ldGhvZCBpcyBub3QgYWxsb3dlZCB0bworICAgICAqIGJlIGNhbGxlZCBkdXJpbmcgcHJldmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWdyZWVzIHRoZSBhbmdsZSB0aGF0IHRoZSBwaWN0dXJlIHdpbGwgYmUgcm90YXRlZCBjbG9ja3dpc2UuCisgICAgICogICAgICAgICAgICAgICAgVmFsaWQgdmFsdWVzIGFyZSAwLCA5MCwgMTgwLCBhbmQgMjcwLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIG5hdGl2ZSBmaW5hbCB2b2lkIHNldERpc3BsYXlPcmllbnRhdGlvbihpbnQgZGVncmVlcyk7CisKKyAgICAvKioKICAgICAgKiBIYW5kbGVzIHRoZSB6b29tIGNhbGxiYWNrLgogICAgICAqCiAgICAgICogQGhpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0lSZW1vdGVDYWxsYmFjay5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvSVJlbW90ZUNhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNmM3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0lSZW1vdGVDYWxsYmFjay5haWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC9hbmRyb2lkL2FwcC9JQWN0aXZpdHlQZW5kaW5nUmVzdWx0LmFpZGwKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGFuZHJvaWQub3M7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqIEBoaWRlICovCitvbmV3YXkgaW50ZXJmYWNlIElSZW1vdGVDYWxsYmFjayB7CisgICAgdm9pZCBzZW5kUmVzdWx0KGluIEJ1bmRsZSBkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01haWxib3hOb3RBdmFpbGFibGVFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01haWxib3hOb3RBdmFpbGFibGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0YWRiZC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NYWlsYm94Tm90QXZhaWxhYmxlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm9zOwotCi0vKiogQGhpZGUgKi8KLXB1YmxpYyBjbGFzcyBNYWlsYm94Tm90QXZhaWxhYmxlRXhjZXB0aW9uIGV4dGVuZHMgVGhyb3dhYmxlCi17Ci0gIC8qKgotICAgKiBUaGlzIGV4Y2VwdGlvbiByZXByZXNlbnRzIHRoZSBjYXNlIHdoZW4gYSByZXF1ZXN0IGZvciBhCi0gICAqIG5hbWVkLCBwdWJsaXNoZWQgbWFpbGJveCBmYWlscyBiZWNhdXNlIHRoZSByZXF1ZXN0ZWQgbmFtZSBoYXMgbm90IGJlZW4gcHVibGlzaGVkCi0gICAqLwotCi0gICAgcHVibGljCi0gICAgTWFpbGJveE5vdEF2YWlsYWJsZUV4Y2VwdGlvbigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYwotICAgIE1haWxib3hOb3RBdmFpbGFibGVFeGNlcHRpb24oU3RyaW5nIHMpCi0gICAgewotICAgICAgICBzdXBlcihzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzZW5nZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3Nlbmdlci5qYXZhCmluZGV4IDFiYzU1NGUuLmFkNTVhYmRkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzZW5nZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzZW5nZXIuamF2YQpAQCAtMjksNyArMjksNyBAQAogICAgICAqIENyZWF0ZSBhIG5ldyBNZXNzZW5nZXIgcG9pbnRpbmcgdG8gdGhlIGdpdmVuIEhhbmRsZXIuICBBbnkgTWVzc2FnZQogICAgICAqIG9iamVjdHMgc2VudCB0aHJvdWdoIHRoaXMgTWVzc2VuZ2VyIHdpbGwgYXBwZWFyIGluIHRoZSBIYW5kbGVyIGFzIGlmCiAgICAgICoge0BsaW5rIEhhbmRsZXIjc2VuZE1lc3NhZ2UoTWVzc2FnZSkgSGFuZGxlci5zZW5kTWVzc2FnZShNZXNzYWdlKX0gaGFkCi0gICAgICogYmUgY2FsbGVkIGRpcmVjdGx5LgorICAgICAqIGJlZW4gY2FsbGVkIGRpcmVjdGx5LgogICAgICAqIAogICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIEhhbmRsZXIgdGhhdCB3aWxsIHJlY2VpdmUgc2VudCBtZXNzYWdlcy4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL1JlbW90ZUNhbGxiYWNrLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9SZW1vdGVDYWxsYmFjay5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTU2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9SZW1vdGVDYWxsYmFjay5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGFuZHJvaWQub3M7CisKK3BhcmNlbGFibGUgUmVtb3RlQ2FsbGJhY2s7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9SZW1vdGVDYWxsYmFjay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUmVtb3RlQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTk1YmRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUmVtb3RlQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vczsKKworLyoqCisgKiBUT0RPOiBNYWtlIHRoaXMgYSBwdWJsaWMgQVBJPyAgTGV0J3Mgc2VlIGhvdyBpdCBnb2VzIHdpdGggYSBmZXcgdXNlCisgKiBjYXNlcyBmaXJzdC4KKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW1vdGVDYWxsYmFjayBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgZmluYWwgSVJlbW90ZUNhbGxiYWNrIG1UYXJnZXQ7CisgICAgCisgICAgY2xhc3MgRGVsaXZlclJlc3VsdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgQnVuZGxlIG1SZXN1bHQ7CisgICAgICAgIAorICAgICAgICBEZWxpdmVyUmVzdWx0KEJ1bmRsZSByZXN1bHQpIHsKKyAgICAgICAgICAgIG1SZXN1bHQgPSByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG9uUmVzdWx0KG1SZXN1bHQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGNsYXNzIExvY2FsQ2FsbGJhY2sgZXh0ZW5kcyBJUmVtb3RlQ2FsbGJhY2suU3R1YiB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgRGVsaXZlclJlc3VsdChidW5kbGUpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgUmVtb3RlQ2FsbGJhY2tQcm94eSBleHRlbmRzIFJlbW90ZUNhbGxiYWNrIHsKKyAgICAgICAgUmVtb3RlQ2FsbGJhY2tQcm94eShJUmVtb3RlQ2FsbGJhY2sgdGFyZ2V0KSB7CisgICAgICAgICAgICBzdXBlcih0YXJnZXQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VsdChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIFJlbW90ZUNhbGxiYWNrKEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBtSGFuZGxlciA9IGhhbmRsZXI7CisgICAgICAgIG1UYXJnZXQgPSBuZXcgTG9jYWxDYWxsYmFjaygpOworICAgIH0KKyAgICAKKyAgICAgUmVtb3RlQ2FsbGJhY2soSVJlbW90ZUNhbGxiYWNrIHRhcmdldCkgeworICAgICAgICBtSGFuZGxlciA9IG51bGw7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNlbmRSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIG1UYXJnZXQuc2VuZFJlc3VsdChidW5kbGUpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvblJlc3VsdChCdW5kbGUgYnVuZGxlKTsKKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyT2JqKSB7CisgICAgICAgIGlmIChvdGhlck9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0LmFzQmluZGVyKCkuZXF1YWxzKCgoUmVtb3RlQ2FsbGJhY2spb3RoZXJPYmopCisgICAgICAgICAgICAgICAgICAgIC5tVGFyZ2V0LmFzQmluZGVyKCkpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQuYXNCaW5kZXIoKS5oYXNoQ29kZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgIG91dC53cml0ZVN0cm9uZ0JpbmRlcihtVGFyZ2V0LmFzQmluZGVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFJlbW90ZUNhbGxiYWNrPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8UmVtb3RlQ2FsbGJhY2s+KCkgeworICAgICAgICBwdWJsaWMgUmVtb3RlQ2FsbGJhY2sgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIElCaW5kZXIgdGFyZ2V0ID0gaW4ucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsID8gbmV3IFJlbW90ZUNhbGxiYWNrUHJveHkoCisgICAgICAgICAgICAgICAgICAgIElSZW1vdGVDYWxsYmFjay5TdHViLmFzSW50ZXJmYWNlKHRhcmdldCkpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZW1vdGVDYWxsYmFja1tdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlbW90ZUNhbGxiYWNrW3NpemVdOworICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YQppbmRleCBkNjcxNjlmLi5lZjQzYWZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhCkBAIC0zNCwxMiArMzQsNiBAQAogICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL2Jvb2ttYXJrcyIpOwogCiAgICAgLyoqCi0gICAgICogVGhlIGlubGluZSBzY2hlbWUgdG8gc2hvdyBlbWJlZGRlZCBjb250ZW50IGluIGEgYnJvd3Nlci4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIElOTElORV9VUkkgPSBVcmkucGFyc2UoImlubGluZToiKTsKLQotICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIGV4dHJhIGRhdGEgd2hlbiBzdGFydGluZyBCcm93c2VyIHdpdGggQUNUSU9OX1ZJRVcgb3IKICAgICAgKiBBQ1RJT05fU0VBUkNIIGludGVudC4KICAgICAgKiA8cD4KQEAgLTYyLDI0ICs1Niw2IEBACiAgICAgICAgICJjb20uYW5kcm9pZC5icm93c2VyLmFwcGxpY2F0aW9uX2lkIjsKIAogICAgIC8qKgotICAgICAqIFRoZSBjb250ZW50IHRvIGJlIHJlbmRlcmVkIHdoZW4gdXJsJ3Mgc2NoZW1lIGlzIGlubGluZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lOTElORV9DT05URU5UID0iY29tLmFuZHJvaWQuYnJvd3Nlci5pbmxpbmUuY29udGVudCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZW5jb2Rpbmcgb2YgdGhlIGlubGluZWQgY29udGVudCBmb3IgaW5saW5lIHNjaGVtZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lOTElORV9FTkNPRElORyA9ImNvbS5hbmRyb2lkLmJyb3dzZXIuaW5saW5lLmVuY29kaW5nIjsKLQotICAgIC8qKgotICAgICAqIFRoZSB1cmwgdXNlZCB3aGVuIHRoZSBpbmxpbmUgY29udGVudCBpcyBmYWxpZWQgdG8gcmVuZGVyLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSU5MSU5FX0ZBSUxVUkwgPSJjb20uYW5kcm9pZC5icm93c2VyLmlubGluZS5mYWlsdXJsIjsKLQotICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIHRoZSBleHRyYSBkYXRhIGluIHRoZSBWSUVXIGludGVudC4gVGhlIGRhdGEgaXMgaW4gYm9vbGVhbi4KICAgICAgKiA8cD4KICAgICAgKiBJZiB0aGUgQnJvd3NlciBpcyBoYW5kbGluZyB0aGUgaW50ZW50IGFuZCB0aGUgc2V0dGluZyBmb3IKQEAgLTEwMiw2ICs3OCwyNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BPU1RfREFUQSA9ICJjb20uYW5kcm9pZC5icm93c2VyLnBvc3RfZGF0YSI7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXh0cmEgZGF0YSBpbiB0aGUgVklFVyBpbnRlbnQuIFRoZSBkYXRhIGlzIGluIHRoZSBmb3JtYXQKKyAgICAgKiBvZiBTdHJpbmcgYXJyYXkuIFRoaXMgc2hvdWxkIGJlIHBhaXJlZCB3aXRoIEVYVFJBX0hFQURFUlNfVkFMVUUuCisgICAgICogPHA+CisgICAgICogVGhlIGtleXMgd2lsbCBiZSBjb21iaW5lZCB3aXRoIHRoZSB2YWx1ZXMgYW5kIHNlbnQgaW4gdGhlIEhUVFAgcmVxdWVzdAorICAgICAqIGhlYWRlcnMgZm9yIHRoZSBwcm92aWRlZCB1cmwuIFRoZSBrZXlzIGNhbid0IGJlIHRoZSBzdGFuZGFyZCBIVFRQIGhlYWRlcnMKKyAgICAgKiBhcyB0aGV5IGFyZSBzZXQgYnkgdGhlIFdlYlZpZXcuIFRoZSB1cmwncyBzY2hlbWEgbXVzdCBiZSBodHRwKHMpLgorICAgICAqIDxwPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hFQURFUlNfS0VZID0gImNvbS5hbmRyb2lkLmJyb3dzZXIuaGVhZGVyc19rZXkiOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGV4dHJhIGRhdGEgaW4gdGhlIFZJRVcgaW50ZW50LiBUaGUgZGF0YSBpcyBpbiB0aGUgZm9ybWF0CisgICAgICogb2YgU3RyaW5nIGFycmF5LiBUaGlzIHNob3VsZCBiZSBwYWlyZWQgd2l0aCBFWFRSQV9IRUFERVJTX0tFWS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWVzIHdpbGwgYmUgY29tYmluZWQgd2l0aCB0aGUga2V5cyBhbmQgc2VudCBpbiB0aGUgSFRUUCByZXF1ZXN0CisgICAgICogaGVhZGVycyBmb3IgdGhlIHByb3ZpZGVkIHVybC4gVGhlIHVybCdzIHNjaGVtYSBtdXN0IGJlIGh0dHAocykuCisgICAgICogPHA+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSEVBREVSU19WQUxVRSA9ICJjb20uYW5kcm9pZC5icm93c2VyLmhlYWRlcnNfdmFsdWUiOworCiAgICAgLyogaWYgeW91IGNoYW5nZSBjb2x1bW4gb3JkZXIgeW91IG11c3QgYWxzbyBjaGFuZ2UgaW5kaWNlcwogICAgICAgIGJlbG93ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBISVNUT1JZX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKaW5kZXggY2JkOGEyNi4uZjg5YmE5MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCkBAIC03NDQsOSArNzQ0LDEwIEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN1YkN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgZXh0ZW5kZWRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRWYWx1ZXMucHV0KEV4dGVuZGVkUHJvcGVydGllcy5OQU1FLCBjdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9OQU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZFZhbHVlcy5wdXQoRXh0ZW5kZWRQcm9wZXJ0aWVzLk5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkN1cnNvci5nZXRTdHJpbmcoQ09MVU1OX05BTUUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkVmFsdWVzLnB1dChFeHRlbmRlZFByb3BlcnRpZXMuVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5nZXRTdHJpbmcoQ09MVU1OX1ZBTFVFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkN1cnNvci5nZXRTdHJpbmcoQ09MVU1OX1ZBTFVFKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuYWRkU3ViVmFsdWUoRXh0ZW5kZWRQcm9wZXJ0aWVzLkNPTlRFTlRfVVJJLCBleHRlbmRlZFZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRG93bmxvYWRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Eb3dubG9hZHMuamF2YQppbmRleCA2YmYwOWI1Li4wOGFiMTY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Eb3dubG9hZHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Eb3dubG9hZHMuamF2YQpAQCAtNTE3LDYgKzUxNyw4IEBACiAgICAgLyoqCiAgICAgICogVGhpcyBkb3dubG9hZCBjb3VsZG4ndCBiZSBjb21wbGV0ZWQgYmVjYXVzZSBvZiBhIHN0b3JhZ2UgaXNzdWUuCiAgICAgICogVHlwaWNhbGx5LCB0aGF0J3MgYmVjYXVzZSB0aGUgZmlsZXN5c3RlbSBpcyBtaXNzaW5nIG9yIGZ1bGwuCisgICAgICogVXNlIHRoZSBtb3JlIHNwZWNpZmljIHtAbGluayAjU1RBVFVTX0lOU1VGRklDSUVOVF9TUEFDRV9FUlJPUn0KKyAgICAgKiBhbmQge0BsaW5rICNTVEFUVVNfREVWSUNFX05PVF9GT1VORF9FUlJPUn0gd2hlbiBhcHByb3ByaWF0ZS4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19GSUxFX0VSUk9SID0gNDkyOwpAQCAtNTU4LDYgKzU2MCwyMSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19UT09fTUFOWV9SRURJUkVDVFMgPSA0OTc7CiAKICAgICAvKioKKyAgICAgKiBUaGlzIGRvd25sb2FkIGNvdWxkbid0IGJlIGNvbXBsZXRlZCBkdWUgdG8gaW5zdWZmaWNpZW50IHN0b3JhZ2UKKyAgICAgKiBzcGFjZS4gIFR5cGljYWxseSwgdGhpcyBpcyBiZWNhdXNlIHRoZSBTRCBjYXJkIGlzIGZ1bGwuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfSU5TVUZGSUNJRU5UX1NQQUNFX0VSUk9SID0gNDk4OworCisgICAgLyoqCisgICAgICogVGhpcyBkb3dubG9hZCBjb3VsZG4ndCBiZSBjb21wbGV0ZWQgYmVjYXVzZSBubyBleHRlcm5hbCBzdG9yYWdlCisgICAgICogZGV2aWNlIHdhcyBmb3VuZC4gIFR5cGljYWxseSwgdGhpcyBpcyBiZWNhdXNlIHRoZSBTRCBjYXJkIGlzIG5vdAorICAgICAqIG1vdW50ZWQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfREVWSUNFX05PVF9GT1VORF9FUlJPUiA9IDQ5OTsKKworICAgIC8qKgogICAgICAqIFRoaXMgZG93bmxvYWQgaXMgdmlzaWJsZSBidXQgb25seSBzaG93cyBpbiB0aGUgbm90aWZpY2F0aW9ucwogICAgICAqIHdoaWxlIGl0J3MgaW4gcHJvZ3Jlc3MuCiAgICAgICogQGhpZGUKQEAgLTEwMTksNiArMTAzNiw4IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGRvd25sb2FkIGNvdWxkbid0IGJlIGNvbXBsZXRlZCBiZWNhdXNlIG9mIGEgc3RvcmFnZSBpc3N1ZS4KICAgICAgICAgICogVHlwaWNhbGx5LCB0aGF0J3MgYmVjYXVzZSB0aGUgZmlsZXN5c3RlbSBpcyBtaXNzaW5nIG9yIGZ1bGwuCisgICAgICAgICAqIFVzZSB0aGUgbW9yZSBzcGVjaWZpYyB7QGxpbmsgI1NUQVRVU19JTlNVRkZJQ0lFTlRfU1BBQ0VfRVJST1J9CisgICAgICAgICAqIGFuZCB7QGxpbmsgI1NUQVRVU19ERVZJQ0VfTk9UX0ZPVU5EX0VSUk9SfSB3aGVuIGFwcHJvcHJpYXRlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0ZJTEVfRVJST1IgPSA0OTI7CiAKQEAgLTEwNTQsNiArMTA3MywxOSBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfVE9PX01BTllfUkVESVJFQ1RTID0gNDk3OwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGRvd25sb2FkIGNvdWxkbid0IGJlIGNvbXBsZXRlZCBkdWUgdG8gaW5zdWZmaWNpZW50IHN0b3JhZ2UKKyAgICAgICAgICogc3BhY2UuICBUeXBpY2FsbHksIHRoaXMgaXMgYmVjYXVzZSB0aGUgU0QgY2FyZCBpcyBmdWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0lOU1VGRklDSUVOVF9TUEFDRV9FUlJPUiA9IDQ5ODsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBkb3dubG9hZCBjb3VsZG4ndCBiZSBjb21wbGV0ZWQgYmVjYXVzZSBubyBleHRlcm5hbCBzdG9yYWdlCisgICAgICAgICAqIGRldmljZSB3YXMgZm91bmQuICBUeXBpY2FsbHksIHRoaXMgaXMgYmVjYXVzZSB0aGUgU0QgY2FyZCBpcyBub3QKKyAgICAgICAgICogbW91bnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19ERVZJQ0VfTk9UX0ZPVU5EX0VSUk9SID0gNDk5OworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGRvd25sb2FkIGlzIHZpc2libGUgYnV0IG9ubHkgc2hvd3MgaW4gdGhlIG5vdGlmaWNhdGlvbnMKICAgICAgICAgICogd2hpbGUgaXQncyBpbiBwcm9ncmVzcy4KICAgICAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQppbmRleCBlY2ZlYTAwLi4yM2E5ZjQ5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKQEAgLTIwMzMsMTAgKzIwMzMsMTAgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfTU9DS19MT0NBVElPTiA9ICJtb2NrX2xvY2F0aW9uIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIEFuZHJvaWQgSUQgKGEgdW5pcXVlIDY0LWJpdCB2YWx1ZSkgYXMgYSBoZXggc3RyaW5nLgotICAgICAgICAgKiBJZGVudGljYWwgdG8gdGhhdCBvYnRhaW5lZCBieSBjYWxsaW5nCi0gICAgICAgICAqIEdvb2dsZUxvZ2luU2VydmljZS5nZXRBbmRyb2lkSWQoKTsgaXQgaXMgYWxzbyBwbGFjZWQgaGVyZQotICAgICAgICAgKiBzbyB5b3UgY2FuIGdldCBpdCB3aXRob3V0IGJpbmRpbmcgdG8gYSBzZXJ2aWNlLgorICAgICAgICAgKiBBIDY0LWJpdCBudW1iZXIgKGFzIGEgaGV4IHN0cmluZykgdGhhdCBpcyByYW5kb21seQorICAgICAgICAgKiBnZW5lcmF0ZWQgb24gdGhlIGRldmljZSdzIGZpcnN0IGJvb3QgYW5kIHNob3VsZCByZW1haW4KKyAgICAgICAgICogY29uc3RhbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgZGV2aWNlLiAgKFRoZSB2YWx1ZSBtYXkKKyAgICAgICAgICogY2hhbmdlIGlmIGEgZmFjdG9yeSByZXNldCBpcyBwZXJmb3JtZWQgb24gdGhlIGRldmljZS4pCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkRST0lEX0lEID0gImFuZHJvaWRfaWQiOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvc2VhcmNoL1NlYXJjaERpYWxvZ1dyYXBwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9zZWFyY2gvU2VhcmNoRGlhbG9nV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU2NGFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9zZWFyY2gvU2VhcmNoRGlhbG9nV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuc2VydmVyLnNlYXJjaDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLklTZWFyY2hNYW5hZ2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIFJ1bnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNlYXJjaERpYWxvZ30gb24gaXRzIG93biB0aHJlYWQuCi0gKi8KLWNsYXNzIFNlYXJjaERpYWxvZ1dyYXBwZXIKLWltcGxlbWVudHMgRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIsIERpYWxvZ0ludGVyZmFjZS5PbkRpc21pc3NMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNlYXJjaE1hbmFnZXJTZXJ2aWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9VSV9USFJFQURfTkFNRSA9ICJTZWFyY2hEaWFsb2ciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUFSQ0hfVUlfVEhSRUFEX1BSSU9SSVRZID0KLSAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLlRIUkVBRF9QUklPUklUWV9ERUZBVUxUOwotCi0gICAgLy8gVGFrZXMgbm8gYXJndW1lbnRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19JTklUID0gMDsKLSAgICAvLyBUYWtlcyB0aGVzZSBhcmd1bWVudHM6Ci0gICAgLy8gYXJnMTogc2VsZWN0SW5pdGlhbFF1ZXJ5LCAwID0gZmFsc2UsIDEgPSB0cnVlCi0gICAgLy8gYXJnMjogZ2xvYmFsU2VhcmNoLCAwID0gZmFsc2UsIDEgPSB0cnVlCi0gICAgLy8gb2JqOiBzZWFyY2hNYW5hZ2VyQ2FsbGJhY2sKLSAgICAvLyBkYXRhW0tFWV9JTklUSUFMX1FVRVJZXTogaW5pdGlhbCBxdWVyeQotICAgIC8vIGRhdGFbS0VZX0xBVU5DSF9BQ1RJVklUWV06IGxhdW5jaCBhY3Rpdml0eQotICAgIC8vIGRhdGFbS0VZX0FQUF9TRUFSQ0hfREFUQV06IGFwcCBzZWFyY2ggZGF0YQotICAgIC8vIGRhdGFbS0VZX1RSSUdHRVJdOiAwID0gZmFsc2UsIDEgPSB0cnVlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TVEFSVF9TRUFSQ0ggPSAxOwotICAgIC8vIFRha2VzIG5vIGFyZ3VtZW50cwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU1RPUF9TRUFSQ0ggPSAyOwotICAgIC8vIGFyZzEgaXMgYWN0aXZpdHkgaWQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FDVElWSVRZX1JFU1VNSU5HID0gMzsKLSAgICAvLyBvYmogaXMgdGhlIHJlYXNvbgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xPU0lOR19TWVNURU1fRElBTE9HUyA9IDQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lOSVRJQUxfUVVFUlkgPSAicSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MQVVOQ0hfQUNUSVZJVFkgPSAiYSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BUFBfU0VBUkNIX0RBVEEgPSAiZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JREVOVCA9ICJpIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RSSUdHRVIgPSAidCI7Ci0KLSAgICAvLyBDb250ZXh0IHVzZWQgZm9yIGdldHRpbmcgc2VhcmNoIFVJIHJlc291cmNlcwotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLQotICAgIC8vIEhhbmRsZXMgbWVzc2FnZXMgb24gdGhlIHNlYXJjaCBVSSB0aHJlYWQuCi0gICAgcHJpdmF0ZSBmaW5hbCBTZWFyY2hEaWFsb2dIYW5kbGVyIG1TZWFyY2hVaVRocmVhZDsKLQotICAgIC8vIFRoZSBzZWFyY2ggVUkKLSAgICBTZWFyY2hEaWFsb2cgbVNlYXJjaERpYWxvZzsKLQotICAgIC8vIElmIHRoZSBzZWFyY2ggVUkgaXMgdmlzaWJsZSwgdGhpcyBpcyB0aGUgY2FsbGJhY2sgZm9yIHRoZSBjbGllbnQgdGhhdCBzaG93ZWQgaXQuCi0gICAgSVNlYXJjaE1hbmFnZXJDYWxsYmFjayBtQ2FsbGJhY2sgPSBudWxsOwotCi0gICAgLy8gSWRlbnRpdHkgb2YgbGFzdCBhY3Rpdml0eSB0aGF0IHN0YXJ0ZWQgc2VhcmNoLgotICAgIHByaXZhdGUgaW50IG1TdGFydGVkSWRlbnQgPSAwOwotICAgIAotICAgIC8vIElkZW50aXR5IG9mIGN1cnJlbnRseSByZXN1bWVkIGFjdGl2aXR5LgotICAgIHByaXZhdGUgaW50IG1SZXN1bWVkSWRlbnQgPSAwOwotCi0gICAgLy8gVHJ1ZSBpZiB3ZSBoYXZlIHJlZ2lzdGVyZWQgb3VyIHJlY2VpdmVycy4KLSAgICBwcml2YXRlIGJvb2xlYW4gbVJlY2VpdmVyUmVnaXN0ZXJlZDsKLQotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtVmlzaWJsZSA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgc2VhcmNoIGRpYWxvZyB3cmFwcGVyIGFuZCBhIHNlYXJjaCBVSSB0aHJlYWQuIFRoZSBzZWFyY2ggZGlhbG9nIGl0c2VsZiB3aWxsCi0gICAgICogYmUgY3JlYXRlZCBzb21lIGFzeW5jaHJvbm91c2x5IG9uIHRoZSBzZWFyY2ggVUkgdGhyZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBnZXR0aW5nIHNlYXJjaCBVSSByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIFNlYXJjaERpYWxvZ1dyYXBwZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIHNlYXJjaCBVSSB0aHJlYWQKLSAgICAgICAgSGFuZGxlclRocmVhZCB0ID0gbmV3IEhhbmRsZXJUaHJlYWQoU0VBUkNIX1VJX1RIUkVBRF9OQU1FLCBTRUFSQ0hfVUlfVEhSRUFEX1BSSU9SSVRZKTsKLSAgICAgICAgdC5zdGFydCgpOwotICAgICAgICBtU2VhcmNoVWlUaHJlYWQgPSBuZXcgU2VhcmNoRGlhbG9nSGFuZGxlcih0LmdldExvb3BlcigpKTsKLQotICAgICAgICAvLyBDcmVhdGUgc2VhcmNoIFVJIG9uIHRoZSBzZWFyY2ggVUkgdGhyZWFkCi0gICAgICAgIG1TZWFyY2hVaVRocmVhZC5zZW5kRW1wdHlNZXNzYWdlKE1TR19JTklUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBtVmlzaWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgc2VhcmNoIFVJLgotICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIHNlYXJjaCBVSSB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIG1TZWFyY2hEaWFsb2cgPSBuZXcgU2VhcmNoRGlhbG9nKG1Db250ZXh0KTsKLSAgICAgICAgbVNlYXJjaERpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKHRoaXMpOwotICAgICAgICBtU2VhcmNoRGlhbG9nLnNldE9uRGlzbWlzc0xpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBpZiAoIW1SZWNlaXZlclJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKAotICAgICAgICAgICAgICAgICAgICBJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7Ci0gICAgICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBtU2VhcmNoVWlUaHJlYWQpOwotICAgICAgICAgICAgbVJlY2VpdmVyUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW5yZWdpc3RlckJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBpZiAobVJlY2VpdmVyUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlcik7Ci0gICAgICAgICAgICBtUmVjZWl2ZXJSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIHNlYXJjaCBkaWFsb2cgd2hlbiByZXF1ZXN0ZWQgYnkgdGhlIHN5c3RlbSAoZS5nLiB3aGVuIGEgcGhvbmUgY2FsbCBjb21lcyBpbikuCi0gICAgICovCi0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fQ09ORklHVVJBVElPTl9DSEFOR0VELmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgZGVidWcoSW50ZW50LkFDVElPTl9DT05GSUdVUkFUSU9OX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgIHBlcmZvcm1PbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLy8KLSAgICAvLyBFeHRlcm5hbCBBUEkKLSAgICAvLwotCi0gICAgLyoqCi0gICAgICogTGF1bmNoZXMgdGhlIHNlYXJjaCBVSS4KLSAgICAgKiBDYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZC4KLSAgICAgKgotICAgICAqIEBzZWUgU2VhcmNoTWFuYWdlciNzdGFydFNlYXJjaChTdHJpbmcsIGJvb2xlYW4sIENvbXBvbmVudE5hbWUsIEJ1bmRsZSwgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNlYXJjaChmaW5hbCBTdHJpbmcgaW5pdGlhbFF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzZWxlY3RJbml0aWFsUXVlcnksCi0gICAgICAgICAgICBmaW5hbCBDb21wb25lbnROYW1lIGxhdW5jaEFjdGl2aXR5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFwcFNlYXJjaERhdGEsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGdsb2JhbFNlYXJjaCwKLSAgICAgICAgICAgIGZpbmFsIElTZWFyY2hNYW5hZ2VyQ2FsbGJhY2sgc2VhcmNoTWFuYWdlckNhbGxiYWNrLAotICAgICAgICAgICAgaW50IGlkZW50LAotICAgICAgICAgICAgYm9vbGVhbiB0cmlnZ2VyKSB7Ci0gICAgICAgIGlmIChEQkcpIGRlYnVnKCJzdGFydFNlYXJjaCgpIik7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgbXNnLndoYXQgPSBNU0dfU1RBUlRfU0VBUkNIOwotICAgICAgICBtc2cuYXJnMSA9IHNlbGVjdEluaXRpYWxRdWVyeSA/IDEgOiAwOwotICAgICAgICBtc2cuYXJnMiA9IGdsb2JhbFNlYXJjaCA/IDEgOiAwOwotICAgICAgICBtc2cub2JqID0gc2VhcmNoTWFuYWdlckNhbGxiYWNrOwotICAgICAgICBCdW5kbGUgbXNnRGF0YSA9IG1zZy5nZXREYXRhKCk7Ci0gICAgICAgIG1zZ0RhdGEucHV0U3RyaW5nKEtFWV9JTklUSUFMX1FVRVJZLCBpbml0aWFsUXVlcnkpOwotICAgICAgICBtc2dEYXRhLnB1dFBhcmNlbGFibGUoS0VZX0xBVU5DSF9BQ1RJVklUWSwgbGF1bmNoQWN0aXZpdHkpOwotICAgICAgICBtc2dEYXRhLnB1dEJ1bmRsZShLRVlfQVBQX1NFQVJDSF9EQVRBLCBhcHBTZWFyY2hEYXRhKTsKLSAgICAgICAgbXNnRGF0YS5wdXRJbnQoS0VZX0lERU5ULCBpZGVudCk7Ci0gICAgICAgIG1zZ0RhdGEucHV0SW50KEtFWV9UUklHR0VSLCB0cmlnZ2VyID8gMSA6IDApOwotICAgICAgICBtU2VhcmNoVWlUaHJlYWQuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgLy8gYmUgYSBsaXR0bGUgbW9yZSBlYWdlciBpbiBzZXR0aW5nIHRoaXMgc28gaXNWaXNpYmxlIHdpbGwgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIGlmCi0gICAgICAgIC8vIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBzdGFydFNlYXJjaAotICAgICAgICBtVmlzaWJsZSA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyB0aGUgc2VhcmNoIGRpYWxvZy4KLSAgICAgKiBDYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wU2VhcmNoKCkgewotICAgICAgICBpZiAoREJHKSBkZWJ1Zygic3RvcFNlYXJjaCgpIik7Ci0gICAgICAgIG1TZWFyY2hVaVRocmVhZC5zZW5kRW1wdHlNZXNzYWdlKE1TR19TVE9QX1NFQVJDSCk7Ci0gICAgICAgIC8vIGJlIGEgbGl0dGxlIG1vcmUgZWFnZXIgaW4gc2V0dGluZyB0aGlzIHNvIGlzVmlzaWJsZSB3aWxsIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSBpZgotICAgICAgICAvLyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgc3RvcFNlYXJjaAotICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGN1cnJlbnRseSByZXN1bWVkIGFjdGl2aXR5LgotICAgICAqIENhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjdGl2aXR5UmVzdW1pbmcoaW50IGlkZW50KSB7Ci0gICAgICAgIGlmIChEQkcpIGRlYnVnKCJhY3Rpdml0eVJlc3VtaW5nKGlkZW50PSIgKyBpZGVudCArICIpIik7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgbXNnLndoYXQgPSBNU0dfQUNUSVZJVFlfUkVTVU1JTkc7Ci0gICAgICAgIG1zZy5hcmcxID0gaWRlbnQ7Ci0gICAgICAgIG1TZWFyY2hVaVRocmVhZC5zZW5kTWVzc2FnZShtc2cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgY2xvc2luZyBvZiBzeXN0ZW0gd2luZG93cy9kaWFsb2dzCi0gICAgICogQ2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2luZ1N5c3RlbURpYWxvZ3MoU3RyaW5nIHJlYXNvbikgewotICAgICAgICBpZiAoREJHKSBkZWJ1ZygiY2xvc2luZ1N5c3RlbURpYWxvZ3MocmVhc29uPSIgKyByZWFzb24gKyAiKSIpOwotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gTVNHX0NMT1NJTkdfU1lTVEVNX0RJQUxPR1M7Ci0gICAgICAgIG1zZy5vYmogPSByZWFzb247Ci0gICAgICAgIG1TZWFyY2hVaVRocmVhZC5zZW5kTWVzc2FnZShtc2cpOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcyB0aGF0IHJ1biBvbiB0aGUgc2VhcmNoIFVJIHRocmVhZAotICAgIC8vCi0KLSAgICBwcml2YXRlIGNsYXNzIFNlYXJjaERpYWxvZ0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLQotICAgICAgICBwdWJsaWMgU2VhcmNoRGlhbG9nSGFuZGxlcihMb29wZXIgbG9vcGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihsb29wZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19JTklUOgotICAgICAgICAgICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NUQVJUX1NFQVJDSDoKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RhcnRTZWFyY2hNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NUT1BfU0VBUkNIOgotICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3RvcFNlYXJjaCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19BQ1RJVklUWV9SRVNVTUlORzoKLSAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUFjdGl2aXR5UmVzdW1pbmcobXNnLmFyZzEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19DTE9TSU5HX1NZU1RFTV9ESUFMT0dTOgotICAgICAgICAgICAgICAgICAgICBwZXJmb3JtQ2xvc2luZ1N5c3RlbURpYWxvZ3MoKFN0cmluZyltc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU3RhcnRTZWFyY2hNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBCdW5kbGUgbXNnRGF0YSA9IG1zZy5nZXREYXRhKCk7Ci0gICAgICAgICAgICBTdHJpbmcgaW5pdGlhbFF1ZXJ5ID0gbXNnRGF0YS5nZXRTdHJpbmcoS0VZX0lOSVRJQUxfUVVFUlkpOwotICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RJbml0aWFsUXVlcnkgPSBtc2cuYXJnMSAhPSAwOwotICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBsYXVuY2hBY3Rpdml0eSA9Ci0gICAgICAgICAgICAgICAgICAgIChDb21wb25lbnROYW1lKSBtc2dEYXRhLmdldFBhcmNlbGFibGUoS0VZX0xBVU5DSF9BQ1RJVklUWSk7Ci0gICAgICAgICAgICBCdW5kbGUgYXBwU2VhcmNoRGF0YSA9IG1zZ0RhdGEuZ2V0QnVuZGxlKEtFWV9BUFBfU0VBUkNIX0RBVEEpOwotICAgICAgICAgICAgYm9vbGVhbiBnbG9iYWxTZWFyY2ggPSBtc2cuYXJnMiAhPSAwOwotICAgICAgICAgICAgSVNlYXJjaE1hbmFnZXJDYWxsYmFjayBzZWFyY2hNYW5hZ2VyQ2FsbGJhY2sgPSAoSVNlYXJjaE1hbmFnZXJDYWxsYmFjaykgbXNnLm9iajsKLSAgICAgICAgICAgIGludCBpZGVudCA9IG1zZ0RhdGEuZ2V0SW50KEtFWV9JREVOVCk7Ci0gICAgICAgICAgICBib29sZWFuIHRyaWdnZXIgPSBtc2dEYXRhLmdldEludChLRVlfVFJJR0dFUikgIT0gMDsKLSAgICAgICAgICAgIHBlcmZvcm1TdGFydFNlYXJjaChpbml0aWFsUXVlcnksIHNlbGVjdEluaXRpYWxRdWVyeSwgbGF1bmNoQWN0aXZpdHksCi0gICAgICAgICAgICAgICAgICAgIGFwcFNlYXJjaERhdGEsIGdsb2JhbFNlYXJjaCwgc2VhcmNoTWFuYWdlckNhbGxiYWNrLCBpZGVudCwgdHJpZ2dlcik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjdHVhbGx5IGxhdW5jaGVzIHRoZSBzZWFyY2ggVUkuCi0gICAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgc2VhcmNoIFVJIHRocmVhZC4KLSAgICAgKi8KLSAgICB2b2lkIHBlcmZvcm1TdGFydFNlYXJjaChTdHJpbmcgaW5pdGlhbFF1ZXJ5LAotICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RJbml0aWFsUXVlcnksCi0gICAgICAgICAgICBDb21wb25lbnROYW1lIGxhdW5jaEFjdGl2aXR5LAotICAgICAgICAgICAgQnVuZGxlIGFwcFNlYXJjaERhdGEsCi0gICAgICAgICAgICBib29sZWFuIGdsb2JhbFNlYXJjaCwKLSAgICAgICAgICAgIElTZWFyY2hNYW5hZ2VyQ2FsbGJhY2sgc2VhcmNoTWFuYWdlckNhbGxiYWNrLAotICAgICAgICAgICAgaW50IGlkZW50LAotICAgICAgICAgICAgYm9vbGVhbiB0cmlnZ2VyKSB7Ci0gICAgICAgIGlmIChEQkcpIGRlYnVnKCJwZXJmb3JtU3RhcnRTZWFyY2goKSIpOwotCi0gICAgICAgIHJlZ2lzdGVyQnJvYWRjYXN0UmVjZWl2ZXIoKTsKLSAgICAgICAgbUNhbGxiYWNrID0gc2VhcmNoTWFuYWdlckNhbGxiYWNrOwotCi0gICAgICAgIC8vIGNsZWFuIHVwIGFueSBoaWRkZW4gZGlhbG9nIHRoYXQgd2Ugd2VyZSB3YWl0aW5nIHRvIHJlc3VtZQotICAgICAgICBpZiAobVN0YXJ0ZWRJZGVudCAhPSAwKSB7Ci0gICAgICAgICAgICBtU2VhcmNoRGlhbG9nLmRpc21pc3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGFydGVkSWRlbnQgPSBpZGVudDsKLSAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiKioqKioqKioqKioqKioqKioqKiBESUFMT0c6IHN0YXJ0Iik7Ci0KLSAgICAgICAgbVNlYXJjaERpYWxvZy5zaG93KGluaXRpYWxRdWVyeSwgc2VsZWN0SW5pdGlhbFF1ZXJ5LCBsYXVuY2hBY3Rpdml0eSwgYXBwU2VhcmNoRGF0YSwKLSAgICAgICAgICAgICAgICBnbG9iYWxTZWFyY2gpOwotICAgICAgICBtVmlzaWJsZSA9IHRydWU7Ci0gICAgICAgIGlmICh0cmlnZ2VyKSB7Ci0gICAgICAgICAgICBtU2VhcmNoRGlhbG9nLmxhdW5jaFF1ZXJ5U2VhcmNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY3R1YWxseSBjYW5jZWxzIHRoZSBzZWFyY2ggVUkuCi0gICAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgc2VhcmNoIFVJIHRocmVhZC4KLSAgICAgKi8KLSAgICB2b2lkIHBlcmZvcm1TdG9wU2VhcmNoKCkgewotICAgICAgICBpZiAoREJHKSBkZWJ1ZygicGVyZm9ybVN0b3BTZWFyY2goKSIpOwotICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICIqKioqKioqKioqKioqKioqKioqIERJQUxPRzogY2FuY2VsIik7Ci0gICAgICAgIG1TZWFyY2hEaWFsb2cuY2FuY2VsKCk7Ci0gICAgICAgIG1WaXNpYmxlID0gZmFsc2U7Ci0gICAgICAgIG1TdGFydGVkSWRlbnQgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHJlc3VtZWQgYWN0aXZpdHkKLSAgICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIG9uIHRoZSBzZWFyY2ggVUkgdGhyZWFkLgotICAgICAqLwotICAgIHZvaWQgcGVyZm9ybUFjdGl2aXR5UmVzdW1pbmcoaW50IGlkZW50KSB7Ci0gICAgICAgIGlmIChEQkcpIGRlYnVnKCJwZXJmb3JtUmVzdW1pbmdBY3Rpdml0eSgpOiBtU3RhcnRlZElkZW50PSIKLSAgICAgICAgICAgICAgICArIG1TdGFydGVkSWRlbnQgKyAiLCByZXN1bWluZzogIiArIGlkZW50KTsKLSAgICAgICAgdGhpcy5tUmVzdW1lZElkZW50ID0gaWRlbnQ7Ci0gICAgICAgIGlmIChtU3RhcnRlZElkZW50ICE9IDApIHsKLSAgICAgICAgICAgIGlmIChtU3RhcnRlZElkZW50ID09IG1SZXN1bWVkSWRlbnQpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgcmVzdW1pbmcgaW50byB0aGUgYWN0aXZpdHkgd2hlcmUgd2UgcHJldmlvdXNseSBoaWQgdGhlIGRpYWxvZywgYnJpbmcgaXQKLSAgICAgICAgICAgICAgICAvLyBiYWNrCi0gICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiKioqKioqKioqKioqKioqKioqKiBESUFMT0c6IHNob3ciKTsKLSAgICAgICAgICAgICAgICBtU2VhcmNoRGlhbG9nLnNob3coKTsKLSAgICAgICAgICAgICAgICBtVmlzaWJsZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHJlc3VtaW5nIGludG8gc29tZSBvdGhlciBhY3Rpdml0eTsgaGlkZSBvdXJzZWx2ZXMgaW4gY2FzZSB3ZSBldmVyIGNvbWUgYmFjawotICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBzaG93IG91cnNlbHZlcyBxdWlja2x5IGFnYWluCi0gICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiKioqKioqKioqKioqKioqKioqKiBESUFMT0c6IGhpZGUiKTsKLSAgICAgICAgICAgICAgICBtU2VhcmNoRGlhbG9nLmhpZGUoKTsKLSAgICAgICAgICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBkdWUgdG8gc3lzdGVtIGRpYWxvZ3MgYmVpbmcgY2xvc2VkCi0gICAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgc2VhcmNoIFVJIHRocmVhZC4KLSAgICAgKi8KLSAgICB2b2lkIHBlcmZvcm1DbG9zaW5nU3lzdGVtRGlhbG9ncyhTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIGlmIChEQkcpIGRlYnVnKCJwZXJmb3JtQ2xvc2luZ1N5c3RlbURpYWxvZ3MoKTogbVN0YXJ0ZWRJZGVudD0iCi0gICAgICAgICAgICAgICAgKyBtU3RhcnRlZElkZW50ICsgIiwgcmVhc29uOiAiICsgcmVhc29uKTsKLSAgICAgICAgaWYgKCEic2VhcmNoIi5lcXVhbHMocmVhc29uKSkgewotICAgICAgICAgICAgaWYgKERCRykgZGVidWcoSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUyk7Ci0gICAgICAgICAgICBwZXJmb3JtU3RvcFNlYXJjaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgc2VhcmNoIFVJIHRocmVhZC4KLSAgICAgKi8KLSAgICB2b2lkIHBlcmZvcm1PbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkgewotICAgICAgICBpZiAoREJHKSBkZWJ1ZygicGVyZm9ybU9uQ29uZmlndXJhdGlvbkNoYW5nZWQoKSIpOwotICAgICAgICBtU2VhcmNoRGlhbG9nLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkge0BsaW5rIFNlYXJjaERpYWxvZ30gd2hlbiBpdCBnb2VzIGF3YXkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25EaXNtaXNzKERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKLSAgICAgICAgaWYgKERCRykgZGVidWcoIm9uRGlzbWlzcygpIik7Ci0gICAgICAgIG1TdGFydGVkSWRlbnQgPSAwOwotICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOwotICAgICAgICBjYWxsT25EaXNtaXNzKCk7Ci0KLSAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0aGUgY2FsbGJhY2sgYW55bW9yZSwgcmVsZWFzZSBpdAotICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOwotICAgICAgICB1bnJlZ2lzdGVyQnJvYWRjYXN0UmVjZWl2ZXIoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB7QGxpbmsgU2VhcmNoRGlhbG9nfSB3aGVuIHRoZSB1c2VyIG9yIGFjdGl2aXR5IGNhbmNlbHMgc2VhcmNoLgotICAgICAqIFdoZW5ldmVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwge0BsaW5rICNvbkRpc21pc3N9IGlzIGFsd2F5cyBjYWxsZWQgYWZ0ZXJ3YXJkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbChEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7Ci0gICAgICAgIGlmIChEQkcpIGRlYnVnKCJvbkNhbmNlbCgpIik7Ci0gICAgICAgIGNhbGxPbkNhbmNlbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjYWxsT25EaXNtaXNzKCkgewotICAgICAgICBpZiAobUNhbGxiYWNrID09IG51bGwpIHJldHVybjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBiZSBzYWZlIHRvIGRvIG9uIHRoZSBzZWFyY2ggVUkgdGhyZWFkLCBzaW5jZSBpdCdzIGEgb25ld2F5IGludGVyZmFjZQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGlzbWlzcygpOwotICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBUaGUgcHJvY2VzcyB0aGF0IGhvc3RlZCB0aGUgY2FsbGJhY2sgaGFzIGRpZWQsIGRvIG5vdGhpbmcKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJvbkRpc21pc3MoKSBmYWlsZWQ6ICIgKyBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FsbE9uQ2FuY2VsKCkgewotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHNhZmUgdG8gZG8gb24gdGhlIHNlYXJjaCBVSSB0aHJlYWQsIHNpbmNlIGl0J3MgYSBvbmV3YXkgaW50ZXJmYWNlCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ2FuY2VsKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHByb2Nlc3MgdGhhdCBob3N0ZWQgdGhlIGNhbGxiYWNrIGhhcyBkaWVkLCBkbyBub3RoaW5nCi0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJvbkNhbmNlbCgpIGZhaWxlZDogIiArIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIG1zZykgewotICAgICAgICBUaHJlYWQgdGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLSAgICAgICAgTG9nLmQoVEFHLCBtc2cgKyAiICgiICsgdGhyZWFkLmdldE5hbWUoKSArICItIiArIHRocmVhZC5nZXRJZCgpICsgIikiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvc2VhcmNoL1NlYXJjaE1hbmFnZXJTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvc2VhcmNoL1NlYXJjaE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggZjlhMGI5My4uOTk1M2I1NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL3NlYXJjaC9TZWFyY2hNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9zZWFyY2gvU2VhcmNoTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNTEsMTAgKzUxLDYgQEAKICAgICAvLyBPbmx5IGFjY2Vzc2VkIGJ5IGVuc3VyZVNlYXJjaGFibGVzQ3JlYXRlZCgpIGFuZCBnZXRTZWFyY2hhYmxlcygpCiAgICAgcHJpdmF0ZSBTZWFyY2hhYmxlcyBtU2VhcmNoYWJsZXM7CiAKLSAgICAvLyBUaGlzIGZpZWxkIGlzIGluaXRpYWxpemVkIGluIGVuc3VyZVNlYXJjaERpYWxvZ0NyZWF0ZWQoKSwgYW5kIHRoZW4gbmV2ZXIgbW9kaWZpZWQuCi0gICAgLy8gT25seSBhY2Nlc3NlZCBieSBlbnN1cmVTZWFyY2hEaWFsb2dDcmVhdGVkKCkgYW5kIGdldFNlYXJjaERpYWxvZygpCi0gICAgcHJpdmF0ZSBTZWFyY2hEaWFsb2dXcmFwcGVyIG1TZWFyY2hEaWFsb2c7Ci0KICAgICAvKioKICAgICAgKiBJbml0aWFsaXplcyB0aGUgU2VhcmNoIE1hbmFnZXIgc2VydmljZSBpbiB0aGUgcHJvdmlkZWQgc3lzdGVtIGNvbnRleHQuCiAgICAgICogT25seSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBvYmplY3Qgc2hvdWxkIGJlIGNyZWF0ZWQhCkBAIC02MywyMyArNTksNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBTZWFyY2hNYW5hZ2VyU2VydmljZShDb250ZXh0IGNvbnRleHQpICB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgLy8gY2FsbCBpbml0aWFsaXplKCkgYWZ0ZXIgYWxsIHBlbmRpbmcgYWN0aW9ucyBvbiB0aGUgbWFpbiBzeXN0ZW0gdGhyZWFkIGhhdmUgZmluaXNoZWQKLSAgICAgICAgbmV3IEhhbmRsZXIoKS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBsaXN0IG9mIHNlYXJjaGFibGUgYWN0aXZpdGllcyBhbmQgdGhlIHNlYXJjaCBVSS4KLSAgICAgKi8KLSAgICB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnJlZ2lzdGVyQWN0aXZpdHlXYXRjaGVyKAotICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlXYXRjaGVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZW5zdXJlU2VhcmNoYWJsZXNDcmVhdGVkKCkgewpAQCAtOTYsMjIgKzc1LDExIEBACiAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVBhY2thZ2VDaGFuZ2VkUmVjZWl2ZXIsIHBhY2thZ2VGaWx0ZXIpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZW5zdXJlU2VhcmNoRGlhbG9nQ3JlYXRlZCgpIHsKLSAgICAgICAgaWYgKG1TZWFyY2hEaWFsb2cgIT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIG1TZWFyY2hEaWFsb2cgPSBuZXcgU2VhcmNoRGlhbG9nV3JhcHBlcihtQ29udGV4dCk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU2VhcmNoYWJsZXMgZ2V0U2VhcmNoYWJsZXMoKSB7CiAgICAgICAgIGVuc3VyZVNlYXJjaGFibGVzQ3JlYXRlZCgpOwogICAgICAgICByZXR1cm4gbVNlYXJjaGFibGVzOwogICAgIH0KIAotICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNlYXJjaERpYWxvZ1dyYXBwZXIgZ2V0U2VhcmNoRGlhbG9nKCkgewotICAgICAgICBlbnN1cmVTZWFyY2hEaWFsb2dDcmVhdGVkKCk7Ci0gICAgICAgIHJldHVybiBtU2VhcmNoRGlhbG9nOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFJlZnJlc2hlcyB0aGUgInNlYXJjaGFibGVzIiBsaXN0IHdoZW4gcGFja2FnZXMgYXJlIGFkZGVkL3JlbW92ZWQuCiAgICAgICovCkBAIC0xMjQsOCArOTIsNiBAQAogICAgICAgICAgICAgICAgICAgICBJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVNT1ZFRC5lcXVhbHMoYWN0aW9uKSB8fAogICAgICAgICAgICAgICAgICAgICBJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgewogICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIkdvdCAiICsgYWN0aW9uKTsKLSAgICAgICAgICAgICAgICAvLyBEaXNtaXNzIHNlYXJjaCBkaWFsb2csIHNpbmNlIHRoZSBzZWFyY2ggY29udGV4dCBtYXkgbm8gbG9uZ2VyIGJlIHZhbGlkCi0gICAgICAgICAgICAgICAgZ2V0U2VhcmNoRGlhbG9nKCkuc3RvcFNlYXJjaCgpOwogICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBsaXN0IG9mIHNlYXJjaGFibGUgYWN0aXZpdGllcwogICAgICAgICAgICAgICAgIGdldFNlYXJjaGFibGVzKCkuYnVpbGRTZWFyY2hhYmxlTGlzdCgpOwogICAgICAgICAgICAgICAgIGJyb2FkY2FzdFNlYXJjaGFibGVzQ2hhbmdlZCgpOwpAQCAtMTMzLDE5ICs5OSw2IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHJpdmF0ZSBJQWN0aXZpdHlXYXRjaGVyLlN0dWIgbUFjdGl2aXR5V2F0Y2hlciA9IG5ldyBJQWN0aXZpdHlXYXRjaGVyLlN0dWIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGFjdGl2aXR5UmVzdW1pbmcoaW50IGFjdGl2aXR5SWQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKERCRykgTG9nLmkoImZvbyIsICIqKioqKioqKioqKioqKioqKioqKioqIHJlc3VtaW5nOiAiICsgYWN0aXZpdHlJZCk7Ci0gICAgICAgICAgICBpZiAobVNlYXJjaERpYWxvZyA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICBtU2VhcmNoRGlhbG9nLmFjdGl2aXR5UmVzdW1pbmcoYWN0aXZpdHlJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2luZ1N5c3RlbURpYWxvZ3MoU3RyaW5nIHJlYXNvbikgewotICAgICAgICAgICAgaWYgKERCRykgTG9nLmkoImZvbyIsICIqKioqKioqKioqKioqKioqKioqKioqIGNsb3NpbmcgZGlhbG9nczogIiArIHJlYXNvbik7Ci0gICAgICAgICAgICBpZiAobVNlYXJjaERpYWxvZyA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICBtU2VhcmNoRGlhbG9nLmNsb3NpbmdTeXN0ZW1EaWFsb2dzKHJlYXNvbik7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIAogICAgIC8qKgogICAgICAqIEluZm9ybXMgYWxsIGxpc3RlbmVycyB0aGF0IHRoZSBsaXN0IG9mIHNlYXJjaGFibGVzIGhhcyBiZWVuIHVwZGF0ZWQuCiAgICAgICovCkBAIC0yMTQsNjIgKzE2Nyw0IEBACiAgICAgICAgIGdldFNlYXJjaGFibGVzKCkuc2V0RGVmYXVsdFdlYlNlYXJjaChjb21wb25lbnQpOwogICAgICAgICBicm9hZGNhc3RTZWFyY2hhYmxlc0NoYW5nZWQoKTsKICAgICB9Ci0KLSAgICAvLyBTZWFyY2ggVUkgQVBJCi0KLSAgICAvKioKLSAgICAgKiBMYXVuY2hlcyB0aGUgc2VhcmNoIFVJLiBDYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZC4KLSAgICAgKgotICAgICAqIEBzZWUgU2VhcmNoTWFuYWdlciNzdGFydFNlYXJjaChTdHJpbmcsIGJvb2xlYW4sIENvbXBvbmVudE5hbWUsIEJ1bmRsZSwgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNlYXJjaChTdHJpbmcgaW5pdGlhbFF1ZXJ5LAotICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RJbml0aWFsUXVlcnksCi0gICAgICAgICAgICBDb21wb25lbnROYW1lIGxhdW5jaEFjdGl2aXR5LAotICAgICAgICAgICAgQnVuZGxlIGFwcFNlYXJjaERhdGEsCi0gICAgICAgICAgICBib29sZWFuIGdsb2JhbFNlYXJjaCwKLSAgICAgICAgICAgIElTZWFyY2hNYW5hZ2VyQ2FsbGJhY2sgc2VhcmNoTWFuYWdlckNhbGxiYWNrLAotICAgICAgICAgICAgaW50IGlkZW50KSB7Ci0gICAgICAgIGdldFNlYXJjaERpYWxvZygpLnN0YXJ0U2VhcmNoKGluaXRpYWxRdWVyeSwKLSAgICAgICAgICAgICAgICBzZWxlY3RJbml0aWFsUXVlcnksCi0gICAgICAgICAgICAgICAgbGF1bmNoQWN0aXZpdHksCi0gICAgICAgICAgICAgICAgYXBwU2VhcmNoRGF0YSwKLSAgICAgICAgICAgICAgICBnbG9iYWxTZWFyY2gsCi0gICAgICAgICAgICAgICAgc2VhcmNoTWFuYWdlckNhbGxiYWNrLAotICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgIGZhbHNlKTsgLy8gZG9uJ3QgdHJpZ2dlcgotICAgIH0KLQotICAgIC8qKgotICAgICAqIExhdW5jaGVzIHRoZSBzZWFyY2ggVUkgYW5kIHRyaWdnZXJzIHRoZSBzZWFyY2gsIGFzIGlmIHRoZSB1c2VyIGhhZCBjbGlja2VkIG9uIHRoZQotICAgICAqIHNlYXJjaCBidXR0b24gd2l0aGluIHRoZSBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAc2VlIFNlYXJjaE1hbmFnZXIjdHJpZ2dlclNlYXJjaChTdHJpbmcsIGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lLCBhbmRyb2lkLm9zLkJ1bmRsZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyU2VhcmNoKFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIENvbXBvbmVudE5hbWUgbGF1bmNoQWN0aXZpdHksCi0gICAgICAgICAgICBCdW5kbGUgYXBwU2VhcmNoRGF0YSwKLSAgICAgICAgICAgIElTZWFyY2hNYW5hZ2VyQ2FsbGJhY2sgc2VhcmNoTWFuYWdlckNhbGxiYWNrLAotICAgICAgICAgICAgaW50IGlkZW50KSB7Ci0gICAgICAgIGdldFNlYXJjaERpYWxvZygpLnN0YXJ0U2VhcmNoKAotICAgICAgICAgICAgICAgIHF1ZXJ5LAotICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgIGxhdW5jaEFjdGl2aXR5LAotICAgICAgICAgICAgICAgIGFwcFNlYXJjaERhdGEsCi0gICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgc2VhcmNoTWFuYWdlckNhbGxiYWNrLAotICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgIHRydWUpOyAvLyB0cmlnZXIgc2VhcmNoIGFmdGVyIGxhdW5jaGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbmNlbHMgdGhlIHNlYXJjaCBkaWFsb2cuIENhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3BTZWFyY2goKSB7Ci0gICAgICAgIGdldFNlYXJjaERpYWxvZygpLnN0b3BTZWFyY2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBtU2VhcmNoRGlhbG9nICE9IG51bGwgJiYgbVNlYXJjaERpYWxvZy5pc1Zpc2libGUoKTsKLSAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQppbmRleCAxMzM3YmVkLi4zZjE2NzJhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCkBAIC0xNzcsMTggKzE3NywyMSBAQAogCiAgICAgLyoqCiAgICAgICogTG9hZCBhIHVybCBmcm9tIHRoZSBuZXR3b3JrIG9yIHRoZSBmaWxlc3lzdGVtIGludG8gdGhlIG1haW4gZnJhbWUuCi0gICAgICogRm9sbG93aW5nIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBTYWZhcmksIGphdmFzY3JpcHQ6IFVSTHMgYXJlIG5vdAotICAgICAqIHBhc3NlZCB0byB0aGUgbWFpbiBmcmFtZSwgaW5zdGVhZCB0aGV5IGFyZSBldmFsdWF0ZWQgaW1tZWRpYXRlbHkuCisgICAgICogRm9sbG93aW5nIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBTYWZhcmksIGphdmFzY3JpcHQ6IFVSTHMgYXJlIG5vdCBwYXNzZWQKKyAgICAgKiB0byB0aGUgbWFpbiBmcmFtZSwgaW5zdGVhZCB0aGV5IGFyZSBldmFsdWF0ZWQgaW1tZWRpYXRlbHkuCiAgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIGxvYWQuCisgICAgICogQHBhcmFtIGV4dHJhSGVhZGVycyBUaGUgZXh0cmEgaGVhZGVycyBzZW50IHdpdGggdGhpcyB1cmwuIFRoaXMgc2hvdWxkIG5vdAorICAgICAqICAgICAgICAgICAgaW5jbHVkZSB0aGUgY29tbW9uIGhlYWRlcnMgbGlrZSAidXNlci1hZ2VudCIuIElmIGl0IGRvZXMsIGl0CisgICAgICogICAgICAgICAgICB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBpbnRyaW5zaWMgdmFsdWUgb2YgdGhlIFdlYlZpZXcuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgbG9hZFVybChTdHJpbmcgdXJsKSB7CisgICAgcHVibGljIHZvaWQgbG9hZFVybChTdHJpbmcgdXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGV4dHJhSGVhZGVycykgewogICAgICAgICBtTG9hZEluaXRGcm9tSmF2YSA9IHRydWU7CiAgICAgICAgIGlmIChVUkxVdGlsLmlzSmF2YVNjcmlwdFVybCh1cmwpKSB7CiAgICAgICAgICAgICAvLyBzdHJpcCBvZmYgdGhlIHNjaGVtZSBhbmQgZXZhbHVhdGUgdGhlIHN0cmluZwogICAgICAgICAgICAgc3RyaW5nQnlFdmFsdWF0aW5nSmF2YVNjcmlwdEZyb21TdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgIHVybC5zdWJzdHJpbmcoImphdmFzY3JpcHQ6Ii5sZW5ndGgoKSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmF0aXZlTG9hZFVybCh1cmwpOworICAgICAgICAgICAgbmF0aXZlTG9hZFVybCh1cmwsIGV4dHJhSGVhZGVycyk7CiAgICAgICAgIH0KICAgICAgICAgbUxvYWRJbml0RnJvbUphdmEgPSBmYWxzZTsKICAgICB9CkBAIC05MDQsNyArOTA3LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSB1cmwgaXMgYmFkLgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlTG9hZFVybChTdHJpbmcgdXJsKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUxvYWRVcmwoU3RyaW5nIHVybCwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKTsKIAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUG9zdFVybChTdHJpbmcgdXJsLCBieXRlW10gcG9zdERhdGEpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQppbmRleCA5M2U3MmZmLi5lY2VhNTVmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKQEAgLTEzNzYsNiArMTM3NiwyMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIExvYWQgdGhlIGdpdmVuIHVybCB3aXRoIHRoZSBleHRyYSBoZWFkZXJzLgorICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCBvZiB0aGUgcmVzb3VyY2UgdG8gbG9hZC4KKyAgICAgKiBAcGFyYW0gZXh0cmFIZWFkZXJzIFRoZSBleHRyYSBoZWFkZXJzIHNlbnQgd2l0aCB0aGlzIHVybC4gVGhpcyBzaG91bGQgbm90CisgICAgICogICAgICAgICAgICBpbmNsdWRlIHRoZSBjb21tb24gaGVhZGVycyBsaWtlICJ1c2VyLWFnZW50Ii4gSWYgaXQgZG9lcywgaXQKKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGludHJpbnNpYyB2YWx1ZSBvZiB0aGUgV2ViVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkVXJsKFN0cmluZyB1cmwsIE1hcDxTdHJpbmcsIFN0cmluZz4gZXh0cmFIZWFkZXJzKSB7CisgICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7CisgICAgICAgIFdlYlZpZXdDb3JlLkdldFVybERhdGEgYXJnID0gbmV3IFdlYlZpZXdDb3JlLkdldFVybERhdGEoKTsKKyAgICAgICAgYXJnLm1VcmwgPSB1cmw7CisgICAgICAgIGFyZy5tRXh0cmFIZWFkZXJzID0gZXh0cmFIZWFkZXJzOworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuTE9BRF9VUkwsIGFyZyk7CisgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogTG9hZCB0aGUgZ2l2ZW4gdXJsLgogICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCBvZiB0aGUgcmVzb3VyY2UgdG8gbG9hZC4KICAgICAgKi8KQEAgLTEzODMsOSArMTM5OSw3IEBACiAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5MT0FEX1VSTCwgdXJsKTsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKKyAgICAgICAgbG9hZFVybCh1cmwsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQppbmRleCA2NzAwZDcxLi4xZTIxY2I0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQpAQCAtNjg2LDYgKzY4NiwxMSBAQAogICAgICAgICBpbnQgbVk7CiAgICAgfQogCisgICAgc3RhdGljIGNsYXNzIEdldFVybERhdGEgeworICAgICAgICBTdHJpbmcgbVVybDsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtRXh0cmFIZWFkZXJzOworICAgIH0KKwogICAgIHN0YXRpYyBjbGFzcyBQb3N0VXJsRGF0YSB7CiAgICAgICAgIFN0cmluZyBtVXJsOwogICAgICAgICBieXRlW10gbVBvc3REYXRhOwpAQCAtOTU4LDkgKzk2MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGbG9hdCkgbXNnLm9iaikuZmxvYXRWYWx1ZSgpLCBtc2cuYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTE9BRF9VUkw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFVybCgoU3RyaW5nKSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTE9BRF9VUkw6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRVcmxEYXRhIHBhcmFtID0gKEdldFVybERhdGEpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFVybChwYXJhbS5tVXJsLCBwYXJhbS5tRXh0cmFIZWFkZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQT1NUX1VSTDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RVcmxEYXRhIHBhcmFtID0gKFBvc3RVcmxEYXRhKSBtc2cub2JqOwpAQCAtMTU0NSw5ICsxNTUyLDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBsb2FkVXJsKFN0cmluZyB1cmwpIHsKKyAgICBwcml2YXRlIHZvaWQgbG9hZFVybChTdHJpbmcgdXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGV4dHJhSGVhZGVycykgewogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSBMb2cudihMT0dUQUcsICIgQ09SRSBsb2FkVXJsICIgKyB1cmwpOwotICAgICAgICBtQnJvd3NlckZyYW1lLmxvYWRVcmwodXJsKTsKKyAgICAgICAgbUJyb3dzZXJGcmFtZS5sb2FkVXJsKHVybCwgZXh0cmFIZWFkZXJzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQga2V5KEtleUV2ZW50IGV2dCwgYm9vbGVhbiBpc0Rvd24pIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvSU1lZGlhQ29udGFpbmVyU2VydmljZS5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9JTWVkaWFDb250YWluZXJTZXJ2aWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzI2ZTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvSU1lZGlhQ29udGFpbmVyU2VydmljZS5haWRsCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcDsKKworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworCitpbnRlcmZhY2UgSU1lZGlhQ29udGFpbmVyU2VydmljZSB7CisgICAgU3RyaW5nIGNvcHlSZXNvdXJjZVRvQ29udGFpbmVyKGluIFVyaSBwYWNrYWdlVVJJLAorICAgICAgICAgICAgICAgIFN0cmluZyBjb250YWluZXJJZCwKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5LCBTdHJpbmcgcmVzRmlsZU5hbWUpOworICAgIGJvb2xlYW4gY29weVJlc291cmNlKGluIFVyaSBwYWNrYWdlVVJJLAorICAgICAgICAgICAgICAgIGluIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG91dFN0cmVhbSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGFuemlUb1Bpbnlpbi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGFuemlUb1Bpbnlpbi5qYXZhCmluZGV4IDQzNjhlOTguLjZhNGFkYWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hhbnppVG9QaW55aW4uamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IYW56aVRvUGlueWluLmphdmEKQEAgLTE2LDggKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsOwogCi1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLnV0aWwuQWJzdHJhY3RNZXNzYWdlUGFyc2VyLlRva2VuOwotCiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC0yOTgsOCArMjk2LDEwIEBACiAgICAgICAgIH07CiAKICAgICAvKiogRmlyc3QgYW5kIGxhc3QgQ2hpbmVzZSBjaGFyYWN0ZXIgd2l0aCBrbm93biBQaW55aW4gYWNjb3JkaW5nIHRvIHpoIGNvbGxhdGlvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVF9VTklIQU4gPSAgIlx1NTQxNiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfVU5JSEFOID0gICJcdTU0OTciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVF9QSU5ZSU5fVU5JSEFOID0gICJcdTU0MTYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1BJTllJTl9VTklIQU4gPSAgIlx1NTQ5NyI7CisgICAgLyoqIFRoZSBmaXJzdCBDaGluZXNlIGNoYXJhY3RlciBpbiBVbmljb2RlIGJsb2NrICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSVJTVF9VTklIQU4gPSAnXHUzNDAwJzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsYXRvciBDT0xMQVRPUiA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5DSElOQSk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBIYW56aVRvUGlueWluIHNJbnN0YW5jZTsKQEAgLTMxMSwxMCArMzExLDE4IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiICI7CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUkgPSAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVRJTiA9IDE7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJTllJTiA9IDI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAzOwogCisgICAgICAgIHB1YmxpYyBUb2tlbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUb2tlbihpbnQgdHlwZSwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIH0KICAgICAgICAgLyoqCiAgICAgICAgICAqIFR5cGUgb2YgdGhpcyB0b2tlbiwgQVNDSUksIFBJTllJTiBvciBVTktOT1dOLgogICAgICAgICAgKi8KQEAgLTM0Nyw2ICszNTUsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc0luc3RhbmNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy53KFRBRywgIlRoZXJlIGlzIG5vIENoaW5lc2UgY29sbGF0b3IsIEhhbnppVG9QaW55aW4gaXMgZGlzYWJsZWQiKTsKICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBIYW56aVRvUGlueWluKGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CiAgICAgICAgIH0KQEAgLTM1OSwxMSArMzY4LDE1IEBACiAgICAgICAgIGludCBvZmZzZXQgPSAtMTsKICAgICAgICAgaW50IGNtcDsKICAgICAgICAgaWYgKGNoYXJhY3RlciA8IDI1NikgewotICAgICAgICAgICAgdG9rZW4udHlwZSA9IFRva2VuLkFTQ0lJOworICAgICAgICAgICAgdG9rZW4udHlwZSA9IFRva2VuLkxBVElOOworICAgICAgICAgICAgdG9rZW4udGFyZ2V0ID0gbGV0dGVyOworICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA8IEZJUlNUX1VOSUhBTikgeworICAgICAgICAgICAgdG9rZW4udHlwZSA9IFRva2VuLlVOS05PV047CiAgICAgICAgICAgICB0b2tlbi50YXJnZXQgPSBsZXR0ZXI7CiAgICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbXAgPSBDT0xMQVRPUi5jb21wYXJlKGxldHRlciwgRklSU1RfVU5JSEFOKTsKKyAgICAgICAgICAgIGNtcCA9IENPTExBVE9SLmNvbXBhcmUobGV0dGVyLCBGSVJTVF9QSU5ZSU5fVU5JSEFOKTsKICAgICAgICAgICAgIGlmIChjbXAgPCAwKSB7CiAgICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IFRva2VuLlVOS05PV047CiAgICAgICAgICAgICAgICAgdG9rZW4udGFyZ2V0ID0gbGV0dGVyOwpAQCAtMzcyLDcgKzM4NSw3IEBACiAgICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IFRva2VuLlBJTllJTjsKICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbXAgPSBDT0xMQVRPUi5jb21wYXJlKGxldHRlciwgTEFTVF9VTklIQU4pOworICAgICAgICAgICAgICAgIGNtcCA9IENPTExBVE9SLmNvbXBhcmUobGV0dGVyLCBMQVNUX1BJTllJTl9VTklIQU4pOwogICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgPSBUb2tlbi5VTktOT1dOOwogICAgICAgICAgICAgICAgICAgICB0b2tlbi50YXJnZXQgPSBsZXR0ZXI7CkBAIC00MTIsNDQgKzQyNSw3MSBAQAogICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgaW5wdXQgdG8gYSBhcnJheSBvZiB0b2tlbnMuIFRoZSBzZXF1ZW5jZSBvZiBBU0NJSSBvciBVbmtub3duCisgICAgICogY2hhcmFjdGVycyB3aXRob3V0IHNwYWNlIHdpbGwgYmUgcHV0IGludG8gYSBUb2tlbiwgT25lIEhhbnppIGNoYXJhY3RlciAKKyAgICAgKiB3aGljaCBoYXMgcGlueWluIHdpbGwgYmUgdHJlYXRlZCBhcyBhIFRva2VuLgorICAgICAqIElmIHRoZXNlIGlzIG5vIENoaW5hIGNvbGxhdG9yLCB0aGUgZW1wdHkgdG9rZW4gYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCiAgICAgcHVibGljIEFycmF5TGlzdDxUb2tlbj4gZ2V0KGZpbmFsIFN0cmluZyBpbnB1dCkgewotICAgICAgICBpZiAoIW1IYXNDaGluYUNvbGxhdG9yIHx8IFRleHRVdGlscy5pc0VtcHR5KGlucHV0KSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQogICAgICAgICBBcnJheUxpc3Q8VG9rZW4+IHRva2VucyA9IG5ldyBBcnJheUxpc3Q8VG9rZW4+KCk7Ci0gICAgICAgIFRva2VuIGN1cnJlbnRUb2tlbjsKLQorICAgICAgICBpZiAoIW1IYXNDaGluYUNvbGxhdG9yIHx8IFRleHRVdGlscy5pc0VtcHR5KGlucHV0KSkgeworICAgICAgICAgICAgLy8gcmV0dXJuIGVtcHR5IHRva2Vucy4KKyAgICAgICAgICAgIHJldHVybiB0b2tlbnM7CisgICAgICAgIH0KICAgICAgICAgZmluYWwgaW50IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoKCk7Ci0KLSAgICAgICAgY3VycmVudFRva2VuID0gZ2V0VG9rZW4oaW5wdXQuY2hhckF0KDApKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGlucHV0TGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCB0b2tlblR5cGUgPSBUb2tlbi5MQVRJTjsKKyAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgaW5wdXQsIGNyZWF0ZSBhIG5ldyB0b2tlbiB3aGVuCisgICAgICAgIC8vIGEuIFRva2VuIHR5cGUgY2hhbmdlZAorICAgICAgICAvLyBiLiBHZXQgdGhlIFBpbnlpbiBvZiBjdXJyZW50IGNoYXJhdGVyLgorICAgICAgICAvLyBjLiBjdXJyZW50IGNoYXJhY3RlciBpcyBzcGFjZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dExlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBmaW5hbCBjaGFyIGNoYXJhY3RlciA9IGlucHV0LmNoYXJBdChpKTsKLSAgICAgICAgICAgIFRva2VuIHRva2VuID0gZ2V0VG9rZW4oY2hhcmFjdGVyKTsKLQotICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgIT0gY3VycmVudFRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4udGFyZ2V0ID0gY3VycmVudFRva2VuLnRhcmdldC50cmltKCk7Ci0gICAgICAgICAgICAgICAgdG9rZW5zLmFkZChjdXJyZW50VG9rZW4pOwotICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IHRva2VuOworICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFRva2VuKHNiLCB0b2tlbnMsIHRva2VuVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPCAyNTYpIHsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW5UeXBlICE9IFRva2VuLkxBVElOICYmIHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRUb2tlbihzYiwgdG9rZW5zLCB0b2tlblR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b2tlblR5cGUgPSBUb2tlbi5MQVRJTjsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2hhcmFjdGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyIDwgRklSU1RfVU5JSEFOKSB7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuVHlwZSAhPSBUb2tlbi5VTktOT1dOICYmIHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRUb2tlbihzYiwgdG9rZW5zLCB0b2tlblR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b2tlblR5cGUgPSBUb2tlbi5VTktOT1dOOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjaGFyYWN0ZXIpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbi5BU0NJSToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlbi5VTktOT1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLnNvdXJjZSArPSB0b2tlbi5zb3VyY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4udGFyZ2V0ICs9IHRva2VuLnRhcmdldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuLlBJTllJTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5zb3VyY2UgKz0gdG9rZW4uc291cmNlOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLnRhcmdldCArPSAiICIgKyB0b2tlbi50YXJnZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBUb2tlbiB0ID0gZ2V0VG9rZW4oY2hhcmFjdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAodC50eXBlID09IFRva2VuLlBJTllJTikgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRUb2tlbihzYiwgdG9rZW5zLCB0b2tlblR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRva2Vucy5hZGQodCk7CisgICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZSA9IFRva2VuLlBJTllJTjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5UeXBlICE9IHQudHlwZSAmJiBzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRva2VuKHNiLCB0b2tlbnMsIHRva2VuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG9rZW5UeXBlID0gdC50eXBlOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2hhcmFjdGVyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBjdXJyZW50VG9rZW4udGFyZ2V0ID0gY3VycmVudFRva2VuLnRhcmdldC50cmltKCk7Ci0gICAgICAgIHRva2Vucy5hZGQoY3VycmVudFRva2VuKTsKLQorICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBhZGRUb2tlbihzYiwgdG9rZW5zLCB0b2tlblR5cGUpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiB0b2tlbnM7CiAgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFRva2VuKGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IsIGZpbmFsIEFycmF5TGlzdDxUb2tlbj4gdG9rZW5zLAorICAgICAgICAgICAgZmluYWwgaW50IHRva2VuVHlwZSkgeworICAgICAgICBTdHJpbmcgc3RyID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgdG9rZW5zLmFkZChuZXcgVG9rZW4odG9rZW5UeXBlLCBzdHIsIHN0cikpOworICAgICAgICBzYi5zZXRMZW5ndGgoMCk7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9BbmRyb2lkLm1rIGIvY29yZS9qbmkvQW5kcm9pZC5tawppbmRleCA2N2EwYmRhLi43ZmQ1OGU4IDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkLm1rCisrKyBiL2NvcmUvam5pL0FuZHJvaWQubWsKQEAgLTk5LDYgKzk5LDcgQEAKIAlhbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1hmZXJtb2RlLmNwcCBcCisJYW5kcm9pZC9ncmFwaGljcy9ZdXZUb0pwZWdFbmNvZGVyLmNwcCBcCiAJYW5kcm9pZF9tZWRpYV9BdWRpb1JlY29yZC5jcHAgXAogCWFuZHJvaWRfbWVkaWFfQXVkaW9TeXN0ZW0uY3BwIFwKIAlhbmRyb2lkX21lZGlhX0F1ZGlvVHJhY2suY3BwIFwKQEAgLTE0OCw2ICsxNDksNyBAQAogCWV4dGVybmFsL3RyZW1vci9UcmVtb3IgXAogCWV4dGVybmFsL2ljdTRjL2kxOG4gXAogCWV4dGVybmFsL2ljdTRjL2NvbW1vbiBcCisJZXh0ZXJuYWwvanBlZyBcCiAJZnJhbWV3b3Jrcy9vcHQvZW1vamkKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCkBAIC0xNzUsNyArMTc3LDggQEAKIAlsaWJpY3VpMThuIFwKIAlsaWJpY3VkYXRhIFwKIAlsaWJtZWRpYSBcCi0JbGlid3BhX2NsaWVudAorCWxpYndwYV9jbGllbnQgXAorCWxpYmpwZWcKIAogaWZlcSAoJChCT0FSRF9IQVZFX0JMVUVUT09USCksdHJ1ZSkKIExPQ0FMX0NfSU5DTFVERVMgKz0gXApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwIGIvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCmluZGV4IDgzNjQ4MzguLmZhMWVlMGQgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcAorKysgYi9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKQEAgLTY0LDYgKzY0LDcgQEAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19SZWdpb24oSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1NoYWRlcihKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfVHlwZWZhY2UoSk5JRW52KiBlbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1l1dkltYWdlKEpOSUVudiogZW52KTsKIAogZXh0ZXJuIGludCByZWdpc3Rlcl9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfRUdMSW1wbChKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwoSk5JRW52KiBlbnYpOwpAQCAtMTIxNSw2ICsxMjE2LDcgQEAKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfU2hhZGVyKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfVHlwZWZhY2UpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19YZmVybW9kZSksCisgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1l1dkltYWdlKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2NvbV9hbmRyb2lkX2ludGVybmFsX2dyYXBoaWNzX05hdGl2ZVV0aWxzKSwKIAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cpLApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9ZdXZUb0pwZWdFbmNvZGVyLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvWXV2VG9KcGVnRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1YzlhZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvWXV2VG9KcGVnRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKyNpbmNsdWRlICJDcmVhdGVKYXZhT3V0cHV0U3RyZWFtQWRhcHRvci5oIgorI2luY2x1ZGUgIlNrSnBlZ1V0aWxpdHkuaCIKKyNpbmNsdWRlICJZdXZUb0pwZWdFbmNvZGVyLmgiCisjaW5jbHVkZSAidWkvUGl4ZWxGb3JtYXQuaCIKKworI2luY2x1ZGUgPGpuaS5oPgorCitZdXZUb0pwZWdFbmNvZGVyKiBZdXZUb0pwZWdFbmNvZGVyOjpjcmVhdGUoaW50IGZvcm1hdCwgaW50KiBzdHJpZGVzKSB7CisgICAgLy8gT25seSBQSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQIGFuZCBQSVhFbF9GT01BVF9ZQ2JDcl80MjJfSSBhcmUgc3VwcG9ydGVkCisgICAgLy8gZm9yIG5vdy4KKyAgICBpZiAoZm9ybWF0ID09IGFuZHJvaWQ6OlBJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1ApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBZdXY0MjBTcFRvSnBlZ0VuY29kZXIoc3RyaWRlcyk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gYW5kcm9pZDo6UElYRUxfRk9STUFUX1lDYkNyXzQyMl9JKSB7CisgICAgICAgIHJldHVybiBuZXcgWXV2NDIySVRvSnBlZ0VuY29kZXIoc3RyaWRlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworWXV2VG9KcGVnRW5jb2Rlcjo6WXV2VG9KcGVnRW5jb2RlcihpbnQqIHN0cmlkZXMpIDogZlN0cmlkZXMoc3RyaWRlcykgeworfQorCitib29sIFl1dlRvSnBlZ0VuY29kZXI6OmVuY29kZShTa1dTdHJlYW0qIHN0cmVhbSwgdm9pZCogaW5ZdXYsIGludCB3aWR0aCwKKyAgICAgICAgaW50IGhlaWdodCwgaW50KiBvZmZzZXRzLCBpbnQganBlZ1F1YWxpdHkpIHsKKyAgICBqcGVnX2NvbXByZXNzX3N0cnVjdCAgICBjaW5mbzsKKyAgICBza2pwZWdfZXJyb3JfbWdyICAgICAgICBza19lcnI7CisgICAgc2tqcGVnX2Rlc3RpbmF0aW9uX21nciAgc2tfd3N0cmVhbShzdHJlYW0pOworCisgICAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJnNrX2Vycik7CisgICAgc2tfZXJyLmVycm9yX2V4aXQgPSBza2pwZWdfZXJyb3JfZXhpdDsKKyAgICBpZiAoc2V0am1wKHNrX2Vyci5mSm1wQnVmKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7CisKKyAgICBjaW5mby5kZXN0ID0gJnNrX3dzdHJlYW07CisKKyAgICBzZXRKcGVnQ29tcHJlc3NTdHJ1Y3QoJmNpbmZvLCB3aWR0aCwgaGVpZ2h0LCBqcGVnUXVhbGl0eSk7CisKKyAgICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7CisKKyAgICBjb21wcmVzcygmY2luZm8sICh1aW50OF90KikgaW5ZdXYsIG9mZnNldHMpOworCisgICAganBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFl1dlRvSnBlZ0VuY29kZXI6OnNldEpwZWdDb21wcmVzc1N0cnVjdChqcGVnX2NvbXByZXNzX3N0cnVjdCogY2luZm8sCisgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHkpIHsKKyAgICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCBxdWFsaXR5LCBUUlVFKTsKKworICAgIGNpbmZvLT5pbWFnZV93aWR0aCA9IHdpZHRoOworICAgIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7CisgICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOworICAgIGpwZWdfc2V0X2RlZmF1bHRzKGNpbmZvKTsKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfWUNiQ3IpOworICAgIGNpbmZvLT5yYXdfZGF0YV9pbiA9IFRSVUU7CisKKyAgICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7CisKKyAgICBjb25maWdTYW1wbGluZ0ZhY3RvcnMoY2luZm8pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitZdXY0MjBTcFRvSnBlZ0VuY29kZXI6Oll1djQyMFNwVG9KcGVnRW5jb2RlcihpbnQqIHN0cmlkZXMpIDoKKyAgICAgICAgWXV2VG9KcGVnRW5jb2RlcihzdHJpZGVzKSB7CisgICAgZk51bVBsYW5lcyA9IDI7Cit9CisKK3ZvaWQgWXV2NDIwU3BUb0pwZWdFbmNvZGVyOjpjb21wcmVzcyhqcGVnX2NvbXByZXNzX3N0cnVjdCogY2luZm8sCisgICAgICAgIHVpbnQ4X3QqIHl1diwgaW50KiBvZmZzZXRzKSB7CisgICAgU2tEZWJ1Z2YoIm9uRmx5Q29tcHJlc3MiKTsKKyAgICBKU0FNUFJPVyB5WzE2XTsKKyAgICBKU0FNUFJPVyBjYls4XTsKKyAgICBKU0FNUFJPVyBjcls4XTsKKyAgICBKU0FNUEFSUkFZIHBsYW5lc1szXTsKKyAgICBwbGFuZXNbMF0gPSB5OworICAgIHBsYW5lc1sxXSA9IGNiOworICAgIHBsYW5lc1syXSA9IGNyOworCisgICAgaW50IHdpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOworICAgIGludCBoZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgIHVpbnQ4X3QqIHlQbGFuYXIgPSB5dXYgKyBvZmZzZXRzWzBdOworICAgIHVpbnQ4X3QqIHZ1UGxhbmFyID0geXV2ICsgb2Zmc2V0c1sxXTsgLy93aWR0aCAqIGhlaWdodDsKKyAgICB1aW50OF90KiB1Um93cyA9IG5ldyB1aW50OF90IFs4ICogKHdpZHRoID4+IDEpXTsKKyAgICB1aW50OF90KiB2Um93cyA9IG5ldyB1aW50OF90IFs4ICogKHdpZHRoID4+IDEpXTsKKworCisgICAgLy8gcHJvY2VzcyAxNiBsaW5lcyBvZiBZIGFuZCA4IGxpbmVzIG9mIFUvViBlYWNoIHRpbWUuCisgICAgd2hpbGUgKGNpbmZvLT5uZXh0X3NjYW5saW5lIDwgY2luZm8tPmltYWdlX2hlaWdodCkgeworICAgICAgICAvL2RlaXRuZXJsZWF2ZSB1IGFuZCB2CisgICAgICAgIGRlaW50ZXJsZWF2ZSh2dVBsYW5hciwgdVJvd3MsIHZSb3dzLCBjaW5mby0+bmV4dF9zY2FubGluZSwgd2lkdGgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgLy8geSByb3cKKyAgICAgICAgICAgIHlbaV0gPSB5UGxhbmFyICsgKGNpbmZvLT5uZXh0X3NjYW5saW5lICsgaSkgKiBmU3RyaWRlc1swXTsKKworICAgICAgICAgICAgLy8gY29uc3RydWN0IHUgcm93IGFuZCB2IHJvdworICAgICAgICAgICAgaWYgKChpICYgMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGhlaWdodCBhbmQgd2lkdGggYXJlIGJvdGggaGFsdmVkIGJlY2F1c2Ugb2YgZG93bnNhbXBsaW5nCisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IChpID4+IDEpICogKHdpZHRoID4+IDEpOworICAgICAgICAgICAgICAgIGNiW2kvMl0gPSB1Um93cyArIG9mZnNldDsKKyAgICAgICAgICAgICAgICBjcltpLzJdID0gdlJvd3MgKyBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBqcGVnX3dyaXRlX3Jhd19kYXRhKGNpbmZvLCBwbGFuZXMsIDE2KTsKKyAgICB9CisgICAgZGVsZXRlIFtdIHVSb3dzOworICAgIGRlbGV0ZSBbXSB2Um93czsKKworfQorCit2b2lkIFl1djQyMFNwVG9KcGVnRW5jb2Rlcjo6ZGVpbnRlcmxlYXZlKHVpbnQ4X3QqIHZ1UGxhbmFyLCB1aW50OF90KiB1Um93cywKKyAgICAgICAgdWludDhfdCogdlJvd3MsIGludCByb3dJbmRleCwgaW50IHdpZHRoKSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgODsgKytyb3cpIHsKKyAgICAgICAgaW50IG9mZnNldCA9ICgocm93SW5kZXggPj4gMSkgKyByb3cpICogZlN0cmlkZXNbMV07CisgICAgICAgIHVpbnQ4X3QqIHZ1ID0gdnVQbGFuYXIgKyBvZmZzZXQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKHdpZHRoID4+IDEpOyArK2kpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICh3aWR0aCA+PiAxKSArIGk7CisgICAgICAgICAgICB1Um93c1tpbmRleF0gPSB2dVsxXTsKKyAgICAgICAgICAgIHZSb3dzW2luZGV4XSA9IHZ1WzBdOworICAgICAgICAgICAgdnUgKz0gMjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBZdXY0MjBTcFRvSnBlZ0VuY29kZXI6OmNvbmZpZ1NhbXBsaW5nRmFjdG9ycyhqcGVnX2NvbXByZXNzX3N0cnVjdCogY2luZm8pIHsKKyAgICAvLyBjYiBhbmQgY3IgYXJlIGhvcml6b250YWxseSBkb3duc2FtcGxlZCBhbmQgdmVydGljYWxseSBkb3duc2FtcGxlZCBhcyB3ZWxsLgorICAgIGNpbmZvLT5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDI7CisgICAgY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMjsKKyAgICBjaW5mby0+Y29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLT5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8tPmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitZdXY0MjJJVG9KcGVnRW5jb2Rlcjo6WXV2NDIySVRvSnBlZ0VuY29kZXIoaW50KiBzdHJpZGVzKSA6CisgICAgICAgIFl1dlRvSnBlZ0VuY29kZXIoc3RyaWRlcykgeworICAgIGZOdW1QbGFuZXMgPSAxOworfQorCit2b2lkIFl1djQyMklUb0pwZWdFbmNvZGVyOjpjb21wcmVzcyhqcGVnX2NvbXByZXNzX3N0cnVjdCogY2luZm8sCisgICAgICAgIHVpbnQ4X3QqIHl1diwgaW50KiBvZmZzZXRzKSB7CisgICAgU2tEZWJ1Z2YoIm9uRmx5Q29tcHJlc3NfNDIyIik7CisgICAgSlNBTVBST1cgeVsxNl07CisgICAgSlNBTVBST1cgY2JbMTZdOworICAgIEpTQU1QUk9XIGNyWzE2XTsKKyAgICBKU0FNUEFSUkFZIHBsYW5lc1szXTsKKyAgICBwbGFuZXNbMF0gPSB5OworICAgIHBsYW5lc1sxXSA9IGNiOworICAgIHBsYW5lc1syXSA9IGNyOworCisgICAgaW50IHdpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOworICAgIGludCBoZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgIHVpbnQ4X3QqIHlSb3dzID0gbmV3IHVpbnQ4X3QgWzE2ICogd2lkdGhdOworICAgIHVpbnQ4X3QqIHVSb3dzID0gbmV3IHVpbnQ4X3QgWzE2ICogKHdpZHRoID4+IDEpXTsKKyAgICB1aW50OF90KiB2Um93cyA9IG5ldyB1aW50OF90IFsxNiAqICh3aWR0aCA+PiAxKV07CisKKyAgICB1aW50OF90KiB5dXZPZmZzZXQgPSB5dXYgKyBvZmZzZXRzWzBdOworCisgICAgLy8gcHJvY2VzcyAxNiBsaW5lcyBvZiBZIGFuZCAxNiBsaW5lcyBvZiBVL1YgZWFjaCB0aW1lLgorICAgIHdoaWxlIChjaW5mby0+bmV4dF9zY2FubGluZSA8IGNpbmZvLT5pbWFnZV9oZWlnaHQpIHsKKyAgICAgICAgZGVpbnRlcmxlYXZlKHl1dk9mZnNldCwgeVJvd3MsIHVSb3dzLCB2Um93cywgY2luZm8tPm5leHRfc2NhbmxpbmUsIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgLy8geSByb3cKKyAgICAgICAgICAgIHlbaV0gPSB5Um93cyArIGkgKiB3aWR0aDsKKworICAgICAgICAgICAgLy8gY29uc3RydWN0IHUgcm93IGFuZCB2IHJvdworICAgICAgICAgICAgLy8gd2lkdGggaXMgaGFsdmVkIGJlY2F1c2Ugb2YgZG93bnNhbXBsaW5nCisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaSAqICh3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgIGNiW2ldID0gdVJvd3MgKyBvZmZzZXQ7CisgICAgICAgICAgICBjcltpXSA9IHZSb3dzICsgb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAganBlZ193cml0ZV9yYXdfZGF0YShjaW5mbywgcGxhbmVzLCAxNik7CisgICAgfQorICAgIGRlbGV0ZSBbXSB5Um93czsKKyAgICBkZWxldGUgW10gdVJvd3M7CisgICAgZGVsZXRlIFtdIHZSb3dzOworfQorCisKK3ZvaWQgWXV2NDIySVRvSnBlZ0VuY29kZXI6OmRlaW50ZXJsZWF2ZSh1aW50OF90KiB5dXYsIHVpbnQ4X3QqIHlSb3dzLCB1aW50OF90KiB1Um93cywKKyAgICAgICAgdWludDhfdCogdlJvd3MsIGludCByb3dJbmRleCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgMTY7ICsrcm93KSB7CisgICAgICAgIHVpbnQ4X3QqIHl1dlNlZyA9IHl1diArIChyb3dJbmRleCArIHJvdykgKiBmU3RyaWRlc1swXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAod2lkdGggPj4gMSk7ICsraSkgeworICAgICAgICAgICAgaW50IGluZGV4WSA9IHJvdyAqIHdpZHRoICsgKGkgPDwgMSk7CisgICAgICAgICAgICBpbnQgaW5kZXhVID0gcm93ICogKHdpZHRoID4+IDEpICsgaTsKKyAgICAgICAgICAgIHlSb3dzW2luZGV4WV0gPSB5dXZTZWdbMF07CisgICAgICAgICAgICB5Um93c1tpbmRleFkgKyAxXSA9IHl1dlNlZ1syXTsKKyAgICAgICAgICAgIHVSb3dzW2luZGV4VV0gPSB5dXZTZWdbMV07CisgICAgICAgICAgICB2Um93c1tpbmRleFVdID0geXV2U2VnWzNdOworICAgICAgICAgICAgeXV2U2VnICs9IDQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWXV2NDIySVRvSnBlZ0VuY29kZXI6OmNvbmZpZ1NhbXBsaW5nRmFjdG9ycyhqcGVnX2NvbXByZXNzX3N0cnVjdCogY2luZm8pIHsKKyAgICAvLyBjYiBhbmQgY3IgYXJlIGhvcml6b250YWxseSBkb3duc2FtcGxlZCBhbmQgdmVydGljYWxseSBkb3duc2FtcGxlZCBhcyB3ZWxsLgorICAgIGNpbmZvLT5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDI7CisgICAgY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMjsKKyAgICBjaW5mby0+Y29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLT5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciA9IDI7CisgICAgY2luZm8tPmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAyOworfQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgamJvb2xlYW4gWXV2SW1hZ2VfY29tcHJlc3NUb0pwZWcoSk5JRW52KiBlbnYsIGpvYmplY3QsIGpieXRlQXJyYXkgaW5ZdXYsCisgICAgICAgIGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgamludEFycmF5IG9mZnNldHMsCisgICAgICAgIGppbnRBcnJheSBzdHJpZGVzLCBpbnQganBlZ1F1YWxpdHksIGpvYmplY3QganN0cmVhbSwKKyAgICAgICAgamJ5dGVBcnJheSBqc3RvcmFnZSkgeworICAgIGpieXRlKiB5dXYgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGluWXV2LCBOVUxMKTsKKyAgICBTa1dTdHJlYW0qIHN0cm0gPSBDcmVhdGVKYXZhT3V0cHV0U3RyZWFtQWRhcHRvcihlbnYsIGpzdHJlYW0sIGpzdG9yYWdlKTsKKworICAgIGppbnQqIGltZ09mZnNldHMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMob2Zmc2V0cywgTlVMTCk7CisgICAgamludCogaW1nU3RyaWRlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhzdHJpZGVzLCBOVUxMKTsKKyAgICBZdXZUb0pwZWdFbmNvZGVyKiBlbmNvZGVyID0gWXV2VG9KcGVnRW5jb2Rlcjo6Y3JlYXRlKGZvcm1hdCwgaW1nU3RyaWRlcyk7CisgICAgaWYgKGVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVuY29kZXItPmVuY29kZShzdHJtLCB5dXYsIHdpZHRoLCBoZWlnaHQsIGltZ09mZnNldHMsIGpwZWdRdWFsaXR5KTsKKworICAgIGRlbGV0ZSBlbmNvZGVyOworICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGluWXV2LCB5dXYsIDApOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMob2Zmc2V0cywgaW1nT2Zmc2V0cywgMCk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhzdHJpZGVzLCBpbWdTdHJpZGVzLCAwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdZdXZJbWFnZU1ldGhvZHNbXSA9IHsKKyAgICB7ICAgIm5hdGl2ZUNvbXByZXNzVG9KcGVnIiwgICIoW0JJSUlbSVtJSUxqYXZhL2lvL091dHB1dFN0cmVhbTtbQilaIiwKKyAgICAgICAgKHZvaWQqKVl1dkltYWdlX2NvbXByZXNzVG9KcGVnIH0KK307CisKKyNkZWZpbmUga0NsYXNzUGF0aE5hbWUgICJhbmRyb2lkL2dyYXBoaWNzL1l1dkltYWdlIgorCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19ZdXZJbWFnZShKTklFbnYqIGVudik7CitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19ZdXZJbWFnZShKTklFbnYqIGVudikKK3sKKyAgICByZXR1cm4gYW5kcm9pZDo6QW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsIGtDbGFzc1BhdGhOYW1lLAorICAgICAgICAgICAgZ1l1dkltYWdlTWV0aG9kcywgU0tfQVJSQVlfQ09VTlQoZ1l1dkltYWdlTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9ZdXZUb0pwZWdFbmNvZGVyLmggYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1l1dlRvSnBlZ0VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzEwNmNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9ZdXZUb0pwZWdFbmNvZGVyLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBZdXZUb0pwZWdFbmNvZGVyX0RFRklORUQKKyNkZWZpbmUgWXV2VG9KcGVnRW5jb2Rlcl9ERUZJTkVECisKKyNpbmNsdWRlICJTa1R5cGVzLmgiCisjaW5jbHVkZSAiU2tTdHJlYW0uaCIKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlICJqcGVnbGliLmgiCisgICAgI2luY2x1ZGUgImplcnJvci5oIgorfQorCitjbGFzcyBZdXZUb0pwZWdFbmNvZGVyIHsKK3B1YmxpYzoKKyAgICAvKiogQ3JlYXRlIGFuIGVuY29kZXIgYmFzZWQgb24gdGhlIFlVViBmb3JtYXQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIHBpeGVsRm9ybWF0IFRoZSB5dXYgcGl4ZWwgZm9ybWF0IGFzIGRlZmluZWQgaW4gdWkvUGl4ZWxGb3JtYXQuaC4KKyAgICAgKiAgQHBhcmFtIHN0cmlkZXMgVGhlIG51bWJlciBvZiByb3cgYnl0ZXMgaW4gZWFjaCBpbWFnZSBwbGFuZS4KKyAgICAgKiAgQHJldHVybiBhbiBlbmNvZGVyIGJhc2VkIG9uIHRoZSBwaXhlbEZvcm1hdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgWXV2VG9KcGVnRW5jb2RlciogY3JlYXRlKGludCBwaXhlbEZvcm1hdCwgaW50KiBzdHJpZGVzKTsKKworICAgIFl1dlRvSnBlZ0VuY29kZXIoaW50KiBzdHJpZGVzKTsKKworICAgIC8qKiBFbmNvZGUgWVVWIGRhdGEgdG8ganBlZywgIHdoaWNoIGlzIG91dHB1dCB0byBhIHN0cmVhbS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gc3RyZWFtIFRoZSBqcGVnIG91dHB1dCBzdHJlYW0uCisgICAgICogIEBwYXJhbSBpbll1diBUaGUgaW5wdXQgeXV2IGRhdGEuCisgICAgICogIEBwYXJhbSB3aWR0aCBXaWR0aCBvZiB0aGUgdGhlIFl1diBkYXRhIGluIHRlcm1zIG9mIHBpeGVscy4KKyAgICAgKiAgQHBhcmFtIGhlaWdodCBIZWlnaHQgb2YgdGhlIFl1diBkYXRhIGluIHRlcm1zIG9mIHBpeGVscy4KKyAgICAgKiAgQHBhcmFtIG9mZnNldHMgVGhlIG9mZnNldHMgaW4gZWFjaCBpbWFnZSBwbGFuZSB3aXRoIHJlc3BlY3QgdG8gaW5ZdXYuCisgICAgICogIEBwYXJhbSBqcGVnUXVhbGl0eSBQaWN0dXJlIHF1YWxpdHkgaW4gWzAsIDEwMF0uCisgICAgICogIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgY29tcHJlc3NlZCB0aGUgc3RyZWFtLgorICAgICAqLworICAgIGJvb2wgZW5jb2RlKFNrV1N0cmVhbSogc3RyZWFtLCAgdm9pZCogaW5ZdXYsIGludCB3aWR0aCwKKyAgICAgICAgICAgaW50IGhlaWdodCwgaW50KiBvZmZzZXRzLCBpbnQganBlZ1F1YWxpdHkpOworCisgICAgdmlydHVhbCB+WXV2VG9KcGVnRW5jb2RlcigpIHt9CisKK3Byb3RlY3RlZDoKKyAgICBpbnQgZk51bVBsYW5lczsKKyAgICBpbnQqIGZTdHJpZGVzOworICAgIHZvaWQgc2V0SnBlZ0NvbXByZXNzU3RydWN0KGpwZWdfY29tcHJlc3Nfc3RydWN0KiBjaW5mbywgaW50IHdpZHRoLAorICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IHF1YWxpdHkpOworICAgIHZpcnR1YWwgdm9pZCBjb25maWdTYW1wbGluZ0ZhY3RvcnMoanBlZ19jb21wcmVzc19zdHJ1Y3QqIGNpbmZvKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGNvbXByZXNzKGpwZWdfY29tcHJlc3Nfc3RydWN0KiBjaW5mbywKKyAgICAgICAgICAgIHVpbnQ4X3QqIHl1diwgaW50KiBvZmZzZXRzKSA9IDA7Cit9OworCitjbGFzcyBZdXY0MjBTcFRvSnBlZ0VuY29kZXIgOiBwdWJsaWMgWXV2VG9KcGVnRW5jb2RlciB7CitwdWJsaWM6CisgICAgIFl1djQyMFNwVG9KcGVnRW5jb2RlcihpbnQqIHN0cmlkZXMpOworICAgICB2aXJ0dWFsIH5ZdXY0MjBTcFRvSnBlZ0VuY29kZXIoKSB7fQorCitwcml2YXRlOgorICAgICB2b2lkIGNvbmZpZ1NhbXBsaW5nRmFjdG9ycyhqcGVnX2NvbXByZXNzX3N0cnVjdCogY2luZm8pOworICAgICB2b2lkIGRlaW50ZXJsZWF2ZVl1dih1aW50OF90KiB5dXYsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQ4X3QqJiB5UGxhbmFyLCB1aW50OF90KiYgdVBsYW5hciwgdWludDhfdComIHZQbGFuYXIpOworICAgICB2b2lkIGRlaW50ZXJsZWF2ZSh1aW50OF90KiB2dVBsYW5hciwgdWludDhfdCogdVJvd3MsIHVpbnQ4X3QqIHZSb3dzLAorICAgICAgICAgICAgIGludCByb3dJbmRleCwgaW50IHdpZHRoKTsKKyAgICAgdm9pZCBjb21wcmVzcyhqcGVnX2NvbXByZXNzX3N0cnVjdCogY2luZm8sIHVpbnQ4X3QqIHl1diwgaW50KiBvZmZzZXRzKTsKK307CisKK2NsYXNzIFl1djQyMklUb0pwZWdFbmNvZGVyIDogcHVibGljIFl1dlRvSnBlZ0VuY29kZXIgeworcHVibGljOgorICAgIFl1djQyMklUb0pwZWdFbmNvZGVyKGludCogc3RyaWRlcyk7CisgICAgdmlydHVhbCB+WXV2NDIySVRvSnBlZ0VuY29kZXIoKSB7fQorCitwcml2YXRlOgorICAgIHZvaWQgY29uZmlnU2FtcGxpbmdGYWN0b3JzKGpwZWdfY29tcHJlc3Nfc3RydWN0KiBjaW5mbyk7CisgICAgdm9pZCBjb21wcmVzcyhqcGVnX2NvbXByZXNzX3N0cnVjdCogY2luZm8sIHVpbnQ4X3QqIHl1diwgaW50KiBvZmZzZXRzKTsKKyAgICB2b2lkIGRlaW50ZXJsZWF2ZSh1aW50OF90KiB5dXYsIHVpbnQ4X3QqIHlSb3dzLCB1aW50OF90KiB1Um93cywKKyAgICAgICAgICAgIHVpbnQ4X3QqIHZSb3dzLCBpbnQgcm93SW5kZXgsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfaGFyZHdhcmVfQ2FtZXJhLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfaGFyZHdhcmVfQ2FtZXJhLmNwcAppbmRleCA2NGVlNGYwLi4xYTU5ODdjIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2hhcmR3YXJlX0NhbWVyYS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9oYXJkd2FyZV9DYW1lcmEuY3BwCkBAIC01NDYsNiArNTQ2LDE4IEBACiAgICAgfQogfQogCitzdGF0aWMgdm9pZCBhbmRyb2lkX2hhcmR3YXJlX0NhbWVyYV9zZXREaXNwbGF5T3JpZW50YXRpb24oSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKKyAgICAgICAgamludCB2YWx1ZSkKK3sKKyAgICBMT0dWKCJzZXREaXNwbGF5T3JpZW50YXRpb24iKTsKKyAgICBzcDxDYW1lcmE+IGNhbWVyYSA9IGdldF9uYXRpdmVfY2FtZXJhKGVudiwgdGhpeiwgTlVMTCk7CisgICAgaWYgKGNhbWVyYSA9PSAwKSByZXR1cm47CisKKyAgICBpZiAoY2FtZXJhLT5zZW5kQ29tbWFuZChDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OLCB2YWx1ZSwgMCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAic2V0IGRpc3BsYXkgb3JpZW50YXRpb24gZmFpbGVkIik7CisgICAgfQorfQorCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBjYW1NZXRob2RzW10gPSB7CkBAIC02MDMsNiArNjE1LDkgQEAKICAgeyAic3RvcFNtb290aFpvb20iLAogICAgICIoKVYiLAogICAgICh2b2lkICopYW5kcm9pZF9oYXJkd2FyZV9DYW1lcmFfc3RvcFNtb290aFpvb20gfSwKKyAgeyAic2V0RGlzcGxheU9yaWVudGF0aW9uIiwKKyAgICAiKEkpViIsCisgICAgKHZvaWQgKilhbmRyb2lkX2hhcmR3YXJlX0NhbWVyYV9zZXREaXNwbGF5T3JpZW50YXRpb24gfSwKIH07CiAKIHN0cnVjdCBmaWVsZCB7CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBkODE0NzZhLi41NGUxNWE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTcwMCw2ICs3MDAsNDYgQEAKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX21vdW50X2Zvcm1hdF9maWxlc3lzdGVtcyIKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19tb3VudF9mb3JtYXRfZmlsZXN5c3RlbXMiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhY2Nlc3MgdG8gQVNFQyBub24tZGVzdHJ1Y3RpdmUgQVBJIGNhbGxzCisgICAgICAgICBAaGlkZSAgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQVNFQ19BQ0NFU1MiCisgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24tZ3JvdXAuU1lTVEVNX1RPT0xTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfYXNlY19hY2Nlc3MiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfYXNlY19hY2Nlc3MiIC8+CisKKyAgICA8IS0tIEFsbG93cyBjcmVhdGlvbiBvZiBBU0VDIHZvbHVtZXMKKyAgICAgICAgIEBoaWRlICAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BU0VDX0NSRUFURSIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5TWVNURU1fVE9PTFMiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJkYW5nZXJvdXMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9hc2VjX2NyZWF0ZSIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19hc2VjX2NyZWF0ZSIgLz4KKworICAgIDwhLS0gQWxsb3dzIGRlc3RydWN0aW9uIG9mIEFTRUMgdm9sdW1lcworICAgICAgICAgQGhpZGUgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFTRUNfREVTVFJPWSIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5TWVNURU1fVE9PTFMiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJkYW5nZXJvdXMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9hc2VjX2Rlc3Ryb3kiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfYXNlY19kZXN0cm95IiAvPgorCisgICAgPCEtLSBBbGxvd3MgbW91bnQgLyB1bm1vdW50IG9mIEFTRUMgdm9sdW1lcworICAgICAgICAgQGhpZGUgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFTRUNfTU9VTlRfVU5NT1VOVCIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5TWVNURU1fVE9PTFMiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJkYW5nZXJvdXMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9hc2VjX21vdW50X3VubW91bnQiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfYXNlY19tb3VudF91bm1vdW50IiAvPgorCisgICAgPCEtLSBBbGxvd3MgcmVuYW1lIG9mIEFTRUMgdm9sdW1lcworICAgICAgICAgQGhpZGUgIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFTRUNfUkVOQU1FIgorICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLlNZU1RFTV9UT09MUyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9ImRhbmdlcm91cyIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX2FzZWNfcmVuYW1lIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX2FzZWNfcmVuYW1lIiAvPgorCiAgICAgPCEtLSBBbGxvd3MgYXBwbGljYXRpb25zIHRvIGRpc2FibGUgdGhlIGtleWd1YXJkIC0tPgogICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiCiAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24tZ3JvdXAuU1lTVEVNX1RPT0xTIgpAQCAtMTE2Miw2ICsxMjAyLDE2IEBACiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIKICAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZU9yU3lzdGVtIiAvPgogCisgICAgPCEtLSBNdXN0IGJlIHJlcXVpcmVkIGJ5IGRlZmF1bHQgY29udGFpbmVyIHNlcnZpY2Ugc28gdGhhdCBvbmx5CisgICAgICAgICB0aGUgc3lzdGVtIGNhbiBiaW5kIHRvIGl0IGFuZCB1c2UgaXQgdG8gY29weQorICAgICAgICAgcHJvdGVjdGVkIGRhdGEgdG8gc2VjdXJlIGNvbnRhaW5lcnMgb3IgZmlsZXMKKyAgICAgICAgIGFjY2Vzc2libGUgdG8gdGhlIHN5c3RlbS4KKyAgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNPUFlfUFJPVEVDVEVEX0RBVEEiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9jb3B5UHJvdGVjdGVkRGF0YSIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtbGFiX2NvcHlQcm90ZWN0ZWREYXRhIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlIiAvPgorCiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6cHJvY2Vzcz0ic3lzdGVtIgogICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcnNpc3RlbnQ9InRydWUiCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCAwZWYwN2ZmLi4yNTkzOThmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTg3Nyw2ICs4NzcsMzEgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdW50X2Zvcm1hdF9maWxlc3lzdGVtcyI+QWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBmb3JtYXQgcmVtb3ZhYmxlIHN0b3JhZ2UuPC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYXNlY19hY2Nlc3MiPmdldCBpbmZvcm1hdGlvbiBvbiBzZWN1cmUgc3RvcmFnZTwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYXNlY19hY2Nlc3MiPkFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gZ2V0IGluZm9ybWF0aW9uIG9uIHNlY3VyZSBzdG9yYWdlLjwvc3RyaW5nPgorCisgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FzZWNfY3JlYXRlIj5jcmVhdGUgc2VjdXJlIHN0b3JhZ2U8L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2FzZWNfY3JlYXRlIj5BbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGNyZWF0ZSBzZWN1cmUgc3RvcmFnZS48L3N0cmluZz4KKworICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hc2VjX2Rlc3Ryb3kiPmRlc3Ryb3kgc2VjdXJlIHN0b3JhZ2U8L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2FzZWNfZGVzdHJveSI+QWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBkZXN0cm95IHNlY3VyZSBzdG9yYWdlLjwvc3RyaW5nPgorCisgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FzZWNfbW91bnRfdW5tb3VudCI+bW91bnQgLyB1bm1vdW50IHNlY3VyZSBzdG9yYWdlPC9zdHJpbmc+CisgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hc2VjX21vdW50X3VubW91bnQiPkFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gbW91bnQgLyB1bm1vdW50IHNlY3VyZSBzdG9yYWdlLjwvc3RyaW5nPgorCisgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FzZWNfcmVuYW1lIj5yZW5hbWUgc2VjdXJlIHN0b3JhZ2U8L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2FzZWNfcmVuYW1lIj5BbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHJlbmFtZSBzZWN1cmUgc3RvcmFnZS48L3N0cmluZz4KKworICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl92aWJyYXRlIj5jb250cm9sIHZpYnJhdG9yPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY192aWJyYXRlIj5BbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGNvbnRyb2wKQEAgLTExNjcsMTAgKzExOTIsMTAgQEAKICAgICA8IS0tIFRpdGxlIG9mIHBvbGljeSBhY2Nlc3MgdG8gd2F0Y2ggdXNlciBsb2dpbiBhdHRlbXB0cyAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIj5XYXRjaCBsb2dpbiBhdHRlbXB0czwvc3RyaW5nPgogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3YXRjaCB1c2VyIGxvZ2luIGF0dGVtcHRzIC0tPgotICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIj5Nb25pdG9yIGF0dGVtcHRzIHRvIGxvZ2luIHRvCi0gICAgICAgIHRoZSBkZXZpY2UsIGluIHBhcnRpY3VsYXIgdG8gcmVzcG9uZCB0byBmYWlsZWQgbG9naW4gYXR0ZW1wdHMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iPk1vbml0b3IgZmFpbGVkIGF0dGVtcHRzIHRvIGxvZ2luIHRvCisgICAgICAgIHRoZSBkZXZpY2UsIHRvIHBlcmZvcm0gc29tZSBhY3Rpb24uPC9zdHJpbmc+CiAgICAgPCEtLSBUaXRsZSBvZiBwb2xpY3kgYWNjZXNzIHRvIHJlc2V0IHVzZXIncyBwYXNzd29yZCAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIj5SZXNldCB5b3VyIHBhc3N3b3JkPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCI+UmVzZXQgcGFzc3dvcmQ8L3N0cmluZz4KICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIHBvbGljeSBhY2Nlc3MgdG8gcmVzZXQgdXNlcidzIHBhc3N3b3JkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIj5Gb3JjZSB5b3VyIHBhc3N3b3JkCiAgICAgICAgIHRvIGEgbmV3IHZhbHVlLCByZXF1aXJpbmcgdGhlIGFkbWluaXN0cmF0b3IgZ2l2ZSBpdCB0byB5b3UKQEAgLTExODQsMTIgKzEyMDksMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siPkZvcmNlIGxvY2s8L3N0cmluZz4KICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIHBvbGljeSBhY2Nlc3MgdG8gbGltaXRpbmcgdGhlIHVzZXIncyBwYXNzd29yZCBjaG9pY2VzIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siPkZvcmNlIHRoZSBkZXZpY2UgdG8gaW1tZWRpYXRlbHkgbG9jaywKLSAgICAgICAgcmVxdWlyaW5nIHRoYXQgaXRzIHBhc3N3b3JkIGlzIHJlLWVudGVyZWQuPC9zdHJpbmc+CisgICAgICAgIHJlcXVpcmluZyB0aGF0IHlvdSByZS1lbnRlciBpdHMgcGFzc3dvcmQuPC9zdHJpbmc+CiAgICAgPCEtLSBUaXRsZSBvZiBwb2xpY3kgYWNjZXNzIHRvIHdpcGUgdGhlIHVzZXIncyBkYXRhIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIj5FcmFzZSBhbGwgZGF0YTwvc3RyaW5nPgogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3aXBlIHRoZSB1c2VyJ3MgZGF0YSAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiPlBlcmZvcm0gYSBmYWN0b3J5IHJlc2V0LCBkZWxldGluZwotICAgICAgICBhbGwgb2YgeW91ciBkYXRhIHdpdGhvdXQgYW55IGNvbmZpcm1hdGlvbiBmcm9tIHlvdS48L3N0cmluZz4KKyAgICAgICAgYWxsIG9mIHlvdXIgZGF0YSB3aXRob3V0IGFueSBjb25maXJtYXRpb24uPC9zdHJpbmc+CiAKICAgICA8IS0tIFRoZSBvcmRlciBvZiB0aGVzZSBpcyBpbXBvcnRhbnQsIGRvbid0IHJlb3JkZXIgd2l0aG91dCBjaGFuZ2luZyBDb250YWN0cy5qYXZhIC0tPiA8c2tpcCAvPgogICAgIDwhLS0gUGhvbmUgbnVtYmVyIHR5cGVzIGZyb20gYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy4gVGhpcyBjb3VsZCBiZSB1c2VkIHdoZW4gYWRkaW5nIGEgbmV3IHBob25lIG51bWJlciBmb3IgYSBjb250YWN0LCBmb3IgZXhhbXBsZS4gLS0+CkBAIC0yMDc3LDYgKzIxMDIsMTIgQEAKICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiPkFsbG93cyB0aGUgbW9kaWZpY2F0aW9uIG9mIGNvbGxlY3RlZCBjb21wb25lbnQgdXNhZ2Ugc3RhdGlzdGljcy4gTm90IGZvciB1c2UgYnkgbm9ybWFsIGFwcGxpY2F0aW9ucy48L3N0cmluZz4KIAorICAgIDwhLS0gcGVybWlzc2lvbiBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8gZGVmYXVsdCBjb250YWluZXIgc2VydmljZSAtLT4KKyAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24gdGhhdCBsZXRzIGFuIGFwcGxpY2F0aW9uIHVzZSBkZWZhdWx0IGNvbnRhaW5lciBzZXJ2aWNlLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY29weVByb3RlY3RlZERhdGEiPkFsbG93cyB0byBpbnZva2UgZGVmYXVsdCBjb250YWluZXIgc2VydmljZSB0byBjb3B5IGNvbnRlbnQuIE5vdCBmb3IgdXNlIGJ5IG5vcm1hbCBhcHBsaWNhdGlvbnMuPC9zdHJpbmc+CisgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCAgdXNlZCB0byBpbnZva2UgZGVmYXVsdCBjb250YWluZXIgc2VydmljZSB0byBjb3B5IGNvbnRlbnQuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY29weVByb3RlY3RlZERhdGEiPkFsbG93cyB0byBpbnZva2UgZGVmYXVsdCBjb250YWluZXIgc2VydmljZSB0byBjb3B5IGNvbnRlbnQuIE5vdCBmb3IgdXNlIGJ5IG5vcm1hbCBhcHBsaWNhdGlvbnMuPC9zdHJpbmc+CisKICAgICA8IS0tIFNob3duIGluIHRoZSB0dXRvcmlhbCBmb3IgdGFwIHR3aWNlIGZvciB6b29tIGNvbnRyb2wuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idHV0b3JpYWxfZG91YmxlX3RhcF90b196b29tX21lc3NhZ2Vfc2hvcnQiPlRhcCB0d2ljZSBmb3Igem9vbSBjb250cm9sPC9zdHJpbmc+CiAKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWQubWsgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YzE3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgV2Ugb25seSB3YW50IHRoaXMgYXBrIGJ1aWxkIGZvciB0ZXN0cy4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKKyMgSW5jbHVkZSBhbGwgdGVzdCBqYXZhIGZpbGVzLgorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gRnJhbWV3b3Jrc0NvcmVUZXN0cworCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKwpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0YmRhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw1NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy5jb3JldGVzdHMiPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9TTVMiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9DT05UQUNUUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0NPTlRBQ1RTIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV0FLRV9MT0NLIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0hBTkdFX0NPTkZJR1VSQVRJT04iIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9BUE5fU0VUVElOR1MiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5CUk9BRENBU1RfU1RJQ0tZIiAvPgorCisgICAgPCEtLSBsb2NhdGlvbiB0ZXN0IHBlcm1pc3Npb25zIC0tPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04iLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19NT0NLX0xPQ0FUSU9OIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRVRUSU5HUyIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0VDVVJFX1NFVFRJTkdTIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIi8+CisgICAgCisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkiIGFuZHJvaWQ6bGFiZWw9IlN0dWJiZWQgVGVzdCBCcm93c2VyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkZPUl9URVNUU19PTkxZIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LlRlc3RCcm93c2VyVGVzdHMiIGFuZHJvaWQ6bGFiZWw9IlRlc3QgQnJvd3NlciBUZXN0cyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5VTklUX1RFU1QiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbgorICAgIAlhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgIAlhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzIgorICAgIAlhbmRyb2lkOmxhYmVsPSJGcmFtZXdvcmtzIENvcmUgVGVzdHMiIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9BdFBhcnNlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9BdFBhcnNlclRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC9jb3JlL0F0UGFyc2VyVGVzdC5qYXZhCnJlbmFtZSB0byBjb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQXRQYXJzZXJUZXN0LmphdmEKaW5kZXggMDljYjZlOS4uYzVhYTUyYiAxMDA2NDQKLS0tIGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9BdFBhcnNlclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQXRQYXJzZXJUZXN0LmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5jb3JlOworcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKIAogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkF0Q29tbWFuZEhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQXRDb21tYW5kUmVzdWx0OwpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29udGVudC9PYnNlcnZlck5vZGVUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L09ic2VydmVyTm9kZVRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29udGVudC9PYnNlcnZlck5vZGVUZXN0LmphdmEKcmVuYW1lIHRvIGNvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvT2JzZXJ2ZXJOb2RlVGVzdC5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC9jb250ZW50L1N5bmNTdG9yYWdlRW5naW5lVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZVRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZVRlc3QuamF2YQpyZW5hbWUgdG8gY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZVRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3JUZXN0LmphdmEKcmVuYW1lIHRvIGNvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL01hdHJpeEN1cnNvclRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9BYnN0cmFjdEpEQkNEcml2ZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvQWJzdHJhY3RKREJDRHJpdmVyVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC9jb3JlL0Fic3RyYWN0SkRCQ0RyaXZlclRlc3QuamF2YQpyZW5hbWUgdG8gY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0Fic3RyYWN0SkRCQ0RyaXZlclRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9TUUxpdGVKREJDRHJpdmVyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUpEQkNEcml2ZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvU1FMaXRlSkRCQ0RyaXZlclRlc3QuamF2YQpyZW5hbWUgdG8gY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUpEQkNEcml2ZXJUZXN0LmphdmEKZGlmZiAtLWdpdCBhL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvUmVjdXJyZW5jZVNldFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0VGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIHRlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvUmVjdXJyZW5jZVNldFRlc3QuamF2YQpyZW5hbWUgdG8gY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXRUZXN0LmphdmEKaW5kZXggY2VlMzI0Yy4uNjRjZDZjNCAxMDA2NDQKLS0tIGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9SZWN1cnJlbmNlU2V0VGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0VGVzdC5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQuY29yZTsKK3BhY2thZ2UgYW5kcm9pZC5waW07CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLnBpbS5JQ2FsZW5kYXI7CmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC91dGlsL0RheU9mTW9udGhDdXJzb3JUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0RheU9mTW9udGhDdXJzb3JUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL3V0aWwvRGF5T2ZNb250aEN1cnNvclRlc3QuamF2YQpyZW5hbWUgdG8gY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9EYXlPZk1vbnRoQ3Vyc29yVGVzdC5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC91dGlsL0Zsb2F0TWF0aFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvRmxvYXRNYXRoVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC91dGlsL0Zsb2F0TWF0aFRlc3QuamF2YQpyZW5hbWUgdG8gY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9GbG9hdE1hdGhUZXN0LmphdmEKZGlmZiAtLWdpdCBhL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL3V0aWwvTW9udGhEaXNwbGF5SGVscGVyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Nb250aERpc3BsYXlIZWxwZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL3V0aWwvTW9udGhEaXNwbGF5SGVscGVyVGVzdC5qYXZhCnJlbmFtZSB0byBjb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL01vbnRoRGlzcGxheUhlbHBlclRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvdXRpbC9TdGF0ZVNldFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvU3RhdGVTZXRUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL3V0aWwvU3RhdGVTZXRUZXN0LmphdmEKcmVuYW1lIHRvIGNvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvU3RhdGVTZXRUZXN0LmphdmEKZGlmZiAtLWdpdCBhL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL3ZpZXcvRm9jdXNGaW5kZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L0ZvY3VzRmluZGVyVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC92aWV3L0ZvY3VzRmluZGVyVGVzdC5qYXZhCnJlbmFtZSB0byBjb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L0ZvY3VzRmluZGVyVGVzdC5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC92aWV3L1ZpZXdHcm91cEF0dHJpYnV0ZXNUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L1ZpZXdHcm91cEF0dHJpYnV0ZXNUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwQXR0cmlidXRlc1Rlc3QuamF2YQpyZW5hbWUgdG8gY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9WaWV3R3JvdXBBdHRyaWJ1dGVzVGVzdC5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC93ZWJraXQvVXJsSW50ZXJjZXB0UmVnaXN0cnlUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93ZWJraXQvVXJsSW50ZXJjZXB0UmVnaXN0cnlUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL3dlYmtpdC9VcmxJbnRlcmNlcHRSZWdpc3RyeVRlc3QuamF2YQpyZW5hbWUgdG8gY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2Via2l0L1VybEludGVyY2VwdFJlZ2lzdHJ5VGVzdC5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVkaWNhdGVzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvUHJlZGljYXRlc1Rlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvUHJlZGljYXRlc1Rlc3QuamF2YQpyZW5hbWUgdG8gY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvUHJlZGljYXRlc1Rlc3QuamF2YQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1l1dkltYWdlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvWXV2SW1hZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTNiZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1l1dkltYWdlLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsCisgKgorICogWXV2SW1hZ2UgY29udGFpbnMgWVVWIGRhdGEgYW5kIHByb3ZpZGVzIGEgbWV0aG9kIHRoYXQgY29tcHJlc3NlcyBhIHJlZ2lvbiBvZgorICogdGhlIFlVViBkYXRhIHRvIGEgSnBlZy4gVGhlIFlVViBkYXRhIHNob3VsZCBiZSBwcm92aWRlZCBhcyBhIHNpbmdsZSBieXRlCisgKiBhcnJheSBpcnJlc3BlY3RpdmUgb2YgdGhlIG51bWJlciBvZiBpbWFnZSBwbGFuZXMgaW4gaXQuIFRoZSBzdHJpZGUgb2YgZWFjaAorICogaW1hZ2UgcGxhbmUgc2hvdWxkIGJlIHByb3ZpZGVkIGFzIHdlbGwuCisgKgorICogVG8gY29tcHJlc3MgYSByZWN0YW5nbGUgcmVnaW9uIGluIHRoZSBZVVYgZGF0YSwgdXNlcnMgaGF2ZSB0byBzcGVjaWZ5IGEKKyAqIHJlZ2lvbiBieSB3aWR0aCwgaGVpZ2h0IGFuZCBvZmZzZXRzLCB3aGVyZSBlYWNoIGltYWdlIHBsYW5lIGhhcyBhCisgKiBjb3JyZXNwb25kaW5nIG9mZnNldC4gQWxsIG9mZnNldHMgYXJlIG1lYXN1cmVkIGFzIGEgZGlzcGxhY2VtZW50IGluIGJ5dGVzCisgKiBmcm9tIHl1dlswXSwgd2hlcmUgeXV2WzBdIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl1diBkYXRhLgorICovCitwdWJsaWMgY2xhc3MgWXV2SW1hZ2UgeworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGJ5dGVzIG9mIHRlbXAgc3RvcmFnZSB3ZSB1c2UgZm9yIGNvbW11bmljYXRpbmcgYmV0d2VlbiB0aGUKKyAgICAgKiBuYXRpdmUgY29tcHJlc3NvciBhbmQgdGhlIGphdmEgT3V0cHV0U3RyZWFtLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBXT1JLSU5HX0NPTVBSRVNTX1NUT1JBR0UgPSA0MDk2OworCisgICAvKioKKyAgICAgKiBUaGUgWVVWIGZvcm1hdCBhcyBkZWZpbmVkIGluIHtAbGluayBQaXhlbEZvcm1hdH0uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbUZvcm1hdDsKKworICAgIC8qKgorICAgICAqIFRoZSByYXcgWVVWIGRhdGEuCisgICAgICogSW4gdGhlIGNhc2Ugb2YgbW9yZSB0aGFuIG9uZSBpbWFnZSBwbGFuZSwgdGhlIGltYWdlIHBsYW5lcyBtdXN0IGJlCisgICAgICogY29uY2F0ZW5hdGVkIGludG8gYSBzaW5nbGUgYnl0ZSBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGVbXSBtRGF0YTsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygcm93IGJ5dGVzIGluIGVhY2ggaW1hZ2UgcGxhbmUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRbXSBtU3RyaWRlczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBZdXZJbWFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB5dXYgVGhlIFlVViBkYXRhLiBJbiB0aGUgY2FzZSBvZiBtb3JlIHRoYW4gb25lIGltYWdlIHBsYW5lLCBhbGwgdGhlIHBsYW5lcyBtdXN0IGJlCisgICAgICogICAgICAgICAgICBjb25jYXRlbmF0ZWQgaW50byBhIHNpbmdsZSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBmb3JtYXQgVGhlIFlVViBkYXRhIGZvcm1hdCBhcyBkZWZpbmVkIGluIHtAbGluayBQaXhlbEZvcm1hdH0uCisgICAgICogQHBhcmFtIHN0cmlkZXMgUm93IGJ5dGVzIG9mIGVhY2ggaW1hZ2UgcGxhbmUuCisgICAgICovCisgICAgcHVibGljIFl1dkltYWdlKGJ5dGVbXSB5dXYsIGludCBmb3JtYXQsIGludFtdIHN0cmlkZXMpIHsKKyAgICAgICAgaWYgKCh5dXYgPT0gbnVsbCkgfHwgKHN0cmlkZXMgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ5dXYgb3Igc3RyaWRlcyBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1EYXRhID0geXV2OworICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgICAgICBtU3RyaWRlcyA9IHN0cmlkZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcHJlc3MgYSByZWN0YW5nbGUgcmVnaW9uIGluIHRoZSBZdXZJbWFnZSB0byBhIGpwZWcuCisgICAgICogT25seSBQaXhlbEZvcm1hdC5ZQ2JDcl80MjBfU1AgYW5kIFBpeGVsRm9ybWF0LllDYkNyXzQyMl9JCisgICAgICogYXJlIHN1cHBvcnRlZCBmb3Igbm93LgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHJlZ2lvbi4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSByZWdpb24uCisgICAgICogQHBhcmFtIG9mZnNldHMgVGhlIG9mZnNldHMgb2YgdGhlIHJlY3RhbmdsZSByZWdpb24gaW4gZWFjaCBpbWFnZSBwbGFuZS4KKyAgICAgKiAgICAgICAgICAgICAgICBUaGUgb2Zmc2V0cyBhcmUgbWVhc3VyZWQgYXMgYSBkaXNwbGFjZW1lbnQgaW4gYnl0ZXMgZnJvbQorICAgICAqICAgICAgICAgICAgICAgIHl1dlswXSwgd2hlcmUgeXV2WzBdIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl1diBkYXRhLgorICAgICAqIEBwYXJhbSBxdWFsaXR5ICBIaW50IHRvIHRoZSBjb21wcmVzc29yLCAwLTEwMC4gMCBtZWFuaW5nIGNvbXByZXNzIGZvcgorICAgICAqICAgICAgICAgICAgICAgICBzbWFsbCBzaXplLCAxMDAgbWVhbmluZyBjb21wcmVzcyBmb3IgbWF4IHF1YWxpdHkuCisgICAgICogQHBhcmFtIHN0cmVhbSAgIFRoZSBvdXRwdXRzdHJlYW0gdG8gd3JpdGUgdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgY29tcHJlc3NlZCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbXByZXNzVG9KcGVnKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50W10gb2Zmc2V0cywgaW50IHF1YWxpdHksCisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIGlmICghdmFsaWRhdGUobUZvcm1hdCwgd2lkdGgsIGhlaWdodCwgb2Zmc2V0cykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWFsaXR5IDwgMCB8fCBxdWFsaXR5ID4gMTAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWFsaXR5IG11c3QgYmUgMC4uMTAwIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUNvbXByZXNzVG9KcGVnKG1EYXRhLCBtRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBvZmZzZXRzLAorICAgICAgICAgICAgICAgIG1TdHJpZGVzLCBxdWFsaXR5LCBzdHJlYW0sIG5ldyBieXRlW1dPUktJTkdfQ09NUFJFU1NfU1RPUkFHRV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIFlVViBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0WXV2RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIFlVViBmb3JtYXQgYXMgZGVmaW5lZCBpbiB7QGxpbmsgUGl4ZWxGb3JtYXR9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0WXV2Rm9ybWF0KCkgeworICAgICAgICByZXR1cm4gbUZvcm1hdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93IGJ5dGVzIGluIGVhY2ggaW1hZ2UgcGxhbmUuCisgICAgICovCisgICAgcHVibGljIGludFtdIGdldFN0cmlkZXMoKSB7CisgICAgICAgIHJldHVybiBtU3RyaWRlczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludFtdIG9mZnNldHMpIHsKKyAgICAgICAgaWYgKGZvcm1hdCAhPSBQaXhlbEZvcm1hdC5ZQ2JDcl80MjBfU1AgJiYKKyAgICAgICAgICAgICAgICBmb3JtYXQgIT0gUGl4ZWxGb3JtYXQuWUNiQ3JfNDIyX0kpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJvbmx5IHN1cHBvcnQgUGl4ZWxGb3JtYXQuWUNiQ3JfNDIwX1NQICIgKworICAgICAgICAgICAgICAgICAgICAiYW5kIFBpeGVsRm9ybWF0LllDYkNyXzQyMl9JIGZvciBub3ciKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZmZzZXRzLmxlbmd0aCAhPSBtU3RyaWRlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ0aGUgbnVtYmVyIG9mIGltYWdlIHBsYW5lcyBhcmUgbWlzbWF0Y2hlZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdpZHRoIDw9IDAgIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAid2lkdGggYW5kIGhlaWdodCBtdXN0IGxhcmdlIHRoYW4gMCIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlcXVpcmVkU2l6ZTsKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBQaXhlbEZvcm1hdC5ZQ2JDcl80MjBfU1ApIHsKKyAgICAgICAgICAgIHJlcXVpcmVkU2l6ZSA9IGhlaWdodCAqIG1TdHJpZGVzWzBdICsoaGVpZ2h0ID4+IDEpICogbVN0cmlkZXNbMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXF1aXJlZFNpemUgPSBoZWlnaHQgKiBtU3RyaWRlc1swXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1aXJlZFNpemUgPiBtRGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aCBvci9hbmQgaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSB5dXYgZGF0YSIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vIG5hdGl2ZSBtZXRob2RzCisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuYXRpdmVDb21wcmVzc1RvSnBlZyhieXRlW10gb3JpWXV2LAorICAgICAgICAgICAgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnRbXSBvZmZzZXRzLCBpbnRbXSBzdHJpZGVzLAorICAgICAgICAgICAgaW50IHF1YWxpdHksIE91dHB1dFN0cmVhbSBzdHJlYW0sIGJ5dGVbXSB0ZW1wU3RvcmFnZSk7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhY2hpbmdEYXRhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhY2hpbmdEYXRhU291cmNlLmgKaW5kZXggYjBmYzRiMi4uMzBiN2FkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FjaGluZ0RhdGFTb3VyY2UuaApAQCAtMzMsNiArMzMsOCBAQAogCiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIAorICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkNhY2hpbmdEYXRhU291cmNlKCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggZjg4NjY2YS4uMGMwYWNlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTMxLDYgKzMxLDEwIEBACiAKIGNsYXNzIERhdGFTb3VyY2UgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6CisgICAgZW51bSBGbGFncyB7CisgICAgICAgIGtXYW50c1ByZWZldGNoaW5nID0gMSwKKyAgICB9OworCiAgICAgc3RhdGljIHNwPERhdGFTb3VyY2U+IENyZWF0ZUZyb21VUkkoY29uc3QgY2hhciAqdXJpKTsKIAogICAgIERhdGFTb3VyY2UoKSB7fQpAQCAtNDUsNiArNDksMTAgQEAKICAgICAvLyBNYXkgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVELgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmZfdCAqc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKICAgICBib29sIHNuaWZmKFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmgKaW5kZXggZDVkYzllNi4uMzA3NWYxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IVFRQRGF0YVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSFRUUERhdGFTb3VyY2UuaApAQCAtMzMsNiArMzMsMTAgQEAKIAogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmc7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+SFRUUERhdGFTb3VyY2UoKTsKIApAQCAtNTIsNiArNTYsOCBAQAogCiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAorICAgIHNzaXplX3Qgc2VuZFJhbmdlUmVxdWVzdChzaXplX3Qgb2Zmc2V0KTsKKwogICAgIEhUVFBEYXRhU291cmNlKGNvbnN0IEhUVFBEYXRhU291cmNlICYpOwogICAgIEhUVFBEYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgSFRUUERhdGFTb3VyY2UgJik7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9DYW1lcmEuaCBiL2luY2x1ZGUvdWkvQ2FtZXJhLmgKaW5kZXggNTIxOTc3Mi4uYzUwNmZiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91aS9DYW1lcmEuaAorKysgYi9pbmNsdWRlL3VpL0NhbWVyYS5oCkBAIC04Miw2ICs4Miw3IEBACiBlbnVtIHsKICAgICBDQU1FUkFfQ01EX1NUQVJUX1NNT09USF9aT09NICAgICA9IDEsCiAgICAgQ0FNRVJBX0NNRF9TVE9QX1NNT09USF9aT09NICAgICAgPSAyLAorICAgIENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04gPSAzLAogfTsKIAogLy8gY2FtZXJhIGZhdGFsIGVycm9ycwpAQCAtMjA5LDQgKzIxMCwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9DYW1lcmFQYXJhbWV0ZXJzLmggYi9pbmNsdWRlL3VpL0NhbWVyYVBhcmFtZXRlcnMuaAppbmRleCBhNWVhMTMzLi5jYWUwNjc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0NhbWVyYVBhcmFtZXRlcnMuaAorKysgYi9pbmNsdWRlL3VpL0NhbWVyYVBhcmFtZXRlcnMuaApAQCAtMjksMTIgKzI5LDYgQEAKICAgICBDYW1lcmFQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzggJnBhcmFtcykgeyB1bmZsYXR0ZW4ocGFyYW1zKTsgfQogICAgIH5DYW1lcmFQYXJhbWV0ZXJzKCk7CiAKLSAgICBlbnVtIHsKLSAgICAgICAgQ0FNRVJBX09SSUVOVEFUSU9OX1VOS05PV04gPSAwLAotICAgICAgICBDQU1FUkFfT1JJRU5UQVRJT05fUE9SVFJBSVQgPSAxLAotICAgICAgICBDQU1FUkFfT1JJRU5UQVRJT05fTEFORFNDQVBFID0gMiwKLSAgICB9OwotCiAgICAgU3RyaW5nOCBmbGF0dGVuKCkgY29uc3Q7CiAgICAgdm9pZCB1bmZsYXR0ZW4oY29uc3QgU3RyaW5nOCAmcGFyYW1zKTsKIApAQCAtNjMsOSArNTcsNiBAQAogICAgIHZvaWQgc2V0UGljdHVyZUZvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpOwogICAgIGNvbnN0IGNoYXIgKmdldFBpY3R1cmVGb3JtYXQoKSBjb25zdDsKIAotICAgIGludCBnZXRPcmllbnRhdGlvbigpIGNvbnN0OwotICAgIHZvaWQgc2V0T3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKTsKLQogICAgIHZvaWQgZHVtcCgpIGNvbnN0OwogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvbGlicy91aS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2xpYnMvdWkvQ2FtZXJhUGFyYW1ldGVycy5jcHAKaW5kZXggMmUwNDA5Yi4uYTk0ZjZiOSAxMDA2NDQKLS0tIGEvbGlicy91aS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAorKysgYi9saWJzL3VpL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC0xMjEsOSArMTIxLDYgQEAKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9NQUNST1tdID0gIm1hY3JvIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9GSVhFRFtdID0gImZpeGVkIjsKIAotc3RhdGljIGNvbnN0IGNoYXIqIHBvcnRyYWl0ID0gInBvcnRyYWl0IjsKLXN0YXRpYyBjb25zdCBjaGFyKiBsYW5kc2NhcGUgPSAibGFuZHNjYXBlIjsKLQogQ2FtZXJhUGFyYW1ldGVyczo6Q2FtZXJhUGFyYW1ldGVycygpCiAgICAgICAgICAgICAgICAgOiBtTWFwKCkKIHsKQEAgLTI4MiwyMyArMjc5LDYgQEAKICAgICBzZXQoS0VZX1BSRVZJRVdfRk9STUFULCBmb3JtYXQpOwogfQogCi1pbnQgQ2FtZXJhUGFyYW1ldGVyczo6Z2V0T3JpZW50YXRpb24oKSBjb25zdAotewotICAgIGNvbnN0IGNoYXIqIG9yaWVudGF0aW9uID0gZ2V0KCJvcmllbnRhdGlvbiIpOwotICAgIGlmIChvcmllbnRhdGlvbiAmJiAhc3RyY21wKG9yaWVudGF0aW9uLCBwb3J0cmFpdCkpCi0gICAgICAgIHJldHVybiBDQU1FUkFfT1JJRU5UQVRJT05fUE9SVFJBSVQ7Ci0gICAgcmV0dXJuIENBTUVSQV9PUklFTlRBVElPTl9MQU5EU0NBUEU7Ci19Ci0KLXZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6c2V0T3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKQotewotICAgIGlmIChvcmllbnRhdGlvbiA9PSBDQU1FUkFfT1JJRU5UQVRJT05fUE9SVFJBSVQpIHsKLSAgICAgICAgc2V0KCJvcmllbnRhdGlvbiIsIHBvcnRyYWl0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXQoIm9yaWVudGF0aW9uIiwgbGFuZHNjYXBlKTsKLSAgICB9Ci19Ci0KIGNvbnN0IGNoYXIgKkNhbWVyYVBhcmFtZXRlcnM6OmdldFByZXZpZXdGb3JtYXQoKSBjb25zdAogewogICAgIHJldHVybiBnZXQoS0VZX1BSRVZJRVdfRk9STUFUKTsKZGlmZiAtLWdpdCBhL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvQW5kcm9pZC5tayBiL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDJjZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vdGVzdHMvbG9jYXRpb250ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgV2Ugb25seSB3YW50IHRoaXMgYXBrIGJ1aWxkIGZvciB0ZXN0cy4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKKyMgSW5jbHVkZSBhbGwgdGVzdCBqYXZhIGZpbGVzLgorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gRnJhbWV3b3Jrc0xvY2F0aW9uVGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKZGlmZiAtLWdpdCBhL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDlkZjBmCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vdGVzdHMvbG9jYXRpb250ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3MubG9jYXRpb250ZXN0cyI+CisKKyAgICA8IS0tIGxvY2F0aW9uIHRlc3QgcGVybWlzc2lvbnMgLS0+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfRklORV9MT0NBVElPTiIvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX01PQ0tfTE9DQVRJT04iLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFVFRJTkdTIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiLz4KKyAgICAKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgCWFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgCWFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy5sb2NhdGlvbnRlc3RzIgorICAgIAlhbmRyb2lkOmxhYmVsPSJGcmFtZXdvcmtzIExvY2F0aW9uIFRlc3RzIiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uVGVzdC5qYXZhIGIvbG9jYXRpb24vdGVzdHMvbG9jYXRpb250ZXN0cy9zcmMvYW5kcm9pZC9sb2NhdGlvbi9Mb2NhdGlvblRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25UZXN0LmphdmEKcmVuYW1lIHRvIGxvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25UZXN0LmphdmEKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvam5pL0FuZHJvaWQubWsKaW5kZXggY2E2MjMwZi4uMWQ4MmUzMiAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvam5pL0FuZHJvaWQubWsKQEAgLTEsNiArMSwxMCBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAoraWZuZXEgKCQoQlVJTERfV0lUSE9VVF9QViksdHJ1ZSkKK2luY2x1ZGUgZXh0ZXJuYWwvb3BlbmNvcmUvQ29uZmlnLm1rCitlbmRpZgorCiBMT0NBTF9TUkNfRklMRVM6PSBcCiAgICAgYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAgXAogICAgIGFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlci5jcHAgXApAQCAtMTksNiArMjMsNyBAQAogICAgIGxpYmN1dGlscwogCiBpZm5lcSAoJChCVUlMRF9XSVRIT1VUX1BWKSx0cnVlKQorCiBMT0NBTF9TUkNfRklMRVMgKz0gXAogICAgIGFuZHJvaWRfbWVkaWFfQW1ySW5wdXRTdHJlYW0uY3BwCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDM4MTM5MDcuLmRiYjUyYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMzEsNiArMzEsNyBAQAogICAgICAgICBNUEVHNEV4dHJhY3Rvci5jcHAgICAgICAgIFwKICAgICAgICAgTVBFRzRXcml0ZXIuY3BwICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhRXh0cmFjdG9yLmNwcCAgICAgICAgXAorICAgICAgICBQcmVmZXRjaGVyLmNwcCAgICAgICAgICAgIFwKICAgICAgICAgU2FtcGxlSXRlcmF0b3IuY3BwICAgICAgICBcCiAgICAgICAgIFNhbXBsZVRhYmxlLmNwcCAgICAgICAgICAgXAogICAgICAgICBTaG91dGNhc3RTb3VyY2UuY3BwICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggZjZjZDQ2YS4uNDJiOWFjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvQXdlc29tZVBsYXllci5oIgorI2luY2x1ZGUgImluY2x1ZGUvUHJlZmV0Y2hlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CkBAIC0xMTgsNiArMTE5LDggQEAKICAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKICAgICBtU3RyZWFtRG9uZUV2ZW50ID0gbmV3IEF3ZXNvbWVFdmVudCh0aGlzLCAxKTsKICAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOworICAgIG1CdWZmZXJpbmdFdmVudCA9IG5ldyBBd2Vzb21lRXZlbnQodGhpcywgMik7CisgICAgbUJ1ZmZlcmluZ0V2ZW50UGVuZGluZyA9IGZhbHNlOwogCiAgICAgbVF1ZXVlLnN0YXJ0KCk7CiAKQEAgLTEzMiwxMSArMTM1LDE2IEBACiAgICAgbUNsaWVudC5kaXNjb25uZWN0KCk7CiB9CiAKLXZvaWQgQXdlc29tZVBsYXllcjo6Y2FuY2VsUGxheWVyRXZlbnRzKCkgewordm9pZCBBd2Vzb21lUGxheWVyOjpjYW5jZWxQbGF5ZXJFdmVudHMoYm9vbCBrZWVwQnVmZmVyaW5nR29pbmcpIHsKICAgICBtUXVldWUuY2FuY2VsRXZlbnQobVZpZGVvRXZlbnQtPmV2ZW50SUQoKSk7CiAgICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gZmFsc2U7CiAgICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1TdHJlYW1Eb25lRXZlbnQtPmV2ZW50SUQoKSk7CiAgICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSBmYWxzZTsKKworICAgIGlmICgha2VlcEJ1ZmZlcmluZ0dvaW5nKSB7CisgICAgICAgIG1RdWV1ZS5jYW5jZWxFdmVudChtQnVmZmVyaW5nRXZlbnQtPmV2ZW50SUQoKSk7CisgICAgICAgIG1CdWZmZXJpbmdFdmVudFBlbmRpbmcgPSBmYWxzZTsKKyAgICB9CiB9CiAKIHZvaWQgQXdlc29tZVBsYXllcjo6c2V0TGlzdGVuZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIpIHsKQEAgLTE0OSwxMiArMTU3LDIyIEBACiAKICAgICByZXNldF9sKCk7CiAKLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZUZyb21VUkkodXJpKTsKKyAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmkpOworCisgICAgaWYgKGRhdGFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShkYXRhU291cmNlKTsKIAogICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBpZiAoZGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtXYW50c1ByZWZldGNoaW5nKSB7CisgICAgICAgIG1QcmVmZXRjaGVyID0gbmV3IFByZWZldGNoZXI7CisgICAgfQorCiAgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChleHRyYWN0b3IpOwogfQogCkBAIC0xODIsOCArMjAwLDYgQEAKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0RGF0YVNvdXJjZV9sKGNvbnN0IHNwPE1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yKSB7Ci0gICAgcmVzZXRfbCgpOwotCiAgICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKICAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKQEAgLTI1Myw2ICsyNjksOCBAQAogCiAgICAgbVNlZWtpbmcgPSBmYWxzZTsKICAgICBtU2Vla1RpbWVVcyA9IDA7CisKKyAgICBtUHJlZmV0Y2hlci5jbGVhcigpOwogfQogCiAvLyBzdGF0aWMKQEAgLTI3OCwxNiArMjk2LDM4IEBACiAgICAgfQogfQogCi12b2lkIEF3ZXNvbWVQbGF5ZXI6Om5vdGlmeUxpc3RlbmVyX2woaW50IG1zZykgewordm9pZCBBd2Vzb21lUGxheWVyOjpub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxKSB7CiAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwogCiAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KG1zZyk7CisgICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KG1zZywgZXh0MSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKK3ZvaWQgQXdlc29tZVBsYXllcjo6b25CdWZmZXJpbmdVcGRhdGUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtQnVmZmVyaW5nRXZlbnRQZW5kaW5nID0gZmFsc2U7CisKKyAgICBpZiAobUR1cmF0aW9uVXMgPj0gMCkgeworICAgICAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSBtUHJlZmV0Y2hlci0+Z2V0Q2FjaGVkRHVyYXRpb25VcygpOworICAgICAgICBpbnQ2NF90IHBvc2l0aW9uVXMgPSAwOworICAgICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgcG9zaXRpb25VcyA9IG1WaWRlb1RpbWVVczsKKyAgICAgICAgfSBlbHNlIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgcG9zaXRpb25VcyA9IG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lVXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgKz0gcG9zaXRpb25VczsKKworICAgICAgICBkb3VibGUgcGVyY2VudGFnZSA9IChkb3VibGUpY2FjaGVkRHVyYXRpb25VcyAvIG1EdXJhdGlvblVzOworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0JVRkZFUklOR19VUERBVEUsIHBlcmNlbnRhZ2UgKiAxMDAuMCk7CisKKyAgICAgICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKKyAgICB9Cit9CisKIHZvaWQgQXdlc29tZVBsYXllcjo6b25TdHJlYW1Eb25lKCkgewogICAgIC8vIFBvc3RlZCB3aGVuZXZlciBhbnkgc3RyZWFtIGZpbmlzaGVzIHBsYXlpbmcuCiAKQEAgLTM2MSw2ICs0MDEsOCBAQAogICAgICAgICBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7CiAgICAgfQogCisgICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNDE0LDcgKzQ1Niw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBjYW5jZWxQbGF5ZXJFdmVudHMoKTsKKyAgICBjYW5jZWxQbGF5ZXJFdmVudHModHJ1ZSAvKiBrZWVwQnVmZmVyaW5nR29pbmcgKi8pOwogCiAgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMKSB7CiAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKQEAgLTUxOCwxMSArNTYwLDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXRBdWRpb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0QXVkaW9Tb3VyY2Uoc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSkgewogICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBpZiAobVByZWZldGNoZXIgIT0gTlVMTCkgeworICAgICAgICBzb3VyY2UgPSBtUHJlZmV0Y2hlci0+YWRkU291cmNlKHNvdXJjZSk7CisgICAgfQorCiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOwogCiAgICAgY29uc3QgY2hhciAqbWltZTsKQEAgLTU0OSwxMSArNTk1LDE1IEBACiAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZSAhPSBOVUxMID8gT0sgOiBVTktOT1dOX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXRWaWRlb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0VmlkZW9Tb3VyY2Uoc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSkgewogICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBpZiAobVByZWZldGNoZXIgIT0gTlVMTCkgeworICAgICAgICBzb3VyY2UgPSBtUHJlZmV0Y2hlci0+YWRkU291cmNlKHNvdXJjZSk7CisgICAgfQorCiAgICAgbVZpZGVvU291cmNlID0gT01YQ29kZWM6OkNyZWF0ZSgKICAgICAgICAgICAgIG1DbGllbnQuaW50ZXJmYWNlKCksIHNvdXJjZS0+Z2V0Rm9ybWF0KCksCiAgICAgICAgICAgICBmYWxzZSwgLy8gY3JlYXRlRW5jb2RlcgpAQCAtNTgwLDkgKzYzMCwxMyBAQAogICAgIGlmIChjb2RlID09IDEpIHsKICAgICAgICAgb25TdHJlYW1Eb25lKCk7CiAgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMikgeworICAgICAgICBvbkJ1ZmZlcmluZ1VwZGF0ZSgpOworICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKwogICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IGZhbHNlOwogCiAgICAgaWYgKG1TZWVraW5nKSB7CkBAIC03MTgsNSArNzcyLDE3IEBACiAgICAgbVF1ZXVlLnBvc3RFdmVudChtU3RyZWFtRG9uZUV2ZW50KTsKIH0KIAordm9pZCBBd2Vzb21lUGxheWVyOjpwb3N0QnVmZmVyaW5nRXZlbnRfbCgpIHsKKyAgICBpZiAobVByZWZldGNoZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1CdWZmZXJpbmdFdmVudFBlbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyaW5nRXZlbnRQZW5kaW5nID0gdHJ1ZTsKKyAgICBtUXVldWUucG9zdEV2ZW50V2l0aERlbGF5KG1CdWZmZXJpbmdFdmVudCwgMTAwMDAwMGxsKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FjaGluZ0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FjaGluZ0RhdGFTb3VyY2UuY3BwCmluZGV4IDIzZjQ4OTcuLjhkMDRlYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhY2hpbmdEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5jcHAKQEAgLTY1LDYgKzY1LDEwIEBACiAgICAgcmV0dXJuIG1Tb3VyY2UtPmluaXRDaGVjaygpOwogfQogCit1aW50MzJfdCBDYWNoaW5nRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmZsYWdzKCk7Cit9CisKIHNzaXplX3QgQ2FjaGluZ0RhdGFTb3VyY2U6OnJlYWRBdChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUERhdGFTb3VyY2UuY3BwCmluZGV4IDdlOGJiYzYuLjEzNWEwNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQRGF0YVNvdXJjZS5jcHAKQEAgLTE5MCwzMCArMTkwLDEyIEBACiAgICAgbUh0dHAgPSBOVUxMOwogfQogCi1zc2l6ZV90IEhUVFBEYXRhU291cmNlOjpyZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgPj0gbUJ1ZmZlck9mZnNldAotICAgICAgICAgICAgJiYgb2Zmc2V0IDwgKG9mZl90KShtQnVmZmVyT2Zmc2V0ICsgbUJ1ZmZlckxlbmd0aCkpIHsKLSAgICAgICAgc2l6ZV90IG51bV9ieXRlc19hdmFpbGFibGUgPSBtQnVmZmVyTGVuZ3RoIC0gKG9mZnNldCAtIG1CdWZmZXJPZmZzZXQpOwotCi0gICAgICAgIHNpemVfdCBjb3B5ID0gbnVtX2J5dGVzX2F2YWlsYWJsZTsKLSAgICAgICAgaWYgKGNvcHkgPiBzaXplKSB7Ci0gICAgICAgICAgICBjb3B5ID0gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWNweShkYXRhLCAoY29uc3QgY2hhciAqKW1CdWZmZXIgKyAob2Zmc2V0IC0gbUJ1ZmZlck9mZnNldCksIGNvcHkpOwotCi0gICAgICAgIHJldHVybiBjb3B5OwotICAgIH0KLQotICAgIG1CdWZmZXJPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgbUJ1ZmZlckxlbmd0aCA9IDA7Ci0KK3NzaXplX3QgSFRUUERhdGFTb3VyY2U6OnNlbmRSYW5nZVJlcXVlc3Qoc2l6ZV90IG9mZnNldCkgewogICAgIGNoYXIgaG9zdFsxMjhdOwogICAgIHNwcmludGYoaG9zdCwgIkhvc3Q6ICVzXHJcbiIsIG1Ib3N0KTsKIAogICAgIGNoYXIgcmFuZ2VbMTI4XTsKLSAgICBzcHJpbnRmKHJhbmdlLCAiUmFuZ2U6IGJ5dGVzPSVsZC0lbGRcclxuXHJcbiIsCi0gICAgICAgICAgICBtQnVmZmVyT2Zmc2V0LCBtQnVmZmVyT2Zmc2V0ICsga0J1ZmZlclNpemUgLSAxKTsKKyAgICBzcHJpbnRmKHJhbmdlLCAiUmFuZ2U6IGJ5dGVzPSVkLVxyXG5cclxuIiwgb2Zmc2V0KTsKIAogICAgIGludCBodHRwX3N0YXR1czsKIApAQCAtMjUxLDEyICsyMzMsNDQgQEAKICAgICBjaGFyICplbmQ7CiAgICAgdW5zaWduZWQgbG9uZyBjb250ZW50TGVuZ3RoID0gc3RydG91bCh2YWx1ZS5jX3N0cigpLCAmZW5kLCAxMCk7CiAKLSAgICBzc2l6ZV90IG51bV9ieXRlc19yZWNlaXZlZCA9IG1IdHRwLT5yZWNlaXZlKG1CdWZmZXIsIGNvbnRlbnRMZW5ndGgpOworICAgIHJldHVybiBjb250ZW50TGVuZ3RoOworfQogCi0gICAgaWYgKG51bV9ieXRlc19yZWNlaXZlZCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBudW1fYnl0ZXNfcmVjZWl2ZWQ7Citzc2l6ZV90IEhUVFBEYXRhU291cmNlOjpyZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChvZmZzZXQgPj0gbUJ1ZmZlck9mZnNldAorICAgICAgICAgICAgJiYgb2Zmc2V0IDwgKG9mZl90KShtQnVmZmVyT2Zmc2V0ICsgbUJ1ZmZlckxlbmd0aCkpIHsKKyAgICAgICAgc2l6ZV90IG51bV9ieXRlc19hdmFpbGFibGUgPSBtQnVmZmVyTGVuZ3RoIC0gKG9mZnNldCAtIG1CdWZmZXJPZmZzZXQpOworCisgICAgICAgIHNpemVfdCBjb3B5ID0gbnVtX2J5dGVzX2F2YWlsYWJsZTsKKyAgICAgICAgaWYgKGNvcHkgPiBzaXplKSB7CisgICAgICAgICAgICBjb3B5ID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShkYXRhLCAoY29uc3QgY2hhciAqKW1CdWZmZXIgKyAob2Zmc2V0IC0gbUJ1ZmZlck9mZnNldCksIGNvcHkpOworCisgICAgICAgIHJldHVybiBjb3B5OwogICAgIH0KIAorICAgIHNzaXplX3QgY29udGVudExlbmd0aCA9IDA7CisgICAgaWYgKG1CdWZmZXJMZW5ndGggPD0gMCB8fCBvZmZzZXQgIT0gbUJ1ZmZlck9mZnNldCArIG1CdWZmZXJMZW5ndGgpIHsKKyAgICAgICAgbUh0dHAtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgY29udGVudExlbmd0aCA9IHNlbmRSYW5nZVJlcXVlc3Qob2Zmc2V0KTsKKworICAgICAgICBpZiAoY29udGVudExlbmd0aCA+IGtCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBjb250ZW50TGVuZ3RoID0ga0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb250ZW50TGVuZ3RoID0ga0J1ZmZlclNpemU7CisgICAgfQorCisgICAgbUJ1ZmZlck9mZnNldCA9IG9mZnNldDsKKworICAgIGlmIChjb250ZW50TGVuZ3RoIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRMZW5ndGg7CisgICAgfQorCisgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVjZWl2ZWQgPSBtSHR0cC0+cmVjZWl2ZShtQnVmZmVyLCBjb250ZW50TGVuZ3RoKTsKKwogICAgIG1CdWZmZXJMZW5ndGggPSAoc2l6ZV90KW51bV9ieXRlc19yZWNlaXZlZDsKIAogICAgIHNpemVfdCBjb3B5ID0gbUJ1ZmZlckxlbmd0aDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ByZWZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUHJlZmV0Y2hlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyOTk4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ByZWZldGNoZXIuY3BwCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJQcmVmZXRjaGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9QcmVmZXRjaGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFByZWZldGNoZWRTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworICAgIFByZWZldGNoZWRTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxQcmVmZXRjaGVyPiAmcHJlZmV0Y2hlciwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5QcmVmZXRjaGVkU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBQcmVmZXRjaGVyOworCisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisKKyAgICBzcDxQcmVmZXRjaGVyPiBtUHJlZmV0Y2hlcjsKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzaXplX3QgbUluZGV4OworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtUmVhY2hlZEVPUzsKKyAgICBpbnQ2NF90IG1TZWVrVGltZVVzOworICAgIGludDY0X3QgbUNhY2hlRHVyYXRpb25VczsKKworICAgIExpc3Q8TWVkaWFCdWZmZXIgKj4gbUNhY2hlZEJ1ZmZlcnM7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWZmIHNvdXJjZSBpcyBjdXJyZW50bHkgY2FjaGluZy4KKyAgICBib29sIGdldENhY2hlRHVyYXRpb25VcyhpbnQ2NF90ICpkdXJhdGlvblVzKTsKKworICAgIHZvaWQgdXBkYXRlQ2FjaGVEdXJhdGlvbl9sKCk7CisgICAgdm9pZCBjbGVhckNhY2hlX2woKTsKKworICAgIHZvaWQgY2FjaGVNb3JlKCk7CisKKyAgICBQcmVmZXRjaGVkU291cmNlKGNvbnN0IFByZWZldGNoZWRTb3VyY2UgJik7CisgICAgUHJlZmV0Y2hlZFNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IFByZWZldGNoZWRTb3VyY2UgJik7Cit9OworCitQcmVmZXRjaGVyOjpQcmVmZXRjaGVyKCkKKyAgICA6IG1Eb25lKGZhbHNlKSwKKyAgICAgIG1UaHJlYWRFeGl0ZWQoZmFsc2UpIHsKKyAgICBzdGFydFRocmVhZCgpOworfQorCitQcmVmZXRjaGVyOjp+UHJlZmV0Y2hlcigpIHsKKyAgICBzdG9wVGhyZWFkKCk7Cit9CisKK3NwPE1lZGlhU291cmNlPiBQcmVmZXRjaGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3A8UHJlZmV0Y2hlZFNvdXJjZT4gcHNvdXJjZSA9CisgICAgICAgIG5ldyBQcmVmZXRjaGVkU291cmNlKHRoaXMsIG1Tb3VyY2VzLnNpemUoKSwgc291cmNlKTsKKworICAgIG1Tb3VyY2VzLmFkZChwc291cmNlKTsKKworICAgIHJldHVybiBwc291cmNlOworfQorCit2b2lkIFByZWZldGNoZXI6OnN0YXJ0VGhyZWFkKCkgeworICAgIG1UaHJlYWRFeGl0ZWQgPSBmYWxzZTsKKyAgICBtRG9uZSA9IGZhbHNlOworCisgICAgaW50IHJlcyA9IGFuZHJvaWRDcmVhdGVUaHJlYWRFdGMoCisgICAgICAgICAgICBUaHJlYWRXcmFwcGVyLCB0aGlzLCAiUHJlZmV0Y2hlciIsCisgICAgICAgICAgICBBTkRST0lEX1BSSU9SSVRZX0RFRkFVTFQsIDAsICZtVGhyZWFkKTsKKworICAgIENIRUNLX0VRKHJlcywgMSk7Cit9CisKK3ZvaWQgUHJlZmV0Y2hlcjo6c3RvcFRocmVhZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgd2hpbGUgKCFtVGhyZWFkRXhpdGVkKSB7CisgICAgICAgIG1Eb25lID0gdHJ1ZTsKKyAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYworaW50IFByZWZldGNoZXI6OlRocmVhZFdyYXBwZXIodm9pZCAqbWUpIHsKKyAgICBzdGF0aWNfY2FzdDxQcmVmZXRjaGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIENhY2hlIGFib3V0IDEwc2VjcyBmb3IgZWFjaCBzb3VyY2UuCitzdGF0aWMgaW50NjRfdCBrTWF4Q2FjaGVEdXJhdGlvblVzID0gMTAwMDAwMDBsbDsKKwordm9pZCBQcmVmZXRjaGVyOjp0aHJlYWRGdW5jKCkgeworICAgIGZvciAoOzspIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1Eb25lKSB7CisgICAgICAgICAgICBtVGhyZWFkRXhpdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTG9jaywgMTAwMDAwMDBsbCk7CisKKyAgICAgICAgaW50NjRfdCBtaW5DYWNoZUR1cmF0aW9uVXMgPSAtMTsKKyAgICAgICAgc3NpemVfdCBtaW5JbmRleCA9IC0xOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxQcmVmZXRjaGVkU291cmNlPiBzb3VyY2UgPSBtU291cmNlc1tpXS5wcm9tb3RlKCk7CisKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQ2NF90IGNhY2hlRHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmICghc291cmNlLT5nZXRDYWNoZUR1cmF0aW9uVXMoJmNhY2hlRHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNhY2hlRHVyYXRpb25VcyA+PSBrTWF4Q2FjaGVEdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtaW5JbmRleCA8IDAgfHwgY2FjaGVEdXJhdGlvblVzIDwgbWluQ2FjaGVEdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgbWluQ2FjaGVEdXJhdGlvblVzID0gY2FjaGVEdXJhdGlvblVzOworICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtaW5JbmRleCA8IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3A8UHJlZmV0Y2hlZFNvdXJjZT4gc291cmNlID0gbVNvdXJjZXNbbWluSW5kZXhdLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzb3VyY2UtPmNhY2hlTW9yZSgpOworICAgICAgICB9CisgICAgfQorfQorCitpbnQ2NF90IFByZWZldGNoZXI6OmdldENhY2hlZER1cmF0aW9uVXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGludDY0X3QgbWluQ2FjaGVEdXJhdGlvblVzID0gLTE7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IC0xOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaW50NjRfdCBjYWNoZUR1cmF0aW9uVXM7CisgICAgICAgIHNwPFByZWZldGNoZWRTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2VzW2ldLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc291cmNlLT5nZXRDYWNoZUR1cmF0aW9uVXMoJmNhY2hlRHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNhY2hlRHVyYXRpb25VcyA+PSBrTWF4Q2FjaGVEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtaW5JbmRleCA8IDAgfHwgY2FjaGVEdXJhdGlvblVzIDwgbWluQ2FjaGVEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtaW5DYWNoZUR1cmF0aW9uVXMgPSBjYWNoZUR1cmF0aW9uVXM7CisgICAgICAgICAgICBtaW5JbmRleCA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbWluQ2FjaGVEdXJhdGlvblVzIDwgMCA/IDAgOiBtaW5DYWNoZUR1cmF0aW9uVXM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1ByZWZldGNoZWRTb3VyY2U6OlByZWZldGNoZWRTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPFByZWZldGNoZXI+ICZwcmVmZXRjaGVyLAorICAgICAgICBzaXplX3QgaW5kZXgsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQorICAgIDogbVByZWZldGNoZXIocHJlZmV0Y2hlciksCisgICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtSW5kZXgoaW5kZXgpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVJlYWNoZWRFT1MoZmFsc2UpLAorICAgICAgbVNlZWtUaW1lVXMoMCksCisgICAgICBtQ2FjaGVEdXJhdGlvblVzKDApIHsKK30KKworUHJlZmV0Y2hlZFNvdXJjZTo6flByZWZldGNoZWRTb3VyY2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFByZWZldGNoZWRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8vIEJ1ZmZlciAyIHNlY3Mgb24gc3RhcnR1cC4KKyAgICAgICAgaWYgKG1SZWFjaGVkRU9TIHx8IG1DYWNoZUR1cmF0aW9uVXMgPiAyMDAwMDAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBQcmVmZXRjaGVkU291cmNlOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBjbGVhckNhY2hlX2woKTsKKworICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0b3AoKTsKKworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBQcmVmZXRjaGVkU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDSyhtU3RhcnRlZCk7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgICAgICBDSEVDSyhzZWVrVGltZVVzID49IDApOworCisgICAgICAgIGNsZWFyQ2FjaGVfbCgpOworCisgICAgICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgICAgIG1TZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1SZWFjaGVkRU9TICYmIG1DYWNoZWRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICBpZiAobUNhY2hlZEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICAqb3V0ID0gKm1DYWNoZWRCdWZmZXJzLmJlZ2luKCk7CisgICAgbUNhY2hlZEJ1ZmZlcnMuZXJhc2UobUNhY2hlZEJ1ZmZlcnMuYmVnaW4oKSk7CisgICAgdXBkYXRlQ2FjaGVEdXJhdGlvbl9sKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBQcmVmZXRjaGVkU291cmNlOjpnZXRGb3JtYXQoKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZvcm1hdCgpOworfQorCitib29sIFByZWZldGNoZWRTb3VyY2U6OmdldENhY2hlRHVyYXRpb25VcyhpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmICghbVN0YXJ0ZWQgfHwgbVJlYWNoZWRFT1MpIHsKKyAgICAgICAgKmR1cmF0aW9uVXMgPSAwOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqZHVyYXRpb25VcyA9IG1DYWNoZUR1cmF0aW9uVXM7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQcmVmZXRjaGVkU291cmNlOjpjYWNoZU1vcmUoKSB7CisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TZWVrVGltZVVzID49IDApIHsKKyAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKKyAgICAgICAgICAgIG1TZWVrVGltZVVzID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlciwgJm9wdGlvbnMpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CisKKyAgICBNZWRpYUJ1ZmZlciAqY29weSA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICBtZW1jcHkoY29weS0+ZGF0YSgpLAorICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICBzcDxNZXRhRGF0YT4gZnJvbSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgc3A8TWV0YURhdGE+IHRvID0gY29weS0+bWV0YV9kYXRhKCk7CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBpZiAoZnJvbS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSkgeworICAgICAgICB0by0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgfQorCisgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgYnVmZmVyID0gTlVMTDsKKworICAgIG1DYWNoZWRCdWZmZXJzLnB1c2hfYmFjayhjb3B5KTsKKyAgICB1cGRhdGVDYWNoZUR1cmF0aW9uX2woKTsKKyAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOworfQorCit2b2lkIFByZWZldGNoZWRTb3VyY2U6OnVwZGF0ZUNhY2hlRHVyYXRpb25fbCgpIHsKKyAgICBpZiAobUNhY2hlZEJ1ZmZlcnMuc2l6ZSgpIDwgMikgeworICAgICAgICBtQ2FjaGVEdXJhdGlvblVzID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzLCBsYXN0VGltZVVzOworICAgICAgICBDSEVDSygoKm1DYWNoZWRCdWZmZXJzLmJlZ2luKCkpLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgJmZpcnN0VGltZVVzKSk7CisgICAgICAgIENIRUNLKCgqLS1tQ2FjaGVkQnVmZmVycy5lbmQoKSktPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAmbGFzdFRpbWVVcykpOworCisgICAgICAgIG1DYWNoZUR1cmF0aW9uVXMgPSBsYXN0VGltZVVzIC0gZmlyc3RUaW1lVXM7CisgICAgfQorfQorCit2b2lkIFByZWZldGNoZWRTb3VyY2U6OmNsZWFyQ2FjaGVfbCgpIHsKKyAgICBMaXN0PE1lZGlhQnVmZmVyICo+OjppdGVyYXRvciBpdCA9IG1DYWNoZWRCdWZmZXJzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1DYWNoZWRCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICgqaXQpLT5yZWxlYXNlKCk7CisKKyAgICAgICAgaXQgPSBtQ2FjaGVkQnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgdXBkYXRlQ2FjaGVEdXJhdGlvbl9sKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IGIyOGExMmMuLmMyZTQ2YzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC0yNiwxMCArMjYsMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQXVkaW9QbGF5ZXI7CiBzdHJ1Y3QgTWVkaWFCdWZmZXI7CiBzdHJ1Y3QgTWVkaWFFeHRyYWN0b3I7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7Ci1zdHJ1Y3QgQXVkaW9QbGF5ZXI7CitzdHJ1Y3QgUHJlZmV0Y2hlcjsKIHN0cnVjdCBUaW1lU291cmNlOwogCiBzdHJ1Y3QgQXdlc29tZVJlbmRlcmVyIDogcHVibGljIFJlZkJhc2UgewpAQCAtMTA5LDEzICsxMTAsMTggQEAKICAgICBib29sIG1WaWRlb0V2ZW50UGVuZGluZzsKICAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtU3RyZWFtRG9uZUV2ZW50OwogICAgIGJvb2wgbVN0cmVhbURvbmVFdmVudFBlbmRpbmc7CisgICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbUJ1ZmZlcmluZ0V2ZW50OworICAgIGJvb2wgbUJ1ZmZlcmluZ0V2ZW50UGVuZGluZzsKIAogICAgIHZvaWQgcG9zdFZpZGVvRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMgPSAtMSk7CisgICAgdm9pZCBwb3N0QnVmZmVyaW5nRXZlbnRfbCgpOwogICAgIHZvaWQgcG9zdFN0cmVhbURvbmVFdmVudF9sKCk7CiAKICAgICBNZWRpYUJ1ZmZlciAqbUxhc3RWaWRlb0J1ZmZlcjsKICAgICBNZWRpYUJ1ZmZlciAqbVZpZGVvQnVmZmVyOwogCisgICAgc3A8UHJlZmV0Y2hlcj4gbVByZWZldGNoZXI7CisKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woY29uc3Qgc3A8TWVkaWFFeHRyYWN0b3I+ICZleHRyYWN0b3IpOwogICAgIHZvaWQgcmVzZXRfbCgpOwogICAgIHN0YXR1c190IHNlZWtUb19sKGludDY0X3QgdGltZVVzKTsKQEAgLTEyMywxNyArMTI5LDE5IEBACiAgICAgdm9pZCBpbml0UmVuZGVyZXJfbCgpOwogICAgIHZvaWQgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOwogCi0gICAgdm9pZCBjYW5jZWxQbGF5ZXJFdmVudHMoKTsKKyAgICB2b2lkIGNhbmNlbFBsYXllckV2ZW50cyhib29sIGtlZXBCdWZmZXJpbmdHb2luZyA9IGZhbHNlKTsKIAotICAgIHN0YXR1c190IHNldEF1ZGlvU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKLSAgICBzdGF0dXNfdCBzZXRWaWRlb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgc3RhdHVzX3Qgc2V0QXVkaW9Tb3VyY2Uoc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSk7CisgICAgc3RhdHVzX3Qgc2V0VmlkZW9Tb3VyY2Uoc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSk7CiAKICAgICB2b2lkIG9uRXZlbnQoaW50MzJfdCBjb2RlKTsKIAogICAgIHN0YXRpYyB2b2lkIEF1ZGlvTm90aWZ5KHZvaWQgKm1lLCBpbnQgd2hhdCk7CiAgICAgdm9pZCBvblN0cmVhbURvbmUoKTsKIAotICAgIHZvaWQgbm90aWZ5TGlzdGVuZXJfbChpbnQgbXNnKTsKKyAgICB2b2lkIG5vdGlmeUxpc3RlbmVyX2woaW50IG1zZywgaW50IGV4dDEgPSAwKTsKKworICAgIHZvaWQgb25CdWZmZXJpbmdVcGRhdGUoKTsKIAogICAgIEF3ZXNvbWVQbGF5ZXIoY29uc3QgQXdlc29tZVBsYXllciAmKTsKICAgICBBd2Vzb21lUGxheWVyICZvcGVyYXRvcj0oY29uc3QgQXdlc29tZVBsYXllciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvUHJlZmV0Y2hlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9QcmVmZXRjaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5Nzc4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvUHJlZmV0Y2hlci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFBSRUZFVENIRVJfSF8KKworI2RlZmluZSBQUkVGRVRDSEVSX0hfCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYVNvdXJjZTsKK3N0cnVjdCBQcmVmZXRjaGVkU291cmNlOworCitzdHJ1Y3QgUHJlZmV0Y2hlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBQcmVmZXRjaGVyKCk7CisKKyAgICAvLyBHaXZlbiBhbiBleGlzdGluZyBNZWRpYVNvdXJjZSByZXR1cm5zIGEgbmV3IE1lZGlhU291cmNlCisgICAgLy8gdGhhdCB3aWxsIGJlbmVmaXQgZnJvbSBwcmVmZXRjaGluZy9jYWNoaW5nIHRoZSBvcmlnaW5hbCBvbmUuCisgICAgc3A8TWVkaWFTb3VyY2U+IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICBpbnQ2NF90IGdldENhY2hlZER1cmF0aW9uVXMoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflByZWZldGNoZXIoKTsKKworcHJpdmF0ZToKKyAgICBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKKworICAgIFZlY3Rvcjx3cDxQcmVmZXRjaGVkU291cmNlPiA+IG1Tb3VyY2VzOworICAgIGFuZHJvaWRfdGhyZWFkX2lkX3QgbVRocmVhZDsKKyAgICBib29sIG1Eb25lOworICAgIGJvb2wgbVRocmVhZEV4aXRlZDsKKworICAgIHZvaWQgc3RhcnRUaHJlYWQoKTsKKyAgICB2b2lkIHN0b3BUaHJlYWQoKTsKKworICAgIHN0YXRpYyBpbnQgVGhyZWFkV3JhcHBlcih2b2lkICptZSk7CisgICAgdm9pZCB0aHJlYWRGdW5jKCk7CisKKyAgICBQcmVmZXRjaGVyKGNvbnN0IFByZWZldGNoZXIgJik7CisgICAgUHJlZmV0Y2hlciAmb3BlcmF0b3I9KGNvbnN0IFByZWZldGNoZXIgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFBSRUZFVENIRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L01lZGlhTmFtZXMuamF2YSBiL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L01lZGlhTmFtZXMuamF2YQppbmRleCA1MTI3MjU1Li42MDg3MjY4IDEwMDc1NQotLS0gYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9NZWRpYU5hbWVzLmphdmEKKysrIGIvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvTWVkaWFOYW1lcy5qYXZhCkBAIC0yNzQsNiArMjc0LDcgQEAKICAgICAvL3ZpZGVvIHRodW1ibmFpbAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CTkFJTF9PVVRQVVQgPSAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9UaHVtYm5haWwucG5nIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT0xERU5fVEhVTUJOQUlMX09VVFBVVCA9ICIvc2RjYXJkL21lZGlhX2FwaS9nb2xkZW5UaHVtYm5haWwucG5nIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT0xERU5fVEhVTUJOQUlMX09VVFBVVF8yID0gIi9zZGNhcmQvbWVkaWFfYXBpL2dvbGRlblRodW1ibmFpbDIucG5nIjsKICAgICAKICAgICAvL01ldGFkYXRhIFV0aWxpdHkKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRIVU1CTkFJTF9DQVBUVVJFX1RFU1RfRklMRVMgPSB7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9mdW5jdGlvbmFsL01lZGlhUGxheWVyQXBpVGVzdC5qYXZhIGIvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvZnVuY3Rpb25hbC9NZWRpYVBsYXllckFwaVRlc3QuamF2YQppbmRleCA0ZTMwZjkxLi5lZTYwNjdhYiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvZnVuY3Rpb25hbC9NZWRpYVBsYXllckFwaVRlc3QuamF2YQorKysgYi9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9mdW5jdGlvbmFsL01lZGlhUGxheWVyQXBpVGVzdC5qYXZhCkBAIC00MjAsNyArNDIwLDcgQEAKICAgCiAgICAgQExhcmdlVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUaHVtYm5haWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgIGJvb2xlYW4gZ2V0VGh1bWJuYWlsID0gQ29kZWNUZXN0LmdldFRodW1ibmFpbChNZWRpYU5hbWVzLlZJREVPX0gyNjRfQUFDLCBNZWRpYU5hbWVzLkdPTERFTl9USFVNQk5BSUxfT1VUUFVUKTsKKyAgICAgIGJvb2xlYW4gZ2V0VGh1bWJuYWlsID0gQ29kZWNUZXN0LmdldFRodW1ibmFpbChNZWRpYU5hbWVzLlZJREVPX0gyNjRfQUFDLCBNZWRpYU5hbWVzLkdPTERFTl9USFVNQk5BSUxfT1VUUFVUXzIpOwogICAgICAgYXNzZXJ0VHJ1ZSgiR2V0IFRodW1ibmFpbCIsIGdldFRodW1ibmFpbCk7ICAgICAgICAgCiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvQW5kcm9pZC5tayBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmYxZDZhYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBEZWZhdWx0Q29udGFpbmVyU2VydmljZQorCitMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZkNzcxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmRlZmNvbnRhaW5lciI+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfRE9XTkxPQURfTUFOQUdFUiIvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6cHJvY2Vzcz0iZGVmLmNvbnRhaW5lci5zZXJ2aWNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3NlcnZpY2VfbmFtZSI+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSIuRGVmYXVsdENvbnRhaW5lclNlcnZpY2UiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQ09QWV9QUk9URUNURURfREFUQSIvPgorICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk3ZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBzZXJ2aWNlIG5hbWUgIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZV9uYW1lIj5NZWRpYSBDb250YWluZXIgU2VydmljZTwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9zcmMvY29tL2FuZHJvaWQvZGVmY29udGFpbmVyL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9zcmMvY29tL2FuZHJvaWQvZGVmY29udGFpbmVyL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM2MjA3YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3NyYy9jb20vYW5kcm9pZC9kZWZjb250YWluZXIvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDMwNSBAQAorcGFja2FnZSBjb20uYW5kcm9pZC5kZWZjb250YWluZXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSU1lZGlhQ29udGFpbmVyU2VydmljZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSU1vdW50U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CisKKworLyoKKyAqIFRoaXMgc2VydmljZSBjb3BpZXMgYSBkb3dubG9hZGVkIGFwayB0byBhIGZpbGUgcGFzc2VkIGluIGFzCisgKiBhIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9yIHRvIGEgbmV3bHkgY3JlYXRlZCBjb250YWluZXIgc3BlY2lmaWVkCisgKiBieSBwYXJhbWV0ZXJzLiBUaGUgRG93bmxvYWRNYW5hZ2VyIGdpdmVzIGFjY2VzcyB0byB0aGlzIHByb2Nlc3MKKyAqIGJhc2VkIG9uIGl0cyB1aWQuIFRoaXMgcHJvY2VzcyBhbHNvIG5lZWRzIHRoZSBBQ0NFU1NfRE9XTkxPQURfTUFOQUdFUgorICogcGVybWlzc2lvbiB0byBhY2Nlc3MgYXBrcyBkb3dubG9hZGVkIHZpYSB0aGUgZG93bmxvYWQgbWFuYWdlci4KKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRDb250YWluZXJTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZWZDb250YWluZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWID0gZmFsc2U7CisKKyAgICBwcml2YXRlIElNZWRpYUNvbnRhaW5lclNlcnZpY2UuU3R1YiBtQmluZGVyID0gbmV3IElNZWRpYUNvbnRhaW5lclNlcnZpY2UuU3R1YigpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgYW5kIGNvcGllcyByZXNvdXJjZSB0aGVyZS4KKyAgICAgICAgICogQHBhcmFtIHBhYWNrYWdlVVJJIHRoZSB1cmkgb2YgcmVzb3VyY2UgdG8gYmUgY29waWVkLiBDYW4gYmUgZWl0aGVyCisgICAgICAgICAqIGEgY29udGVudCB1cmkgb3IgYSBmaWxlIHVyaQorICAgICAgICAgKiBAcGFyYW0gY29udGFpbmVySWQgdGhlIGlkIG9mIHRoZSBzZWN1cmUgY29udGFpbmVyIHRoYXQgc2hvdWxkCisgICAgICAgICAqIGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgc2VjdXJlIGNvbnRhaW5lciBpbnRvIHdoaWNoIHRoZSByZXNvdXJjZQorICAgICAgICAgKiB3aWxsIGJlIGNvcGllZC4KKyAgICAgICAgICogQHBhcmFtIGtleSBSZWZlcnMgdG8ga2V5IHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIHNlY3VyZSBjb250YWluZXIKKyAgICAgICAgICogQHBhcmFtIHJlc0ZpbGVOYW1lIE5hbWUgb2YgdGhlIHRhcmdldCByZXNvdXJjZSBmaWxlKHJlbGF0aXZlIHRvIG5ld2x5CisgICAgICAgICAqIGNyZWF0ZWQgc2VjdXJlIGNvbnRhaW5lcikKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuZXcgY2FjaGUgcGF0aCB3aGVyZSB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gY29waWVkIGludG8KKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY29weVJlc291cmNlVG9Db250YWluZXIoZmluYWwgVXJpIHBhY2thZ2VVUkksCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRhaW5lcklkLAorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFN0cmluZyByZXNGaWxlTmFtZSkgeworICAgICAgICAgICAgaWYgKHBhY2thZ2VVUkkgPT0gbnVsbCB8fCBjb250YWluZXJJZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29weVJlc291cmNlSW5uZXIocGFja2FnZVVSSSwgY29udGFpbmVySWQsIGtleSwgcmVzRmlsZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSBzcGVjaWZpZWQgcmVzb3VyY2UgdG8gb3V0cHV0IHN0cmVhbQorICAgICAgICAgKiBAcGFyYW0gcGFja2FnZVVSSSB0aGUgdXJpIG9mIHJlc291cmNlIHRvIGJlIGNvcGllZC4gU2hvdWxkIGJlIGEKKyAgICAgICAgICogZmlsZSB1cmkKKyAgICAgICAgICogQHBhcmFtIG91dFN0cmVhbSBSZW1vdGUgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIHVzZWQgZm9yIGNvcHlpbmcKKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgY29weSBzdWNjZWRlZCBvciBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb3B5UmVzb3VyY2UoZmluYWwgVXJpIHBhY2thZ2VVUkksCisgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3V0U3RyZWFtKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZVVSSSA9PSBudWxsIHx8ICBvdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZU91dHB1dFN0cmVhbQorICAgICAgICAgICAgYXV0b091dCA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBjb3B5RmlsZShwYWNrYWdlVVJJLCBhdXRvT3V0KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbUJpbmRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIElNb3VudFNlcnZpY2UgZ2V0TW91bnRTZXJ2aWNlKCkgeworICAgICAgICByZXR1cm4gSU1vdW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoIm1vdW50IikpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNvcHlSZXNvdXJjZUlubmVyKFVyaSBwYWNrYWdlVVJJLCBTdHJpbmcgbmV3Q2FjaGVJZCwgU3RyaW5nIGtleSwgU3RyaW5nIHJlc0ZpbGVOYW1lKSB7CisgICAgICAgIC8vIENyZWF0ZSBuZXcgY29udGFpbmVyIGF0IG5ld0NhY2hlUGF0aAorICAgICAgICBTdHJpbmcgY29kZVBhdGggPSBwYWNrYWdlVVJJLmdldFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIG5ld0NhY2hlUGF0aCA9IG51bGw7CisgICAgICAgIGZpbmFsIGludCBDUkVBVEVfRkFJTEVEID0gMTsKKyAgICAgICAgZmluYWwgaW50IENPUFlfRkFJTEVEID0gMjsKKyAgICAgICAgZmluYWwgaW50IEZJTkFMSVpFX0ZBSUxFRCA9IDM7CisgICAgICAgIGZpbmFsIGludCBQQVNTID0gNDsKKyAgICAgICAgaW50IGVyckNvZGUgPSBDUkVBVEVfRkFJTEVEOworICAgICAgICAvLyBDcmVhdGUgbmV3IGNvbnRhaW5lcgorICAgICAgICBpZiAoKG5ld0NhY2hlUGF0aCA9IGNyZWF0ZVNkRGlyKHBhY2thZ2VVUkksIG5ld0NhY2hlSWQsIGtleSkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGUgcmVzRmlsZSA9IG5ldyBGaWxlKG5ld0NhY2hlUGF0aCwgcmVzRmlsZU5hbWUpOworICAgICAgICAgICAgZXJyQ29kZSA9IENPUFlfRkFJTEVEOworICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgTG9nLmkoVEFHLCAiVHJ5aW5nIHRvIGNvcHkgIiArIGNvZGVQYXRoICsgIiB0byAiICsgcmVzRmlsZSk7CisgICAgICAgICAgICAvLyBDb3B5IGZpbGUgZnJvbSBjb2RlUGF0aAorICAgICAgICAgICAgaWYgKEZpbGVVdGlscy5jb3B5RmlsZShuZXcgRmlsZShjb2RlUGF0aCksIHJlc0ZpbGUpKSB7CisgICAgICAgICAgICAgICAgZXJyQ29kZSA9IEZJTkFMSVpFX0ZBSUxFRDsKKyAgICAgICAgICAgICAgICBpZiAoZmluYWxpemVTZERpcihuZXdDYWNoZUlkKSkgeworICAgICAgICAgICAgICAgICAgICBlcnJDb2RlID0gUEFTUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gUHJpbnQgZXJyb3IgYmFzZWQgb24gZXJyQ29kZQorICAgICAgICBTdHJpbmcgZXJyTXNnID0gIiI7CisgICAgICAgIHN3aXRjaCAoZXJyQ29kZSkgeworICAgICAgICAgICAgY2FzZSBDUkVBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgIGVyck1zZyA9ICJDUkVBVEVfRkFJTEVEIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09QWV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgZXJyTXNnID0gIkNPUFlfRkFJTEVEIjsKKyAgICAgICAgICAgICAgICBkZXN0cm95U2REaXIobmV3Q2FjaGVJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZJTkFMSVpFX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICBlcnJNc2cgPSAiRklOQUxJWkVfRkFJTEVEIjsKKyAgICAgICAgICAgICAgICBkZXN0cm95U2REaXIobmV3Q2FjaGVJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGVyck1zZyA9ICJQQVNTIjsKKyAgICAgICAgICAgICAgICB1bk1vdW50U2REaXIobmV3Q2FjaGVJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgTG9nLmkoVEFHLCAiU3RhdHVzOiAiICsgZXJyTXNnKTsKKyAgICAgICAgaWYgKGVyckNvZGUgIT0gUEFTUykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld0NhY2hlUGF0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVTZERpcihmaW5hbCBVcmkgcGFja2FnZVVSSSwKKyAgICAgICAgICAgIFN0cmluZyBjb250YWluZXJJZCwgU3RyaW5nIHNkRW5jS2V5KSB7CisgICAgICAgIEZpbGUgdG1wUGFja2FnZUZpbGUgPSBuZXcgRmlsZShwYWNrYWdlVVJJLmdldFBhdGgoKSk7CisgICAgICAgIC8vIENyZWF0ZSBtb3VudCBwb2ludCB2aWEgTW91bnRTZXJ2aWNlCisgICAgICAgIElNb3VudFNlcnZpY2UgbW91bnRTZXJ2aWNlID0gZ2V0TW91bnRTZXJ2aWNlKCk7CisgICAgICAgIGxvbmcgbGVuID0gdG1wUGFja2FnZUZpbGUubGVuZ3RoKCk7CisgICAgICAgIGludCBtYkxlbiA9IChpbnQpIChsZW4vKDEwMjQqMTAyNCkpOworICAgICAgICBpZiAoKGxlbiAtIChtYkxlbiAqIDEwMjQgKiAxMDI0KSkgPiAwKSB7CisgICAgICAgICAgICBtYkxlbisrOworICAgICAgICB9CisgICAgICAgIGlmIChsb2NhbExPR1YpIExvZy5pKFRBRywgIm1iTGVuPSIrbWJMZW4pOworICAgICAgICBTdHJpbmcgY2FjaGVQYXRoID0gbnVsbDsKKyAgICAgICAgaW50IG93bmVyVWlkID0gUHJvY2Vzcy5teVVpZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2FjaGVQYXRoID0gbW91bnRTZXJ2aWNlLmNyZWF0ZVNlY3VyZUNvbnRhaW5lcihjb250YWluZXJJZCwKKyAgICAgICAgICAgICAgICBtYkxlbiwKKyAgICAgICAgICAgICAgICAidmZhdCIsIHNkRW5jS2V5LCBvd25lclVpZCk7CisgICAgICAgICAgICBpZiAobG9jYWxMT0dWKSBMb2cuaShUQUcsICJUcnlpbmcgdG8gY3JlYXRlIHNlY3VyZSBjb250YWluZXIgZm9yICAiCisgICAgICAgICAgICAgICAgICAgICsgY29udGFpbmVySWQgKyAiLCBjYWNoZVBhdGggPSIgKyBjYWNoZVBhdGgpOworICAgICAgICAgICAgcmV0dXJuIGNhY2hlUGF0aDsKKyAgICAgICAgfSBjYXRjaChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGNyZWF0ZSBzdG9yYWdlIG9uIHNkY2FyZCB3aXRoIGV4Y2VwdGlvbjogIiArIGUpOworICAgICAgICB9IGNhdGNoKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJNb3VudGVTZXJ2aWNlIG5vdCBydW5uaW5nPyIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyBqdXN0IGZhaWwgaGVyZSBhbmQgbGV0IHRoZSB1c2VyIGRlbGV0ZSBsYXRlciBvbi4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1vdW50U2VydmljZS5kZXN0cm95U2VjdXJlQ29udGFpbmVyKGNvbnRhaW5lcklkKTsKKyAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIExvZy5pKFRBRywgIkRlc3Ryb3lpbmcgY2FjaGUgZm9yICIgKyBjb250YWluZXJJZAorICAgICAgICAgICAgICAgICAgICArICIsIGNhY2hlUGF0aCA9IiArIGNhY2hlUGF0aCk7CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBkZXN0cm95IGV4aXN0aW5nIGNhY2hlOiAiICsgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTW91bnRlU2VydmljZSBub3QgcnVubmluZz8iKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhY2hlUGF0aCA9IG1vdW50U2VydmljZS5jcmVhdGVTZWN1cmVDb250YWluZXIoY29udGFpbmVySWQsCisgICAgICAgICAgICAgICAgbWJMZW4sCisgICAgICAgICAgICAgICAgInZmYXQiLCBzZEVuY0tleSwgb3duZXJVaWQpOworICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgTG9nLmkoVEFHLCAiVHJ5aW5nIHRvIGluc3RhbGwgYWdhaW4gIiArIGNvbnRhaW5lcklkCisgICAgICAgICAgICAgICAgICAgKyAiLCBjYWNoZVBhdGggPSIgKyBjYWNoZVBhdGgpOworICAgICAgICAgICAgcmV0dXJuIGNhY2hlUGF0aDsKKyAgICAgICAgfSBjYXRjaChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGNyZWF0ZSBzdG9yYWdlIG9uIHNkY2FyZCB3aXRoIGV4Y2VwdGlvbjogIiArIGUpOworICAgICAgICB9IGNhdGNoKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJNb3VudGVTZXJ2aWNlIG5vdCBydW5uaW5nPyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBkZXN0cm95U2REaXIoU3RyaW5nIGNvbnRhaW5lcklkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRlc3Ryb3kgcmlnaHQgYXdheQorICAgICAgICAgICAgZ2V0TW91bnRTZXJ2aWNlKCkuZGVzdHJveVNlY3VyZUNvbnRhaW5lcihjb250YWluZXJJZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkZhaWxlZCB0byBkZXN0cm95IGNvbnRhaW5lciA6ICIgKyBjb250YWluZXJJZCk7CisgICAgICAgIH0gY2F0Y2goUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk1vdW50ZVNlcnZpY2Ugbm90IHJ1bm5pbmc/Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBmaW5hbGl6ZVNkRGlyKFN0cmluZyBjb250YWluZXJJZCl7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRNb3VudFNlcnZpY2UoKS5maW5hbGl6ZVNlY3VyZUNvbnRhaW5lcihjb250YWluZXJJZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkZhaWxlZCB0byBmaW5hbGl6ZSBjb250YWluZXIgZm9yIHBrZyA6ICIgKyBjb250YWluZXJJZCk7CisgICAgICAgIH0gY2F0Y2goUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk1vdW50ZVNlcnZpY2Ugbm90IHJ1bm5pbmc/Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB1bk1vdW50U2REaXIoU3RyaW5nIGNvbnRhaW5lcklkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnZXRNb3VudFNlcnZpY2UoKS51bm1vdW50U2VjdXJlQ29udGFpbmVyKGNvbnRhaW5lcklkKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVubW91bnQgaWQ6ICAiICsgY29udGFpbmVySWQgKyAiIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfSBjYXRjaChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTW91bnRlU2VydmljZSBub3QgcnVubmluZz8iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbW91bnRTZERpcihTdHJpbmcgY29udGFpbmVySWQsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRNb3VudFNlcnZpY2UoKS5tb3VudFNlY3VyZUNvbnRhaW5lcihjb250YWluZXJJZCwga2V5LCBQcm9jZXNzLm15VWlkKCkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIG1vdW50IGlkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVySWQgKyAiIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfSBjYXRjaChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTW91bnRlU2VydmljZSBub3QgcnVubmluZz8iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weVRvRmlsZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRmlsZU91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IGlucHV0U3RyZWFtLnJlYWQoYnVmZmVyKSkgPj0gMCkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiRXhjZXB0aW9uIDogIiArIGUgKyAiIHdoZW4gY29weWluZyBmaWxlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weVRvRmlsZShGaWxlIHNyY0ZpbGUsIEZpbGVPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKTsKKyAgICAgICAgICAgIHJldHVybiBjb3B5VG9GaWxlKGlucHV0U3RyZWFtLCBvdXQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeyBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgaW5wdXRTdHJlYW0uY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgIGJvb2xlYW4gY29weUZpbGUoVXJpIHBQYWNrYWdlVVJJLCBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSkgeworICAgICAgICBpZiAocFBhY2thZ2VVUkkuZ2V0U2NoZW1lKCkuZXF1YWxzKCJmaWxlIikpIHsKKyAgICAgICAgICAgIGZpbmFsIEZpbGUgc3JjUGFja2FnZUZpbGUgPSBuZXcgRmlsZShwUGFja2FnZVVSSS5nZXRQYXRoKCkpOworICAgICAgICAgICAgLy8gV2UgY29weSB0aGUgc291cmNlIHBhY2thZ2UgZmlsZSB0byBhIHRlbXAgZmlsZSBhbmQgdGhlbiByZW5hbWUgaXQgdG8gdGhlCisgICAgICAgICAgICAvLyBkZXN0aW5hdGlvbiBmaWxlIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSBhIHdpbmRvdyB3aGVyZSB0aGUgcGFja2FnZSBkaXJlY3RvcnkKKyAgICAgICAgICAgIC8vIHNjYW5uZXIgbm90aWNlcyB0aGUgbmV3IHBhY2thZ2UgZmlsZSBidXQgaXQncyBub3QgY29tcGxldGVseSBjb3BpZWQgeWV0LgorICAgICAgICAgICAgaWYgKCFjb3B5VG9GaWxlKHNyY1BhY2thZ2VGaWxlLCBvdXRTdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGRuJ3QgY29weSBmaWxlOiAiICsgc3JjUGFja2FnZUZpbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwUGFja2FnZVVSSS5nZXRTY2hlbWUoKS5lcXVhbHMoImNvbnRlbnQiKSkgeworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmZCA9IGdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5GaWxlRGVzY3JpcHRvcihwUGFja2FnZVVSSSwgInIiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGRuJ3Qgb3BlbiBmaWxlIGRlc2NyaXB0b3IgZnJvbSBkb3dubG9hZCBzZXJ2aWNlLiBGYWlsZWQgd2l0aCBleGNlcHRpb24gIiArIGUpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGRuJ3Qgb3BlbiBmaWxlIGRlc2NyaXB0b3IgZnJvbSBkb3dubG9hZCBzZXJ2aWNlIChudWxsKS4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiT3BlbmVkIGZpbGUgZGVzY3JpcHRvciBmcm9tIGRvd25sb2FkIHNlcnZpY2UuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgZGxTdHJlYW0gPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IuQXV0b0Nsb3NlSW5wdXRTdHJlYW0oZmQpOworICAgICAgICAgICAgICAgIC8vIFdlIGNvcHkgdGhlIHNvdXJjZSBwYWNrYWdlIGZpbGUgdG8gYSB0ZW1wIGZpbGUgYW5kIHRoZW4gcmVuYW1lIGl0IHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIGZpbGUgaW4gb3JkZXIgdG8gZWxpbWluYXRlIGEgd2luZG93IHdoZXJlIHRoZSBwYWNrYWdlIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIC8vIHNjYW5uZXIgbm90aWNlcyB0aGUgbmV3IHBhY2thZ2UgZmlsZSBidXQgaXQncyBub3QgY29tcGxldGVseSBjb3BpZWQgeWV0LgorICAgICAgICAgICAgICAgIGlmICghY29weVRvRmlsZShkbFN0cmVhbSwgb3V0U3RyZWFtKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZG4ndCBjb3B5ICIgKyBwUGFja2FnZVVSSSArICIgdG8gdGVtcCBmaWxlLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGFja2FnZSBVUkkgaXMgbm90ICdmaWxlOicgb3IgJ2NvbnRlbnQ6JyAtICIgKyBwUGFja2FnZVVSSSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcHJlbG9hZGVkLWNsYXNzZXMgYi9wcmVsb2FkZWQtY2xhc3NlcwppbmRleCA5MGJiYjM3Li5kMTA4ODgzIDEwMDY0NAotLS0gYS9wcmVsb2FkZWQtY2xhc3NlcworKysgYi9wcmVsb2FkZWQtY2xhc3NlcwpAQCAtNjk0LDkgKzY5NCw3IEBACiBjb20uaWJtLmljdTRqbmkuY2hhcnNldC5DaGFyc2V0RW5jb2RlcklDVQogY29tLmlibS5pY3U0am5pLmNoYXJzZXQuQ2hhcnNldElDVQogY29tLmlibS5pY3U0am5pLnRleHQuQ29sbGF0aW9uQXR0cmlidXRlCi1jb20uaWJtLmljdTRqbmkudGV4dC5EZWNpbWFsRm9ybWF0Ci1jb20uaWJtLmljdTRqbmkudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scwotY29tLmlibS5pY3U0am5pLnRleHQuTmF0aXZlRGVjaW1hbEZvcm1hdCRVTnVtYmVyRm9ybWF0QXR0cmlidXRlCitjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVEZWNpbWFsRm9ybWF0CiBjb20uaWJtLmljdTRqbmkudGV4dC5SdWxlQmFzZWRDb2xsYXRvcgogY29tLmlibS5pY3U0am5pLnV0aWwuUmVzb3VyY2VzJERlZmF1bHRUaW1lWm9uZXMKIGRhbHZpay5zeXN0ZW0uRGV4RmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQm9vdFJlY2VpdmVyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Cb290UmVjZWl2ZXIuamF2YQppbmRleCBkZWJiYmI0Li5mYmI0NDExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Cb290UmVjZWl2ZXIuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Cb290UmVjZWl2ZXIuamF2YQpAQCAtODksMTQgKzg5LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICBsb2dCb290RmlsZShjciwgZGIsICIvY2FjaGUvcmVjb3ZlcnkvbG9nIiwgIlNZU1RFTV9SRUNPVkVSWV9MT0ciKTsKLSAgICAgICAgbG9nQm9vdEZpbGUoY3IsIGRiLCAiL3Byb2MvbGFzdF9rbXNnIiwgIlNZU1RFTV9MQVNUX0tNU0ciKTsKLSAgICAgICAgbG9nQm9vdEZpbGUoY3IsIGRiLCAiL2RhdGEvZG9udHBhbmljL2FwYW5pY19jb25zb2xlIiwgIkFQQU5JQ19DT05TT0xFIik7Ci0gICAgICAgIGxvZ0Jvb3RGaWxlKGNyLCBkYiwgIi9kYXRhL2RvbnRwYW5pYy9hcGFuaWNfdGhyZWFkcyIsICJBUEFOSUNfVEhSRUFEUyIpOworICAgICAgICBsb2dCb290RmlsZShjciwgZGIsIHByb3BzLCAiL2NhY2hlL3JlY292ZXJ5L2xvZyIsICJTWVNURU1fUkVDT1ZFUllfTE9HIik7CisgICAgICAgIGxvZ0Jvb3RGaWxlKGNyLCBkYiwgcHJvcHMsICIvcHJvYy9sYXN0X2ttc2ciLCAiU1lTVEVNX0xBU1RfS01TRyIpOworICAgICAgICBsb2dCb290RmlsZShjciwgZGIsIHByb3BzLCAiL2RhdGEvZG9udHBhbmljL2FwYW5pY19jb25zb2xlIiwgIkFQQU5JQ19DT05TT0xFIik7CisgICAgICAgIGxvZ0Jvb3RGaWxlKGNyLCBkYiwgcHJvcHMsICIvZGF0YS9kb250cGFuaWMvYXBhbmljX3RocmVhZHMiLCAiQVBBTklDX1RIUkVBRFMiKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgbG9nQm9vdEZpbGUoQ29udGVudFJlc29sdmVyIGNyLCBEcm9wQm94TWFuYWdlciBkYiwgU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGFnKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgbG9nQm9vdEZpbGUoQ29udGVudFJlc29sdmVyIGNyLCBEcm9wQm94TWFuYWdlciBkYiwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBoZWFkZXJzLCBTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChjciA9PSBudWxsIHx8IGRiID09IG51bGwgfHwgIWRiLmlzVGFnRW5hYmxlZCh0YWcpKSByZXR1cm47ICAvLyBMb2dnaW5nIGRpc2FibGVkCiAKICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwpAQCAtMTA4LDEwICsxMDgsOCBAQAogICAgICAgICBpZiAobGFzdFRpbWUgPT0gZmlsZVRpbWUpIHJldHVybjsgIC8vIEFscmVhZHkgbG9nZ2VkIHRoaXMgcGFydGljdWxhciBmaWxlCiAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRMb25nKGNyLCBzZXR0aW5nLCBmaWxlVGltZSk7CiAKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXBvcnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXBvcnQuYXBwZW5kKCJCdWlsZDogIikuYXBwZW5kKEJ1aWxkLkZJTkdFUlBSSU5UKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgIHJlcG9ydC5hcHBlbmQoIktlcm5lbDogIik7Ci0gICAgICAgIHJlcG9ydC5hcHBlbmQoRmlsZVV0aWxzLnJlYWRUZXh0RmlsZShuZXcgRmlsZSgiL3Byb2MvdmVyc2lvbiIpLCAxMDI0LCAiLi4uXG4iKSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVwb3J0ID0gbmV3IFN0cmluZ0J1aWxkZXIoaGVhZGVycyk7CisgICAgICAgIHJlcG9ydC5hcHBlbmQoIlxuIik7CiAgICAgICAgIHJlcG9ydC5hcHBlbmQoRmlsZVV0aWxzLnJlYWRUZXh0RmlsZShuZXcgRmlsZShmaWxlbmFtZSksIExPR19TSVpFLCAiW1tUUlVOQ0FURURdXVxuIikpOwogICAgICAgICBkYi5hZGRUZXh0KHRhZywgcmVwb3J0LnRvU3RyaW5nKCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGZiZDUzMTcuLmViZDZmM2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjMsMTkgKzIzLDIzIEBACiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOwogCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuRGV2aWNlQWRtaW47CiBpbXBvcnQgYW5kcm9pZC5hcHAuRGV2aWNlQWRtaW5JbmZvOwogaW1wb3J0IGFuZHJvaWQuYXBwLkRldmljZVBvbGljeU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSURldmljZVBvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSVBvd2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlY292ZXJ5U3lzdGVtOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlQ2FsbGJhY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNjQsMTYgKzY4LDY4IEBACiAgICAgQWN0aXZlQWRtaW4gbUFjdGl2ZUFkbWluOwogICAgIAogICAgIHN0YXRpYyBjbGFzcyBBY3RpdmVBZG1pbiB7Ci0gICAgICAgIEFjdGl2ZUFkbWluKERldmljZUFkbWluSW5mbyBfaW5mbykgewotICAgICAgICAgICAgaW5mbyA9IF9pbmZvOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICBmaW5hbCBEZXZpY2VBZG1pbkluZm8gaW5mbzsKLSAgICAgICAgaW50IGdldFVpZCgpIHsgcmV0dXJuIGluZm8uZ2V0QWN0aXZpdHlJbmZvKCkuYXBwbGljYXRpb25JbmZvLnVpZDsgfQogICAgICAgICAKICAgICAgICAgaW50IHBhc3N3b3JkTW9kZSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfTU9ERV9VTlNQRUNJRklFRDsKICAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZExlbmd0aCA9IDA7CiAgICAgICAgIGxvbmcgbWF4aW11bVRpbWVUb1VubG9jayA9IDA7CisgICAgICAgIGludCBtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA9IDA7CisgICAgICAgIAorICAgICAgICBBY3RpdmVBZG1pbihEZXZpY2VBZG1pbkluZm8gX2luZm8pIHsKKyAgICAgICAgICAgIGluZm8gPSBfaW5mbzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IGdldFVpZCgpIHsgcmV0dXJuIGluZm8uZ2V0QWN0aXZpdHlJbmZvKCkuYXBwbGljYXRpb25JbmZvLnVpZDsgfQorICAgICAgICAKKyAgICAgICAgdm9pZCB3cml0ZVRvWG1sKFhtbFNlcmlhbGl6ZXIgb3V0KQorICAgICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHBhc3N3b3JkTW9kZSAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX01PREVfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBhc3N3b3JkLW1vZGUiKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcocGFzc3dvcmRNb2RlKSk7CisgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicGFzc3dvcmQtbW9kZSIpOworICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxlbmd0aCIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1uLXBhc3N3b3JkLWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXhpbXVtVGltZVRvVW5sb2NrICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfTU9ERV9VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWF4LXRpbWUtdG8tdW5sb2NrIik7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBMb25nLnRvU3RyaW5nKG1heGltdW1UaW1lVG9VbmxvY2spKTsKKyAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtYXgtdGltZS10by11bmxvY2siKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtYXgtZmFpbGVkLXBhc3N3b3JkLXdpcGUiKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUpKTsKKyAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtYXgtZmFpbGVkLXBhc3N3b3JkLXdpcGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCByZWFkRnJvbVhtbChYbWxQdWxsUGFyc2VyIHBhcnNlcikKKyAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IG91dGVyRGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgd2hpbGUgKCh0eXBlPXBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UCisgICAgICAgICAgICAgICAgICAgJiYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gb3V0ZXJEZXB0aCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgdHlwZSA9PSBYbWxQdWxsUGFyc2VyLlRFWFQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyB0YWcgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgicGFzc3dvcmQtbW9kZSIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRNb2RlID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1sZW5ndGgiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtYXgtdGltZS10by11bmxvY2siLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1heGltdW1UaW1lVG9VbmxvY2sgPSBMb25nLnBhcnNlTG9uZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1heC1mYWlsZWQtcGFzc3dvcmQtd2lwZSIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtOTEsMjUgKzE0Nyw0MiBAQAogICAgICAgICByZXR1cm4gbUlQb3dlck1hbmFnZXI7CiAgICAgfQogICAgIAotICAgIEFjdGl2ZUFkbWluIGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgcmVxUG9saWN5KQorICAgIEFjdGl2ZUFkbWluIGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFjdGl2ZUFkbWluOworICAgICAgICBpZiAoYWRtaW4gIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHdoby5nZXRQYWNrYWdlTmFtZSgpLmVxdWFscyhhZG1pbi5pbmZvLmdldEFjdGl2aXR5SW5mbygpLnBhY2thZ2VOYW1lKQorICAgICAgICAgICAgICAgICYmIHdoby5nZXRDbGFzc05hbWUoKS5lcXVhbHMoYWRtaW4uaW5mby5nZXRBY3Rpdml0eUluZm8oKS5uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGFkbWluOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBBY3RpdmVBZG1pbiBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZChDb21wb25lbnROYW1lIHdobykKICAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtQWN0aXZlQWRtaW4gIT0gbnVsbCAmJiBtQWN0aXZlQWRtaW4uZ2V0VWlkKCkgPT0gQmluZGVyLmdldENhbGxpbmdVaWQoKSkgeworICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BY3RpdmVBZG1pbjsKKyAgICAgICAgaWYgKGFkbWluICE9IG51bGwgJiYgYWRtaW4uZ2V0VWlkKCkgPT0gQmluZGVyLmdldENhbGxpbmdVaWQoKSkgewogICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF3aG8uZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMobUFjdGl2ZUFkbWluLmluZm8uZ2V0QWN0aXZpdHlJbmZvKCkucGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAhd2hvLmdldENsYXNzTmFtZSgpLmVxdWFscyhtQWN0aXZlQWRtaW4uaW5mby5nZXRBY3Rpdml0eUluZm8oKS5uYW1lKSkgeworICAgICAgICAgICAgICAgIGlmICghd2hvLmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKGFkbWluLmluZm8uZ2V0QWN0aXZpdHlJbmZvKCkucGFja2FnZU5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhd2hvLmdldENsYXNzTmFtZSgpLmVxdWFscyhhZG1pbi5pbmZvLmdldEFjdGl2aXR5SW5mbygpLm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQ3VycmVudCBhZG1pbiBpcyBub3QgIiArIHdobyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtQWN0aXZlQWRtaW4uaW5mby51c2VzUG9saWN5KHJlcVBvbGljeSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkFkbWluICIgKyBtQWN0aXZlQWRtaW4uaW5mby5nZXRDb21wb25lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3Qgc3BlY2lmeSB1c2VzLXBvbGljeSBmb3I6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUFjdGl2ZUFkbWluLmluZm8uZ2V0VGFnRm9yUG9saWN5KHJlcVBvbGljeSkpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVBZG1pbjsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkN1cnJlbnQgYWRtaW4gaXMgbm90IG93bmVkIGJ5IHVpZCAiICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CiAgICAgfQogICAgIAorICAgIEFjdGl2ZUFkbWluIGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgcmVxUG9saWN5KQorICAgICAgICAgICAgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKKyAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8pOworICAgICAgICBpZiAoIWFkbWluLmluZm8udXNlc1BvbGljeShyZXFQb2xpY3kpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkFkbWluICIgKyBhZG1pbi5pbmZvLmdldENvbXBvbmVudCgpCisgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IHNwZWNpZnkgdXNlcy1wb2xpY3kgZm9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgYWRtaW4uaW5mby5nZXRUYWdGb3JQb2xpY3kocmVxUG9saWN5KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkbWluOworICAgIH0KKyAgICAKICAgICB2b2lkIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoQWN0aXZlQWRtaW4gYWRtaW4sIFN0cmluZyBhY3Rpb24pIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoYWN0aW9uKTsKICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChhZG1pbi5pbmZvLmdldENvbXBvbmVudCgpKTsKQEAgLTE4MiwyNSArMjU1LDE3IEBACiAgICAgICAgICAgICBpZiAoYXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiYWRtaW4iKTsKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJuYW1lIiwgYXAuaW5mby5nZXRDb21wb25lbnQoKS5mbGF0dGVuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFwLnBhc3N3b3JkTW9kZSAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX01PREVfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJwYXNzd29yZC1tb2RlIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhhcC5wYXNzd29yZE1vZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicGFzc3dvcmQtbW9kZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbGVuZ3RoIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcoYXAubWluaW11bVBhc3N3b3JkTGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtbi1wYXNzd29yZC1sZW5ndGgiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYXAubWF4aW11bVRpbWVUb1VubG9jayAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX01PREVfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtYXgtdGltZS10by11bmxvY2siKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBMb25nLnRvU3RyaW5nKGFwLm1heGltdW1UaW1lVG9VbmxvY2spKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWF4LXRpbWUtdG8tdW5sb2NrIik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFwLndyaXRlVG9YbWwob3V0KTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJhZG1pbiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicG9saWNpZXMiKTsKIAorICAgICAgICAgICAgaWYgKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDApIHsKKyAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImZhaWxlZC1wYXNzd29yZC1hdHRlbXB0cyIpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cykpOworICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImZhaWxlZC1wYXNzd29yZC1hdHRlbXB0cyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCiAgICAgICAgICAgICBvdXQuZW5kRG9jdW1lbnQoKTsKICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwogICAgICAgICAgICAgam91cm5hbC5jb21taXQoKTsKQEAgLTIyMCw1MSArMjg1LDQxIEBACiAgICAgICAgIEpvdXJuYWxlZEZpbGUgam91cm5hbCA9IG1ha2VKb3VybmFsZWRGaWxlKCk7CiAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwogICAgICAgICBGaWxlIGZpbGUgPSBqb3VybmFsLmNob29zZUZvclJlYWQoKTsKLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwogICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYbWwubmV3UHVsbFBhcnNlcigpOwogICAgICAgICAgICAgcGFyc2VyLnNldElucHV0KHN0cmVhbSwgbnVsbCk7CiAKLSAgICAgICAgICAgIGludCB0eXBlID0gcGFyc2VyLm5leHQoKTsKLSAgICAgICAgICAgIHdoaWxlICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IHBhcnNlci5uZXh0KCk7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIHdoaWxlICgodHlwZT1wYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBTdHJpbmcgdGFnID0gcGFyc2VyLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmICgicG9saWNpZXMiLmVxdWFscyh0YWcpKSB7Ci0gICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBudWxsOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHBhcnNlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YWcgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoImFkbWluIi5lcXVhbHModGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8gZGFpID0gZmluZEFkbWluKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudE5hbWUudW5mbGF0dGVuRnJvbVN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibmFtZSIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYWkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBuZXcgQWN0aXZlQWRtaW4oZGFpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInBhc3N3b3JkLW1vZGUiLmVxdWFscyh0YWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXAucGFzc3dvcmRNb2RlID0gSW50ZWdlci5wYXJzZUludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtbGVuZ3RoIi5lcXVhbHModGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWF4LXRpbWUtdG8tdW5sb2NrIi5lcXVhbHModGFnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1heGltdW1UaW1lVG9VbmxvY2sgPSBMb25nLnBhcnNlTG9uZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9IHBhcnNlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXAgIT0gbnVsbCAmJiAiYWRtaW4iLmVxdWFscyh0YWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZUFkbWluID0gYXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEicG9saWNpZXMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiU2V0dGluZ3MgZG8gbm90IHN0YXJ0IHdpdGggcG9saWNpZXMgdGFnOiBmb3VuZCAiICsgdGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICAgICAgaW50IG91dGVyRGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKyAgICAgICAgICAgIHdoaWxlICgodHlwZT1wYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICAgICYmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IG91dGVyRGVwdGgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHR5cGUgPT0gWG1sUHVsbFBhcnNlci5URVhUKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0YWcgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgiYWRtaW4iLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mbyBkYWkgPSBmaW5kQWRtaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50TmFtZS51bmZsYXR0ZW5Gcm9tU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJuYW1lIikpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IG5ldyBBY3RpdmVBZG1pbihkYWkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXAucmVhZEZyb21YbWwocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVBZG1pbiA9IGFwOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCk7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy53KFRBRywgImZhaWxlZCBwYXJzaW5nICIgKyBmaWxlICsgIiAiICsgZSk7CkBAIC0yODUsMTAgKzM0MCw2IEBACiAgICAgICAgICAgICAvLyBJZ25vcmUKICAgICAgICAgfQogCi0gICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiTm8gdmFsaWQgc3RhcnQgdGFnIGZvdW5kIGluIHBvbGljaWVzIGZpbGUiKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgbG9uZyB0aW1lTXMgPSBnZXRNYXhpbXVtVGltZVRvTG9jaygpOwogICAgICAgICBpZiAodGltZU1zIDw9IDApIHsKICAgICAgICAgICAgIHRpbWVNcyA9IEludGVnZXIuTUFYX1ZBTFVFOwpAQCAtNDE4LDYgKzQ2OSwyNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbnVtKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCisgICAgICAgICAgICAvLyBzbyB0cnkgdG8gcmV0cmlldmUgaXQgdG8gY2hlY2sgdGhhdCB0aGUgY2FsbGVyIGlzIG9uZS4KKyAgICAgICAgICAgIGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1dJUEVfREFUQSk7CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1dBVENIX0xPR0lOKTsKKyAgICAgICAgICAgIGlmIChhcC5tYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSAhPSBudW0pIHsKKyAgICAgICAgICAgICAgICBhcC5tYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA9IG51bTsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWN0aXZlQWRtaW4gIT0gbnVsbCA/IG1BY3RpdmVBZG1pbi5tYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA6IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgcHVibGljIGJvb2xlYW4gcmVzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKICAgICAgICAgaW50IG1vZGU7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtNDg4LDIwICs1NjAsNTMgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICB2b2lkIHdpcGVEYXRhTG9ja2VkKGludCBmbGFncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVjb3ZlcnlTeXN0ZW0ucmVib290V2lwZVVzZXJEYXRhKG1Db250ZXh0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHJlcXVlc3RpbmcgZGF0YSB3aXBlIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgcHVibGljIHZvaWQgd2lwZURhdGEoaW50IGZsYWdzKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCiAgICAgICAgICAgICAvLyBzbyB0cnkgdG8gcmV0cmlldmUgaXQgdG8gY2hlY2sgdGhhdCB0aGUgY2FsbGVyIGlzIG9uZS4KICAgICAgICAgICAgIGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKG51bGwsCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9XSVBFX0RBVEEpOworICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aXBlRGF0YUxvY2tlZChmbGFncyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSZWNvdmVyeVN5c3RlbS5yZWJvb3RXaXBlVXNlckRhdGEobUNvbnRleHQpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgcmVxdWVzdGluZyBkYXRhIHdpcGUiLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZ2V0UmVtb3ZlV2FybmluZyhDb21wb25lbnROYW1lIGNvbXAsIGZpbmFsIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKKyAgICAgICAgCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZChjb21wKTsKKyAgICAgICAgICAgIGlmIChhZG1pbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNlbmRSZXN1bHQobnVsbCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoRGV2aWNlQWRtaW4uQUNUSU9OX0RFVklDRV9BRE1JTl9ESVNBQkxFX1JFUVVFU1RFRCk7CisgICAgICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KGFkbWluLmluZm8uZ2V0Q29tcG9uZW50KCkpOworICAgICAgICAgICAgbUNvbnRleHQuc2VuZE9yZGVyZWRCcm9hZGNhc3QoaW50ZW50LCBudWxsLCBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNlbmRSZXN1bHQoZ2V0UmVzdWx0RXh0cmFzKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCBudWxsLCBBY3Rpdml0eS5SRVNVTFRfT0ssIG51bGwsIG51bGwpOwogICAgICAgICB9CiAgICAgfQogICAgIApAQCAtNTE2LDcgKzYyMSwxMCBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE1vZGUgPSBtb2RlOwogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoRGV2aWNlQWRtaW4uQUNUSU9OX1BBU1NXT1JEX0NIQU5HRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewpAQCAtNTM0LDYgKzY0MiwxMSBAQAogICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cysrOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgICAgIGludCBtYXggPSBnZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSgpOworICAgICAgICAgICAgICAgIGlmIChtYXggPiAwICYmIG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzID49IG1heCkgeworICAgICAgICAgICAgICAgICAgICB3aXBlRGF0YUxvY2tlZCgwKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2VuZEFkbWluQ29tbWFuZExvY2tlZChEZXZpY2VBZG1pbi5BQ1RJT05fUEFTU1dPUkRfRkFJTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1dBVENIX0xPR0lOKTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CkBAIC01NTEsNiArNjY0LDcgQEAKICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgPSAwOworICAgICAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgc2VuZEFkbWluQ29tbWFuZExvY2tlZChEZXZpY2VBZG1pbi5BQ1RJT05fUEFTU1dPUkRfU1VDQ0VFREVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9XQVRDSF9MT0dJTik7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0luc3RhbGxlci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5zdGFsbGVyLmphdmEKaW5kZXggNmE3ZDQzMi4uODhiMWYwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5zdGFsbGVyLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5zdGFsbGVyLmphdmEKQEAgLTI2MywxMCArMjYzLDE1IEBACiAgICAgICAgIHJldHVybiBleGVjdXRlKGJ1aWxkZXIudG9TdHJpbmcoKSk7CiAgICAgfQogCi0gICAgcHVibGljIGludCBzZXRGb3J3YXJkTG9ja1Blcm0oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgZ2lkKSB7CisgICAgLyoKKyAgICAgKiBAcGFyYW0gcGFja2FnZVBhdGhTdWZmaXggVGhlIG5hbWUgb2YgdGhlIHBhdGggcmVsYXRpdmUgdG8gaW5zdGFsbAorICAgICAqIGRpcmVjdG9yeS4gU2F5IGlmIHRoZSBwYXRoIG5hbWUgaXMgL2RhdGEvYXBwL2NvbS50ZXN0LTEuYXBrLAorICAgICAqIHRoZSBwYWNrYWdlIHN1ZmZpeCBwYXRoIHdpbGwgYmUgY29tLnRlc3QtMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2V0Rm9yd2FyZExvY2tQZXJtKFN0cmluZyBwYWNrYWdlUGF0aFN1ZmZpeCwgaW50IGdpZCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigicHJvdGVjdCIpOwogICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChwYWNrYWdlTmFtZSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhY2thZ2VQYXRoU3VmZml4KTsKICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2lkKTsKICAgICAgICAgcmV0dXJuIGV4ZWN1dGUoYnVpbGRlci50b1N0cmluZygpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKaW5kZXggODVhMmUwYi4uMGI3Y2ZhZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKQEAgLTU1Myw3ICs1NTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ID09IFZvbHVtZVN0YXRlLk5vTWVkaWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEVudmlyb25tZW50Lk1FRElBX1JFTU9WRUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ID09IFZvbHVtZVN0YXRlLklkbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEVudmlyb25tZW50Lk1FRElBX1VOTU9VTlRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRWb2x1bWUocGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CkBAIC01NjksNyArNTY5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlVuZXhwZWN0ZWQgc3RhdGUgJWQiLCBzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVB1YmxpY1ZvbHVtZVN0YXRlKHBhdGgsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVB1YmxpY1ZvbHVtZVN0YXRlKHBhdGgsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHByb2Nlc3NpbmcgaW5pdGlhbCB2b2x1bWUgc3RhdGUiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHVibGljVm9sdW1lU3RhdGUocGF0aCwgRW52aXJvbm1lbnQuTUVESUFfUkVNT1ZFRCk7CkBAIC0xMDU2LDExICsxMDU4LDIxIEBACiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZ1tdIGdldFNlY3VyZUNvbnRhaW5lckxpc3QoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkFTRUNfQUNDRVNTKQorICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBBU0VDX0FDQ0VTUyBwZXJtaXNzaW9uIik7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1Db25uZWN0b3IuZG9MaXN0Q29tbWFuZCgibGlzdF9hc2VjIiwgVm9sZFJlc3BvbnNlQ29kZS5Bc2VjTGlzdFJlc3VsdCk7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBjcmVhdGVTZWN1cmVDb250YWluZXIoU3RyaW5nIGlkLCBpbnQgc2l6ZU1iLCBTdHJpbmcgZnN0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSwgaW50IG93bmVyVWlkKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkFTRUNfQ1JFQVRFKQorICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBBU0VDX0NSRUFURSBwZXJtaXNzaW9uIik7CisgICAgICAgIH0KICAgICAgICAgU3RyaW5nIGNtZCA9IFN0cmluZy5mb3JtYXQoImNyZWF0ZV9hc2VjICVzICVkICVzICVzICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIHNpemVNYiwgZnN0eXBlLCBrZXksIG93bmVyVWlkKTsKICAgICAgICAgbUNvbm5lY3Rvci5kb0NvbW1hbmQoY21kKTsKQEAgLTEwNjgsMTUgKzEwODAsMzEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZVNlY3VyZUNvbnRhaW5lcihTdHJpbmcgaWQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQVNFQ19DUkVBVEUpCisgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIEFTRUNfQ1JFQVRFIHBlcm1pc3Npb24iKTsKKyAgICAgICAgfQogICAgICAgICBtQ29ubmVjdG9yLmRvQ29tbWFuZChTdHJpbmcuZm9ybWF0KCJmaW5hbGl6ZV9hc2VjICVzIiwgaWQpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkZXN0cm95U2VjdXJlQ29udGFpbmVyKFN0cmluZyBpZCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtQ29udGV4dC5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5BU0VDX0RFU1RST1kpCisgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIEFTRUNfREVTVFJPWSBwZXJtaXNzaW9uIik7CisgICAgICAgIH0KICAgICAgICAgbUNvbm5lY3Rvci5kb0NvbW1hbmQoU3RyaW5nLmZvcm1hdCgiZGVzdHJveV9hc2VjICVzIiwgaWQpKTsKICAgICB9CiAgICAKICAgICBwdWJsaWMgU3RyaW5nIG1vdW50U2VjdXJlQ29udGFpbmVyKFN0cmluZyBpZCwgU3RyaW5nIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvd25lclVpZCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtQ29udGV4dC5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5BU0VDX01PVU5UX1VOTU9VTlQpCisgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIEFTRUNfTU9VTlRfVU5NT1VOVCBwZXJtaXNzaW9uIik7CisgICAgICAgIH0KKyAgICAgICAgbUNvbm5lY3Rvci5kb0NvbW1hbmQoU3RyaW5nLmZvcm1hdCgiZGVzdHJveV9hc2VjICVzIiwgaWQpKTsKICAgICAgICAgU3RyaW5nIGNtZCA9IFN0cmluZy5mb3JtYXQoIm1vdW50X2FzZWMgJXMgJXMgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwga2V5LCBvd25lclVpZCk7CiAgICAgICAgIG1Db25uZWN0b3IuZG9Db21tYW5kKGNtZCk7CkBAIC0xMDg0LDE2ICsxMTEyLDMxIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdW5tb3VudFNlY3VyZUNvbnRhaW5lcihTdHJpbmcgaWQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQVNFQ19NT1VOVF9VTk1PVU5UKQorICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBBU0VDX01PVU5UX1VOTU9VTlQgcGVybWlzc2lvbiIpOworICAgICAgICB9CiAgICAgICAgIFN0cmluZyBjbWQgPSBTdHJpbmcuZm9ybWF0KCJ1bm1vdW50X2FzZWMgJXMiLCBpZCk7CiAgICAgICAgIG1Db25uZWN0b3IuZG9Db21tYW5kKGNtZCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVuYW1lU2VjdXJlQ29udGFpbmVyKFN0cmluZyBvbGRJZCwgU3RyaW5nIG5ld0lkKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkFTRUNfUkVOQU1FKQorICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBBU0VDX1JFTkFNRSBwZXJtaXNzaW9uIik7CisgICAgICAgIH0KICAgICAgICAgU3RyaW5nIGNtZCA9IFN0cmluZy5mb3JtYXQoInJlbmFtZV9hc2VjICVzICVzIiwgb2xkSWQsIG5ld0lkKTsKICAgICAgICAgbUNvbm5lY3Rvci5kb0NvbW1hbmQoY21kKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldFNlY3VyZUNvbnRhaW5lclBhdGgoU3RyaW5nIGlkKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkFTRUNfQUNDRVNTKQorICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJSZXF1aXJlcyBBU0VDX0FDQ0VTUyBwZXJtaXNzaW9uIik7CisgICAgICAgIH0KICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcnNwID0gbUNvbm5lY3Rvci5kb0NvbW1hbmQoImFzZWNfcGF0aCAiICsgaWQpOwogCiAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiByc3ApIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMTMwNzk3Mi4uMWNmM2JhZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSU1lZGlhQ29udGFpbmVyU2VydmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuUmVzb2x2ZXJBY3Rpdml0eTsKIGltcG9ydCBjb20uYW5kcm9pZC5jb21tb24uRmFzdFhtbFNlcmlhbGl6ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuY29tbW9uLlhtbFV0aWxzOwpAQCAtMzEsNiArMzIsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwpAQCAtNjIsNiArNjQsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CkBAIC0yODMsMjYgKzI4Niw3OSBAQAogICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4gbVBlbmRpbmdCcm9hZGNhc3RzCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+KCk7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRU5EX1BFTkRJTkdfQlJPQURDQVNUID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IERFU1RST1lfU0RfQ09OVEFJTkVSID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1DU19CT1VORCA9IDM7CisgICAgc3RhdGljIGZpbmFsIGludCBFTkRfQ09QWSA9IDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBJTklUX0NPUFkgPSA1OworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUNTX1VOQklORCA9IDY7CiAgICAgLy8gRGVsYXkgdGltZSBpbiBtaWxsaXNlY3MKICAgICBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9ERUxBWSA9IDEwICogMTAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IERFU1RST1lfU0RfQ09OVEFJTkVSX0RFTEFZID0gMzAgKiAxMDAwOworICAgIHByaXZhdGUgU2VydmljZUNvbm5lY3Rpb24gbURlZkNvbnRhaW5lckNvbm4gPSBuZXcgU2VydmljZUNvbm5lY3Rpb24oKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICAgICAgSU1lZGlhQ29udGFpbmVyU2VydmljZSBpbWNzID0KKyAgICAgICAgICAgICAgICBJTWVkaWFDb250YWluZXJTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUNTX0JPVU5ELCBpbWNzKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7CisgICAgICAgIH0KKyAgICB9OwogCiAgICAgY2xhc3MgUGFja2FnZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEluc3RhbGxBcmdzPiBtUGVuZGluZ0luc3RhbGxzID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SW5zdGFsbEFyZ3M+KCk7CisgICAgICAgIC8vIFNlcnZpY2UgQ29ubmVjdGlvbiB0byByZW1vdGUgbWVkaWEgY29udGFpbmVyIHNlcnZpY2UgdG8gY29weQorICAgICAgICAvLyBwYWNrYWdlIHVyaSdzIGZyb20gZXh0ZXJuYWwgbWVkaWEgb250byBzZWN1cmUgY29udGFpbmVycworICAgICAgICAvLyBvciBpbnRlcm5hbCBzdG9yYWdlLgorICAgICAgICBwcml2YXRlIElNZWRpYUNvbnRhaW5lclNlcnZpY2UgbUNvbnRhaW5lclNlcnZpY2UgPSBudWxsOworCiAgICAgICAgIFBhY2thZ2VIYW5kbGVyKExvb3BlciBsb29wZXIpIHsKICAgICAgICAgICAgIHN1cGVyKGxvb3Blcik7CiAgICAgICAgIH0KICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewogICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgREVTVFJPWV9TRF9DT05UQUlORVI6Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwa2dOYW1lID0gKFN0cmluZykgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBrZ05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9vIGJhZCB3ZSBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvcnMgZnJvbSBkZXN0cm95aW5nIHRoZSBjb250YWluZXJzLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXN0cm95U2REaXIocGtnTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gZGVzdHJveSBjb250YWluZXIgZm9yIHBrZyA6ICIgKyBwa2dOYW1lKTsKKyAgICAgICAgICAgICAgICBjYXNlIElOSVRfQ09QWTogeworICAgICAgICAgICAgICAgICAgICBJbnN0YWxsQXJncyBhcmdzID0gKEluc3RhbGxBcmdzKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBhcmdzLmNyZWF0ZUNvcHlGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgIEludGVudCBzZXJ2aWNlID0gbmV3IEludGVudCgpLnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuZGVmY29udGFpbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuZGVmY29udGFpbmVyLkRlZmF1bHRDb250YWluZXJTZXJ2aWNlIikpOworICAgICAgICAgICAgICAgICAgICBpZiAobUNvbnRhaW5lclNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBhZGQgdG8gcGVuZGluZyBsaXN0LiBVc2UgcmVtb3RlIHN0dWIgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVN0YXJ0Q29weShhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29udGV4dC5iaW5kU2VydmljZShzZXJ2aWNlLCBtRGVmQ29udGFpbmVyQ29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nSW5zdGFsbHMuYWRkKGFyZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gYmluZCB0byBtZWRpYSBjb250YWluZXIgc2VydmljZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGljYXRlIGluc3RhbGwgZmFpbHVyZSBUT0RPIGFkZCBuZXcgZXJyb3IgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQZW5kaW5nSW5zdGFsbChhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfSU5TVUZGSUNJRU5UX1NUT1JBR0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIE1DU19CT1VORDogeworICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIG1Db250YWluZXJTZXJ2aWNlIGlmIG5lZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5vYmogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRhaW5lclNlcnZpY2UgPSAoSU1lZGlhQ29udGFpbmVyU2VydmljZSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdJbnN0YWxscy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YWxsQXJncyBhcmdzID0gbVBlbmRpbmdJbnN0YWxscy5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RhcnRDb3B5KGFyZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIE1DU19VTkJJTkQgOiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ0luc3RhbGxzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1EZWZDb250YWluZXJDb25uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250YWluZXJTZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBTRU5EX1BFTkRJTkdfQlJPQURDQVNUIDogewogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZXNbXTsKICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGNvbXBvbmVudHNbXTsKQEAgLTM0Myw3ICszOTksMzcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyBVdGlsaXR5IG1ldGhvZCB0byBpbml0aWF0ZSBjb3B5aW5nIGFwayB2aWEgbWVkaWEKKyAgICAgICAgLy8gY29udGFpbmVyIHNlcnZpY2UuCisgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTdGFydENvcHkoSW5zdGFsbEFyZ3MgYXJncykgeworICAgICAgICAgICAgaW50IHJldCA9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEOworICAgICAgICAgICAgaWYgKG1Db250YWluZXJTZXJ2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBJbnN0YWxsIGVycm9yCisgICAgICAgICAgICAgICAgcmV0ID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfSU5TVUZGSUNJRU5UX1NUT1JBR0U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IGFyZ3MuY29weUFwayhtQ29udGFpbmVyU2VydmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1DU19VTkJJTkQpOworICAgICAgICAgICAgcHJvY2Vzc1BlbmRpbmdJbnN0YWxsKGFyZ3MsIHJldCk7CisgICAgICAgIH0KICAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBpbnN0YWxsT25TZChpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKCgoZmxhZ3MgJiBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX0ZPUldBUkRfTE9DSykgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAoKGZsYWdzICYgUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9PTl9TRENBUkQpID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gaXNGd2RMb2NrZWQoaW50IGZsYWdzKSB7CisgICAgICAgIGlmICgoZmxhZ3MgJiBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX0ZPUldBUkRfTE9DSykgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVBhY2thZ2VNYW5hZ2VyIG1haW4oQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGZhY3RvcnlUZXN0KSB7CiAgICAgICAgIFBhY2thZ2VNYW5hZ2VyU2VydmljZSBtID0gbmV3IFBhY2thZ2VNYW5hZ2VyU2VydmljZShjb250ZXh0LCBmYWN0b3J5VGVzdCk7CiAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoInBhY2thZ2UiLCBtKTsKQEAgLTIwMjIsMTEgKzIxMDgsMTIgQEAKICAgICAgICAgICAgIGludCBwYXJzZUZsYWdzLAogICAgICAgICAgICAgaW50IHNjYW5Nb2RlKSB7CiAgICAgICAgIG1MYXN0U2NhbkVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9TVUNDRUVERUQ7CisgICAgICAgIFN0cmluZyBzY2FuUGF0aCA9IHNjYW5GaWxlLmdldFBhdGgoKTsKICAgICAgICAgcGFyc2VGbGFncyB8PSBtRGVmUGFyc2VGbGFnczsKLSAgICAgICAgUGFja2FnZVBhcnNlciBwcCA9IG5ldyBQYWNrYWdlUGFyc2VyKHNjYW5GaWxlLmdldFBhdGgoKSk7CisgICAgICAgIFBhY2thZ2VQYXJzZXIgcHAgPSBuZXcgUGFja2FnZVBhcnNlcihzY2FuUGF0aCk7CiAgICAgICAgIHBwLnNldFNlcGFyYXRlUHJvY2Vzc2VzKG1TZXBhcmF0ZVByb2Nlc3Nlcyk7CiAgICAgICAgIGZpbmFsIFBhY2thZ2VQYXJzZXIuUGFja2FnZSBwa2cgPSBwcC5wYXJzZVBhY2thZ2Uoc2NhbkZpbGUsCi0gICAgICAgICAgICAgICAgc2NhbkZpbGUuZ2V0UGF0aCgpLAorICAgICAgICAgICAgICAgIHNjYW5QYXRoLAogICAgICAgICAgICAgICAgIG1NZXRyaWNzLCBwYXJzZUZsYWdzKTsKICAgICAgICAgaWYgKHBrZyA9PSBudWxsKSB7CiAgICAgICAgICAgICBtTGFzdFNjYW5FcnJvciA9IHBwLmdldFBhcnNlRXJyb3IoKTsKQEAgLTIwNjYsNyArMjE1Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJlbW92ZSB0aGUgbG9hZGVkIGVudHJpZXMgZnJvbSBwYWNrYWdlIGxpc3RzLgogICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VzLnJlbW92ZShwcy5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWxldGVQYWNrYWdlUmVzb3VyY2VzTEkocHMubmFtZSwgcHMuY29kZVBhdGhTdHJpbmcsIHBzLnJlc291cmNlUGF0aFN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIEluc3RhbGxBcmdzIGFyZ3MgPSBuZXcgRmlsZUluc3RhbGxBcmdzKHBzLmNvZGVQYXRoU3RyaW5nLCBwcy5yZXNvdXJjZVBhdGhTdHJpbmcpOworICAgICAgICAgICAgICAgICAgICBhcmdzLmNsZWFuVXBSZXNvdXJjZXNMSSgpOwogICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3MuZW5hYmxlU3lzdGVtUGFja2FnZUxQKHBzLm5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIwNzcsNiArMjE2NSwxOCBAQAogICAgICAgICBpZiAocHMgIT0gbnVsbCAmJiAhcHMuY29kZVBhdGguZXF1YWxzKHBzLnJlc291cmNlUGF0aCkpIHsKICAgICAgICAgICAgIHBhcnNlRmxhZ3MgfD0gUGFja2FnZVBhcnNlci5QQVJTRV9GT1JXQVJEX0xPQ0s7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoKHBhcnNlRmxhZ3MgJiBQYWNrYWdlUGFyc2VyLlBBUlNFX0ZPUldBUkRfTE9DSykgIT0gMCkgeworICAgICAgICAgICAgaWYgKHBzICE9IG51bGwgJiYgcHMucmVzb3VyY2VQYXRoU3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwa2cuYXBwbGljYXRpb25JbmZvLnB1YmxpY1NvdXJjZURpciA9IHBzLnJlc291cmNlUGF0aFN0cmluZzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4gYXQgYWxsLiBKdXN0IGxvZyBhbiBlcnJvci4KKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJSZXNvdXJjZSBwYXRoIG5vdCBzZXQgZm9yIHBrZyA6ICIgKyBwa2cucGFja2FnZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGtnLmFwcGxpY2F0aW9uSW5mby5wdWJsaWNTb3VyY2VEaXIgPSBwa2cubVNjYW5QYXRoOworICAgICAgICB9CisgICAgICAgIHBrZy5hcHBsaWNhdGlvbkluZm8uc291cmNlRGlyID0gcGtnLm1TY2FuUGF0aDsKICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGludm9rZSB0aGUgZm9sbG93aW5nIG1ldGhvZCBvbmx5IGlmIHdlIGFyZSBhYm91dCB0byB1bnBhY2sgYW4gYXBwbGljYXRpb24KICAgICAgICAgcmV0dXJuIHNjYW5QYWNrYWdlTEkocGtnLCBwYXJzZUZsYWdzLCBzY2FuTW9kZSB8IFNDQU5fVVBEQVRFX1NJR05BVFVSRSk7CiAgICAgfQpAQCAtMjIzMCw0MSArMjMzMCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBJbml0aWFsaXplIHBhY2thZ2Ugc291cmNlIGFuZCByZXNvdXJjZSBkaXJlY3RvcmllcwotICAgICAgICBGaWxlIGRlc3RSZXNvdXJjZUZpbGUgPSBudWxsOwotICAgICAgICBGaWxlIGRlc3RDb2RlRmlsZSA9IG51bGw7Ci0gICAgICAgIGlmICgoc2Nhbk1vZGUgJiBTQ0FOX05PX1BBVEhTKSA9PSAwKSB7Ci0gICAgICAgICAgICBib29sZWFuIGZ3ZExvY2tlZCA9IChwYXJzZUZsYWdzICYgUGFja2FnZVBhcnNlci5QQVJTRV9GT1JXQVJEX0xPQ0spICE9IDA7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGtnRmlsZU5hbWUgPSBwa2dOYW1lICsgIi5hcGsiOwotICAgICAgICAgICAgRmlsZSBkZXN0RGlyID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGZ3ZExvY2tlZCkgewotICAgICAgICAgICAgICAgIGRlc3REaXIgPSBtRHJtQXBwUHJpdmF0ZUluc3RhbGxEaXI7Ci0gICAgICAgICAgICAgICAgZGVzdFJlc291cmNlRmlsZSA9IG5ldyBGaWxlKG1BcHBJbnN0YWxsRGlyLCBwa2dOYW1lICsgIi56aXAiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBvblNkID0gKHBhcnNlRmxhZ3MgJiBQYWNrYWdlUGFyc2VyLlBBUlNFX09OX1NEQ0FSRCkgIT0gMDsKLSAgICAgICAgICAgICAgICBpZiAoIW9uU2QpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdERpciA9IG1BcHBJbnN0YWxsRGlyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYWNoZVBhdGggPSBnZXRTZERpcihwa2dOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTZWN1cmUgY29udGFpbmVyIHBhdGggZm9yIHBrZzogIiArIHBrZ05hbWUgKyAiIGF0IGxvY2F0aW9uOiAiICsgY2FjaGVQYXRoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0U2NhbkVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfQ09OVEFJTkVSX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdERpciA9IG5ldyBGaWxlKGNhY2hlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3RSZXNvdXJjZUZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBwa2dGaWxlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0Q29kZUZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBwa2dGaWxlTmFtZSk7Ci0gICAgICAgICAgICBwa2cubVBhdGggPSBkZXN0Q29kZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwa2cubVBhdGggPSBwa2cubVNjYW5QYXRoOwotICAgICAgICAgICAgZGVzdENvZGVGaWxlID0gbmV3IEZpbGUocGtnLm1TY2FuUGF0aCk7Ci0gICAgICAgICAgICBkZXN0UmVzb3VyY2VGaWxlID0gbmV3IEZpbGUocGtnLm1TY2FuUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGtnLmFwcGxpY2F0aW9uSW5mby5zb3VyY2VEaXIgPSBkZXN0Q29kZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIHBrZy5hcHBsaWNhdGlvbkluZm8ucHVibGljU291cmNlRGlyID0gZGVzdFJlc291cmNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgRmlsZSBkZXN0Q29kZUZpbGUgPSBuZXcgRmlsZShwa2cuYXBwbGljYXRpb25JbmZvLnNvdXJjZURpcik7CisgICAgICAgIEZpbGUgZGVzdFJlc291cmNlRmlsZSA9IG5ldyBGaWxlKHBrZy5hcHBsaWNhdGlvbkluZm8ucHVibGljU291cmNlRGlyKTsKIAogICAgICAgICBTaGFyZWRVc2VyU2V0dGluZyBzdWlkID0gbnVsbDsKICAgICAgICAgUGFja2FnZVNldHRpbmcgcGtnU2V0dGluZyA9IG51bGw7CkBAIC0yNTY4LDIxICsyNjM1LDE3IEBACiAKICAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IGluc3RhbGxhdGlvbiB0byBmYWlsIGJleW9uZCB0aGlzIHBvaW50LAogICAgICAgICBpZiAoKHNjYW5Nb2RlJlNDQU5fTU9OSVRPUikgIT0gMCkgewotICAgICAgICAgICAgcGtnLm1QYXRoID0gZGVzdENvZGVGaWxlLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICAgICAgbUFwcERpcnMucHV0KHBrZy5tUGF0aCwgcGtnKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFJlcXVlc3QgdGhlIEFjdGl2aXR5TWFuYWdlciB0byBraWxsIHRoZSBwcm9jZXNzKG9ubHkgZm9yIGV4aXN0aW5nIHBhY2thZ2VzKQogICAgICAgICAvLyBzbyB0aGF0IHdlIGRvIG5vdCBlbmQgdXAgaW4gYSBjb25mdXNlZCBzdGF0ZSB3aGlsZSB0aGUgdXNlciBpcyBzdGlsbCB1c2luZyB0aGUgb2xkZXIKICAgICAgICAgLy8gdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRpb24gd2hpbGUgdGhlIG5ldyBvbmUgZ2V0cyBpbnN0YWxsZWQuCi0gICAgICAgIElBY3Rpdml0eU1hbmFnZXIgYW0gPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpOwotICAgICAgICBpZiAoKGFtICE9IG51bGwpICYmICgocGFyc2VGbGFncyAmIFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfUkVQTEFDRV9FWElTVElORyApICE9IDApKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFtLmtpbGxBcHBsaWNhdGlvbldpdGhVaWQocGtnLmFwcGxpY2F0aW9uSW5mby5wYWNrYWdlTmFtZSwKKyAgICAgICAgaWYgKChwYXJzZUZsYWdzICYgUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9SRVBMQUNFX0VYSVNUSU5HICkgIT0gMCkgeworICAgICAgICAgICAga2lsbEFwcGxpY2F0aW9uKHBrZy5hcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBwa2cuYXBwbGljYXRpb25JbmZvLnVpZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgc3luY2hyb25pemVkIChtUGFja2FnZXMpIHsKICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IHNldHRpbmcgdG8gbVNldHRpbmdzCiAgICAgICAgICAgICBtU2V0dGluZ3MuaW5zZXJ0UGFja2FnZVNldHRpbmdMUChwa2dTZXR0aW5nLCBwa2cpOwpAQCAtMjgzNSw2ICsyODk4LDE5IEBACiAgICAgICAgIHJldHVybiBwa2c7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGtpbGxBcHBsaWNhdGlvbihTdHJpbmcgcGtnTmFtZSwgaW50IHVpZCkgeworICAgICAgICAvLyBSZXF1ZXN0IHRoZSBBY3Rpdml0eU1hbmFnZXIgdG8ga2lsbCB0aGUgcHJvY2Vzcyhvbmx5IGZvciBleGlzdGluZyBwYWNrYWdlcykKKyAgICAgICAgLy8gc28gdGhhdCB3ZSBkbyBub3QgZW5kIHVwIGluIGEgY29uZnVzZWQgc3RhdGUgd2hpbGUgdGhlIHVzZXIgaXMgc3RpbGwgdXNpbmcgdGhlIG9sZGVyCisgICAgICAgIC8vIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0aW9uIHdoaWxlIHRoZSBuZXcgb25lIGdldHMgaW5zdGFsbGVkLgorICAgICAgICBJQWN0aXZpdHlNYW5hZ2VyIGFtID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKTsKKyAgICAgICAgaWYgKGFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYW0ua2lsbEFwcGxpY2F0aW9uV2l0aFVpZChwa2dOYW1lLCB1aWQpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSByZXR1cm5lZCBieSBjYWNoZVBhY2thZ2VTaGFyZWRMaWJzRm9yQWJpTEkKICAgICAvLyB0byBpbmRpY2F0ZSBpZiBuYXRpdmUgc2hhcmVkIGxpYnJhcmllcyB3ZXJlIGZvdW5kIGluIHRoZSBwYWNrYWdlLgogICAgIC8vIFZhbHVlcyBhcmU6CkBAIC0zODY2LDI2ICszOTQyLDUxIEBACiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uSU5TVEFMTF9QQUNLQUdFUywgbnVsbCk7CiAKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKElOSVRfQ09QWSk7CisgICAgICAgIG1zZy5vYmogPSBjcmVhdGVJbnN0YWxsQXJncyhwYWNrYWdlVVJJLCBvYnNlcnZlciwgZmxhZ3MsIGluc3RhbGxlclBhY2thZ2VOYW1lKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEluc3RhbGxBcmdzIGNyZWF0ZUluc3RhbGxBcmdzKFVyaSBwYWNrYWdlVVJJLCBJUGFja2FnZUluc3RhbGxPYnNlcnZlciBvYnNlcnZlciwKKyAgICAgICAgICAgIGludCBmbGFncywgU3RyaW5nIGluc3RhbGxlclBhY2thZ2VOYW1lKSB7CisgICAgICAgIGlmIChpbnN0YWxsT25TZChmbGFncykpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2RJbnN0YWxsQXJncyhwYWNrYWdlVVJJLCBvYnNlcnZlciwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlclBhY2thZ2VOYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUluc3RhbGxBcmdzKHBhY2thZ2VVUkksIG9ic2VydmVyLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVyUGFja2FnZU5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnN0YWxsQXJncyBjcmVhdGVJbnN0YWxsQXJncyhpbnQgZmxhZ3MsIFN0cmluZyBmdWxsQ29kZVBhdGgsIFN0cmluZyBmdWxsUmVzb3VyY2VQYXRoKSB7CisgICAgICAgIGlmIChpbnN0YWxsT25TZChmbGFncykpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2RJbnN0YWxsQXJncyhmdWxsQ29kZVBhdGgsIGZ1bGxSZXNvdXJjZVBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5zdGFsbEFyZ3MoZnVsbENvZGVQYXRoLCBmdWxsUmVzb3VyY2VQYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGVuZGluZ0luc3RhbGwoZmluYWwgSW5zdGFsbEFyZ3MgYXJncywgZmluYWwgaW50IGN1cnJlbnRTdGF0dXMpIHsKICAgICAgICAgLy8gUXVldWUgdXAgYW4gYXN5bmMgb3BlcmF0aW9uIHNpbmNlIHRoZSBwYWNrYWdlIGluc3RhbGxhdGlvbiBtYXkgdGFrZSBhIGxpdHRsZSB3aGlsZS4KICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKHRoaXMpOwogICAgICAgICAgICAgICAgICAvLyBSZXN1bHQgb2JqZWN0IHRvIGJlIHJldHVybmVkCiAgICAgICAgICAgICAgICAgUGFja2FnZUluc3RhbGxlZEluZm8gcmVzID0gbmV3IFBhY2thZ2VJbnN0YWxsZWRJbmZvKCk7Ci0gICAgICAgICAgICAgICAgcmVzLnJldHVybkNvZGUgPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1NVQ0NFRURFRDsKKyAgICAgICAgICAgICAgICByZXMucmV0dXJuQ29kZSA9IGN1cnJlbnRTdGF0dXM7CiAgICAgICAgICAgICAgICAgcmVzLnVpZCA9IC0xOwogICAgICAgICAgICAgICAgIHJlcy5wa2cgPSBudWxsOwogICAgICAgICAgICAgICAgIHJlcy5yZW1vdmVkSW5mbyA9IG5ldyBQYWNrYWdlUmVtb3ZlZEluZm8oKTsKLSAgICAgICAgICAgICAgICAvLyBNYWtlIGEgdGVtcG9yYXJ5IGNvcHkgb2YgZmlsZSBmcm9tIGdpdmVuIHBhY2thZ2VVUkkKLSAgICAgICAgICAgICAgICBGaWxlIHRtcFBhY2thZ2VGaWxlID0gY29weVRlbXBJbnN0YWxsRmlsZShwYWNrYWdlVVJJLCByZXMpOwotICAgICAgICAgICAgICAgIGlmICh0bXBQYWNrYWdlRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXJncy5kb1ByZUluc3RhbGwocmVzLnJldHVybkNvZGUpOworICAgICAgICAgICAgICAgIGlmIChyZXMucmV0dXJuQ29kZSA9PSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1NVQ0NFRURFRCkgewogICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnN0YWxsTG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbFBhY2thZ2VMSShwYWNrYWdlVVJJLCBmbGFncywgdHJ1ZSwgaW5zdGFsbGVyUGFja2FnZU5hbWUsIHRtcFBhY2thZ2VGaWxlLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbFBhY2thZ2VMSShhcmdzLCB0cnVlLCByZXMpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFyZ3MuZG9Qb3N0SW5zdGFsbChyZXMucmV0dXJuQ29kZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3Mub2JzZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIucGFja2FnZUluc3RhbGxlZChyZXMubmFtZSwgcmVzLnJldHVybkNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5vYnNlcnZlci5wYWNrYWdlSW5zdGFsbGVkKHJlcy5uYW1lLCByZXMucmV0dXJuQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJPYnNlcnZlciBubyBsb25nZXIgZXhpc3RzLiIpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zOTA4LDEyICs0MDA5LDQwMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMucGtnLmFwcGxpY2F0aW9uSW5mby5wYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmVzLnJlbW92ZWRJbmZvLmFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSByZXBsYWNlZCBwYWNrYWdlJ3Mgb2xkZXIgcmVzb3VyY2VzIHNhZmVseSBub3cKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUluc3RhbGxMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnJlbW92ZWRJbmZvLmFyZ3MuY2xlYW5VcFJlc291cmNlc0xJKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgICAgfQogCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEluc3RhbGxBcmdzIHsKKyAgICAgICAgZmluYWwgSVBhY2thZ2VJbnN0YWxsT2JzZXJ2ZXIgb2JzZXJ2ZXI7CisgICAgICAgIGZpbmFsIGludCBmbGFnczsKKyAgICAgICAgZmluYWwgVXJpIHBhY2thZ2VVUkk7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbnN0YWxsZXJQYWNrYWdlTmFtZTsKKworICAgICAgICBJbnN0YWxsQXJncyhVcmkgcGFja2FnZVVSSSwKKyAgICAgICAgICAgICAgICBJUGFja2FnZUluc3RhbGxPYnNlcnZlciBvYnNlcnZlciwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgIFN0cmluZyBpbnN0YWxsZXJQYWNrYWdlTmFtZSkgeworICAgICAgICAgICAgdGhpcy5wYWNrYWdlVVJJID0gcGFja2FnZVVSSTsKKyAgICAgICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjsKKyAgICAgICAgICAgIHRoaXMuaW5zdGFsbGVyUGFja2FnZU5hbWUgPSBpbnN0YWxsZXJQYWNrYWdlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29weUZpbGUoKTsKKyAgICAgICAgYWJzdHJhY3QgaW50IGNvcHlBcGsoSU1lZGlhQ29udGFpbmVyU2VydmljZSBpbWNzKTsKKyAgICAgICAgYWJzdHJhY3Qgdm9pZCBkb1ByZUluc3RhbGwoaW50IHN0YXR1cyk7CisgICAgICAgIGFic3RyYWN0IGJvb2xlYW4gZG9SZW5hbWUoaW50IHN0YXR1cywgU3RyaW5nIHBrZ05hbWUsIFN0cmluZyBvbGRDb2RlUGF0aCk7CisgICAgICAgIGFic3RyYWN0IHZvaWQgZG9Qb3N0SW5zdGFsbChpbnQgc3RhdHVzKTsKKyAgICAgICAgYWJzdHJhY3QgU3RyaW5nIGdldENvZGVQYXRoKCk7CisgICAgICAgIGFic3RyYWN0IFN0cmluZyBnZXRSZXNvdXJjZVBhdGgoKTsKKyAgICAgICAgLy8gTmVlZCBpbnN0YWxsZXIgbG9jayBlc3BlY2lhbGx5IGZvciBkZXggZmlsZSByZW1vdmFsLgorICAgICAgICBhYnN0cmFjdCB2b2lkIGNsZWFuVXBSZXNvdXJjZXNMSSgpOworICAgIH0KKworICAgIGNsYXNzIEZpbGVJbnN0YWxsQXJncyBleHRlbmRzIEluc3RhbGxBcmdzIHsKKyAgICAgICAgRmlsZSBpbnN0YWxsRGlyOworICAgICAgICBTdHJpbmcgY29kZUZpbGVOYW1lOworICAgICAgICBTdHJpbmcgcmVzb3VyY2VGaWxlTmFtZTsKKworICAgICAgICBGaWxlSW5zdGFsbEFyZ3MoVXJpIHBhY2thZ2VVUkksCisgICAgICAgICAgICAgICAgSVBhY2thZ2VJbnN0YWxsT2JzZXJ2ZXIgb2JzZXJ2ZXIsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICBTdHJpbmcgaW5zdGFsbGVyUGFja2FnZU5hbWUpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhY2thZ2VVUkksIG9ic2VydmVyLCBmbGFncywgaW5zdGFsbGVyUGFja2FnZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZUluc3RhbGxBcmdzKFN0cmluZyBmdWxsQ29kZVBhdGgsIFN0cmluZyBmdWxsUmVzb3VyY2VQYXRoKSB7CisgICAgICAgICAgICBzdXBlcihudWxsLCBudWxsLCAwLCBudWxsKTsKKyAgICAgICAgICAgIEZpbGUgY29kZUZpbGUgPSBuZXcgRmlsZShmdWxsQ29kZVBhdGgpOworICAgICAgICAgICAgaW5zdGFsbERpciA9IGNvZGVGaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgIGNvZGVGaWxlTmFtZSA9IGZ1bGxDb2RlUGF0aDsKKyAgICAgICAgICAgIHJlc291cmNlRmlsZU5hbWUgPSBmdWxsUmVzb3VyY2VQYXRoOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjcmVhdGVDb3B5RmlsZSgpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZndkTG9ja2VkID0gaXNGd2RMb2NrZWQoZmxhZ3MpOworICAgICAgICAgICAgaW5zdGFsbERpciA9IGZ3ZExvY2tlZCA/IG1Ecm1BcHBQcml2YXRlSW5zdGFsbERpciA6IG1BcHBJbnN0YWxsRGlyOworICAgICAgICAgICAgY29kZUZpbGVOYW1lID0gY3JlYXRlVGVtcFBhY2thZ2VGaWxlKGluc3RhbGxEaXIpLmdldFBhdGgoKTsKKyAgICAgICAgICAgIHJlc291cmNlRmlsZU5hbWUgPSBnZXRSZXNvdXJjZVBhdGhGcm9tQ29kZVBhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRDb2RlUGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb2RlRmlsZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29weUFwayhJTWVkaWFDb250YWluZXJTZXJ2aWNlIGltY3MpIHsKKyAgICAgICAgICAgIC8vIEdldCBhIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgZmlsZQorICAgICAgICAgICAgRmlsZSBjb2RlRmlsZSA9IG5ldyBGaWxlKGNvZGVGaWxlTmFtZSk7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBvdXQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dCA9IFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oY29kZUZpbGUsCisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9XUklURSk7CisgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBjcmVhdGUgZmlsZSBkZXNjcml0cG9yIGZvciA6ICIgKyBjb2RlRmlsZU5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX0ZBSUxFRF9JTlNVRkZJQ0lFTlRfU1RPUkFHRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENvcHkgdGhlIHJlc291cmNlIG5vdworICAgICAgICAgICAgaW50IHJldCA9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfRkFJTEVEX0lOU1VGRklDSUVOVF9TVE9SQUdFOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoaW1jcy5jb3B5UmVzb3VyY2UocGFja2FnZVVSSSwgb3V0KSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1NVQ0NFRURFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeyBpZiAob3V0ICE9IG51bGwpIG91dC5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZG9QcmVJbnN0YWxsKGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9TVUNDRUVERUQpIHsKKyAgICAgICAgICAgICAgICBjbGVhblVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGRvUmVuYW1lKGludCBzdGF0dXMsIGZpbmFsIFN0cmluZyBwa2dOYW1lLCBTdHJpbmcgb2xkQ29kZVBhdGgpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9TVUNDRUVERUQpIHsKKyAgICAgICAgICAgICAgICBjbGVhblVwKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZW5hbWUgYmFzZWQgb24gcGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICBGaWxlIGNvZGVGaWxlID0gbmV3IEZpbGUoZ2V0Q29kZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFwa05hbWUgPSBnZXROZXh0Q29kZVBhdGgob2xkQ29kZVBhdGgsIHBrZ05hbWUsICIuYXBrIik7CisgICAgICAgICAgICAgICAgRmlsZSBkZXNGaWxlID0gbmV3IEZpbGUoaW5zdGFsbERpciwgYXBrTmFtZSArICIuYXBrIik7CisgICAgICAgICAgICAgICAgaWYgKCFjb2RlRmlsZS5yZW5hbWVUbyhkZXNGaWxlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFJlc2V0IHBhdGhzIHNpbmNlIHRoZSBmaWxlIGhhcyBiZWVuIHJlbmFtZWQuCisgICAgICAgICAgICAgICAgY29kZUZpbGVOYW1lID0gZGVzRmlsZS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VGaWxlTmFtZSA9IGdldFJlc291cmNlUGF0aEZyb21Db2RlUGF0aCgpOworICAgICAgICAgICAgICAgIC8vIFNldCBwZXJtaXNzaW9ucworICAgICAgICAgICAgICAgIGlmICghc2V0UGVybWlzc2lvbnMocGtnTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkIHNldHRpbmcgcGVybWlzc2lvbnMuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRvUG9zdEluc3RhbGwoaW50IHN0YXR1cykgeworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1NVQ0NFRURFRCkgeworICAgICAgICAgICAgICAgIGNsZWFuVXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRSZXNvdXJjZVBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VGaWxlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRSZXNvdXJjZVBhdGhGcm9tQ29kZVBhdGgoKSB7CisgICAgICAgICAgICBTdHJpbmcgY29kZVBhdGggPSBnZXRDb2RlUGF0aCgpOworICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfRk9SV0FSRF9MT0NLKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFwa05hbWVPbmx5ID0gZ2V0QXBrTmFtZShjb2RlUGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBJbnN0YWxsRGlyLmdldFBhdGgoKSArICIvIiArIGFwa05hbWVPbmx5ICsgIi56aXAiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29kZVBhdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2xlYW5VcCgpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIFN0cmluZyBzb3VyY2VEaXIgPSBnZXRDb2RlUGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIHB1YmxpY1NvdXJjZURpciA9IGdldFJlc291cmNlUGF0aCgpOworICAgICAgICAgICAgaWYgKHNvdXJjZURpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlRGlyKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUGFja2FnZSBzb3VyY2UgIiArIHNvdXJjZURpciArICIgZG9lcyBub3QgZXhpc3QuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEZWxldGUgYXBwbGljYXRpb24ncyBjb2RlIGFuZCByZXNvdXJjZXMKKyAgICAgICAgICAgICAgICBzb3VyY2VGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB1YmxpY1NvdXJjZURpciAhPSBudWxsICYmICFwdWJsaWNTb3VyY2VEaXIuZXF1YWxzKHNvdXJjZURpcikpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHB1YmxpY1NvdXJjZUZpbGUgPSBuZXcgRmlsZShwdWJsaWNTb3VyY2VEaXIpOworICAgICAgICAgICAgICAgIGlmICghcHVibGljU291cmNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJQYWNrYWdlIHB1YmxpYyBzb3VyY2UgIiArIHB1YmxpY1NvdXJjZUZpbGUgKyAiIGRvZXMgbm90IGV4aXN0LiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHVibGljU291cmNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWNTb3VyY2VGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNsZWFuVXBSZXNvdXJjZXNMSSgpIHsKKyAgICAgICAgICAgIFN0cmluZyBzb3VyY2VEaXIgPSBnZXRDb2RlUGF0aCgpOworICAgICAgICAgICAgaWYgKGNsZWFuVXAoKSAmJiBtSW5zdGFsbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0Q29kZSA9IG1JbnN0YWxsZXIucm1kZXgoc291cmNlRGlyKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0Q29kZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ291bGRuJ3QgcmVtb3ZlIGRleCBmaWxlIGZvciBwYWNrYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgIiBhdCBsb2NhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzb3VyY2VEaXIgKyAiLCByZXRjb2RlPSIgKyByZXRDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgY29uc2lkZXIgdGhpcyB0byBiZSBhIGZhaWx1cmUgb2YgdGhlIGNvcmUgcGFja2FnZSBkZWxldGlvbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzZXRQZXJtaXNzaW9ucyhTdHJpbmcgcGtnTmFtZSkgeworICAgICAgICAgICAgLy8gVE9ETyBEbyB0aGlzIGluIGEgbW9yZSBlbGVnYW50IHdheSBsYXRlciBvbi4gZm9yIG5vdyBqdXN0IGEgaGFjaworICAgICAgICAgICAgaWYgKCFpc0Z3ZExvY2tlZChmbGFncykpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlsZVBlcm1pc3Npb25zID0KKyAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLlNfSVJVU1J8RmlsZVV0aWxzLlNfSVdVU1J8RmlsZVV0aWxzLlNfSVJHUlAKKyAgICAgICAgICAgICAgICAgICAgfEZpbGVVdGlscy5TX0lST1RIOworICAgICAgICAgICAgICAgIGludCByZXRDb2RlID0gRmlsZVV0aWxzLnNldFBlcm1pc3Npb25zKGdldENvZGVQYXRoKCksIGZpbGVQZXJtaXNzaW9ucywgLTEsIC0xKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0Q29kZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkbid0IHNldCBuZXcgcGFja2FnZSBmaWxlIHBlcm1pc3Npb25zIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb2RlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBUaGUgcmV0dXJuIGNvZGUgd2FzOiAiICsgcmV0Q29kZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gRGVmaW5lIG5ldyBpbnRlcm5hbCBlcnJvcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBTZEluc3RhbGxBcmdzIGV4dGVuZHMgSW5zdGFsbEFyZ3MgeworICAgICAgICBTdHJpbmcgY2lkOworICAgICAgICBTdHJpbmcgY2FjaGVQYXRoOworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU19GSUxFX05BTUUgPSAicGtnLmFwayI7CisKKyAgICAgICAgU2RJbnN0YWxsQXJncyhVcmkgcGFja2FnZVVSSSwKKyAgICAgICAgICAgICAgICBJUGFja2FnZUluc3RhbGxPYnNlcnZlciBvYnNlcnZlciwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgIFN0cmluZyBpbnN0YWxsZXJQYWNrYWdlTmFtZSkgeworICAgICAgICAgICBzdXBlcihwYWNrYWdlVVJJLCBvYnNlcnZlciwgZmxhZ3MsIGluc3RhbGxlclBhY2thZ2VOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIFNkSW5zdGFsbEFyZ3MoU3RyaW5nIGZ1bGxDb2RlUGF0aCwgU3RyaW5nIGZ1bGxSZXNvdXJjZVBhdGgpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwsIG51bGwsIDAsIG51bGwpOworICAgICAgICAgICAgLy8gRXh0cmFjdCBjaWQgZnJvbSBmdWxsQ29kZVBhdGgKKyAgICAgICAgICAgIGludCBlaWR4ID0gZnVsbENvZGVQYXRoLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICBTdHJpbmcgc3ViU3RyMSA9IGZ1bGxDb2RlUGF0aC5zdWJzdHJpbmcoMCwgZWlkeCk7CisgICAgICAgICAgICBpbnQgc2lkeCA9IHN1YlN0cjEubGFzdEluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgIGNpZCA9IHN1YlN0cjEuc3Vic3RyaW5nKHNpZHgrMSwgZWlkeCk7CisgICAgICAgICAgICBjYWNoZVBhdGggPSBzdWJTdHIxOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjcmVhdGVDb3B5RmlsZSgpIHsKKyAgICAgICAgICAgIGNpZCA9IGdldFRlbXBDb250YWluZXJJZCgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNvcHlBcGsoSU1lZGlhQ29udGFpbmVyU2VydmljZSBpbWNzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNhY2hlUGF0aCA9IGltY3MuY29weVJlc291cmNlVG9Db250YWluZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlVVJJLCBjaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbmNyeXB0S2V5KCksIFJFU19GSUxFX05BTUUpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNhY2hlUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gTW91bnQgY29udGFpbmVyIG9uY2UgaXRzIGNyZWF0ZWQgd2l0aCBzeXN0ZW1fdWlkCisgICAgICAgICAgICAgICAgY2FjaGVQYXRoID0gbW91bnRTZERpcihjaWQsIFByb2Nlc3MuU1lTVEVNX1VJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FjaGVQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfQ09OVEFJTkVSX0VSUk9SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9TVUNDRUVERUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU3RyaW5nIGdldENvZGVQYXRoKCkgeworICAgICAgICAgICAgcmV0dXJuIGNhY2hlUGF0aCArICIvIiArIFJFU19GSUxFX05BTUU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU3RyaW5nIGdldFJlc291cmNlUGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjYWNoZVBhdGggKyAiLyIgKyBSRVNfRklMRV9OQU1FOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkb1ByZUluc3RhbGwoaW50IHN0YXR1cykgeworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1NVQ0NFRURFRCkgeworICAgICAgICAgICAgICAgIC8vIERlc3Ryb3kgY29udGFpbmVyCisgICAgICAgICAgICAgICAgZGVzdHJveVNkRGlyKGNpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGRvUmVuYW1lKGludCBzdGF0dXMsIGZpbmFsIFN0cmluZyBwa2dOYW1lLAorICAgICAgICAgICAgICAgIFN0cmluZyBvbGRDb2RlUGF0aCkgeworICAgICAgICAgICAgU3RyaW5nIG5ld0NhY2hlSWQgPSBnZXROZXh0Q29kZVBhdGgob2xkQ29kZVBhdGgsIHBrZ05hbWUsICIvIiArIFJFU19GSUxFX05BTUUpOworICAgICAgICAgICAgLy8gU1RPUFNISVAgVEVNUE9SQVJZIEhBQ0sgRk9SIFJFTkFNRQorICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBjb250YWluZXIgYXQgbmV3Q2FjaGVQYXRoCisgICAgICAgICAgICBTdHJpbmcgY29kZVBhdGggPSBnZXRDb2RlUGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIG5ld0NhY2hlUGF0aCA9IG51bGw7CisgICAgICAgICAgICBmaW5hbCBpbnQgQ1JFQVRFX0ZBSUxFRCA9IDE7CisgICAgICAgICAgICBmaW5hbCBpbnQgQ09QWV9GQUlMRUQgPSAzOworICAgICAgICAgICAgZmluYWwgaW50IEZJTkFMSVpFX0ZBSUxFRCA9IDU7CisgICAgICAgICAgICBmaW5hbCBpbnQgUEFTUyA9IDc7CisgICAgICAgICAgICBpbnQgZXJyQ29kZSA9IENSRUFURV9GQUlMRUQ7CisgICAgICAgICAgICBpZiAoKG5ld0NhY2hlUGF0aCA9IGNyZWF0ZVNkRGlyKG5ldyBGaWxlKGNvZGVQYXRoKSwgbmV3Q2FjaGVJZCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnJDb2RlID0gQ09QWV9GQUlMRUQ7CisgICAgICAgICAgICAgICAgLy8gQ29weSBmaWxlIGZyb20gY29kZVBhdGgKKyAgICAgICAgICAgICAgICBpZiAoRmlsZVV0aWxzLmNvcHlGaWxlKG5ldyBGaWxlKGNvZGVQYXRoKSwgbmV3IEZpbGUobmV3Q2FjaGVQYXRoLCBSRVNfRklMRV9OQU1FKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyQ29kZSA9IEZJTkFMSVpFX0ZBSUxFRDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplU2REaXIobmV3Q2FjaGVJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyckNvZGUgPSBQQVNTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUHJpbnQgZXJyb3IgYmFzZWQgb24gZXJyQ29kZQorICAgICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICIiOworICAgICAgICAgICAgc3dpdGNoIChlcnJDb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDUkVBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICBlcnJNc2cgPSAiQ1JFQVRFX0ZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09QWV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgICAgIGVyck1zZyA9ICJDT1BZX0ZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lTZERpcihuZXdDYWNoZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGSU5BTElaRV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgICAgIGVyck1zZyA9ICJGSU5BTElaRV9GQUlMRUQiOworICAgICAgICAgICAgICAgICAgICBkZXN0cm95U2REaXIobmV3Q2FjaGVJZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGVyck1zZyA9ICJQQVNTIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIERlc3Ryb3kgdGhlIHRlbXBvcmFyeSBjb250YWluZXIKKyAgICAgICAgICAgIGRlc3Ryb3lTZERpcihjaWQpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3RhdHVzOiAiICsgZXJyTXNnKTsKKyAgICAgICAgICAgIGlmIChlcnJDb2RlICE9IFBBU1MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaWQgPSBuZXdDYWNoZUlkOworICAgICAgICAgICAgY2FjaGVQYXRoID0gbmV3Q2FjaGVQYXRoOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZG9Qb3N0SW5zdGFsbChpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEKSB7CisgICAgICAgICAgICAgICAgY2xlYW5VcCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBVbm1vdW50IGNvbnRhaW5lcgorICAgICAgICAgICAgICAgIC8vIFJlbmFtZSBhbmQgcmVtb3VudCBiYXNlZCBvbiBwYWNrYWdlIG5hbWUgYW5kIG5ldyB1aWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhblVwKCkgeworICAgICAgICAgICAgLy8gRGVzdHJveSBzZWN1cmUgY29udGFpbmVyCisgICAgICAgICAgICBkZXN0cm95U2REaXIoY2lkKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYW5VcFJlc291cmNlc0xJKCkgeworICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUZpbGUgPSBnZXRDb2RlUGF0aCgpOworICAgICAgICAgICAgLy8gUmVtb3ZlIGRleCBmaWxlCisgICAgICAgICAgICBpZiAobUluc3RhbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IHJldENvZGUgPSBtSW5zdGFsbGVyLnJtZGV4KHNvdXJjZUZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYgKHJldENvZGUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvdWxkbid0IHJlbW92ZSBkZXggZmlsZSBmb3IgcGFja2FnZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdCBsb2NhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzb3VyY2VGaWxlLnRvU3RyaW5nKCkgKyAiLCByZXRjb2RlPSIgKyByZXRDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgY29uc2lkZXIgdGhpcyB0byBiZSBhIGZhaWx1cmUgb2YgdGhlIGNvcmUgcGFja2FnZSBkZWxldGlvbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFuVXAoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBVdGlsaXR5IG1ldGhvZCB1c2VkIHRvIGNyZWF0ZSBjb2RlIHBhdGhzIGJhc2VkIG9uIHBhY2thZ2UgbmFtZSBhbmQgYXZhaWxhYmxlIGluZGV4LgorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXh0Q29kZVBhdGgoU3RyaW5nIG9sZENvZGVQYXRoLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgc3VmZml4KSB7CisgICAgICAgIFN0cmluZyBpZHhTdHIgPSAiIjsKKyAgICAgICAgaW50IGlkeCA9IDE7CisgICAgICAgIGlmIChvbGRDb2RlUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgZWlkeCA9IC0xOworICAgICAgICAgICAgaWYgKHN1ZmZpeCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZWlkeCA9IG9sZENvZGVQYXRoLmluZGV4T2Yoc3VmZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlaWR4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgZWlkeCA9IG9sZENvZGVQYXRoLmxlbmd0aCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNpZHggPSBvbGRDb2RlUGF0aC5pbmRleE9mKHByZWZpeCk7CisgICAgICAgICAgICBpZiAoc2lkeCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHNpZHggPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHN1YlN0ciA9IG9sZENvZGVQYXRoLnN1YnN0cmluZyhzaWR4ICsgcHJlZml4Lmxlbmd0aCgpLCBlaWR4KTsKKyAgICAgICAgICAgIGlmIChzdWJTdHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChzdWJTdHIuc3RhcnRzV2l0aCgiLSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHN1YlN0ciA9IHN1YlN0ci5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IEludGVnZXIucGFyc2VJbnQoc3ViU3RyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeC0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZHhTdHIgPSAiLSIgKyBJbnRlZ2VyLnRvU3RyaW5nKGlkeCk7CisgICAgICAgIHJldHVybiBwcmVmaXggKyBpZHhTdHI7CisgICAgfQorCisgICAgLy8gVXRpbGl0eSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSByZWxhdGl2ZSBwYWNrYWdlIHBhdGggd2l0aCByZXNwZWN0CisgICAgLy8gdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuIExpa2Ugc2F5IGZvciAvZGF0YS9kYXRhL2NvbS50ZXN0LTEuYXBrCisgICAgLy8gc3RyaW5nIGNvbS50ZXN0LTEgaXMgcmV0dXJuZWQuCisgICAgc3RhdGljIFN0cmluZyBnZXRBcGtOYW1lKFN0cmluZyBjb2RlUGF0aCkgeworICAgICAgICBpZiAoY29kZVBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNpZHggPSBjb2RlUGF0aC5sYXN0SW5kZXhPZigiLyIpOworICAgICAgICBpbnQgZWlkeCA9IGNvZGVQYXRoLmxhc3RJbmRleE9mKCIuIik7CisgICAgICAgIGlmIChlaWR4ID09IC0xKSB7CisgICAgICAgICAgICBlaWR4ID0gY29kZVBhdGgubGVuZ3RoKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZWlkeCA9PSAwKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICIgSW52YWxpZCBjb2RlIHBhdGgsICIrIGNvZGVQYXRoICsgIiBOb3QgYSB2YWxpZCBhcGsgbmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvZGVQYXRoLnN1YnN0cmluZyhzaWR4KzEsIGVpZHgpOworICAgIH0KKwogICAgIGNsYXNzIFBhY2thZ2VJbnN0YWxsZWRJbmZvIHsKICAgICAgICAgU3RyaW5nIG5hbWU7CiAgICAgICAgIGludCB1aWQ7CkBAIC0zOTMyLDcgKzQ0MjQsNiBAQAogICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGZvciBsYXRlciwgaW4gY2FzZSB3ZSBuZWVkIHRvIHJvbGxiYWNrIHRoaXMgaW5zdGFsbAogICAgICAgICBib29sZWFuIGRhdGFEaXJFeGlzdHM7CiAgICAgICAgIFN0cmluZyBwa2dOYW1lID0gcGtnLnBhY2thZ2VOYW1lOwotICAgICAgICBib29sZWFuIG9uU2QgPSAocGFyc2VGbGFncyAmIFBhY2thZ2VQYXJzZXIuUEFSU0VfT05fU0RDQVJEKSAhPSAwOwogCiAgICAgICAgIGlmICh1c2VFbmNyeXB0ZWRGaWxlc3lzdGVtRm9yUGFja2FnZShwa2cpKSB7CiAgICAgICAgICAgICBkYXRhRGlyRXhpc3RzID0gKG5ldyBGaWxlKG1TZWN1cmVBcHBEYXRhRGlyLCBwa2dOYW1lKSkuZXhpc3RzKCk7CkBAIC0zOTUwLDE0ICs0NDQxLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtTGFzdFNjYW5FcnJvciA9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEOwotICAgICAgICBpZiAob25TZCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIHNlY3VyZSBjb250YWluZXIgbW91bnQgcG9pbnQgZm9yIHBhY2thZ2UKLSAgICAgICAgICAgIFN0cmluZyBjUGF0aCA9IGNyZWF0ZVNkRGlyKG5ldyBGaWxlKHBrZy5tU2NhblBhdGgpLCBwa2dOYW1lKTsKLSAgICAgICAgICAgIGlmIChjUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RTY2FuRXJyb3IgPSByZXMucmV0dXJuQ29kZSA9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfRkFJTEVEX0NPTlRBSU5FUl9FUlJPUjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgUGFja2FnZVBhcnNlci5QYWNrYWdlIG5ld1BhY2thZ2UgPSBzY2FuUGFja2FnZUxJKHBrZywgcGFyc2VGbGFncywgc2Nhbk1vZGUpOwogICAgICAgICBpZiAobmV3UGFja2FnZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBMb2cudyhUQUcsICJQYWNrYWdlIGNvdWxkbid0IGJlIGluc3RhbGxlZCBpbiAiICsgcGtnLm1QYXRoKTsKQEAgLTM5NjUsMjEgKzQ0NDgsOSBAQAogICAgICAgICAgICAgICAgIHJlcy5yZXR1cm5Db2RlID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfSU5WQUxJRF9BUEs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGaWxlIGRlc3RQYWNrYWdlRmlsZSA9IG5ldyBGaWxlKHBrZy5tUGF0aCk7Ci0gICAgICAgICAgICBpZiAoZGVzdFBhY2thZ2VGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSXQncyBzYWZlIHRvIGRvIHRoaXMgYmVjYXVzZSB3ZSBrbm93IChmcm9tIHRoZSBhYm92ZSBjaGVjaykgdGhhdCB0aGUgZmlsZQotICAgICAgICAgICAgICAgIC8vIGlzbid0IGN1cnJlbnRseSB1c2VkIGZvciBhbiBpbnN0YWxsZWQgcGFja2FnZS4KLSAgICAgICAgICAgICAgICBkZXN0UGFja2FnZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICB1cGRhdGVTZXR0aW5nc0xJKG5ld1BhY2thZ2UsCiAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlclBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICByZXMpOwotICAgICAgICAgICAgaWYgKHJlcy5yZXR1cm5Db2RlID09IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY29udGFpbmVyIGNhbiBiZSBmaW5hbGl6ZWQKLSAgICAgICAgICAgICAgICBpZihvblNkICYmICFmaW5hbGl6ZVNkRGlyKHBrZ05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcy5yZXR1cm5Db2RlID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfQ09OVEFJTkVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgcGFydGlhbGx5IGluc3RhbGxlZCBhcHBsaWNhdGlvbi4gdGhlIGRhdGEgZGlyZWN0b3J5IHdpbGwgaGF2ZSB0byBiZQogICAgICAgICAgICAgLy8gcmVzdG9yZWQgaWYgaXQgd2FzIGFscmVhZHkgZXhpc3RpbmcKICAgICAgICAgICAgIGlmIChyZXMucmV0dXJuQ29kZSAhPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1NVQ0NFRURFRCkgewpAQCAtMzk4OCwxNSArNDQ1OSwxMSBAQAogICAgICAgICAgICAgICAgIC8vIHNjYW5QYWNrYWdlTG9ja2VkLCB1bmxlc3MgdGhvc2UgZGlyZWN0b3JpZXMgZXhpc3RlZCBiZWZvcmUgd2UgZXZlbiB0cmllZCB0bwogICAgICAgICAgICAgICAgIC8vIGluc3RhbGwuCiAgICAgICAgICAgICAgICAgZGVsZXRlUGFja2FnZUxJKAotICAgICAgICAgICAgICAgICAgICAgICAgcGtnTmFtZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrZ05hbWUsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YURpckV4aXN0cyA/IFBhY2thZ2VNYW5hZ2VyLkRPTlRfREVMRVRFX0RBVEEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMucmVtb3ZlZEluZm8pOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChvblNkICYmIHJlcy5yZXR1cm5Db2RlICE9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEKSB7Ci0gICAgICAgICAgICAvLyBEZXN0cm95IGNhY2hlCi0gICAgICAgICAgICBkZXN0cm95U2REaXIocGtnTmFtZSk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVwbGFjZVBhY2thZ2VMSShQYWNrYWdlUGFyc2VyLlBhY2thZ2UgcGtnLApAQCAtNDAzOSw3ICs0NTA2LDcgQEAKIAogICAgICAgICBwYXJzZUZsYWdzIHw9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfUkVQTEFDRV9FWElTVElORzsKICAgICAgICAgLy8gRmlyc3QgZGVsZXRlIHRoZSBleGlzdGluZyBwYWNrYWdlIHdoaWxlIHJldGFpbmluZyB0aGUgZGF0YSBkaXJlY3RvcnkKLSAgICAgICAgaWYgKCFkZWxldGVQYWNrYWdlTEkocGtnTmFtZSwgZmFsc2UsIFBhY2thZ2VNYW5hZ2VyLkRPTlRfREVMRVRFX0RBVEEsCisgICAgICAgIGlmICghZGVsZXRlUGFja2FnZUxJKHBrZ05hbWUsIHRydWUsIFBhY2thZ2VNYW5hZ2VyLkRPTlRfREVMRVRFX0RBVEEsCiAgICAgICAgICAgICAgICAgcmVzLnJlbW92ZWRJbmZvKSkgewogICAgICAgICAgICAgLy8gSWYgdGhlIGV4aXN0aW5nIHBhY2thZ2Ugd2FzJ250IHN1Y2Nlc3NmdWxseSBkZWxldGVkCiAgICAgICAgICAgICByZXMucmV0dXJuQ29kZSA9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfRkFJTEVEX1JFUExBQ0VfQ09VTEROVF9ERUxFVEU7CkBAIC00MDYzLDE3ICs0NTMwLDEwIEBACiAKICAgICAgICAgaWYgKHJlcy5yZXR1cm5Db2RlID09IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEKSB7CiAgICAgICAgICAgICAvLyBJZiB3ZSBkZWxldGVkIGFuIGV4aXNpdGluZyBwYWNrYWdlLCB0aGUgb2xkIHNvdXJjZSBhbmQgcmVzb3VyY2UgZmlsZXMgdGhhdCB3ZQotICAgICAgICAgICAgLy8gd2VyZSBrZWVwaW5nIGFyb3VuZCBpbiBjYXNlIHdlIG5lZWRlZCB0aGVtIChzZWUgYmVsb3cpIGNhbiBub3cgYmUgZGVsZXRlZAotICAgICAgICAgICAgZmluYWwgQXBwbGljYXRpb25JbmZvIGRlbGV0ZWRQYWNrYWdlQXBwSW5mbyA9IGRlbGV0ZWRQYWNrYWdlLmFwcGxpY2F0aW9uSW5mbzsKLSAgICAgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSW5mbyBpbnN0YWxsZWRQYWNrYWdlQXBwSW5mbyA9Ci0gICAgICAgICAgICAgICAgbmV3UGFja2FnZS5hcHBsaWNhdGlvbkluZm87Ci0gICAgICAgICAgICBkZWxldGVQYWNrYWdlUmVzb3VyY2VzTEkocGtnTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIWRlbGV0ZWRQYWNrYWdlQXBwSW5mby5zb3VyY2VEaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGluc3RhbGxlZFBhY2thZ2VBcHBJbmZvLnNvdXJjZURpcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlbGV0ZWRQYWNrYWdlQXBwSW5mby5zb3VyY2VEaXIgOiBudWxsLAotICAgICAgICAgICAgICAgICAgICAhZGVsZXRlZFBhY2thZ2VBcHBJbmZvLnB1YmxpY1NvdXJjZURpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoaW5zdGFsbGVkUGFja2FnZUFwcEluZm8ucHVibGljU291cmNlRGlyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVsZXRlZFBhY2thZ2VBcHBJbmZvLnB1YmxpY1NvdXJjZURpciA6IG51bGwpOworICAgICAgICAgICAgLy8gd2VyZSBrZWVwaW5nIGFyb3VuZCBpbiBjYXNlIHdlIG5lZWRlZCB0aGVtIChzZWUgYmVsb3cpIGNhbiBub3cgYmUgZGVsZXRlZC4KKyAgICAgICAgICAgIC8vIFRoaXMgaW5mbyB3aWxsIGJlIHNldCBvbiB0aGUgcmVzLnJlbW92ZWRJbmZvIHRvIGNsZWFuIHVwIGxhdGVyIG9uIGFzIHBvc3QKKyAgICAgICAgICAgIC8vIGluc3RhbGwgYWN0aW9uLgorCiAgICAgICAgICAgICAvL3VwZGF0ZSBzaWduYXR1cmUgb24gdGhlIG5ldyBwYWNrYWdlIHNldHRpbmcKICAgICAgICAgICAgIC8vdGhpcyBzaG91bGQgYWx3YXlzIHN1Y2NlZWQsIHNpbmNlIHdlIGNoZWNrZWQgdGhlCiAgICAgICAgICAgICAvL3NpZ25hdHVyZSBlYXJsaWVyLgpAQCAtNDEwMCwyMiArNDU2MCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgYWxsb2NhdGluZyBzdG9yYWdlIHdoZW4gcmVzdG9yaW5nIHBrZyA6ICIgKyBwa2dOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGaWxlIHJlc3RvcmVUbXBGaWxlID0gY3JlYXRlVGVtcFBhY2thZ2VGaWxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3RvcmVUbXBGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIGNyZWF0aW5nIHRlbXAgZmlsZSB3aGVuIHJlc3RvcmluZyBwa2cgOiAgIiArIHBrZ05hbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghRmlsZVV0aWxzLmNvcHlGaWxlKHJlc3RvcmVGaWxlLCByZXN0b3JlVG1wRmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIGNvcHlpbmcgdGVtcCBmaWxlIHdoZW4gcmVzdG9yaW5nIHBrZyA6ICIgKyBwa2dOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBQYWNrYWdlSW5zdGFsbGVkSW5mbyByZXN0b3JlUmVzID0gbmV3IFBhY2thZ2VJbnN0YWxsZWRJbmZvKCk7CiAgICAgICAgICAgICAgICAgcmVzdG9yZVJlcy5yZW1vdmVkSW5mbyA9IG5ldyBQYWNrYWdlUmVtb3ZlZEluZm8oKTsKLSAgICAgICAgICAgICAgICBpbnN0YWxsUGFja2FnZUxJKAotICAgICAgICAgICAgICAgICAgICAgICAgVXJpLmZyb21GaWxlKHJlc3RvcmVGaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzRm9yd2FyZExvY2tlZChkZWxldGVkUGFja2FnZSkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GT1JXQVJEX0xPQ0sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwLCBmYWxzZSwgb2xkSW5zdGFsbGVyUGFja2FnZU5hbWUsIHJlc3RvcmVUbXBGaWxlLCByZXN0b3JlUmVzKTsKKyAgICAgICAgICAgICAgICAvLyBQYXJzZSBvbGQgcGFja2FnZQorICAgICAgICAgICAgICAgIHBhcnNlRmxhZ3MgfD0gflBhY2thZ2VNYW5hZ2VyLklOU1RBTExfUkVQTEFDRV9FWElTVElORzsKKyAgICAgICAgICAgICAgICBzY2FuUGFja2FnZUxJKHJlc3RvcmVGaWxlLCBwYXJzZUZsYWdzLCBzY2FuTW9kZSk7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtUGFja2FnZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JhbnRQZXJtaXNzaW9uc0xQKGRlbGV0ZWRQYWNrYWdlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5ncy53cml0ZUxQKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChyZXN0b3JlUmVzLnJldHVybkNvZGUgIT0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9TVUNDRUVERUQpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHJlc3RvcmluZyBwa2cgOiAiICsgcGtnTmFtZSArICIgYWZ0ZXIgZmFpbGVkIHVwZ3JhZGUiKTsKICAgICAgICAgICAgICAgICB9CkBAIC00MjIwLDI0ICs0NjczLDExIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vIFhYWCBUaGVyZSBhcmUgcHJvYmFibHkgc29tZSBiaWcgaXNzdWVzIGhlcmU6IHVwb24gZG9pbmcKLSAgICAgICAgLy8gdGhlIHJlbmFtZSwgd2UgaGF2ZSByZWFjaGVkIHRoZSBwb2ludCBvZiBubyByZXR1cm4gKHRoZQotICAgICAgICAvLyBvcmlnaW5hbCAuYXBrIGlzIGdvbmUhKSwgc28gd2UgY2FuJ3QgZmFpbC4gIFlldC4uLiB3ZSBjYW4uCi0gICAgICAgIEZpbGUgc2NhbkZpbGUgPSBuZXcgRmlsZShuZXdQYWNrYWdlLm1TY2FuUGF0aCk7Ci0gICAgICAgIGlmICghc2NhbkZpbGUucmVuYW1lVG8obmV3IEZpbGUobmV3UGFja2FnZS5tUGF0aCkpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZG4ndCBtb3ZlIHBhY2thZ2UgZmlsZTogIiArIG5ld1BhY2thZ2UubVNjYW5QYXRoICsgIiB0bzogIiArIG5ld1BhY2thZ2UubVBhdGgpOwotICAgICAgICAgICAgLy8gVE9ETyByZW5hbWUgc2hvdWxkIHdvcmsuIFdvcmthcm91bmQKLSAgICAgICAgICAgIGlmICghRmlsZVV0aWxzLmNvcHlGaWxlKHNjYW5GaWxlLCBuZXcgRmlsZShuZXdQYWNrYWdlLm1QYXRoKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZG4ndCBtb3ZlIHBhY2thZ2UgZmlsZSB0bzogIiArIG5ld1BhY2thZ2UubVBhdGgpOwotICAgICAgICAgICAgICAgIHJlcy5yZXR1cm5Db2RlID0gIFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfRkFJTEVEX0lOU1VGRklDSUVOVF9TVE9SQUdFOwotICAgICAgICAgICAgfQorICAgICAgICByZXMucmV0dXJuQ29kZSA9IHNldFBlcm1pc3Npb25zTEkobmV3UGFja2FnZSk7CisgICAgICAgIGlmKHJlcy5yZXR1cm5Db2RlICE9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEKSB7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXMucmV0dXJuQ29kZSA9IHNldFBlcm1pc3Npb25zTEkobmV3UGFja2FnZSk7Ci0gICAgICAgICAgICBpZihyZXMucmV0dXJuQ29kZSAhPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1NVQ0NFRURFRCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTmV3IHBhY2thZ2UgaW5zdGFsbGVkIGluICIgKyBuZXdQYWNrYWdlLm1QYXRoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5kKFRBRywgIk5ldyBwYWNrYWdlIGluc3RhbGxlZCBpbiAiICsgbmV3UGFja2FnZS5tUGF0aCk7CiAgICAgICAgIH0KICAgICAgICAgaWYocmVzLnJldHVybkNvZGUgIT0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9TVUNDRUVERUQpIHsKICAgICAgICAgICAgIGlmIChtSW5zdGFsbGVyICE9IG51bGwpIHsKQEAgLTQyNTgsNjcgKzQ2OTgsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgRmlsZSBjb3B5VGVtcEluc3RhbGxGaWxlKFVyaSBwUGFja2FnZVVSSSwKLSAgICAgICAgICAgIFBhY2thZ2VJbnN0YWxsZWRJbmZvIHJlcykgewotICAgICAgICBGaWxlIHRtcFBhY2thZ2VGaWxlID0gY3JlYXRlVGVtcFBhY2thZ2VGaWxlKCk7Ci0gICAgICAgIGludCByZXRDb2RlID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9TVUNDRUVERUQ7Ci0gICAgICAgIGlmICh0bXBQYWNrYWdlRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXMucmV0dXJuQ29kZSA9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfRkFJTEVEX0lOU1VGRklDSUVOVF9TVE9SQUdFOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocFBhY2thZ2VVUkkuZ2V0U2NoZW1lKCkuZXF1YWxzKCJmaWxlIikpIHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgc3JjUGFja2FnZUZpbGUgPSBuZXcgRmlsZShwUGFja2FnZVVSSS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgLy8gV2UgY29weSB0aGUgc291cmNlIHBhY2thZ2UgZmlsZSB0byBhIHRlbXAgZmlsZSBhbmQgdGhlbiByZW5hbWUgaXQgdG8gdGhlCi0gICAgICAgICAgICAvLyBkZXN0aW5hdGlvbiBmaWxlIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSBhIHdpbmRvdyB3aGVyZSB0aGUgcGFja2FnZSBkaXJlY3RvcnkKLSAgICAgICAgICAgIC8vIHNjYW5uZXIgbm90aWNlcyB0aGUgbmV3IHBhY2thZ2UgZmlsZSBidXQgaXQncyBub3QgY29tcGxldGVseSBjb3BpZWQgeWV0LgotICAgICAgICAgICAgaWYgKCFGaWxlVXRpbHMuY29weUZpbGUoc3JjUGFja2FnZUZpbGUsIHRtcFBhY2thZ2VGaWxlKSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkbid0IGNvcHkgcGFja2FnZSBmaWxlIHRvIHRlbXAgZmlsZS4iKTsKLSAgICAgICAgICAgICAgICByZXRDb2RlID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfSU5TVUZGSUNJRU5UX1NUT1JBR0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocFBhY2thZ2VVUkkuZ2V0U2NoZW1lKCkuZXF1YWxzKCJjb250ZW50IikpIHsKLSAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmQgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuRmlsZURlc2NyaXB0b3IocFBhY2thZ2VVUkksICJyIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkbid0IG9wZW4gZmlsZSBkZXNjcmlwdG9yIGZyb20gZG93bmxvYWQgc2VydmljZS4gRmFpbGVkIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgICAgICAgICByZXRDb2RlID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfSU5TVUZGSUNJRU5UX1NUT1JBR0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkbid0IG9wZW4gZmlsZSBkZXNjcmlwdG9yIGZyb20gZG93bmxvYWQgc2VydmljZSAobnVsbCkuIik7Ci0gICAgICAgICAgICAgICAgcmV0Q29kZSA9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfRkFJTEVEX0lOU1VGRklDSUVOVF9TVE9SQUdFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiT3BlbmVkIGZpbGUgZGVzY3JpcHRvciBmcm9tIGRvd25sb2FkIHNlcnZpY2UuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICBkbFN0cmVhbSA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VJbnB1dFN0cmVhbShmZCk7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY29weSB0aGUgc291cmNlIHBhY2thZ2UgZmlsZSB0byBhIHRlbXAgZmlsZSBhbmQgdGhlbiByZW5hbWUgaXQgdG8gdGhlCi0gICAgICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gZmlsZSBpbiBvcmRlciB0byBlbGltaW5hdGUgYSB3aW5kb3cgd2hlcmUgdGhlIHBhY2thZ2UgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgLy8gc2Nhbm5lciBub3RpY2VzIHRoZSBuZXcgcGFja2FnZSBmaWxlIGJ1dCBpdCdzIG5vdCBjb21wbGV0ZWx5IGNvcGllZCB5ZXQuCi0gICAgICAgICAgICAgICAgaWYgKCFGaWxlVXRpbHMuY29weVRvRmlsZShkbFN0cmVhbSwgdG1wUGFja2FnZUZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkbid0IGNvcHkgcGFja2FnZSBzdHJlYW0gdG8gdGVtcCBmaWxlLiIpOwotICAgICAgICAgICAgICAgICAgICByZXRDb2RlID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfSU5TVUZGSUNJRU5UX1NUT1JBR0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGFja2FnZSBVUkkgaXMgbm90ICdmaWxlOicgb3IgJ2NvbnRlbnQ6JyAtICIgKyBwUGFja2FnZVVSSSk7Ci0gICAgICAgICAgICByZXRDb2RlID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfSU5WQUxJRF9VUkk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXMucmV0dXJuQ29kZSA9IHJldENvZGU7Ci0gICAgICAgIGlmIChyZXRDb2RlICE9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEKSB7Ci0gICAgICAgICAgICBpZiAodG1wUGFja2FnZUZpbGUgIT0gbnVsbCAmJiB0bXBQYWNrYWdlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRtcFBhY2thZ2VGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRtcFBhY2thZ2VGaWxlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbnN0YWxsUGFja2FnZUxJKFVyaSBwUGFja2FnZVVSSSwKLSAgICAgICAgICAgIGludCBwRmxhZ3MsIGJvb2xlYW4gbmV3SW5zdGFsbCwgU3RyaW5nIGluc3RhbGxlclBhY2thZ2VOYW1lLAotICAgICAgICAgICAgRmlsZSB0bXBQYWNrYWdlRmlsZSwgUGFja2FnZUluc3RhbGxlZEluZm8gcmVzKSB7CisgICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxQYWNrYWdlTEkoSW5zdGFsbEFyZ3MgYXJncywKKyAgICAgICAgICAgIGJvb2xlYW4gbmV3SW5zdGFsbCwgUGFja2FnZUluc3RhbGxlZEluZm8gcmVzKSB7CisgICAgICAgIGludCBwRmxhZ3MgPSBhcmdzLmZsYWdzOworICAgICAgICBTdHJpbmcgaW5zdGFsbGVyUGFja2FnZU5hbWUgPSBhcmdzLmluc3RhbGxlclBhY2thZ2VOYW1lOworICAgICAgICBGaWxlIHRtcFBhY2thZ2VGaWxlID0gbmV3IEZpbGUoYXJncy5nZXRDb2RlUGF0aCgpKTsKICAgICAgICAgYm9vbGVhbiBmb3J3YXJkTG9ja2VkID0gKChwRmxhZ3MgJiBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX0ZPUldBUkRfTE9DSykgIT0gMCk7CiAgICAgICAgIGJvb2xlYW4gb25TZCA9ICgocEZsYWdzICYgUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9PTl9TRENBUkQpICE9IDApOwogICAgICAgICBib29sZWFuIHJlcGxhY2luZ0V4aXN0aW5nUGFja2FnZSA9IGZhbHNlOwpAQCAtNDM1MywxNCArNDczNywyNSBAQAogICAgICAgICAgICAgICAgIGJyZWFrIG1haW5fZmxvdzsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gR2V0IHJpZCBvZiBhbGwgcmVmZXJlbmNlcyB0byBwYWNrYWdlIHNjYW4gcGF0aCB2aWEgcGFyc2VyLgorICAgICAgICAgICAgcHAgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIG9sZENvZGVQYXRoID0gbnVsbDsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhY2thZ2VzKSB7CiAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiBpbnN0YWxsaW5nIGFscmVhZHkgZXhpc3RpbmcgcGFja2FnZQogICAgICAgICAgICAgICAgIGlmICgocEZsYWdzJlBhY2thZ2VNYW5hZ2VyLklOU1RBTExfUkVQTEFDRV9FWElTVElORykgIT0gMAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVBhY2thZ2VzLmNvbnRhaW5zS2V5KHBrZ05hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2luZ0V4aXN0aW5nUGFja2FnZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG9sZENvZGVQYXRoID0gbVNldHRpbmdzLm1QYWNrYWdlcy5nZXQocGtnTmFtZSkuY29kZVBhdGhTdHJpbmc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIWFyZ3MuZG9SZW5hbWUocmVzLnJldHVybkNvZGUsIHBrZ05hbWUsIG9sZENvZGVQYXRoKSkgeworICAgICAgICAgICAgICAgIHJlcy5yZXR1cm5Db2RlID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GQUlMRURfSU5TVUZGSUNJRU5UX1NUT1JBR0U7CisgICAgICAgICAgICAgICAgYnJlYWsgbWFpbl9mbG93OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETyByZW5hbWUgIHBrZy5tU2NhblBhdGggSW4gc2NhblBhY2thZ2VMSSBsZXQgaXQganVzdCBzZXQgdmFsdWVzIGJhc2VkIG9uIG1TY2FuUGF0aAorICAgICAgICAgICAgcGtnLmFwcGxpY2F0aW9uSW5mby5zb3VyY2VEaXIgPSBwa2cubVNjYW5QYXRoPSBwa2cubVBhdGggPSBhcmdzLmdldENvZGVQYXRoKCk7CisgICAgICAgICAgICBwa2cuYXBwbGljYXRpb25JbmZvLnB1YmxpY1NvdXJjZURpciA9IGFyZ3MuZ2V0UmVzb3VyY2VQYXRoKCk7CiAgICAgICAgICAgICBpZihyZXBsYWNpbmdFeGlzdGluZ1BhY2thZ2UpIHsKICAgICAgICAgICAgICAgICByZXBsYWNlUGFja2FnZUxJKHBrZywgcGFyc2VGbGFncywgc2Nhbk1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZXJQYWNrYWdlTmFtZSwgcmVzKTsKQEAgLTQzNjksMTUgKzQ3NjQsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlclBhY2thZ2VOYW1lLHJlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAodG1wUGFja2FnZUZpbGUgIT0gbnVsbCAmJiB0bXBQYWNrYWdlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRtcFBhY2thZ2VGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgaWYgKHJlcy5yZXR1cm5Db2RlID09IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEKSB7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIGludCBzZXRQZXJtaXNzaW9uc0xJKFBhY2thZ2VQYXJzZXIuUGFja2FnZSBuZXdQYWNrYWdlKSB7CiAgICAgICAgIFN0cmluZyBwa2dOYW1lID0gbmV3UGFja2FnZS5wYWNrYWdlTmFtZTsKLSAgICAgICAgaW50IHJldENvZGU7CisgICAgICAgIGludCByZXRDb2RlID0gMDsKKyAgICAgICAgLy8gVE9ETyBHcm9zcyBoYWNrIGJ1dCBmaXggbGF0ZXIuIElkZWFsbHkgbW92ZSB0aGlzIHRvIGJlIGEgcG9zdCBpbnN0YWxsYXRpb24KKyAgICAgICAgLy8gY2hlY2sgYWZ0ZXIgYWxsb3RpbmcgdWlkLgogICAgICAgICBpZiAoKG5ld1BhY2thZ2UuYXBwbGljYXRpb25JbmZvLmZsYWdzCiAgICAgICAgICAgICAgICAgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19GT1JXQVJEX0xPQ0spICE9IDApIHsKICAgICAgICAgICAgIEZpbGUgZGVzdFJlc291cmNlRmlsZSA9IG5ldyBGaWxlKG5ld1BhY2thZ2UuYXBwbGljYXRpb25JbmZvLnB1YmxpY1NvdXJjZURpcik7CkBAIC00MzkxLDcgKzQ3ODcsNyBAQAogICAgICAgICAgICAgICAgIC8vVE9ETyBjbGVhbiB1cCB0aGUgZXh0cmFjdGVkIHB1YmxpYyBmaWxlcwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1JbnN0YWxsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldENvZGUgPSBtSW5zdGFsbGVyLnNldEZvcndhcmRMb2NrUGVybShwa2dOYW1lLAorICAgICAgICAgICAgICAgIHJldENvZGUgPSBtSW5zdGFsbGVyLnNldEZvcndhcmRMb2NrUGVybShnZXRBcGtOYW1lKG5ld1BhY2thZ2UubVBhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFja2FnZS5hcHBsaWNhdGlvbkluZm8udWlkKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGZpbGVQZXJtaXNzaW9ucyA9CkBAIC00NDAwLDE1ICs0Nzk2LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYWNrYWdlLmFwcGxpY2F0aW9uSW5mby51aWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgaW50IGZpbGVQZXJtaXNzaW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5TX0lSVVNSfEZpbGVVdGlscy5TX0lXVVNSfEZpbGVVdGlscy5TX0lSR1JQCi0gICAgICAgICAgICAgICAgICAgIHxGaWxlVXRpbHMuU19JUk9USDsKLSAgICAgICAgICAgIHJldENvZGUgPSBGaWxlVXRpbHMuc2V0UGVybWlzc2lvbnMobmV3UGFja2FnZS5tUGF0aCwgZmlsZVBlcm1pc3Npb25zLCAtMSwgLTEpOworICAgICAgICAgICAgLy8gVGhlIHBlcm1pc3Npb25zIG9uIHRoZSByZXNvdXJjZSBmaWxlIHdhcyBzZXQgd2hlbiBpdCB3YXMgY29waWVkIGZvcgorICAgICAgICAgICAgLy8gbm9uIGZvcndhcmQgbG9ja2VkIGFwcHMgYW5kIGFwcHMgb24gc2RjYXJkCiAgICAgICAgIH0KKwogICAgICAgICBpZiAocmV0Q29kZSAhPSAwKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZG4ndCBzZXQgbmV3IHBhY2thZ2UgZmlsZSBwZXJtaXNzaW9ucyBmb3IgIiArCiAgICAgICAgICAgICAgICAgICAgIG5ld1BhY2thZ2UubVBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBUaGUgcmV0dXJuIGNvZGUgd2FzOiAiICsgcmV0Q29kZSk7CisgICAgICAgICAgICAvLyBUT0RPIERlZmluZSBuZXcgaW50ZXJuYWwgZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX0ZBSUxFRF9JTlNVRkZJQ0lFTlRfU1RPUkFHRTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9TVUNDRUVERUQ7CiAgICAgfQpAQCAtNDQ5MSwxMCArNDg4OCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBQYWNrYWdlRmlsZSgpIHsKKyAgICBwcml2YXRlIEZpbGUgY3JlYXRlVGVtcFBhY2thZ2VGaWxlKEZpbGUgaW5zdGFsbERpcikgewogICAgICAgICBGaWxlIHRtcFBhY2thZ2VGaWxlOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgdG1wUGFja2FnZUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ2bWRsIiwgIi50bXAiLCBtQXBwSW5zdGFsbERpcik7CisgICAgICAgICAgICB0bXBQYWNrYWdlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInZtZGwiLCAiLnRtcCIsIGluc3RhbGxEaXIpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZG4ndCBjcmVhdGUgdGVtcCBmaWxlIGZvciBkb3dubG9hZGVkIHBhY2thZ2UgZmlsZS4iKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtNDU3MCw2ICs0OTY3LDEzIEBACiAgICAgICAgICAgICAgICAgc2VuZFBhY2thZ2VCcm9hZGNhc3QoSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFUExBQ0VELCBwYWNrYWdlTmFtZSwgZXh0cmFzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBEZWxldGUgdGhlIHJlc291cmNlcyBoZXJlIGFmdGVyIHNlbmRpbmcgdGhlIGJyb2FkY2FzdCB0byBsZXQKKyAgICAgICAgLy8gb3RoZXIgcHJvY2Vzc2VzIGNsZWFuIHVwIGJlZm9yZSBkZWxldGluZyByZXNvdXJjZXMuCisgICAgICAgIHN5bmNocm9uaXplZCAobUluc3RhbGxMb2NrKSB7CisgICAgICAgICAgICBpZiAoaW5mby5hcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbmZvLmFyZ3MuY2xlYW5VcFJlc291cmNlc0xJKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKQEAgLTQ1NzgsNiArNDk4Miw4IEBACiAgICAgICAgIGludCB1aWQgPSAtMTsKICAgICAgICAgaW50IHJlbW92ZWRVaWQgPSAtMTsKICAgICAgICAgYm9vbGVhbiBpc1JlbW92ZWRQYWNrYWdlU3lzdGVtVXBkYXRlID0gZmFsc2U7CisgICAgICAgIC8vIENsZWFuIHVwIHJlc291cmNlcyBkZWxldGVkIHBhY2thZ2VzLgorICAgICAgICBJbnN0YWxsQXJncyBhcmdzID0gbnVsbDsKIAogICAgICAgICB2b2lkIHNlbmRCcm9hZGNhc3QoYm9vbGVhbiBmdWxsUmVtb3ZlLCBib29sZWFuIHJlcGxhY2luZykgewogICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoMSk7CkBAIC00NzA3LDM2ICs1MTEzLDYgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZVBhY2thZ2VSZXNvdXJjZXNMSShTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgc291cmNlRGlyLCBTdHJpbmcgcHVibGljU291cmNlRGlyKSB7Ci0gICAgICAgIGlmIChzb3VyY2VEaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlRGlyKTsKLSAgICAgICAgICAgIGlmICghc291cmNlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlBhY2thZ2Ugc291cmNlICIgKyBzb3VyY2VEaXIgKyAiIGRvZXMgbm90IGV4aXN0LiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRGVsZXRlIGFwcGxpY2F0aW9uJ3MgY29kZSBhbmQgcmVzb3VyY2VzCi0gICAgICAgICAgICBzb3VyY2VGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgaWYgKG1JbnN0YWxsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCByZXRDb2RlID0gbUluc3RhbGxlci5ybWRleChzb3VyY2VGaWxlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChyZXRDb2RlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZG4ndCByZW1vdmUgZGV4IGZpbGUgZm9yIHBhY2thZ2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lICsgIiBhdCBsb2NhdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzb3VyY2VGaWxlLnRvU3RyaW5nKCkgKyAiLCByZXRjb2RlPSIgKyByZXRDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgY29uc2lkZXIgdGhpcyB0byBiZSBhIGZhaWx1cmUgb2YgdGhlIGNvcmUgcGFja2FnZSBkZWxldGlvbgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocHVibGljU291cmNlRGlyICE9IG51bGwgJiYgIXB1YmxpY1NvdXJjZURpci5lcXVhbHMoc291cmNlRGlyKSkgewotICAgICAgICAgICAgZmluYWwgRmlsZSBwdWJsaWNTb3VyY2VGaWxlID0gbmV3IEZpbGUocHVibGljU291cmNlRGlyKTsKLSAgICAgICAgICAgIGlmICghcHVibGljU291cmNlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlBhY2thZ2UgcHVibGljIHNvdXJjZSAiICsgcHVibGljU291cmNlRmlsZSArICIgZG9lcyBub3QgZXhpc3QuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHVibGljU291cmNlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHB1YmxpY1NvdXJjZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gZGVsZXRlSW5zdGFsbGVkUGFja2FnZUxJKFBhY2thZ2VQYXJzZXIuUGFja2FnZSBwLAogICAgICAgICAgICAgYm9vbGVhbiBkZWxldGVDb2RlQW5kUmVzb3VyY2VzLCBpbnQgZmxhZ3MsIFBhY2thZ2VSZW1vdmVkSW5mbyBvdXRJbmZvKSB7CiAgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBhcHBsaWNhdGlvbkluZm8gPSBwLmFwcGxpY2F0aW9uSW5mbzsKQEAgLTQ3NTMsNyArNTEyOSwxMiBAQAogCiAgICAgICAgIC8vIERlbGV0ZSBhcHBsaWNhdGlvbiBjb2RlIGFuZCByZXNvdXJjZXMKICAgICAgICAgaWYgKGRlbGV0ZUNvZGVBbmRSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgIGRlbGV0ZVBhY2thZ2VSZXNvdXJjZXNMSShhcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUsCisgICAgICAgICAgICAvLyBUT0RPIGNhbiBwaWNrIHVwIGZyb20gUGFja2FnZVNldHRpbmdzIGFzIHdlbGwKKyAgICAgICAgICAgIGludCBpbnN0YWxsRmxhZ3MgPSAoKHAuYXBwbGljYXRpb25JbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfT05fU0RDQVJEKSE9MCkgPworICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX09OX1NEQ0FSRCA6IDA7CisgICAgICAgICAgICBpbnN0YWxsRmxhZ3MgfD0gKChwLmFwcGxpY2F0aW9uSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX0ZPUldBUkRfTE9DSykhPTApID8KKyAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9GT1JXQVJEX0xPQ0sgOiAwOworICAgICAgICAgICAgb3V0SW5mby5hcmdzID0gY3JlYXRlSW5zdGFsbEFyZ3MoaW5zdGFsbEZsYWdzLAogICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkluZm8uc291cmNlRGlyLCBhcHBsaWNhdGlvbkluZm8ucHVibGljU291cmNlRGlyKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQ3OTgsMTIgKzUxNzksNiBAQAogICAgICAgICAgICAgTG9nLncoVEFHLCAiUGFja2FnZSAiICsgcC5wYWNrYWdlTmFtZSArICIgaGFzIG5vIGFwcGxpY2F0aW9uSW5mby4iKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBib29sZWFuIG9uU2QgPSAocC5hcHBsaWNhdGlvbkluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19PTl9TRENBUkQpICE9IDA7Ci0gICAgICAgIC8vIE1vdW50IHNkIGNvbnRhaW5lciBpZiBuZWVkZWQKLSAgICAgICAgaWYgKG9uU2QpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQmV0dGVyIGVycm9yIGhhbmRsaW5nIGZyb20gTW91bnRTZXJ2aWNlIGFwaSBsYXRlcgotICAgICAgICAgICAgbW91bnRTZERpcihwLnBhY2thZ2VOYW1lLCBQcm9jZXNzLlNZU1RFTV9VSUQpIDsKLSAgICAgICAgfQogICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOwogICAgICAgICBpZiAoIChwLmFwcGxpY2F0aW9uSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NZU1RFTSkgIT0gMCkgewogICAgICAgICAgICAgTG9nLmkoVEFHLCAiUmVtb3Zpbmcgc3lzdGVtIHBhY2thZ2U6IitwLnBhY2thZ2VOYW1lKTsKQEAgLTQ4MTIsMjIgKzUxODcsMTAgQEAKICAgICAgICAgICAgIHJldCA9IGRlbGV0ZVN5c3RlbVBhY2thZ2VMSShwLCBmbGFncywgb3V0SW5mbyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJSZW1vdmluZyBub24tc3lzdGVtIHBhY2thZ2U6IitwLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIC8vIEtpbGwgYXBwbGljYXRpb24gcHJlLWVtcHRpdmVseSBlc3BlY2lhbGx5IGZvciBhcHBzIG9uIHNkLgorICAgICAgICAgICAga2lsbEFwcGxpY2F0aW9uKHBhY2thZ2VOYW1lLCBwLmFwcGxpY2F0aW9uSW5mby51aWQpOwogICAgICAgICAgICAgcmV0ID0gZGVsZXRlSW5zdGFsbGVkUGFja2FnZUxJIChwLCBkZWxldGVDb2RlQW5kUmVzb3VyY2VzLCBmbGFncywgb3V0SW5mbyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJldCAmJiBvblNkKSB7Ci0gICAgICAgICAgICBpZiAoZGVsZXRlQ29kZUFuZFJlc291cmNlcykgewotICAgICAgICAgICAgICAgIC8vIFBvc3QgYSBkZWxheWVkIGRlc3Ryb3kgb24gdGhlIGNvbnRhaW5lciBzaW5jZSB0aGVyZSBtaWdodAotICAgICAgICAgICAgICAgIC8vIGJlIGFjdGl2ZSBwcm9jZXNzZXMgaG9sZGluZyBvcGVuIGZpbGUgaGFuZGxlcyB0byBwYWNrYWdlCi0gICAgICAgICAgICAgICAgLy8gcmVzb3VyY2VzIHdoaWNoIHdpbGwgZ2V0IGtpbGxlZCBieSB0aGUgcHJvY2VzcyBraWxsZXIgd2hlbgotICAgICAgICAgICAgICAgIC8vIGRlc3Ryb3lpbmcgdGhlIGNvbnRhaW5lci4gVGhpcyBtaWdodCBldmVuIGtpbGwgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGFuZCBjcmFzaCB0aGUgc3lzdGVtLiBEZWxheSB0aGUgZGVzdHJveSBhIGJpdCBzbwotICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGFjdGl2ZSBwcm9jZXNzZXMgZ2V0IHRvIGhhbmRsZSB0aGUgdW5pbnN0YWxsIGJyb2FkY2FzdHMuCi0gICAgICAgICAgICAgICAgc2VuZERlbGF5ZWREZXN0cm95U2REaXIocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBKdXN0IHVubW91bnQgdGhlIGRpcmVjdG9yeQotICAgICAgICAgICAgICAgIHVuTW91bnRTZERpcihwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKQEAgLTc1MjAsMTEgKzc4ODMsMzEgQEAKICAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBtU2RFbmNyeXB0S2V5ID0gIkFwcHNPblNEIjsKICAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBtU2RFbmNyeXB0QWxnID0gIkFFUyI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1NZWRpYU1vdW50ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTlRBSU5FUlMgPSAyNTA7CiAKLSAgICBwcml2YXRlIE1vdW50U2VydmljZSBnZXRNb3VudFNlcnZpY2UoKSB7CisKKyAgICBzdGF0aWMgTW91bnRTZXJ2aWNlIGdldE1vdW50U2VydmljZSgpIHsKICAgICAgICAgcmV0dXJuIChNb3VudFNlcnZpY2UpIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoIm1vdW50Iik7CiAgICAgfQogCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RW5jcnlwdEtleSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBzZEVuY0tleSA9IFN5c3RlbUtleVN0b3JlLmdldEluc3RhbmNlKCkucmV0cmlldmVLZXlIZXhTdHJpbmcobVNkRW5jcnlwdEtleSk7CisgICAgICAgICAgICBpZiAoc2RFbmNLZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNkRW5jS2V5ID0gU3lzdGVtS2V5U3RvcmUuZ2V0SW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTmV3S2V5SGV4U3RyaW5nKDEyOCwgbVNkRW5jcnlwdEFsZywgbVNkRW5jcnlwdEtleSk7CisgICAgICAgICAgICAgICAgaWYgKHNkRW5jS2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGNyZWF0ZSBlbmNyeXB0aW9uIGtleXMiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNkRW5jS2V5OworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbnNhZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGNyZWF0ZSBlbmNyeXB0aW9uIGtleXMgd2l0aCBleGNlcHRpb246ICIgKyBuc2FlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCiAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVTZERpcihGaWxlIHRtcFBhY2thZ2VGaWxlLCBTdHJpbmcgcGtnTmFtZSkgewogICAgICAgICAvLyBDcmVhdGUgbW91bnQgcG9pbnQgdmlhIE1vdW50U2VydmljZQogICAgICAgICBNb3VudFNlcnZpY2UgbW91bnRTZXJ2aWNlID0gZ2V0TW91bnRTZXJ2aWNlKCk7CkBAIC03NTM1LDggKzc5MTgsNiBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChERUJVR19TRF9JTlNUQUxMKSBMb2cuaShUQUcsICJtYkxlbj0iK21iTGVuKTsKICAgICAgICAgU3RyaW5nIGNhY2hlUGF0aCA9IG51bGw7Ci0gICAgICAgIC8vIFJlbW92ZSBhbnkgcGVuZGluZyBkZXN0cm95IG1lc3NhZ2VzCi0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKERFU1RST1lfU0RfQ09OVEFJTkVSLCBwa2dOYW1lKTsKICAgICAgICAgU3RyaW5nIHNkRW5jS2V5OwogICAgICAgICB0cnkgewogICAgICAgICAgICAgc2RFbmNLZXkgPSBTeXN0ZW1LZXlTdG9yZS5nZXRJbnN0YW5jZSgpLnJldHJpZXZlS2V5SGV4U3RyaW5nKG1TZEVuY3J5cHRLZXkpOwpAQCAtNzU5Nyw3ICs3OTc4LDEzIEBACiAKICAgIHByaXZhdGUgYm9vbGVhbiB1bk1vdW50U2REaXIoU3RyaW5nIHBrZ05hbWUpIHsKICAgICAgICAvLyBTVE9QU0hJUCB1bm1vdW50IGRpcmVjdG9yeQotICAgICAgIHJldHVybiB0cnVlOworICAgICAgIHRyeSB7CisgICAgICAgICAgIGdldE1vdW50U2VydmljZSgpLnVubW91bnRTZWN1cmVDb250YWluZXIocGtnTmFtZSk7CisgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byB1bm1vdW50IDogIiArIHBrZ05hbWUgKyAiIHdpdGggZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogCiAgICBwcml2YXRlIFN0cmluZyBnZXRTZERpcihTdHJpbmcgcGtnTmFtZSkgewpAQCAtNzYyMiwxMCArODAwOSw2IEBACiAKICAgIHByaXZhdGUgYm9vbGVhbiBkZXN0cm95U2REaXIoU3RyaW5nIHBrZ05hbWUpIHsKICAgICAgICB0cnkgewotICAgICAgICAgICBpZiAobUhhbmRsZXIuaGFzTWVzc2FnZXMoREVTVFJPWV9TRF9DT05UQUlORVIsIHBrZ05hbWUpKSB7Ci0gICAgICAgICAgICAgICAvLyBEb24ndCBoYXZlIHRvIHNlbmQgbWVzc2FnZSBhZ2FpbgotICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoREVTVFJPWV9TRF9DT05UQUlORVIsIHBrZ05hbWUpOwotICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZGVzdHJveSByaWdodCBhd2F5CiAgICAgICAgICAgIGdldE1vdW50U2VydmljZSgpLmRlc3Ryb3lTZWN1cmVDb250YWluZXIocGtnTmFtZSk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNzYzNSw3ICs4MDE4LDcgQEAKICAgICAgICB9CiAgICB9CiAKLSAgIHByaXZhdGUgU3RyaW5nW10gZ2V0U2VjdXJlQ29udGFpbmVyTGlzdCgpIHsKKyAgIHN0YXRpYyBTdHJpbmdbXSBnZXRTZWN1cmVDb250YWluZXJMaXN0KCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBnZXRNb3VudFNlcnZpY2UoKS5nZXRTZWN1cmVDb250YWluZXJMaXN0KCk7CiAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKQEAgLTc2NDQsMTMgKzgwMjcsNDcgQEAKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KIAotICAgcHJpdmF0ZSB2b2lkIHNlbmREZWxheWVkRGVzdHJveVNkRGlyKFN0cmluZyBwa2dOYW1lKSB7Ci0gICAgICAgaWYgKG1IYW5kbGVyLmhhc01lc3NhZ2VzKERFU1RST1lfU0RfQ09OVEFJTkVSLCBwa2dOYW1lKSkgewotICAgICAgICAgICAvLyBEb24ndCBoYXZlIHRvIHNlbmQgbWVzc2FnZSBhZ2FpbgotICAgICAgICAgICByZXR1cm47CisgICBzdGF0aWMgU3RyaW5nIGdldFRlbXBDb250YWluZXJJZCgpIHsKKyAgICAgICBTdHJpbmcgcHJlZml4ID0gInNtZGwxdG1wIjsKKyAgICAgICBpbnQgdG1wSWR4ID0gMTsKKyAgICAgICBTdHJpbmcgbGlzdFtdID0gZ2V0U2VjdXJlQ29udGFpbmVyTGlzdCgpOworICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgICAgIGludCBpZExpc3RbXSA9IG5ldyBpbnRbTUFYX0NPTlRBSU5FUlNdOworICAgICAgICAgICBib29sZWFuIG5ldmVyRm91bmQgPSB0cnVlOworICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbGlzdCkgeworICAgICAgICAgICAgICAgLy8gSWdub3JlIG51bGwgZW50cmllcworICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaW50IHNpZHggPSBuYW1lLmluZGV4T2YocHJlZml4KTsKKyAgICAgICAgICAgICAgIGlmIChzaWR4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgLy8gTm90IGEgdGVtcCBmaWxlLiBqdXN0IGlnbm9yZQorICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgU3RyaW5nIHN1YlN0ciA9IG5hbWUuc3Vic3RyaW5nKHNpZHggKyBwcmVmaXgubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgaWRMaXN0W2lkeF0gPSAtMTsKKyAgICAgICAgICAgICAgIGlmIChzdWJTdHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgIGludCBjaWQgPSBJbnRlZ2VyLnBhcnNlSW50KHN1YlN0cik7CisgICAgICAgICAgICAgICAgICAgICAgIGlkTGlzdFtpZHgrK10gPSBjaWQ7CisgICAgICAgICAgICAgICAgICAgICAgIG5ldmVyRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAoIW5ldmVyRm91bmQpIHsKKyAgICAgICAgICAgICAgIC8vIFNvcnQgaWRMaXN0CisgICAgICAgICAgICAgICBBcnJheXMuc29ydChpZExpc3QpOworICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gaWRMaXN0Lmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgaWYgKGlkTGlzdFtqLTFdICE9IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgdG1wSWR4ID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CiAgICAgICAgfQotICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShERVNUUk9ZX1NEX0NPTlRBSU5FUiwgcGtnTmFtZSk7Ci0gICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgREVTVFJPWV9TRF9DT05UQUlORVJfREVMQVkpOworICAgICAgIHJldHVybiBwcmVmaXggKyB0bXBJZHg7CiAgICB9CiAKICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXMoZmluYWwgYm9vbGVhbiBtZWRpYVN0YXR1cykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDQ0YjY2MjQuLmMyYzZlNzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSW5zdHJ1bWVudGF0aW9uSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYXRoUGVybWlzc2lvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvOwpAQCAtODg0NSw3ICs4ODQ2LDI2IEBACiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJQcm9jZXNzOiBzeXN0ZW1fc2VydmVyXG4iKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJQcm9jZXNzOiAiKS5hcHBlbmQocHJvY2Vzcy5wcm9jZXNzTmFtZSkuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiRmxhZ3M6IDB4IikuYXBwZW5kKEludGVnZXIudG9TdHJpbmcocHJvY2Vzcy5pbmZvLmZsYWdzLCAxNikpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm9jZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSBwcm9jZXNzLmluZm8uZmxhZ3M7CisgICAgICAgICAgICAgICAgSVBhY2thZ2VNYW5hZ2VyIHBtID0gQWN0aXZpdHlUaHJlYWQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkZsYWdzOiAweCIpLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGZsYWdzLCAxNikpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwa2cgOiBwcm9jZXNzLnBrZ0xpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJQYWNrYWdlOiAiKS5hcHBlbmQocGtnKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VJbmZvIHBpID0gcG0uZ2V0UGFja2FnZUluZm8ocGtnLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgdiIpLmFwcGVuZChwaS52ZXJzaW9uQ29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpLnZlcnNpb25OYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgKCIpLmFwcGVuZChwaS52ZXJzaW9uTmFtZSkuYXBwZW5kKCIpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgZ2V0dGluZyBwYWNrYWdlIGluZm86ICIgKyBwa2csIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYWN0aXZpdHkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiQWN0aXZpdHk6ICIpLmFwcGVuZChhY3Rpdml0eS5zaG9ydENvbXBvbmVudE5hbWUpLmFwcGVuZCgiXG4iKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy9UZWxlcGhvbnlUZXN0L3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnl0ZXN0L1RlbGVwaG9ueVVuaXRUZXN0UnVubmVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvVGVsZXBob255VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255dGVzdC9UZWxlcGhvbnlVbml0VGVzdFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFhZjMxLi4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS90ZXN0cy9UZWxlcGhvbnlUZXN0L3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnl0ZXN0L1RlbGVwaG9ueVVuaXRUZXN0UnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50ZWxlcGhvbnl0ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0U3VpdGU7Ci0KLS8qKgotICogSW5zdHJ1bWVudGF0aW9uIFRlc3QgUnVubmVyIGZvciBhbGwgVGVsZXBob255IHVuaXQgdGVzdHMuCi0gKgotICogUnVubmluZyBhbGwgdGVzdHM6Ci0gKgotICogICBydW50ZXN0IHRlbGVwaG9ueS11bml0Ci0gKiBvcgotICogICBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBjb20uYW5kcm9pZC50ZWxlcGhvbnl0ZXN0Ly5UZWxlcGhvbnlVbml0VGVzdFJ1bm5lcgotICovCi0KLXB1YmxpYyBjbGFzcyBUZWxlcGhvbnlVbml0VGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRlc3RTdWl0ZSBnZXRBbGxUZXN0cygpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IEluc3RydW1lbnRhdGlvblRlc3RTdWl0ZSh0aGlzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKGNvbS5hbmRyb2lkLnRlbGVwaG9ueXRlc3QudW5pdC5DYWxsZXJJbmZvVW5pdFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoY29tLmFuZHJvaWQudGVsZXBob255dGVzdC51bml0LlBob25lTnVtYmVyVXRpbHNVbml0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0TG9hZGVyKCkgewotICAgICAgICByZXR1cm4gVGVsZXBob255VW5pdFRlc3RSdW5uZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvVGVsZXBob255VGVzdC9BbmRyb2lkLm1rIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL0FuZHJvaWQubWsKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gdGVsZXBob255L3Rlc3RzL1RlbGVwaG9ueVRlc3QvQW5kcm9pZC5tawpyZW5hbWUgdG8gdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL0FuZHJvaWQubWsKaW5kZXggMWVmODQ0OC4uNDVlMjY1YSAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL1RlbGVwaG9ueVRlc3QvQW5kcm9pZC5taworKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZC5tawpAQCAtNyw2ICs3LDYgQEAKIAogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgogCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gdGVsZXBob255dGVzdAorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEZyYW1ld29ya3NUZWxlcGhvbnlUZXN0cwogCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy9UZWxlcGhvbnlUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDgzJQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvdGVzdHMvVGVsZXBob255VGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCnJlbmFtZSB0byB0ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiMmE0ODFiLi43MGFlZWJjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvVGVsZXBob255VGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNiw3ICsxNiw3IEBACiAtLT4KIAogPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZWxlcGhvbnl0ZXN0Ij4KKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5mcmFtZXdvcmtzLnRlbGVwaG9ueXRlc3RzIj4KIAogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CkBAIC0yOCw5ICsyOCw5IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KLSAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iLlRlbGVwaG9ueVVuaXRUZXN0UnVubmVyIgotICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlbGVwaG9ueXRlc3QiCi0gICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlbGVwaG9ueSB1bml0IHRlc3RzIEluc3RydW1lbnRhdGlvblJ1bm5lciI+CisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkZyYW1ld29ya3MgVGVsZXBob255IFRlc3RzIj4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiIC8+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FUUmVzcG9uc2VQYXJzZXJUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9BVFJlc3BvbnNlUGFyc2VyVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FUUmVzcG9uc2VQYXJzZXJUZXN0LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FUUmVzcG9uc2VQYXJzZXJUZXN0LmphdmEKZGlmZiAtLWdpdCBhL3Rlc3RzL0NvcmVUZXN0cy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0FkblJlY29yZFRlc3QuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQWRuUmVjb3JkVGVzdC5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0VGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL0NvcmVUZXN0cy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0VGVzdC5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXJUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXJUZXN0LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXJUZXN0LmphdmEKZGlmZiAtLWdpdCBhL3Rlc3RzL0NvcmVUZXN0cy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltUGhvbmVCb29rVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltUGhvbmVCb29rVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVBob25lQm9va1Rlc3QuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltUGhvbmVCb29rVGVzdC5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVNtc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVNtc1Rlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1TbXNUZXN0LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVNtc1Rlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVV0aWxzVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpbVV0aWxzVGVzdC5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVV0aWxzVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVV0aWxzVGVzdC5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlVdGlsc1Rlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCmRpZmYgLS1naXQgYS90ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEKcmVuYW1lIHRvIHRlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNVGVzdEhhbmRsZXIuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01UZXN0SGFuZGxlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9Db3JlVGVzdHMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01UZXN0SGFuZGxlci5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNVGVzdEhhbmRsZXIuamF2YQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL1RlbGVwaG9ueVRlc3Qvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueXRlc3QvdW5pdC9DYWxsZXJJbmZvVW5pdFRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255dGVzdC91bml0L0NhbGxlckluZm9Vbml0VGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvdGVzdHMvVGVsZXBob255VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255dGVzdC91bml0L0NhbGxlckluZm9Vbml0VGVzdC5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueXRlc3QvdW5pdC9DYWxsZXJJbmZvVW5pdFRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL1RlbGVwaG9ueVRlc3Qvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueXRlc3QvdW5pdC9QaG9uZU51bWJlclV0aWxzVW5pdFRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255dGVzdC91bml0L1Bob25lTnVtYmVyVXRpbHNVbml0VGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZWxlcGhvbnkvdGVzdHMvVGVsZXBob255VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255dGVzdC91bml0L1Bob25lTnVtYmVyVXRpbHNVbml0VGVzdC5qYXZhCnJlbmFtZSB0byB0ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL3RlbGVwaG9ueXRlc3QvdW5pdC9QaG9uZU51bWJlclV0aWxzVW5pdFRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvQW5kcm9pZFRlc3RzL3NyYy9jb20vYW5kcm9pZC91bml0X3Rlc3RzL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YSBiL3Rlc3RzL0FuZHJvaWRUZXN0cy9zcmMvY29tL2FuZHJvaWQvdW5pdF90ZXN0cy9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEKaW5kZXggNjlkNTVjMS4uZDdkZDYwMSAxMDA2NDQKLS0tIGEvdGVzdHMvQW5kcm9pZFRlc3RzL3NyYy9jb20vYW5kcm9pZC91bml0X3Rlc3RzL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQorKysgYi90ZXN0cy9BbmRyb2lkVGVzdHMvc3JjL2NvbS9hbmRyb2lkL3VuaXRfdGVzdHMvRGF0YWJhc2VHZW5lcmFsVGVzdC5qYXZhCkBAIC0xNywxNCArMTcsMTcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQudW5pdF90ZXN0czsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNoYXJBcnJheUJ1ZmZlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVTdGF0ZW1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwpAQCAtNDEsNyArNDQsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHMuSW5zZXJ0SGVscGVyLlRBQkxFX0lORk9fUFJBR01BX0NPTFVNTk5BTUVfSU5ERVg7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlscy5JbnNlcnRIZWxwZXIuVEFCTEVfSU5GT19QUkFHTUFfREVGQVVMVF9JTkRFWDsKIAotcHVibGljIGNsYXNzIERhdGFiYXNlR2VuZXJhbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIFBlcmZvcm1hbmNlVGVzdENhc2UgeworcHVibGljIGNsYXNzIERhdGFiYXNlR2VuZXJhbFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgaW1wbGVtZW50cyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzU3RyaW5nMSA9ICJ0aGlzIGlzIGEgdGVzdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNTdHJpbmcyID0gImFuZCB5ZXQgYW5vdGhlciB0ZXN0IjsKQEAgLTU1LDcgKzU4LDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoIi9zcWxpdGVfc3RtdF9qb3VybmFscyIsICJkYXRhYmFzZV90ZXN0LmRiIik7CisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCAiZGF0YWJhc2VfdGVzdC5kYiIpOwogICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQW5kcm9pZFRlc3RzL3NyYy9jb20vYW5kcm9pZC91bml0X3Rlc3RzL2ludGVybmFsL3V0aWwvSGFuemlUb1BpbnlpblRlc3QuamF2YSBiL3Rlc3RzL0FuZHJvaWRUZXN0cy9zcmMvY29tL2FuZHJvaWQvdW5pdF90ZXN0cy9pbnRlcm5hbC91dGlsL0hhbnppVG9QaW55aW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxZmYwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0FuZHJvaWRUZXN0cy9zcmMvY29tL2FuZHJvaWQvdW5pdF90ZXN0cy9pbnRlcm5hbC91dGlsL0hhbnppVG9QaW55aW5UZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudW5pdF90ZXN0cy5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGFuemlUb1BpbnlpbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhhbnppVG9QaW55aW4uVG9rZW47CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBIYW56aVRvUGlueWluVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgT05FX0hBTlpJID0gIlx1Njc1QyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRXT19IQU5aSSA9ICJcdTY3NUNcdTlENTEiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBU1NJQyA9ICJ0ZXN0IjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgT05FX1VOS05PV04gPSAiXHVGRjcxIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlTQyA9ICJ0ZXN0XHU2NzVDICAgVGVzdCB3aXRoIHNwYWNlXHVGRjcxXHVGRjcxXHU2NzVDIjsKKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VG9rZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXJyYXlMaXN0PFRva2VuPiB0b2tlbnMgPSBIYW56aVRvUGlueWluLmdldEluc3RhbmNlKCkuZ2V0KE9ORV9IQU5aSSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuc2l6ZSgpLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5nZXQoMCkudHlwZSwgVG9rZW4uUElOWUlOKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0b2tlbnMuZ2V0KDApLnRhcmdldC5lcXVhbHNJZ25vcmVDYXNlKCJEVSIpKTsKKworICAgICAgICB0b2tlbnMgPSBIYW56aVRvUGlueWluLmdldEluc3RhbmNlKCkuZ2V0KFRXT19IQU5aSSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuc2l6ZSgpLCAyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5nZXQoMCkudHlwZSwgVG9rZW4uUElOWUlOKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5nZXQoMSkudHlwZSwgVG9rZW4uUElOWUlOKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0b2tlbnMuZ2V0KDApLnRhcmdldC5lcXVhbHNJZ25vcmVDYXNlKCJEVSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0b2tlbnMuZ2V0KDEpLnRhcmdldC5lcXVhbHNJZ25vcmVDYXNlKCJKVUFOIikpOworCisgICAgICAgIHRva2VucyA9IEhhbnppVG9QaW55aW4uZ2V0SW5zdGFuY2UoKS5nZXQoQVNTSUMpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW5zLnNpemUoKSwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuZ2V0KDApLnR5cGUsIFRva2VuLkxBVElOKTsKKworICAgICAgICB0b2tlbnMgPSBIYW56aVRvUGlueWluLmdldEluc3RhbmNlKCkuZ2V0KE9ORV9VTktOT1dOKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5zaXplKCksIDEpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW5zLmdldCgwKS50eXBlLCBUb2tlbi5VTktOT1dOKTsKKworICAgICAgICB0b2tlbnMgPSBIYW56aVRvUGlueWluLmdldEluc3RhbmNlKCkuZ2V0KE1JU0MpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW5zLnNpemUoKSwgNyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuZ2V0KDApLnR5cGUsIFRva2VuLkxBVElOKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5nZXQoMSkudHlwZSwgVG9rZW4uUElOWUlOKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5nZXQoMikudHlwZSwgVG9rZW4uTEFUSU4pOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW5zLmdldCgzKS50eXBlLCBUb2tlbi5MQVRJTik7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuZ2V0KDQpLnR5cGUsIFRva2VuLkxBVElOKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5nZXQoNSkudHlwZSwgVG9rZW4uVU5LTk9XTik7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuZ2V0KDYpLnR5cGUsIFRva2VuLlBJTllJTik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9Db3JlVGVzdHMuamF2YSBiL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvQ29yZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MmZlMGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvY29yZS9Db3JlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuY29yZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlUZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yU3RhdGVMaXN0VGVzdDsKLWltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTWFuYWdlclByb3hpbWl0eVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvblRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0UnVubmVyVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lclRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLio7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyVGVzdDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwQXR0cmlidXRlc1Rlc3Q7Ci1pbXBvcnQgYW5kcm9pZC53ZWJraXQuKjsKLQotcHVibGljIGNsYXNzIENvcmVUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVG8gcnVuIHRoZXNlIHRlc3RzOgotICAgICAqICQgbW1tIGphdmEvdGVzdHMgJiYgYWRiIHN5bmMKLSAgICAgKiAkIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IFwKLSAgICAgKiAgICAtZSBjbGFzcyBhbmRyb2lkLmNvcmUuQ29yZVRlc3RzIFwKLSAgICAgKiAgICBhbmRyb2lkLmNvcmUvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShDb3JlVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBSZS1lbmFibGUgU3RhdGVMaXN0RHJhd2FibGVUZXN0IHdoZW4gd2UgYXJlIHJ1bm5pbmcgaW4gdGhlCi0gICAgICAgIC8vIGZyYW1ld29yay10ZXN0IGRpcmVjdG9yeSB3aGljaCBhbGxvd3MgYWNjZXNzIHRvIHBhY2thZ2UgcHJpdmF0ZQotICAgICAgICAvLyBhY2Nlc3MgZm9yIE1vY2tWaWV3Ci0gICAgICAgIC8vIHN1aXRlLmFkZFRlc3RTdWl0ZShTdGF0ZUxpc3REcmF3YWJsZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRGF5T2ZNb250aEN1cnNvclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTW9udGhEaXNwbGF5SGVscGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTdGF0ZVNldFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sb3JTdGF0ZUxpc3RUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEZvY3VzRmluZGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShWaWV3R3JvdXBBdHRyaWJ1dGVzVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoVGVsZXBob255VGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShGbG9hdE1hdGhUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChKYXZhVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMb2NhdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTG9jYXRpb25NYW5hZ2VyUHJveGltaXR5VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBbmRyb2lkVGVzdFJ1bm5lclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lclRlc3QuY2xhc3MpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvSmF2YVRlc3RzLmphdmEgYi90ZXN0cy9Db3JlVGVzdHMvYW5kcm9pZC9jb3JlL0phdmFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDhjYmYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2NvcmUvSmF2YVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmNvcmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RzIHsKLSAgICBwdWJsaWMgc3RhdGljIFRlc3RTdWl0ZSBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKYXZhVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvL0Rpc2FibGluZyB1bnRpbCBidWcgaHR0cDovL2IvaXNzdWU/aWQ9MTIwMDMzNyBpcyByZXNvbHZlZAotICAgICAgICAvL3N1aXRlLmFkZFRlc3RTdWl0ZShSZXF1ZXN0QVBJVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNYXRoVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTdHJpY3RNYXRoVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShIYXNoTWFwUGVyZlRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZU1hcFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRmxvYXREb3VibGVUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNoYTFUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE5JT1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdEFycmF5VGVzdC5jbGFzcyk7Ci0gICAgICAgIC8vQ29tbWVudGluZyBvdXQgdW50aWwgd2UgZmluZCBhIGJldHRlciB3YXkgdG8gZXhjbHVkZSBmcm9tIGNvbnRpbnVvdXMgdGVzdGluZy4KLSAgICAgICAgLy9zdWl0ZS5hZGRUZXN0U3VpdGUoVVJMVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShVUklUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJlZ2V4VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShIYXNoTWFwVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUxpc3RUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJvb2xlYW5UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN0cmluZ1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQnVmZmVyZWRSZWFkZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENoYXJBcnJheVJlYWRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUHVzaGJhY2tSZWFkZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN0cmluZ1JlYWRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU3RyZWFtVG9rZW5pemVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCeXRlQXJyYXlJbnB1dFN0cmVhbVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRGF0YUlucHV0U3RyZWFtVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCdWZmZXJlZElucHV0U3RyZWFtVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQdXNoYmFja0lucHV0U3RyZWFtVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCeXRlQXJyYXlPdXRwdXRTdHJlYW1UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERhdGFPdXRwdXRTdHJlYW1UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJ1ZmZlcmVkT3V0cHV0U3RyZWFtVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDaGFyQXJyYXlXcml0ZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN0cmluZ1dyaXRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUHJpbnRXcml0ZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJ1ZmZlcmVkV3JpdGVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDbGFzc1Rlc3QuY2xhc3MpOwotICAgICAgICAvL1RvIGJlIHVuY2NvbW1lbnRlZCB3aGVuIEJ1ZyAjNzk5MzI3IGlzIGZpeGVkLgotICAgICAgICAvL3N1aXRlLmFkZFRlc3RTdWl0ZShDbGFzc0xvYWRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTGluZU51bWJlclJlYWRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSW5wdXRTdHJlYW1SZWFkZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE91dHB1dFN0cmVhbVdyaXRlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRW51bVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUGFyc2VJbnRUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBpcGVkU3RyZWFtVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShMb2NhbGVUZXN0LmNsYXNzKTsKLSAgICAgICAgLy9Db21tZW50aW5nIG91dCB1bnRpbCB3ZSBmaW5kIGEgYmV0dGVyIHdheSB0byBleGNsdWRlIGZyb20gY29udGludW91cyB0ZXN0aW5nLgotICAgICAgICAvL3N1aXRlLmFkZFRlc3RTdWl0ZShJbmV0QWRkclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU29ja2V0VGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDaGVja3N1bVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRGVmbGF0ZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoWmlwU3RyZWFtVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShHWklQU3RyZWFtVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShaaXBGaWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShGaWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTUUxpdGVKREJDRHJpdmVyVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShBdFBhcnNlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRGF0YWdyYW1UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENyeXB0b1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWlzY1JlZ3Jlc3Npb25UZXN0LmNsYXNzKTsKLQotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25NYW5hZ2VyUHJveGltaXR5VGVzdC5qYXZhIGIvdGVzdHMvQ29yZVRlc3RzL2FuZHJvaWQvbG9jYXRpb24vTG9jYXRpb25NYW5hZ2VyUHJveGltaXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODJkODc4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL0NvcmVUZXN0cy9hbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uTWFuYWdlclByb3hpbWl0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQubG9jYXRpb247Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Dcml0ZXJpYTsKLWltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU3VwcHJlc3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBUZXN0cyBmb3IgTG9jYXRpb25NYW5hZ2VyLmFkZFByb3hpbWl0eUFsZXJ0Ci0gKiAKLSAqIFRPRE86IGFkZCB0ZXN0cyBmb3IgbW9yZSBzY2VuYXJpb3MKLSAqIAotICogVG8gcnVuOgotICogIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC1lIGNsYXNzIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyUHJveGltaXR5VGVzdCBcCi0gKiAgICAgLXcgYW5kcm9pZC5jb3JlL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCi0gKiAgICAgCi0gKiBUaGlzIHRlc3QgcmVxdWlyZXMgdGhhdCB0aGUgIkFsbG93IG1vY2sgbG9jYXRpb25zIiBzZXR0aW5nIGJlIGVuYWJsZWQuCi0gKiBUbyBlbnN1cmUgcmVsaWFibGUgcmVzdWx0cywgYWxsIGxvY2F0aW9uIHByb3ZpZGVycyBzaG91bGQgYmUgZGlzYWJsZWQuCi0gKiAKLSAqLwotQFN1cHByZXNzCi1ATWVkaXVtVGVzdAotcHVibGljIGNsYXNzIExvY2F0aW9uTWFuYWdlclByb3hpbWl0eVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQREFURV9MT0NBVElPTl9XQUlUX1RJTUUgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9YSU1JVFlfV0FJVF9USU1FID0gMjAwMDsKLQotICAgIHByaXZhdGUgTG9jYXRpb25NYW5hZ2VyIG1Mb2NhdGlvbk1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1QZW5kaW5nSW50ZW50OwotICAgIHByaXZhdGUgVGVzdEludGVudFJlY2VpdmVyIG1JbnRlbnRSZWNlaXZlcjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkxvY2F0aW9uUHJveGltaXR5VGVzdCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfTkFNRSA9ICJ0ZXN0IjsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICAgICAgLy8gdGVzdCB0aGF0IG1vY2sgbG9jYXRpb25zIGFyZSBhbGxvd2VkIHNvIGEgbW9yZSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlIGNhbiBiZSBsb2dnZWQKLSAgICAgICAgaWYgKFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkFMTE9XX01PQ0tfTE9DQVRJT04sIDApID09IDApIHsKLSAgICAgICAgICAgIGZhaWwoIk1vY2sgbG9jYXRpb25zIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgaW4gU2V0dGluZ3MgLSB0aGlzIHRlc3QgcmVxdWlyZXMgIiArCi0gICAgICAgICAgICAgICAgICJtb2NrIGxvY2F0aW9ucyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxvY2F0aW9uTWFuYWdlciA9IChMb2NhdGlvbk1hbmFnZXIpIGdldENvbnRleHQoKS4KLSAgICAgICAgICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTE9DQVRJT05fU0VSVklDRSk7Ci0gICAgICAgIGlmIChtTG9jYXRpb25NYW5hZ2VyLmdldFByb3ZpZGVyKFBST1ZJREVSX05BTUUpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVtb3ZlVGVzdFByb3ZpZGVyKFBST1ZJREVSX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLmFkZFRlc3RQcm92aWRlcihQUk9WSURFUl9OQU1FLCB0cnVlLCAvL3JlcXVpcmVzTmV0d29yaywKLSAgICAgICAgICAgICAgICBmYWxzZSwgLy8gcmVxdWlyZXNTYXRlbGxpdGUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwgLy8gcmVxdWlyZXNDZWxsLAotICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBoYXNNb25ldGFyeUNvc3QsCi0gICAgICAgICAgICAgICAgZmFsc2UsIC8vIHN1cHBvcnRzQWx0aXR1ZGUsCi0gICAgICAgICAgICAgICAgZmFsc2UsIC8vIHN1cHBvcnRzU3BlZWQsIHMKLSAgICAgICAgICAgICAgICBmYWxzZSwgLy8gdXBwb3J0c0JlYXJpbmcsCi0gICAgICAgICAgICAgICAgQ3JpdGVyaWEuUE9XRVJfTUVESVVNLCAvLyBwb3dlclJlcXVpcmVtZW50Ci0gICAgICAgICAgICAgICAgQ3JpdGVyaWEuQUNDVVJBQ1lfRklORSk7IC8vIGFjY3VyYWN5Ci0gICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIuc2V0VGVzdFByb3ZpZGVyRW5hYmxlZChQUk9WSURFUl9OQU1FLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlbW92ZVRlc3RQcm92aWRlcihQUk9WSURFUl9OQU1FKTsKLQotICAgICAgICBpZiAobVBlbmRpbmdJbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZW1vdmVQcm94aW1pdHlBbGVydChtUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnRlbnRSZWNlaXZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRDb250ZXh0KCkudW5yZWdpc3RlclJlY2VpdmVyKG1JbnRlbnRSZWNlaXZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBiYXNpYyBwcm94aW1pdHkgYWxlcnQgd2hlbiBlbnRlcmluZyBwcm94aW1pdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW50ZXJQcm94aW1pdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZG9UZXN0RW50ZXJQcm94aW1pdHkoMTAwMDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHByb3hpbWl0eSBhbGVydCB3aGVuIGVudGVyaW5nIHByb3hpbWl0eSwgd2l0aCBubyBleHBpcmF0aW9uIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRlclByb3hpbWl0eV9ub2V4cGlyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkb1Rlc3RFbnRlclByb3hpbWl0eSgtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIHZhcmlhbnQgZm9yIHRlc3RpbmcgZW50ZXIgcHJveGltaXR5IHNjZW5hcmlvIAotICAgICAqIFRPRE86IGFkZCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXMgbW9yZSBzY2VuYXJpb3MgYXJlIGFkZGVkCi0gICAgICogCi0gICAgICogQHBhcmFtIGV4cGlyYXRpb24gLSBleHBpcnkgb2YgcHJveGltaXR5IGFsZXJ0IAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RFbnRlclByb3hpbWl0eShsb25nIGV4cGlyYXRpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB1cGRhdGUgbG9jYXRpb24gdG8gb3V0c2lkZSBwcm94aW1pdHkgcmFuZ2UKLSAgICAgICAgc3luY2hyb25vdXNTZW5kTG9jYXRpb24oMzAsIDMwKTsKLSAgICAgICAgcmVnaXN0ZXJQcm94aW1pdHlMaXN0ZW5lcigwLCAwLCAxMDAwLCBleHBpcmF0aW9uKTsKLSAgICAgICAgc2VuZExvY2F0aW9uKDAsIDApOwotICAgICAgICB3YWl0Rm9yQWxlcnQoKTsKLSAgICAgICAgYXNzZXJ0UHJveGltaXR5VHlwZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBiYXNpYyBwcm94aW1pdHkgYWxlcnQgd2hlbiBleGl0aW5nIHByb3hpbWl0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGl0UHJveGltaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGZpcnN0IGRvIGVudGVyIHByb3hpbWl0eSBzY2VuYXJpbwotICAgICAgICBkb1Rlc3RFbnRlclByb3hpbWl0eSgtMSk7Ci0KLSAgICAgICAgLy8gbm93IHVwZGF0ZSB0byB0cmlnZ2VyIGV4aXQgcHJveGltaXR5IHByb3hpbWl0eQotICAgICAgICBtSW50ZW50UmVjZWl2ZXIuY2xlYXJSZWNlaXZlZEludGVudHMoKTsKLSAgICAgICAgc2VuZExvY2F0aW9uKDIwLCAyMCk7Ci0gICAgICAgIHdhaXRGb3JBbGVydCgpOwotICAgICAgICBhc3NlcnRQcm94aW1pdHlUeXBlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgdGhlIHByb3hpbWl0eSBpbnRlbnQgcmVjZWl2ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJQcm94aW1pdHlMaXN0ZW5lcihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIAotICAgICAgICAgICAgZmxvYXQgcmFkaXVzLCBsb25nIGV4cGlyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIGludGVudEtleSA9ICJ0ZXN0UHJveGltaXR5IjsKLSAgICAgICAgSW50ZW50IHByb3hpbWl0eUludGVudCA9IG5ldyBJbnRlbnQoaW50ZW50S2V5KTsKLSAgICAgICAgbVBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdChnZXRDb250ZXh0KCksIDAsIAotICAgICAgICAgICAgICAgIHByb3hpbWl0eUludGVudCwgUGVuZGluZ0ludGVudC5GTEFHX0NBTkNFTF9DVVJSRU5UKTsKLSAgICAgICAgbUludGVudFJlY2VpdmVyID0gbmV3IFRlc3RJbnRlbnRSZWNlaXZlcihpbnRlbnRLZXkpOwotCi0gICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIuYWRkUHJveGltaXR5QWxlcnQobGF0aXR1ZGUsIGxvbmdpdHVkZSwgcmFkaXVzLCAKLSAgICAgICAgICAgICAgICBleHBpcmF0aW9uLCBtUGVuZGluZ0ludGVudCk7Ci0KLSAgICAgICAgZ2V0Q29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIobUludGVudFJlY2VpdmVyLCAKLSAgICAgICAgICAgICAgICBtSW50ZW50UmVjZWl2ZXIuZ2V0RmlsdGVyKCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmxvY2tzIHVudGlsIHByb3hpbWl0eSBpbnRlbnQgbm90aWZpY2F0aW9uIGlzIHJlY2VpdmVkCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQWxlcnQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBMb2cuZChMT0dfVEFHLCAiV2FpdGluZyBmb3IgcHJveGltaXR5IHVwZGF0ZSIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnRlbnRSZWNlaXZlcikgewotICAgICAgICAgICAgbUludGVudFJlY2VpdmVyLndhaXQoUFJPWElNSVRZX1dBSVRfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKCJEaWQgbm90IHJlY2VpdmUgcHJveGltaXR5IGFsZXJ0IiwgCi0gICAgICAgICAgICAgICAgbUludGVudFJlY2VpdmVyLmdldExhc3RSZWNlaXZlZEludGVudCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHJlY2VpdmVkIGludGVudCBoYWQgdGhlIGVudGVyIHByb3hpbWl0eSBwcm9wZXJ0eSBzZXQgYXMKLSAgICAgKiBleHBlY3RlZAotICAgICAqIEBwYXJhbSBleHBlY3RlZEVudGVyUHJveGltaXR5IC0gdHJ1ZSBpZiBlbnRlciBwcm94aW1pdHkgZXhwZWN0ZWQsIGZhbHNlIGlmCi0gICAgICogICBleGl0IGV4cGVjdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFByb3hpbWl0eVR5cGUoYm9vbGVhbiBleHBlY3RlZEVudGVyUHJveGltaXR5KSAKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIHByb3hpbWl0eVRlc3QgPSBtSW50ZW50UmVjZWl2ZXIuZ2V0TGFzdFJlY2VpdmVkSW50ZW50KCkuCi0gICAgICAgICAgICAgICAgZ2V0Qm9vbGVhbkV4dHJhKExvY2F0aW9uTWFuYWdlci5LRVlfUFJPWElNSVRZX0VOVEVSSU5HLCAKLSAgICAgICAgICAgICAgICAhZXhwZWN0ZWRFbnRlclByb3hpbWl0eSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicHJveGltaXR5IGFsZXJ0IG5vdCBzZXQgdG8gZXhwZWN0ZWQgZW50ZXIgcHJveGltaXR5IHZhbHVlIiwKLSAgICAgICAgICAgICAgICBleHBlY3RlZEVudGVyUHJveGltaXR5LCBwcm94aW1pdHlUZXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTeW5jaHJvbm91cyB2YXJpYW50IG9mIHNlbmRMb2NhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzeW5jaHJvbm91c1NlbmRMb2NhdGlvbihmaW5hbCBkb3VibGUgbGF0aXR1ZGUsIAotICAgICAgICAgICAgZmluYWwgZG91YmxlIGxvbmdpdHVkZSkKLSAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlbmRMb2NhdGlvbihsYXRpdHVkZSwgbG9uZ2l0dWRlLCB0aGlzKTsKLSAgICAgICAgLy8gd2FpdCBmb3IgbG9jYXRpb24gdG8gYmUgc2V0Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgd2FpdChVUERBVEVfTE9DQVRJT05fV0FJVF9USU1FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzeW5jaHJvbm91c2x5IHVwZGF0ZSB0aGUgbW9jayBsb2NhdGlvbiBwcm92aWRlciB3aXRob3V0IG5vdGlmaWNhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZW5kTG9jYXRpb24oZmluYWwgZG91YmxlIGxhdGl0dWRlLCBmaW5hbCBkb3VibGUgbG9uZ2l0dWRlKSB7Ci0gICAgICAgIHNlbmRMb2NhdGlvbihsYXRpdHVkZSwgbG9uZ2l0dWRlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBc3luY2hyb25vdXNseSB1cGRhdGUgdGhlIG1vY2sgbG9jYXRpb24gcHJvdmlkZXIgd2l0aCBnaXZlbiBsYXRpdHVkZSBhbmQKLSAgICAgKiBsb25naXR1ZGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGF0aXR1ZGUgLSB1cGRhdGUgbG9jYXRpb24KLSAgICAgKiBAcGFyYW0gbG9uZ2l0dWRlIC0gdXBkYXRlIGxvY2F0aW9uCi0gICAgICogQHBhcmFtIG9ic2VydmVyIC0gb3B0aW9uYWxseSwgb2JqZWN0IHRvIG5vdGlmeSB3aGVuIHVwZGF0ZSBpcyBzZW50LklmCi0gICAgICogICAgICAgICAgICBudWxsLCBubyB1cGRhdGUgd2lsbCBiZSBzZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRMb2NhdGlvbihmaW5hbCBkb3VibGUgbGF0aXR1ZGUsIGZpbmFsIGRvdWJsZSBsb25naXR1ZGUsIAotICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9ic2VydmVyKSB7Ci0gICAgICAgIFRocmVhZCBsb2NhdGlvblVwZGF0ZXIgPSBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTG9jYXRpb24gbG9jID0gbmV3IExvY2F0aW9uKFBST1ZJREVSX05BTUUpOwotICAgICAgICAgICAgICAgIGxvYy5zZXRMYXRpdHVkZShsYXRpdHVkZSk7Ci0gICAgICAgICAgICAgICAgbG9jLnNldExvbmdpdHVkZShsb25naXR1ZGUpOwotCi0gICAgICAgICAgICAgICAgbG9jLnNldFRpbWUoamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiU2VuZGluZyB1cGRhdGUgZm9yICIgKyBQUk9WSURFUl9OQU1FKTsKLSAgICAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnNldFRlc3RQcm92aWRlckxvY2F0aW9uKFBST1ZJREVSX05BTUUsIGxvYyk7Ci0gICAgICAgICAgICAgICAgaWYgKG9ic2VydmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChvYnNlcnZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubm90aWZ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGxvY2F0aW9uVXBkYXRlci5zdGFydCgpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIGNsYXNzIHRoYXQgcmVjZWl2ZXMgYSBwcm94aW1pdHkgaW50ZW50IGFuZCBub3RpZmllcyB0aGUgbWFpbiBjbGFzcwotICAgICAqIHdoZW4gcmVjZWl2ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0SW50ZW50UmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUV4cGVjdGVkQWN0aW9uOwotICAgICAgICBwcml2YXRlIEludGVudCBtTGFzdFJlY2VpdmVkSW50ZW50OwotCi0gICAgICAgIHB1YmxpYyBUZXN0SW50ZW50UmVjZWl2ZXIoU3RyaW5nIGV4cGVjdGVkQWN0aW9uKSB7Ci0gICAgICAgICAgICBtRXhwZWN0ZWRBY3Rpb24gPSBleHBlY3RlZEFjdGlvbjsKLSAgICAgICAgICAgIG1MYXN0UmVjZWl2ZWRJbnRlbnQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEludGVudEZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcihtRXhwZWN0ZWRBY3Rpb24pOwotICAgICAgICAgICAgcmV0dXJuIGZpbHRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwgJiYgbUV4cGVjdGVkQWN0aW9uLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIkludGVudCBSZWNlaXZlZDogIiArIGludGVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBtTGFzdFJlY2VpdmVkSW50ZW50ID0gaW50ZW50OwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICBub3RpZnkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW50ZW50IGdldExhc3RSZWNlaXZlZEludGVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTGFzdFJlY2VpdmVkSW50ZW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhclJlY2VpdmVkSW50ZW50cygpIHsKLSAgICAgICAgICAgIG1MYXN0UmVjZWl2ZWRJbnRlbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlUZXN0cy5qYXZhIGIvdGVzdHMvQ29yZVRlc3RzL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGZhZmUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL0NvcmVUZXN0cy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVsZXBob255VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5BZG5SZWNvcmRUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmVUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldFRlc3Q7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNNU0Rpc3BhdGNoZXJUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1QaG9uZUJvb2tUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1TbXNUZXN0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TaW1VdGlsc1Rlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRvIHJ1biB0aGVzZSB0ZXN0czoKLSAqICQgbW1tIGphdmEvdGVzdHMgJiYgYWRiIHN5bmMKLSAqICQgYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgXAotICogICAgLWUgY2xhc3MgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVRlc3RzIFwKLSAqICAgIGFuZHJvaWQuY29yZS9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVsZXBob255VGVzdHMgewotICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFRlbGVwaG9ueVRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBob25lTnVtYmVyV2F0Y2hlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQVRSZXNwb25zZVBhcnNlclRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUGhvbmVOdW1iZXJVdGlsc1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU01TRGlzcGF0Y2hlclRlc3QuY2xhc3MpOwotICAgICAgICAvL3N1aXRlLmFkZFRlc3RTdWl0ZShHU01QaG9uZVRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQWRuUmVjb3JkVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShHc21BbHBoYWJldFRlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltVXRpbHNUZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNpbVBob25lQm9va1Rlc3QuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltU21zVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShUZWxlcGhvbnlVdGlsc1Rlc3QuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19Cg==