ZGlmZiAtLWdpdCBhL2FkYi9BbmRyb2lkLmJwIGIvYWRiL0FuZHJvaWQuYnAKaW5kZXggNDdkYWZmZi4uMDZjZmNiZiAxMDA2NDQKLS0tIGEvYWRiL0FuZHJvaWQuYnAKKysrIGIvYWRiL0FuZHJvaWQuYnAKQEAgLTI3LDYgKzI3LDcgQEAKICAgICAgICAgIi1EQURCX0hPU1Q9MSIsICAgICAgICAgLy8gb3ZlcnJpZGRlbiBieSBhZGJkX2RlZmF1bHRzCiAgICAgICAgICItREFMTE9XX0FEQkRfUk9PVD0wIiwgIC8vIG92ZXJyaWRkZW4gYnkgYWRiZF9kZWZhdWx0cwogICAgICAgICAiLURBTkRST0lEX0JBU0VfVU5JUVVFX0ZEX0RJU0FCTEVfSU1QTElDSVRfQ09OVkVSU0lPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0ZBU1RERVBMT1k9MSIsIC8vIGVuYWJsZSBmYXN0IGRlcGxveQogICAgIF0sCiAgICAgY3BwX3N0ZDogImV4cGVyaW1lbnRhbCIsCiAKQEAgLTI3MCwyMiArMjcxLDMzIEBACiAgICAgICAgICJjbGllbnQvY29uc29sZS5jcHAiLAogICAgICAgICAiY2xpZW50L2FkYl9pbnN0YWxsLmNwcCIsCiAgICAgICAgICJjbGllbnQvbGluZV9wcmludGVyLmNwcCIsCisgICAgICAgICJjbGllbnQvZmFzdGRlcGxveS5jcHAiLAorICAgICAgICAiY2xpZW50L2Zhc3RkZXBsb3ljYWxsYmFja3MuY3BwIiwKICAgICAgICAgInNoZWxsX3NlcnZpY2VfcHJvdG9jb2wuY3BwIiwKICAgICBdLAogCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICAgICAgImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgICAgICJiaW4yY19mYXN0ZGVwbG95YWdlbnRzY3JpcHQiCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhZGJfaG9zdCIsCisgICAgICAgICJsaWJhbmRyb2lkZnciLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliY3J5cHRvX3V0aWxzIiwKICAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJmYXN0ZGVwbG95X2hvc3QiLAogICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZG5zc2QiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlidXNiIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliemlwYXJjaGl2ZSIsCisgICAgICAgICJsaWJ6IiwKICAgICBdLAogCiAgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCkBAIC0yOTUsMTAgKzMwNyw2IEBACiAgICAgLy8gd2lsbCB2aW9sYXRlIE9EUgogICAgIHNoYXJlZF9saWJzOiBbXSwKIAotICAgIHJlcXVpcmVkOiBbCi0gICAgICAgICJkZXBsb3lwYXRjaGdlbmVyYXRvciIsCi0gICAgXSwKLQogICAgIC8vIEFyY2hpdmUgYWRiLCBhZGIuZXhlLgogICAgIGRpc3Q6IHsKICAgICAgICAgdGFyZ2V0czogWwpAQCAtNjU4LDMgKzY2Niw5MCBAQAogICAgICAgICB9LAogICAgIH0sCiB9CisKKy8vIE5vdGU6IHVzaW5nIHBpcGUgZm9yIHh4ZCB0byBjb250cm9sIHRoZSB2YXJpYWJsZSBuYW1lIGdlbmVyYXRlZAorLy8gdGhlIGRlZmF1bHQgbmFtZSB1c2VkIGJ5IHh4ZCBpcyB0aGUgcGF0aCB0byB0aGUgaW5wdXQgZmlsZS4KK2phdmFfZ2VucnVsZSB7CisgICAgbmFtZTogImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgb3V0OiBbImRlcGxveWFnZW50LmluYyJdLAorICAgIHNyY3M6IFsiOmRlcGxveWFnZW50Il0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiYmluMmNfZmFzdGRlcGxveWFnZW50c2NyaXB0IiwKKyAgICBvdXQ6IFsiZGVwbG95YWdlbnRzY3JpcHQuaW5jIl0sCisgICAgc3JjczogWyJmYXN0ZGVwbG95L2RlcGxveWFnZW50L2RlcGxveWFnZW50LnNoIl0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50U2NyaXB0W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitjY19saWJyYXJ5X2hvc3Rfc3RhdGljIHsKKyAgICBuYW1lOiAibGliZmFzdGRlcGxveV9ob3N0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucHJvdG8iLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFkYl9ob3N0IiwKKyAgICAgICAgImxpYmFuZHJvaWRmdyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjcnlwdG9fdXRpbHMiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmRpYWdub3NlX3VzYiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICB9LAorICAgIHRhcmdldDogeworICAgICAgICB3aW5kb3dzOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsiQWRiV2luQXBpIl0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZmFzdGRlcGxveV90ZXN0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAiLAorICAgICAgICAiZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWRiX2hvc3QiLAorICAgICAgICAibGliYW5kcm9pZGZ3IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNyeXB0b191dGlscyIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKKyAgICAgICAgImxpYmZhc3RkZXBsb3lfaG9zdCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIHdpbmRvd3M6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgICAgICBzaGFyZWRfbGliczogWyJBZGJXaW5BcGkiXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGRhdGE6IFsKKyAgICAgICAgImZhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2FkYi9jbGllbnQvZmFzdGRlcGxveS5jcHAgYi9hZGIvY2xpZW50L2Zhc3RkZXBsb3kuY3BwCmluZGV4IGY0ZTg2NjQuLmZiYWUyMTkgMTAwNjQ0Ci0tLSBhL2FkYi9jbGllbnQvZmFzdGRlcGxveS5jcHAKKysrIGIvYWRiL2NsaWVudC9mYXN0ZGVwbG95LmNwcApAQCAtMjcsNiArMjcsOSBAQAogI2luY2x1ZGUgImFuZHJvaWRmdy9aaXBGaWxlUk8uaCIKICNpbmNsdWRlICJjbGllbnQvZmlsZV9zeW5jX2NsaWVudC5oIgogI2luY2x1ZGUgImNvbW1hbmRsaW5lLmgiCisjaW5jbHVkZSAiZGVwbG95YWdlbnQuaW5jIiAgICAgICAgLy8gR2VuZXJhdGVkIGluY2x1ZGUgdmlhIGJ1aWxkIHJ1bGUuCisjaW5jbHVkZSAiZGVwbG95YWdlbnRzY3JpcHQuaW5jIiAgLy8gR2VuZXJhdGVkIGluY2x1ZGUgdmlhIGJ1aWxkIHJ1bGUuCisjaW5jbHVkZSAiZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgiCiAjaW5jbHVkZSAiZmFzdGRlcGxveWNhbGxiYWNrcy5oIgogI2luY2x1ZGUgInN5c2RlcHMuaCIKIApAQCAtMzUsNiArMzgsOCBAQAogc3RhdGljIGNvbnN0ZXhwciBsb25nIGtSZXF1aXJlZEFnZW50VmVyc2lvbiA9IDB4MDAwMDAwMDI7CiAKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0RldmljZUFnZW50UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvIjsKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0RldmljZUFnZW50RmlsZSA9ICIvZGF0YS9sb2NhbC90bXAvZGVwbG95YWdlbnQuamFyIjsKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0RldmljZUFnZW50U2NyaXB0ID0gIi9kYXRhL2xvY2FsL3RtcC9kZXBsb3lhZ2VudCI7CiAKIHN0YXRpYyBib29sIGdfdXNlX2xvY2FsYWdlbnQgPSBmYWxzZTsKIApAQCAtNzEsNDYgKzc2LDMyIEBACiAgICAgZ191c2VfbG9jYWxhZ2VudCA9IHVzZV9sb2NhbGFnZW50OwogfQogCi0vLyBsb2NhbF9wYXRoIC0gbXVzdCBzdGFydCB3aXRoIGEgJy8nIGFuZCBiZSByZWxhdGl2ZSB0byAkQU5EUk9JRF9QUk9EVUNUX09VVAotc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9hZ2VudF9jb21wb25lbnRfaG9zdF9wYXRoKGNvbnN0IGNoYXIqIGxvY2FsX3BhdGgsIGNvbnN0IGNoYXIqIHNka19wYXRoKSB7Ci0gICAgc3RkOjpzdHJpbmcgYWRiX2RpciA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBpZiAoYWRiX2Rpci5lbXB0eSgpKSB7Ci0gICAgICAgIGVycm9yX2V4aXQoIkNvdWxkIG5vdCBkZXRlcm1pbmUgbG9jYXRpb24gb2YgYWRiISIpOwotICAgIH0KLQotICAgIGlmIChnX3VzZV9sb2NhbGFnZW50KSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHByb2R1Y3Rfb3V0ID0gZ2V0ZW52KCJBTkRST0lEX1BST0RVQ1RfT1VUIik7Ci0gICAgICAgIGlmIChwcm9kdWN0X291dCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBlcnJvcl9leGl0KCJDb3VsZCBub3QgbG9jYXRlICVzIGJlY2F1c2UgJEFORFJPSURfUFJPRFVDVF9PVVQgaXMgbm90IGRlZmluZWQiLAotICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wYXRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIlcyVzIiwgcHJvZHVjdF9vdXQsIGxvY2FsX3BhdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBhZGJfZGlyICsgc2RrX3BhdGg7Ci0gICAgfQotfQotCiBzdGF0aWMgYm9vbCBkZXBsb3lfYWdlbnQoYm9vbCBjaGVja1RpbWVTdGFtcHMpIHsKICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gc3JjczsKLSAgICBzdGQ6OnN0cmluZyBqYXJfcGF0aCA9Ci0gICAgICAgICAgICBnZXRfYWdlbnRfY29tcG9uZW50X2hvc3RfcGF0aCgiL3N5c3RlbS9mcmFtZXdvcmsvZGVwbG95YWdlbnQuamFyIiwgIi9kZXBsb3lhZ2VudC5qYXIiKTsKLSAgICBzdGQ6OnN0cmluZyBzY3JpcHRfcGF0aCA9Ci0gICAgICAgICAgICBnZXRfYWdlbnRfY29tcG9uZW50X2hvc3RfcGF0aCgiL3N5c3RlbS9iaW4vZGVwbG95YWdlbnQiLCAiL2RlcGxveWFnZW50Iik7Ci0gICAgc3Jjcy5wdXNoX2JhY2soamFyX3BhdGguY19zdHIoKSk7Ci0gICAgc3Jjcy5wdXNoX2JhY2soc2NyaXB0X3BhdGguY19zdHIoKSk7Ci0KLSAgICBpZiAoZG9fc3luY19wdXNoKHNyY3MsIGtEZXZpY2VBZ2VudFBhdGgsIGNoZWNrVGltZVN0YW1wcykpIHsKLSAgICAgICAgLy8gb24gd2luZG93cyB0aGUgc2hlbGwgc2NyaXB0IG1pZ2h0IGhhdmUgbG9zdCBleGVjdXRlIHBlcm1pc3Npb24KLSAgICAgICAgLy8gc28gbmVlZCB0byBzZXQgdGhpcyBleHBsaWNpdGx5Ci0gICAgICAgIGNvbnN0IGNoYXIqIGtDaG1vZENvbW1hbmRQYXR0ZXJuID0gImNobW9kIDc3NyAlc2RlcGxveWFnZW50IjsKLSAgICAgICAgc3RkOjpzdHJpbmcgY2htb2RDb21tYW5kID0KLSAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoa0NobW9kQ29tbWFuZFBhdHRlcm4sIGtEZXZpY2VBZ2VudFBhdGgpOwotICAgICAgICBpbnQgcmV0ID0gc2VuZF9zaGVsbF9jb21tYW5kKGNobW9kQ29tbWFuZCk7Ci0gICAgICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICAgICAgZXJyb3JfZXhpdCgiRXJyb3IgZXhlY3V0aW5nICVzIHJldHVybmNvZGU6ICVkIiwgY2htb2RDb21tYW5kLmNfc3RyKCksIHJldCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBlcnJvcl9leGl0KCJFcnJvciBwdXNoaW5nIGFnZW50IGZpbGVzIHRvIGRldmljZSIpOworICAgIC8vIFRPRE86IERlcGxveSBhZ2VudCBmcm9tIGJpbjJjIGRpcmVjdGx5IGluc3RlYWQgb2Ygd3JpdGluZyB0byBkaXNrIGZpcnN0LgorICAgIFRlbXBvcmFyeUZpbGUgdGVtcEFnZW50OworICAgIGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkodGVtcEFnZW50LmZkLCBrRGVwbG95QWdlbnQsIHNpemVvZihrRGVwbG95QWdlbnQpKTsKKyAgICBzcmNzLnB1c2hfYmFjayh0ZW1wQWdlbnQucGF0aCk7CisgICAgaWYgKCFkb19zeW5jX3B1c2goc3Jjcywga0RldmljZUFnZW50RmlsZSwgY2hlY2tUaW1lU3RhbXBzKSkgeworICAgICAgICBlcnJvcl9leGl0KCJGYWlsZWQgdG8gcHVzaCBmYXN0ZGVwbG95IGFnZW50IHRvIGRldmljZS4iKTsKKyAgICB9CisgICAgc3Jjcy5jbGVhcigpOworICAgIC8vIFRPRE86IERlcGxveSBhZ2VudCBmcm9tIGJpbjJjIGRpcmVjdGx5IGluc3RlYWQgb2Ygd3JpdGluZyB0byBkaXNrIGZpcnN0LgorICAgIFRlbXBvcmFyeUZpbGUgdGVtcEFnZW50U2NyaXB0OworICAgIGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkodGVtcEFnZW50U2NyaXB0LmZkLCBrRGVwbG95QWdlbnRTY3JpcHQsIHNpemVvZihrRGVwbG95QWdlbnRTY3JpcHQpKTsKKyAgICBzcmNzLnB1c2hfYmFjayh0ZW1wQWdlbnRTY3JpcHQucGF0aCk7CisgICAgaWYgKCFkb19zeW5jX3B1c2goc3Jjcywga0RldmljZUFnZW50U2NyaXB0LCBjaGVja1RpbWVTdGFtcHMpKSB7CisgICAgICAgIGVycm9yX2V4aXQoIkZhaWxlZCB0byBwdXNoIGZhc3RkZXBsb3kgYWdlbnQgc2NyaXB0IHRvIGRldmljZS4iKTsKKyAgICB9CisgICAgc3Jjcy5jbGVhcigpOworICAgIC8vIG9uIHdpbmRvd3MgdGhlIHNoZWxsIHNjcmlwdCBtaWdodCBoYXZlIGxvc3QgZXhlY3V0ZSBwZXJtaXNzaW9uCisgICAgLy8gc28gbmVlZCB0byBzZXQgdGhpcyBleHBsaWNpdGx5CisgICAgY29uc3QgY2hhcioga0NobW9kQ29tbWFuZFBhdHRlcm4gPSAiY2htb2QgNzc3ICVzIjsKKyAgICBzdGQ6OnN0cmluZyBjaG1vZENvbW1hbmQgPQorICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKGtDaG1vZENvbW1hbmRQYXR0ZXJuLCBrRGV2aWNlQWdlbnRTY3JpcHQpOworICAgIGludCByZXQgPSBzZW5kX3NoZWxsX2NvbW1hbmQoY2htb2RDb21tYW5kKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgZXJyb3JfZXhpdCgiRXJyb3IgZXhlY3V0aW5nICVzIHJldHVybmNvZGU6ICVkIiwgY2htb2RDb21tYW5kLmNfc3RyKCksIHJldCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC0yMzgsMzQgKzIyOSwxNSBAQAogICAgIH0KIH0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9wYXRjaF9nZW5lcmF0b3JfY29tbWFuZCgpIHsKLSAgICBpZiAoZ191c2VfbG9jYWxhZ2VudCkgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb24gYSBXaW5kb3dzIG1hY2hpbmUKLSAgICAgICAgY29uc3QgY2hhciogaG9zdF9vdXQgPSBnZXRlbnYoIkFORFJPSURfSE9TVF9PVVQiKTsKLSAgICAgICAgaWYgKGhvc3Rfb3V0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGVycm9yX2V4aXQoCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgbG9jYXRlIGRlcGxveXBhdGNoZ2VuZXJhdG9yLmphciBiZWNhdXNlICRBTkRST0lEX0hPU1RfT1VUICIKLSAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBkZWZpbmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiamF2YSAtamFyICVzL2ZyYW1ld29yay9kZXBsb3lwYXRjaGdlbmVyYXRvci5qYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Rfb3V0KTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBhZGJfZGlyID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGlmIChhZGJfZGlyLmVtcHR5KCkpIHsKLSAgICAgICAgZXJyb3JfZXhpdCgiQ291bGQgbm90IGxvY2F0ZSBkZXBsb3lwYXRjaGdlbmVyYXRvci5qYXIiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZihSIihqYXZhIC1qYXIgIiVzL2RlcGxveXBhdGNoZ2VuZXJhdG9yLmphciIpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYl9kaXIuY19zdHIoKSk7Ci19Ci0KIHZvaWQgY3JlYXRlX3BhdGNoKGNvbnN0IGNoYXIqIGFwa1BhdGgsIGNvbnN0IGNoYXIqIG1ldGFkYXRhUGF0aCwgY29uc3QgY2hhciogcGF0Y2hQYXRoKSB7Ci0gICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVQYXRjaENvbW1hbmQgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICBSIiglcyAiJXMiICIlcyIgPiAiJXMiKSIsIGdldF9wYXRjaF9nZW5lcmF0b3JfY29tbWFuZCgpLmNfc3RyKCksIGFwa1BhdGgsIG1ldGFkYXRhUGF0aCwKLSAgICAgICAgICAgIHBhdGNoUGF0aCk7Ci0gICAgaW50IHJldHVybkNvZGUgPSBzeXN0ZW0oZ2VuZXJhdGVQYXRjaENvbW1hbmQuY19zdHIoKSk7Ci0gICAgaWYgKHJldHVybkNvZGUgIT0gMCkgewotICAgICAgICBlcnJvcl9leGl0KCJFeGVjdXRpbmcgJXMgcmV0dXJuZWQgJWQiLCBnZW5lcmF0ZVBhdGNoQ29tbWFuZC5jX3N0cigpLCByZXR1cm5Db2RlKTsKKyAgICBEZXBsb3lQYXRjaEdlbmVyYXRvciBnZW5lcmF0b3IoZmFsc2UpOworICAgIHVuaXF1ZV9mZCBwYXRjaEZkKGFkYl9vcGVuKHBhdGNoUGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19DTE9FWEVDKSk7CisgICAgaWYgKHBhdGNoRmQgPCAwKSB7CisgICAgICAgIHBlcnJvcl9leGl0KCJhZGI6IGZhaWxlZCB0byBjcmVhdGUgJXMiLCBwYXRjaFBhdGgpOworICAgIH0KKyAgICBib29sIHN1Y2Nlc3MgPSBnZW5lcmF0b3IuQ3JlYXRlUGF0Y2goYXBrUGF0aCwgbWV0YWRhdGFQYXRoLCBwYXRjaEZkKTsKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgZXJyb3JfZXhpdCgiRmFpbGVkIHRvIGNyZWF0ZSBwYXRjaCBmb3IgJXMiLCBhcGtQYXRoKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L0FuZHJvaWQuYnAgYi9hZGIvZmFzdGRlcGxveS9BbmRyb2lkLmJwCmluZGV4IDFiYTBkZTAuLjk1ZTFhMjggMTAwNjQ0Ci0tLSBhL2FkYi9mYXN0ZGVwbG95L0FuZHJvaWQuYnAKKysrIGIvYWRiL2Zhc3RkZXBsb3kvQW5kcm9pZC5icApAQCAtMTMsMjcgKzEzLDE1IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCi0KIGphdmFfYmluYXJ5IHsKICAgICBuYW1lOiAiZGVwbG95YWdlbnQiLAogICAgIHNka192ZXJzaW9uOiAiMjQiLAogICAgIHNyY3M6IFsiZGVwbG95YWdlbnQvc3JjLyoqLyouamF2YSIsICJkZXBsb3lsaWIvc3JjLyoqLyouamF2YSIsICJwcm90by8qKi8qLnByb3RvIl0sCiAgICAgc3RhdGljX2xpYnM6IFsiYXBremxpYl96aXAiXSwKLSAgICB3cmFwcGVyOiAiZGVwbG95YWdlbnQvZGVwbG95YWdlbnQuc2giLAogICAgIHByb3RvOiB7CiAgICAgICAgIHR5cGU6ICJsaXRlIiwKICAgICB9LAogICAgIGRleF9wcmVvcHQ6IHsKICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgfQotfQotCi1qYXZhX2JpbmFyeV9ob3N0IHsKLSAgICBuYW1lOiAiZGVwbG95cGF0Y2hnZW5lcmF0b3IiLAotICAgIHNyY3M6IFsiZGVwbG95cGF0Y2hnZW5lcmF0b3Ivc3JjLyoqLyouamF2YSIsICJkZXBsb3lsaWIvc3JjLyoqLyouamF2YSIsICJwcm90by8qKi8qLnByb3RvIl0sCi0gICAgc3RhdGljX2xpYnM6IFsiYXBremxpYiJdLAotICAgIG1hbmlmZXN0OiAiZGVwbG95cGF0Y2hnZW5lcmF0b3IvbWFuaWZlc3QudHh0IiwKLSAgICBwcm90bzogewotICAgICAgICB0eXBlOiAiZnVsbCIsCi0gICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveWFnZW50L3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveUFnZW50LmphdmEgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lhZ2VudC9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lBZ2VudC5qYXZhCmluZGV4IDJkM2IxMzUuLmE4MTAzYzQgMTAwNjQ0Ci0tLSBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveWFnZW50L3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveUFnZW50LmphdmEKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95YWdlbnQvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95QWdlbnQuamF2YQpAQCAtMTgxLDcgKzE4MSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHRyYWN0TWV0YURhdGEoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGaWxlIGFwa0ZpbGUgPSBnZXRGaWxlRnJvbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKICAgICAgICAgQVBLTWV0YURhdGEgYXBrTWV0YURhdGEgPSBQYXRjaFV0aWxzLmdldEFQS01ldGFEYXRhKGFwa0ZpbGUpOwotICAgICAgICBhcGtNZXRhRGF0YS53cml0ZURlbGltaXRlZFRvKFN5c3RlbS5vdXQpOworICAgICAgICBhcGtNZXRhRGF0YS53cml0ZVRvKFN5c3RlbS5vdXQpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGludCBjcmVhdGVJbnN0YWxsU2Vzc2lvbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjIzLDcgKzIyMyw2IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQgd3JpdGVFeGl0Q29kZSA9IHdyaXRlUGF0Y2hlZERhdGFUb1Nlc3Npb24obmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZGV2aWNlRmlsZSwgInIiKSwgZGVsdGFTdHJlYW0sIHNlc3Npb25JZCk7Ci0KICAgICAgICAgaWYgKHdyaXRlRXhpdENvZGUgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGNvbW1pdEluc3RhbGxTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yODUsNyArMjg0LDYgQEAKICAgICAgICAgICAgIGlmIChvbGREYXRhTGVuID4gMCkgewogICAgICAgICAgICAgICAgIFBhdGNoVXRpbHMucGlwZShvbGREYXRhLCBvdXRwdXRTdHJlYW0sIGJ1ZmZlciwgKGludCkgb2xkRGF0YUxlbik7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIG5ld0RhdGFCeXRlc1dyaXR0ZW4gKz0gY29weUxlbiArIG9sZERhdGFMZW47CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95bGliL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L1BhdGNoVXRpbHMuamF2YSBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveWxpYi9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9QYXRjaFV0aWxzLmphdmEKaW5kZXggZjBmMDBlMS4uYzYwZjlhNiAxMDA2NDQKLS0tIGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95bGliL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L1BhdGNoVXRpbHMuamF2YQorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lsaWIvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvUGF0Y2hVdGlscy5qYXZhCkBAIC0zOSw3ICszOSw3IEBACiBjbGFzcyBQYXRjaFV0aWxzIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5FR0FUSVZFX01BU0sgPSAxTCA8PCA2MzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5FR0FUSVZFX0xPTkdfU0lHTl9NQVNLID0gMUwgPDwgNjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFID0gIkhBTUFESS9JSEQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05BVFVSRSA9ICJGQVNUREVQTE9ZIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0T2Zmc2V0RnJvbUVudHJ5KFN0b3JlZEVudHJ5IGVudHJ5KSB7CiAgICAgICAgIHJldHVybiBlbnRyeS5nZXRDZW50cmFsRGlyZWN0b3J5SGVhZGVyKCkuZ2V0T2Zmc2V0KCkgKyBlbnRyeS5nZXRMb2NhbEhlYWRlclNpemUoKTsKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjOTI0MwotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImRlcGxveV9wYXRjaF9nZW5lcmF0b3IuaCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJhZGJfdW5pcXVlX2ZkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL2ZpbGUuaCIKKyNpbmNsdWRlICJwYXRjaF91dGlscy5oIgorI2luY2x1ZGUgInN5c2RlcHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTsKKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6TG9nKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgICAgaWYgKCFpc192ZXJib3NlXykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdnByaW50ZihmbXQsIGFwKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6QVBLRW50cnlUb0xvZyhjb25zdCBBUEtFbnRyeSYgZW50cnkpIHsKKyAgICBMb2coIkZpbGVuYW1lOiAlcyIsIGVudHJ5LmZpbGVuYW1lKCkuY19zdHIoKSk7CisgICAgTG9nKCJDUkMzMjogMHglMDhsbFgiLCBlbnRyeS5jcmMzMigpKTsKKyAgICBMb2coIkRhdGEgT2Zmc2V0OiAlbGxkIiwgZW50cnkuZGF0YW9mZnNldCgpKTsKKyAgICBMb2coIkNvbXByZXNzZWQgU2l6ZTogJWxsZCIsIGVudHJ5LmNvbXByZXNzZWRzaXplKCkpOworICAgIExvZygiVW5jb21wcmVzc2VkIFNpemU6ICVsbGQiLCBlbnRyeS51bmNvbXByZXNzZWRzaXplKCkpOworfQorCit2b2lkIERlcGxveVBhdGNoR2VuZXJhdG9yOjpBUEtNZXRhRGF0YVRvTG9nKGNvbnN0IGNoYXIqIGZpbGUsIGNvbnN0IEFQS01ldGFEYXRhJiBtZXRhZGF0YSkgeworICAgIGlmICghaXNfdmVyYm9zZV8pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMb2coIkFQSyBNZXRhZGF0YTogJXMiLCBmaWxlKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGFkYXRhLmVudHJpZXNfc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVBLRW50cnkmIGVudHJ5ID0gbWV0YWRhdGEuZW50cmllcyhpKTsKKyAgICAgICAgQVBLRW50cnlUb0xvZyhlbnRyeSk7CisgICAgfQorfQorCit2b2lkIERlcGxveVBhdGNoR2VuZXJhdG9yOjpSZXBvcnRTYXZpbmdzKGNvbnN0IHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgaWRlbnRpY2FsRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdG90YWxTaXplKSB7CisgICAgbG9uZyB0b3RhbEVxdWFsQnl0ZXMgPSAwOworICAgIGludCB0b3RhbEVxdWFsRmlsZXMgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaWRlbnRpY2FsRW50cmllcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaWRlbnRpY2FsRW50cmllc1tpXS5kZXZpY2VFbnRyeSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICB0b3RhbEVxdWFsQnl0ZXMgKz0gaWRlbnRpY2FsRW50cmllc1tpXS5sb2NhbEVudHJ5LT5jb21wcmVzc2Vkc2l6ZSgpOworICAgICAgICAgICAgdG90YWxFcXVhbEZpbGVzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZmxvYXQgc2F2aW5nUGVyY2VudCA9ICh0b3RhbEVxdWFsQnl0ZXMgKiAxMDAuMGYpIC8gdG90YWxTaXplOworICAgIGZwcmludGYoc3RkZXJyLCAiRGV0ZWN0ZWQgJWQgZXF1YWwgQVBLIGVudHJpZXNcbiIsIHRvdGFsRXF1YWxGaWxlcyk7CisgICAgZnByaW50ZihzdGRlcnIsICIlbGQgYnl0ZXMgYXJlIGVxdWFsIG91dCBvZiAlIiBQUkl1NjQgIiAoJS4yZiUlKVxuIiwgdG90YWxFcXVhbEJ5dGVzLCB0b3RhbFNpemUsCisgICAgICAgICAgICBzYXZpbmdQZXJjZW50KTsKK30KKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6R2VuZXJhdGVQYXRjaChjb25zdCBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIGVudHJpZXNUb1VzZU9uRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhbEFwa1BhdGgsIGJvcnJvd2VkX2ZkIG91dHB1dCkgeworICAgIHVuaXF1ZV9mZCBpbnB1dChhZGJfb3Blbihsb2NhbEFwa1BhdGgsIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgc2l6ZV90IG5ld0Fwa1NpemUgPSBhZGJfbHNlZWsoaW5wdXQsIDBMLCBTRUVLX0VORCk7CisgICAgYWRiX2xzZWVrKGlucHV0LCAwTCwgU0VFS19TRVQpOworCisgICAgUGF0Y2hVdGlsczo6V3JpdGVTaWduYXR1cmUob3V0cHV0KTsKKyAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcobmV3QXBrU2l6ZSwgb3V0cHV0KTsKKyAgICBzaXplX3QgY3VycmVudFNpemVPdXQgPSAwOworICAgIC8vIFdyaXRlIGRhdGEgZnJvbSB0aGUgaG9zdCB1cHRvIHRoZSBmaXJzdCBlbnRyeSB3ZSBoYXZlIHRoYXQgbWF0Y2hlcyBhIGRldmljZSBlbnRyeS4gVGhlbiB3cml0ZQorICAgIC8vIHRoZSBtZXRhZGF0YSBhYm91dCB0aGUgZGV2aWNlIGVudHJ5IGFuZCByZXBlYXQgZm9yIGFsbCBlbnRyaWVzIHRoYXQgbWF0Y2ggb24gZGV2aWNlLiBGaW5hbGx5CisgICAgLy8gd3JpdGUgb3V0IGFueSBkYXRhIGxlZnQuIElmIHRoZSBkZXZpY2UgYW5kIGhvc3QgQVBLcyBhcmUgZXhhY3RseSB0aGUgc2FtZSB0aGlzIGVuZHMgdXAKKyAgICAvLyB3cml0aW5nIG91dCB6aXAgbWV0YWRhdGEgZnJvbSB0aGUgbG9jYWwgQVBLIGZvbGxvd2VkIGJ5IG9mZnNldHMgdG8gdGhlIGRhdGEgdG8gdXNlIGZyb20gdGhlCisgICAgLy8gZGV2aWNlIEFQSy4KKyAgICBmb3IgKGF1dG8mJiBlbnRyeSA6IGVudHJpZXNUb1VzZU9uRGV2aWNlKSB7CisgICAgICAgIGludDY0X3QgZGV2aWNlRGF0YU9mZnNldCA9IGVudHJ5LmRldmljZUVudHJ5LT5kYXRhb2Zmc2V0KCk7CisgICAgICAgIGludDY0X3QgaG9zdERhdGFPZmZzZXQgPSBlbnRyeS5sb2NhbEVudHJ5LT5kYXRhb2Zmc2V0KCk7CisgICAgICAgIGludDY0X3QgZGV2aWNlRGF0YUxlbmd0aCA9IGVudHJ5LmRldmljZUVudHJ5LT5jb21wcmVzc2Vkc2l6ZSgpOworICAgICAgICBpbnQ2NF90IGRlbHRhRnJvbURldmljZURhdGFTdGFydCA9IGhvc3REYXRhT2Zmc2V0IC0gY3VycmVudFNpemVPdXQ7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQsIG91dHB1dCk7CisgICAgICAgIGlmIChkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQgPiAwKSB7CisgICAgICAgICAgICBQYXRjaFV0aWxzOjpQaXBlKGlucHV0LCBvdXRwdXQsIGRlbHRhRnJvbURldmljZURhdGFTdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKGRldmljZURhdGFPZmZzZXQsIG91dHB1dCk7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhkZXZpY2VEYXRhTGVuZ3RoLCBvdXRwdXQpOworICAgICAgICBhZGJfbHNlZWsoaW5wdXQsIGRldmljZURhdGFMZW5ndGgsIFNFRUtfQ1VSKTsKKyAgICAgICAgY3VycmVudFNpemVPdXQgKz0gZGVsdGFGcm9tRGV2aWNlRGF0YVN0YXJ0ICsgZGV2aWNlRGF0YUxlbmd0aDsKKyAgICB9CisgICAgaWYgKGN1cnJlbnRTaXplT3V0ICE9IG5ld0Fwa1NpemUpIHsKKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKG5ld0Fwa1NpemUgLSBjdXJyZW50U2l6ZU91dCwgb3V0cHV0KTsKKyAgICAgICAgUGF0Y2hVdGlsczo6UGlwZShpbnB1dCwgb3V0cHV0LCBuZXdBcGtTaXplIC0gY3VycmVudFNpemVPdXQpOworICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoMCwgb3V0cHV0KTsKKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKDAsIG91dHB1dCk7CisgICAgfQorfQorCitib29sIERlcGxveVBhdGNoR2VuZXJhdG9yOjpDcmVhdGVQYXRjaChjb25zdCBjaGFyKiBsb2NhbEFwa1BhdGgsIGNvbnN0IGNoYXIqIGRldmljZUFwa01ldGFkYXRhUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcnJvd2VkX2ZkIG91dHB1dCkgeworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7CisgICAgQVBLTWV0YURhdGEgZGV2aWNlQXBrTWV0YWRhdGE7CisgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoZGV2aWNlQXBrTWV0YWRhdGFQYXRoLCAmY29udGVudCkpIHsKKyAgICAgICAgZGV2aWNlQXBrTWV0YWRhdGEuUGFyc2VQYXJ0aWFsRnJvbVN0cmluZyhjb250ZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBXaGF0IGRvIHdlIHdhbnQgdG8gZG8gaWYgd2UgZG9uJ3QgZmluZCBhbnkgbWV0YWRhdGEuCisgICAgICAgIC8vIFRoZSBjdXJyZW50IGZhbGxiYWNrIGJlaGF2aW9yIGlzIHRvIGJ1aWxkIGEgcGF0Y2ggd2l0aCB0aGUgY29udGVudHMgb2YgfGxvY2FsQXBrUGF0aHwuCisgICAgfQorCisgICAgQVBLTWV0YURhdGEgbG9jYWxBcGtNZXRhZGF0YSA9IFBhdGNoVXRpbHM6OkdldEFQS01ldGFEYXRhKGxvY2FsQXBrUGF0aCk7CisgICAgLy8gTG9nIGdhdGhlcmVkIG1ldGFkYXRhIGluZm8uCisgICAgQVBLTWV0YURhdGFUb0xvZyhkZXZpY2VBcGtNZXRhZGF0YVBhdGgsIGRldmljZUFwa01ldGFkYXRhKTsKKyAgICBBUEtNZXRhRGF0YVRvTG9nKGxvY2FsQXBrUGF0aCwgbG9jYWxBcGtNZXRhZGF0YSk7CisKKyAgICBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4gaWRlbnRpY2FsRW50cmllczsKKyAgICB1aW50NjRfdCB0b3RhbFNpemUgPQorICAgICAgICAgICAgQnVpbGRJZGVudGljYWxFbnRyaWVzKGlkZW50aWNhbEVudHJpZXMsIGxvY2FsQXBrTWV0YWRhdGEsIGRldmljZUFwa01ldGFkYXRhKTsKKyAgICBSZXBvcnRTYXZpbmdzKGlkZW50aWNhbEVudHJpZXMsIHRvdGFsU2l6ZSk7CisgICAgR2VuZXJhdGVQYXRjaChpZGVudGljYWxFbnRyaWVzLCBsb2NhbEFwa1BhdGgsIG91dHB1dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3VpbnQ2NF90IERlcGxveVBhdGNoR2VuZXJhdG9yOjpCdWlsZElkZW50aWNhbEVudHJpZXMoc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBvdXRJZGVudGljYWxFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEtNZXRhRGF0YSYgbG9jYWxBcGtNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBLTWV0YURhdGEmIGRldmljZUFwa01ldGFkYXRhKSB7CisgICAgdWludDY0X3QgdG90YWxTaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsQXBrTWV0YWRhdGEuZW50cmllc19zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBBUEtFbnRyeSYgbG9jYWxFbnRyeSA9IGxvY2FsQXBrTWV0YWRhdGEuZW50cmllcyhpKTsKKyAgICAgICAgdG90YWxTaXplICs9IGxvY2FsRW50cnkuY29tcHJlc3NlZHNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXZpY2VBcGtNZXRhZGF0YS5lbnRyaWVzX3NpemUoKTsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBBUEtFbnRyeSYgZGV2aWNlRW50cnkgPSBkZXZpY2VBcGtNZXRhZGF0YS5lbnRyaWVzKGopOworICAgICAgICAgICAgaWYgKGRldmljZUVudHJ5LmNyYzMyKCkgPT0gbG9jYWxFbnRyeS5jcmMzMigpICYmCisgICAgICAgICAgICAgICAgZGV2aWNlRW50cnkuZmlsZW5hbWUoKS5jb21wYXJlKGxvY2FsRW50cnkuZmlsZW5hbWUoKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIFNpbXBsZUVudHJ5IHNpbXBsZUVudHJ5OworICAgICAgICAgICAgICAgIHNpbXBsZUVudHJ5LmxvY2FsRW50cnkgPSBjb25zdF9jYXN0PEFQS0VudHJ5Kj4oJmxvY2FsRW50cnkpOworICAgICAgICAgICAgICAgIHNpbXBsZUVudHJ5LmRldmljZUVudHJ5ID0gY29uc3RfY2FzdDxBUEtFbnRyeSo+KCZkZXZpY2VFbnRyeSk7CisgICAgICAgICAgICAgICAgQVBLRW50cnlUb0xvZyhsb2NhbEVudHJ5KTsKKyAgICAgICAgICAgICAgICBvdXRJZGVudGljYWxFbnRyaWVzLnB1c2hfYmFjayhzaW1wbGVFbnRyeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjpzb3J0KG91dElkZW50aWNhbEVudHJpZXMuYmVnaW4oKSwgb3V0SWRlbnRpY2FsRW50cmllcy5lbmQoKSwKKyAgICAgICAgICAgICAgW10oY29uc3QgU2ltcGxlRW50cnkmIGxocywgY29uc3QgU2ltcGxlRW50cnkmIHJocykgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIGxocy5sb2NhbEVudHJ5LT5kYXRhb2Zmc2V0KCkgPCByaHMubG9jYWxFbnRyeS0+ZGF0YW9mZnNldCgpOworICAgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gdG90YWxTaXplOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuaCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGU0MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJhZGJfdW5pcXVlX2ZkLmgiCisjaW5jbHVkZSAiZmFzdGRlcGxveS9wcm90by9BcGtFbnRyeS5wYi5oIgorCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgcGF0Y2ggdGhhdCBjYW4gYmUgYWNjZXB0ZWQgYnkgdGhlIGRlcGxveWFnZW50LiBUaGUKKyAqIHBhdGNoIGZvcm1hdCBpcyBkb2N1bWVudGVkIGluIEdlbmVyYXRlUGF0Y2guCisgKi8KK2NsYXNzIERlcGxveVBhdGNoR2VuZXJhdG9yIHsKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIFNpbXBsZSBzdHJ1Y3QgdG8gaG9sZCBtYXBwaW5nIGJldHdlZW4gbG9jYWwgbWV0YWRhdGEgYW5kIGRldmljZSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgU2ltcGxlRW50cnkgeworICAgICAgICBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS0VudHJ5KiBsb2NhbEVudHJ5OworICAgICAgICBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS0VudHJ5KiBkZXZpY2VFbnRyeTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogSWYgfGlzX3ZlcmJvc2V8IGlzIHRydWUgQXBrRW50cmllcyB0aGF0IGFyZSBzaW1pbGFyIGJldHdlZW4gZGV2aWNlIGFuZCBob3N0IGFyZSB3cml0dGVuIHRvCisgICAgICogdGhlIGNvbnNvbGUuCisgICAgICovCisgICAgZXhwbGljaXQgRGVwbG95UGF0Y2hHZW5lcmF0b3IoYm9vbCBpc192ZXJib3NlKSA6IGlzX3ZlcmJvc2VfKGlzX3ZlcmJvc2UpIHt9CisgICAgLyoqCisgICAgICogR2l2ZW4gYSB8bG9jYWxBcGtQYXRofCwgYW5kIHRoZSB8ZGV2aWNlQXBrTWV0YWRhdGFQYXRofCBmcm9tIGFuIGluc3RhbGxlZCBBUEsgdGhpcyBmdW5jdGlvbgorICAgICAqIHdyaXRlcyBhIHBhdGNoIHRvIHRoZSBnaXZlbiB8b3V0cHV0fC4KKyAgICAgKi8KKyAgICBib29sIENyZWF0ZVBhdGNoKGNvbnN0IGNoYXIqIGxvY2FsQXBrUGF0aCwgY29uc3QgY2hhciogZGV2aWNlQXBrTWV0YWRhdGFQYXRoLAorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgb3V0cHV0KTsKKworICBwcml2YXRlOgorICAgIGJvb2wgaXNfdmVyYm9zZV87CisKKyAgICAvKioKKyAgICAgKiBMb2cgZnVuY3Rpb24gb25seSBsb2dzIGRhdGEgdG8gc3Rkb3V0IHdoZW4gfGlzX3ZlcmJvc2VffCBpcyB0cnVlLgorICAgICAqLworICAgIHZvaWQgTG9nKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18sIDIsIDMpKSk7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gbG9nIHRoZSBBUEtNZXRhRGF0YSBzdHJ1Y3R1cmUuIElmIHxpc192ZXJib3NlX3wgaXMgZmFsc2UgdGhpcyBmdW5jdGlvbgorICAgICAqIGVhcmx5IG91dHMuIHxmaWxlfCBpcyB0aGUgcGF0aCB0byB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB8bWV0YWRhdGF8LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQKKyAgICAgKiBmb3IgZGVidWdnaW5nIC8gaW5mb3JtYXRpb24uCisgICAgICovCisgICAgdm9pZCBBUEtNZXRhRGF0YVRvTG9nKGNvbnN0IGNoYXIqIGZpbGUsIGNvbnN0IGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLTWV0YURhdGEmIG1ldGFkYXRhKTsKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gbG9nIEFQS0VudHJ5LgorICAgICAqLworICAgIHZvaWQgQVBLRW50cnlUb0xvZyhjb25zdCBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS0VudHJ5JiBlbnRyeSk7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVwb3J0IHNhdmluZ3MgYnkgZmFzdGRlcGxveS4gVGhpcyBmdW5jdGlvbiBwcmludHMgb3V0IHNhdmluZ3MgZXZlbiB3aXRoCisgICAgICogfGlzX3ZlcmJvc2VffCBzZXQgdG8gZmFsc2UuIHx0b3RhbFNpemV8IGlzIHVzZWQgdG8gc2hvdyBhIHBlcmNlbnRhZ2Ugb2Ygc2F2aW5ncy4gTm90ZToKKyAgICAgKiB8dG90YWxTaXplfCBpcyB0aGUgc2l6ZSBvZiB0aGUgWmlwRW50cmllcy4gTm90IHRoZSBzaXplIG9mIHRoZSBlbnRpcmUgZmlsZS4gVGhlIG1ldGFkYXRhIG9mCisgICAgICogdGhlIHppcCBkYXRhIG5lZWRzIHRvIGJlIHNlbnQgYWNyb3NzIHdpdGggZXZlcnkgaXRlcmF0aW9uLgorICAgICAqIFtQYXRjaCBmb3JtYXRdCisgICAgICogfEZpeGVkIFN0cmluZ3wgU2lnbmF0dXJlCisgICAgICogfGxvbmd8ICAgICAgICAgTmV3IFNpemUgb2YgQXBrCisgICAgICogfFBhY2tldHNbXXwgICAgQXJyYXkgb2YgUGFja2V0cworICAgICAqCisgICAgICogW1BhY2tldCBGb3JtYXRdCisgICAgICogfGxvbmd8ICAgICBTaXplIG9mIGRhdGEgdG8gdXNlIGZyb20gcGF0Y2gKKyAgICAgKiB8Ynl0ZVtdfCAgIFBhdGNoIGRhdGEKKyAgICAgKiB8bG9uZ3wgICAgIE9mZnNldCBvZiBkYXRhIHRvIHVzZSBhbHJlYWR5IG9uIGRldmljZQorICAgICAqIHxsb25nfCAgICAgTGVuZ3RoIG9mIGRhdGEgdG8gcmVhZCBmcm9tIGRldmljZSBBUEsKKyAgICAgKiBUT0RPKGIvMTM4MzA2Nzg0KTogTW92ZSB0aGUgcGF0Y2ggZm9ybWF0IHRvIGEgcHJvdG8uCisgICAgICovCisgICAgdm9pZCBSZXBvcnRTYXZpbmdzKGNvbnN0IHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgaWRlbnRpY2FsRW50cmllcywgdWludDY0X3QgdG90YWxTaXplKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgZW51bWVyYXRlcyBlYWNoIGVudHJ5IGluIHxlbnRyaWVzVG9Vc2VPbkRldmljZXwgYW5kIGJ1aWxkcyBhIHBhdGNoIGZpbGUgY29weWluZyBkYXRhCisgICAgICogZnJvbSB8bG9jYWxBcGtQYXRofCB3aGVyZSB3ZSBhcmUgdW5hYmxlIHRvIHVzZSBlbnRyaWVzIGFscmVhZHkgb24gdGhlIGRldmljZS4gVGhlIG5ldyBwYXRjaAorICAgICAqIGlzIHdyaXR0ZW4gdG8gfG91dHB1dHwuIFRoZSBlbnRyaWVzIGFyZSBleHBlY3RlZCB0byBiZSBzb3J0ZWQgYnkgZGF0YSBvZmZzZXQgZnJvbSBsb3dlc3QgdG8KKyAgICAgKiBoaWdoZXN0LgorICAgICAqLworICAgIHZvaWQgR2VuZXJhdGVQYXRjaChjb25zdCBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIGVudHJpZXNUb1VzZU9uRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhbEFwa1BhdGgsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCk7CisKKyAgcHJvdGVjdGVkOgorICAgIHVpbnQ2NF90IEJ1aWxkSWRlbnRpY2FsRW50cmllcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgb3V0SWRlbnRpY2FsRW50cmllcywKKyAgICAgICAgICAgIGNvbnN0IGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLTWV0YURhdGEmIGxvY2FsQXBrTWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS01ldGFEYXRhJiBkZXZpY2VBcGtNZXRhZGF0YVBhdGgpOworfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yX3Rlc3QuY3BwIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2RjNDRlCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvcl90ZXN0LmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImRlcGxveV9wYXRjaF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJwYXRjaF91dGlscy5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInN5c2RlcHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTsKKworc3RhdGljIHN0ZDo6c3RyaW5nIEdldFRlc3RGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgcmV0dXJuICJmYXN0ZGVwbG95L3Rlc3RkYXRhLyIgKyBuYW1lOworfQorCitjbGFzcyBUZXN0UGF0Y2hHZW5lcmF0b3IgOiBEZXBsb3lQYXRjaEdlbmVyYXRvciB7CisgIHB1YmxpYzoKKyAgICBUZXN0UGF0Y2hHZW5lcmF0b3IoKSA6IERlcGxveVBhdGNoR2VuZXJhdG9yKGZhbHNlKSB7fQorICAgIHZvaWQgR2F0aGVySWRlbnRpY2FsRW50cmllcyhzdGQ6OnZlY3RvcjxEZXBsb3lQYXRjaEdlbmVyYXRvcjo6U2ltcGxlRW50cnk+JiBvdXRJZGVudGljYWxFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEtNZXRhRGF0YSYgbWV0YWRhdGFBLCBjb25zdCBBUEtNZXRhRGF0YSYgbWV0YWRhdGFCKSB7CisgICAgICAgIEJ1aWxkSWRlbnRpY2FsRW50cmllcyhvdXRJZGVudGljYWxFbnRyaWVzLCBtZXRhZGF0YUEsIG1ldGFkYXRhQik7CisgICAgfQorfTsKKworVEVTVChEZXBsb3lQYXRjaEdlbmVyYXRvclRlc3QsIElkZW50aWNhbEZpbGVFbnRyaWVzKSB7CisgICAgc3RkOjpzdHJpbmcgYXBrUGF0aCA9IEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIik7CisgICAgQVBLTWV0YURhdGEgbWV0YWRhdGFBID0gUGF0Y2hVdGlsczo6R2V0QVBLTWV0YURhdGEoYXBrUGF0aC5jX3N0cigpKTsKKyAgICBUZXN0UGF0Y2hHZW5lcmF0b3IgZ2VuZXJhdG9yOworICAgIHN0ZDo6dmVjdG9yPERlcGxveVBhdGNoR2VuZXJhdG9yOjpTaW1wbGVFbnRyeT4gZW50cmllczsKKyAgICBnZW5lcmF0b3IuR2F0aGVySWRlbnRpY2FsRW50cmllcyhlbnRyaWVzLCBtZXRhZGF0YUEsIG1ldGFkYXRhQSk7CisgICAgLy8gRXhwZWN0IHRoZSBlbnRyeSBjb3VudCB0byBtYXRjaCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1ldGFkYXRhLgorICAgIGNvbnN0IHVpbnQzMl90IGlkZW50aWNhbENvdW50ID0gZW50cmllcy5zaXplKCk7CisgICAgY29uc3QgdWludDMyX3QgZW50cmllc0NvdW50ID0gbWV0YWRhdGFBLmVudHJpZXNfc2l6ZSgpOworICAgIEVYUEVDVF9FUShpZGVudGljYWxDb3VudCwgZW50cmllc0NvdW50KTsKK30KKworVEVTVChEZXBsb3lQYXRjaEdlbmVyYXRvclRlc3QsIE5vRGV2aWNlTWV0YWRhdGEpIHsKKyAgICBzdGQ6OnN0cmluZyBhcGtQYXRoID0gR2V0VGVzdEZpbGUoInJvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsiKTsKKyAgICAvLyBHZXQgc2l6ZSBvZiBvdXIgdGVzdCBhcGsuCisgICAgbG9uZyBhcGtTaXplID0gMDsKKyAgICB7CisgICAgICAgIHVuaXF1ZV9mZCBhcGtGaWxlKGFkYl9vcGVuKGFwa1BhdGguY19zdHIoKSwgT19SRFdSKSk7CisgICAgICAgIGFwa1NpemUgPSBhZGJfbHNlZWsoYXBrRmlsZSwgMEwsIFNFRUtfRU5EKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBwYXRjaCB0aGF0IGlzIDEwMCUgZGlmZmVyZW50LgorICAgIFRlbXBvcmFyeUZpbGUgb3V0cHV0OworICAgIERlcGxveVBhdGNoR2VuZXJhdG9yIGdlbmVyYXRvcih0cnVlKTsKKyAgICBnZW5lcmF0b3IuQ3JlYXRlUGF0Y2goYXBrUGF0aC5jX3N0cigpLCAiIiwgb3V0cHV0LmZkKTsKKworICAgIC8vIEV4cGVjdCBhIHBhdGNoIGZpbGUgdGhhdCBoYXMgYSBzaXplIGF0IGxlYXN0IHRoZSBzaXplIG9mIG91ciBpbml0aWFsIEFQSy4KKyAgICBsb25nIHBhdGNoU2l6ZSA9IGFkYl9sc2VlayhvdXRwdXQuZmQsIDBMLCBTRUVLX0VORCk7CisgICAgRVhQRUNUX0dUKHBhdGNoU2l6ZSwgYXBrU2l6ZSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvbWFuaWZlc3QudHh0IGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvbWFuaWZlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzAwNTA1Li4wMDAwMDAwCi0tLSBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1haW4tQ2xhc3M6IGNvbS5hbmRyb2lkLmZhc3RkZXBsb3kuRGVwbG95UGF0Y2hHZW5lcmF0b3IKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTFkZGQxCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicGF0Y2hfdXRpbHMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWRmdy9aaXBGaWxlUk8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYWRiX2lvLmgiCisjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL2VuZGlhbi5oIgorI2luY2x1ZGUgInN5c2RlcHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKKworc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtTaWduYXR1cmVbXSA9ICJGQVNUREVQTE9ZIjsKKworQVBLTWV0YURhdGEgUGF0Y2hVdGlsczo6R2V0QVBLTWV0YURhdGEoY29uc3QgY2hhciogYXBrUGF0aCkgeworICAgIEFQS01ldGFEYXRhIGFwa01ldGFEYXRhOworI3VuZGVmIG9wZW4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6WmlwRmlsZVJPPiB6aXBGaWxlKGFuZHJvaWQ6OlppcEZpbGVSTzo6b3BlbihhcGtQYXRoKSk7CisjZGVmaW5lIG9wZW4gX19feHh4X3VuaXhfb3BlbgorICAgIGlmICh6aXBGaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJDb3VsZCBub3Qgb3BlbiAlcyIsIGFwa1BhdGgpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICB2b2lkKiBjb29raWU7CisgICAgaWYgKHppcEZpbGUtPnN0YXJ0SXRlcmF0aW9uKCZjb29raWUpKSB7CisgICAgICAgIGFuZHJvaWQ6OlppcEVudHJ5Uk8gZW50cnk7CisgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aXBGaWxlLT5uZXh0RW50cnkoY29va2llKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgY2hhciBmaWxlTmFtZVsyNTZdOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBmaWxlIG5hbWUuCisgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgZmlsZW5hbWVzIGxvbmdlciB0aGFuIDI1Ni4KKyAgICAgICAgICAgIGlmICh6aXBGaWxlLT5nZXRFbnRyeUZpbGVOYW1lKGVudHJ5LCBmaWxlTmFtZSwgc2l6ZW9mKGZpbGVOYW1lKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgdW5jb21wcmVzc2VkU2l6ZSwgY29tcHJlc3NlZFNpemUsIGNyYzMyOworICAgICAgICAgICAgaW50NjRfdCBkYXRhT2Zmc2V0OworICAgICAgICAgICAgemlwRmlsZS0+Z2V0RW50cnlJbmZvKGVudHJ5LCBudWxscHRyLCAmdW5jb21wcmVzc2VkU2l6ZSwgJmNvbXByZXNzZWRTaXplLCAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmY3JjMzIpOworICAgICAgICAgICAgQVBLRW50cnkqIGFwa0VudHJ5ID0gYXBrTWV0YURhdGEuYWRkX2VudHJpZXMoKTsKKyAgICAgICAgICAgIGFwa0VudHJ5LT5zZXRfY3JjMzIoY3JjMzIpOworICAgICAgICAgICAgYXBrRW50cnktPnNldF9maWxlbmFtZShmaWxlTmFtZSk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X2NvbXByZXNzZWRzaXplKGNvbXByZXNzZWRTaXplKTsKKyAgICAgICAgICAgIGFwa0VudHJ5LT5zZXRfdW5jb21wcmVzc2Vkc2l6ZSh1bmNvbXByZXNzZWRTaXplKTsKKyAgICAgICAgICAgIGFwa0VudHJ5LT5zZXRfZGF0YW9mZnNldChkYXRhT2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXBrTWV0YURhdGE7Cit9CisKK3ZvaWQgUGF0Y2hVdGlsczo6V3JpdGVTaWduYXR1cmUoYm9ycm93ZWRfZmQgb3V0cHV0KSB7CisgICAgV3JpdGVGZEV4YWN0bHkob3V0cHV0LCBrU2lnbmF0dXJlLCBzaXplb2Yoa1NpZ25hdHVyZSkgLSAxKTsKK30KKwordm9pZCBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoaW50NjRfdCB2YWx1ZSwgYm9ycm93ZWRfZmQgb3V0cHV0KSB7CisgICAgaW50NjRfdCB0b0xpdHRsZUVuZGlhbiA9IGh0b2xlNjQodmFsdWUpOworICAgIFdyaXRlRmRFeGFjdGx5KG91dHB1dCwgJnRvTGl0dGxlRW5kaWFuLCBzaXplb2YoaW50NjRfdCkpOworfQorCit2b2lkIFBhdGNoVXRpbHM6OlBpcGUoYm9ycm93ZWRfZmQgaW5wdXQsIGJvcnJvd2VkX2ZkIG91dHB1dCwgc2l6ZV90IGFtb3VudCkgeworICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50IEJVRkZFUl9TSVpFID0gMTI4ICogMTAyNDsKKyAgICBjaGFyIGJ1ZmZlcltCVUZGRVJfU0laRV07CisgICAgc2l6ZV90IHRyYW5zZmVyQW1vdW50ID0gMDsKKyAgICB3aGlsZSAodHJhbnNmZXJBbW91bnQgIT0gYW1vdW50KSB7CisgICAgICAgIGxvbmcgY2h1bmtBbW91bnQgPQorICAgICAgICAgICAgICAgIGFtb3VudCAtIHRyYW5zZmVyQW1vdW50ID4gQlVGRkVSX1NJWkUgPyBCVUZGRVJfU0laRSA6IGFtb3VudCAtIHRyYW5zZmVyQW1vdW50OworICAgICAgICBsb25nIHJlYWRBbW91bnQgPSBhZGJfcmVhZChpbnB1dCwgYnVmZmVyLCBjaHVua0Ftb3VudCk7CisgICAgICAgIFdyaXRlRmRFeGFjdGx5KG91dHB1dCwgYnVmZmVyLCByZWFkQW1vdW50KTsKKyAgICAgICAgdHJhbnNmZXJBbW91bnQgKz0gcmVhZEFtb3VudDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuaCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYWRiX3VuaXF1ZV9mZC5oIgorI2luY2x1ZGUgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucGIuaCIKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBtaXJyb3JzIHRoZSBQYXRjaFV0aWxzIGZyb20gZGVwbG95IGFnZW50LgorICovCitjbGFzcyBQYXRjaFV0aWxzIHsKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBsb2NhbCBBUEsgZmlsZSBhbmQgYnVpbGRzIHRoZSBBUEtNZXRhRGF0YSByZXF1aXJlZCBieSB0aGUgcGF0Y2hpbmcKKyAgICAgKiBhbGdvcml0aG0uIFRoZSBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBhbiBlcnJvciBhIHN0cmluZyBpcyBwcmludGVkIHRvIHRoZSB0ZXJtaW5hbCBhbmQgZXhpdCgxKQorICAgICAqIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtNZXRhRGF0YSBHZXRBUEtNZXRhRGF0YShjb25zdCBjaGFyKiBmaWxlKTsKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBmaXhlZCBzaWduYXR1cmUgc3RyaW5nIHRvIHRoZSBoZWFkZXIgb2YgdGhlIHBhdGNoLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIFdyaXRlU2lnbmF0dXJlKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCk7CisgICAgLyoqCisgICAgICogV3JpdGVzIGFuIGludDY0IHRvIHRoZSB8b3V0cHV0fCByZXZlcnNpbmcgdGhlIGJ5dGVzLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIFdyaXRlTG9uZyhpbnQ2NF90IHZhbHVlLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBvdXRwdXQpOworICAgIC8qKgorICAgICAqIENvcHkgfGFtb3VudHwgb2YgZGF0YSBmcm9tIHxpbnB1dHwgdG8gfG91dHB1dHwuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgUGlwZShhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBpbnB1dCwgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFtb3VudCk7Cit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzX3Rlc3QuY3BwIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlZWViZgotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicGF0Y2hfdXRpbHMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYWRiX2lvLmgiCisjaW5jbHVkZSAic3lzZGVwcy5oIgorCit1c2luZyBuYW1lc3BhY2UgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OworCitzdGF0aWMgc3RkOjpzdHJpbmcgR2V0VGVzdEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICByZXR1cm4gImZhc3RkZXBsb3kvdGVzdGRhdGEvIiArIG5hbWU7Cit9CisKK2Jvb2wgRmlsZU1hdGNoZXNDb250ZW50KGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGlucHV0LCBjb25zdCBjaGFyKiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgY29udGVudHNTaXplKSB7CisgICAgYWRiX2xzZWVrKGlucHV0LCAwLCBTRUVLX1NFVCk7CisgICAgLy8gVXNlIGEgdGVtcCBidWZmZXIgbGFyZ2VyIHRoYW4gYW55IHRlc3QgY29udGVudHMuCisgICAgY29uc3RleHByIGludCBCVUZGRVJfU0laRSA9IDIwNDg7CisgICAgY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdOworICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKKyAgICAvLyBWYWxpZGF0ZSBzaXplIG9mIGZpbGVzIGlzIGVxdWFsLgorICAgIHNzaXplX3QgcmVhZEFtb3VudCA9IGFkYl9yZWFkKGlucHV0LCBidWZmZXIsIEJVRkZFUl9TSVpFKTsKKyAgICBFWFBFQ1RfRVEocmVhZEFtb3VudCwgY29udGVudHNTaXplKTsKKyAgICByZXN1bHQgPSBtZW1jbXAoYnVmZmVyLCBjb250ZW50cywgcmVhZEFtb3VudCkgPT0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlYWRBbW91bnQ7IGkrKykgeworICAgICAgICBwcmludGYoIiV4IiwgYnVmZmVyW2ldKTsKKyAgICB9CisgICAgcHJpbnRmKCIgPT0gIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50c1NpemU7IGkrKykgeworICAgICAgICBwcmludGYoIiV4IiwgY29udGVudHNbaV0pOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitURVNUKFBhdGNoVXRpbHNUZXN0LCBTd2FwTG9uZ1dyaXRlcykgeworICAgIFRlbXBvcmFyeUZpbGUgb3V0cHV0OworICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZygweDAwMTEyMjMzNDQ1NTY2NzcsIG91dHB1dC5mZCk7CisgICAgYWRiX2xzZWVrKG91dHB1dC5mZCwgMCwgU0VFS19TRVQpOworICAgIGNvbnN0IGNoYXIgZXhwZWN0ZWRbXSA9IHsweDc3LCAweDY2LCAweDU1LCAweDQ0LCAweDMzLCAweDIyLCAweDExLCAweDAwfTsKKyAgICBFWFBFQ1RfVFJVRShGaWxlTWF0Y2hlc0NvbnRlbnQob3V0cHV0LmZkLCBleHBlY3RlZCwgOCkpOworfQorCitURVNUKFBhdGNoVXRpbHNUZXN0LCBQaXBlV3JpdGVzQW1vdW50VG9PdXRwdXQpIHsKKyAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCgiU29tZSBEYXRhIik7CisgICAgVGVtcG9yYXJ5RmlsZSBpbnB1dDsKKyAgICBUZW1wb3JhcnlGaWxlIG91dHB1dDsKKyAgICAvLyBQb3B1bGF0ZSBpbnB1dCBmaWxlLgorICAgIFdyaXRlRmRFeGFjdGx5KGlucHV0LmZkLCBleHBlY3RlZCk7CisgICAgYWRiX2xzZWVrKGlucHV0LmZkLCAwLCBTRUVLX1NFVCk7CisgICAgLy8gT3BlbiBpbnB1dCBmaWxlIGZvciByZWFkLCBhbmQgb3V0cHV0IGZpbGUgZm9yIHdyaXRlLgorICAgIFBhdGNoVXRpbHM6OlBpcGUoaW5wdXQuZmQsIG91dHB1dC5mZCwgZXhwZWN0ZWQuc2l6ZSgpKTsKKyAgICAvLyBWYWxpZGF0ZSBwaXBlIHdvcmtlZAorICAgIEVYUEVDVF9UUlVFKEZpbGVNYXRjaGVzQ29udGVudChvdXRwdXQuZmQsIGV4cGVjdGVkLmNfc3RyKCksIGV4cGVjdGVkLnNpemUoKSkpOworfQorCitURVNUKFBhdGNoVXRpbHNUZXN0LCBTaWduYXR1cmVDb25zdE1hdGNoZXMpIHsKKyAgICBzdGQ6OnN0cmluZyBhcGtGaWxlID0gR2V0VGVzdEZpbGUoInJvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsiKTsKKyAgICBUZW1wb3JhcnlGaWxlIG91dHB1dDsKKyAgICBQYXRjaFV0aWxzOjpXcml0ZVNpZ25hdHVyZShvdXRwdXQuZmQpOworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKCJGQVNUREVQTE9ZIik7CisgICAgRVhQRUNUX1RSVUUoRmlsZU1hdGNoZXNDb250ZW50KG91dHB1dC5mZCwgY29udGVudHMuY19zdHIoKSwgY29udGVudHMuc2l6ZSgpKSk7Cit9CisKK1RFU1QoUGF0Y2hVdGlsc1Rlc3QsIEdhdGhlck1ldGFkYXRhKSB7CisgICAgc3RkOjpzdHJpbmcgYXBrRmlsZSA9IEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIik7CisgICAgQVBLTWV0YURhdGEgbWV0YWRhdGEgPSBQYXRjaFV0aWxzOjpHZXRBUEtNZXRhRGF0YShhcGtGaWxlLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkTWV0YWRhdGE7CisgICAgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhHZXRUZXN0RmlsZSgicm90YXRpbmdfY3ViZS1tZXRhZGF0YS1yZWxlYXNlLmRhdGEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHBlY3RlZE1ldGFkYXRhKTsKKyAgICBzdGQ6OnN0cmluZyBhY3R1YWxNZXRhZGF0YTsKKyAgICBtZXRhZGF0YS5TZXJpYWxpemVUb1N0cmluZygmYWN0dWFsTWV0YWRhdGEpOworICAgIEVYUEVDVF9FUShleHBlY3RlZE1ldGFkYXRhLCBhY3R1YWxNZXRhZGF0YSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3Ivc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95UGF0Y2hHZW5lcmF0b3IuamF2YSBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveVBhdGNoR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjJlYWIuLjAwMDAwMDAKLS0tIGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3Ivc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95UGF0Y2hHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5mYXN0ZGVwbG95OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcC5TaW1wbGVFbnRyeTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmZhc3RkZXBsb3kuQVBLTWV0YURhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZmFzdGRlcGxveS5BUEtFbnRyeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIERlcGxveVBhdGNoR2VuZXJhdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAxMjggKiAxMDI0OwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikgewotICAgICAgICAgICAgICAgIHNob3dVc2FnZSgwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAyKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZlcmJvc2VGbGFnID0gYXJnc1syXTsKLSAgICAgICAgICAgICAgICBpZiAodmVyYm9zZUZsYWcuY29tcGFyZVRvKCItLXZlcmJvc2UiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgYXBrUGF0aCA9IGFyZ3NbMF07Ci0gICAgICAgICAgICBTdHJpbmcgZGV2aWNlTWV0YWRhdGFQYXRoID0gYXJnc1sxXTsKLSAgICAgICAgICAgIEZpbGUgaG9zdEZpbGUgPSBuZXcgRmlsZShhcGtQYXRoKTsKLQotICAgICAgICAgICAgTGlzdDxBUEtFbnRyeT4gZGV2aWNlWmlwRW50cmllcyA9IGdldE1ldGFkYXRhRnJvbUZpbGUoZGV2aWNlTWV0YWRhdGFQYXRoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGV2aWNlIEVudHJpZXMgKCIgKyBkZXZpY2VaaXBFbnRyaWVzLnNpemUoKSArICIpIik7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEFQS0VudHJ5IGVudHJ5IDogZGV2aWNlWmlwRW50cmllcykgewotICAgICAgICAgICAgICAgICAgICBBUEtFbnRyeVRvU3RyaW5nKGVudHJ5LCBzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxBUEtFbnRyeT4gaG9zdEZpbGVFbnRyaWVzID0gUGF0Y2hVdGlscy5nZXRBUEtNZXRhRGF0YShob3N0RmlsZSkuZ2V0RW50cmllc0xpc3QoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSG9zdCBFbnRyaWVzICgiICsgaG9zdEZpbGVFbnRyaWVzLnNpemUoKSArICIpIik7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEFQS0VudHJ5IGVudHJ5IDogaG9zdEZpbGVFbnRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFQS0VudHJ5VG9TdHJpbmcoZW50cnksIHNiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQgPQotICAgICAgICAgICAgICAgIGdldElkZW50aWNhbENvbnRlbnRzKGRldmljZVppcEVudHJpZXMsIGhvc3RGaWxlRW50cmllcyk7Ci0gICAgICAgICAgICByZXBvcnRJZGVudGljYWxDb250ZW50cyhpZGVudGljYWxDb250ZW50c0VudHJ5U2V0LCBob3N0RmlsZSk7Ci0KLSAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBpZGVudGljYWxFbnRyeSA6IGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgQVBLRW50cnkgZW50cnkgPSBpZGVudGljYWxFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBBUEtFbnRyeVRvU3RyaW5nKGVudHJ5LCBzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSWRlbnRpY2FsIEVudHJpZXMgKCIgKyBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0LnNpemUoKSArICIpIik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjcmVhdGVQYXRjaChpZGVudGljYWxDb250ZW50c0VudHJ5U2V0LCBob3N0RmlsZSwgU3lzdGVtLm91dCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiAiICsgZSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMik7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaG93VXNhZ2UoaW50IGV4aXRDb2RlKSB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigidXNhZ2U6IGRlcGxveXBhdGNoZ2VuZXJhdG9yIDxhcGtwYXRoPiA8ZGV2aWNlYXBrbWV0YWRhdGE+IFstLXZlcmJvc2VdIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KGV4aXRDb2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFQS0VudHJ5VG9TdHJpbmcoQVBLRW50cnkgZW50cnksIFN0cmluZ0J1aWxkZXIgb3V0cHV0U3RyaW5nKSB7Ci0gICAgICAgIG91dHB1dFN0cmluZy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiRmlsZW5hbWU6ICVzXG4iLCBlbnRyeS5nZXRGaWxlTmFtZSgpKSk7Ci0gICAgICAgIG91dHB1dFN0cmluZy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiQ1JDMzI6IDB4JTA4WFxuIiwgZW50cnkuZ2V0Q3JjMzIoKSkpOwotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkRhdGEgT2Zmc2V0OiAlZFxuIiwgZW50cnkuZ2V0RGF0YU9mZnNldCgpKSk7Ci0gICAgICAgIG91dHB1dFN0cmluZy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiQ29tcHJlc3NlZCBTaXplOiAlZFxuIiwgZW50cnkuZ2V0Q29tcHJlc3NlZFNpemUoKSkpOwotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlVuY29tcHJlc3NlZCBTaXplOiAlZFxuIiwgZW50cnkuZ2V0VW5jb21wcmVzc2VkU2l6ZSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxBUEtFbnRyeT4gZ2V0TWV0YWRhdGFGcm9tRmlsZShTdHJpbmcgZGV2aWNlTWV0YWRhdGFQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoZGV2aWNlTWV0YWRhdGFQYXRoKSk7Ci0gICAgICAgIEFQS01ldGFEYXRhIGFwa01ldGFEYXRhID0gQVBLTWV0YURhdGEucGFyc2VEZWxpbWl0ZWRGcm9tKGlzKTsKLSAgICAgICAgcmV0dXJuIGFwa01ldGFEYXRhLmdldEVudHJpZXNMaXN0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PiBnZXRJZGVudGljYWxDb250ZW50cygKLSAgICAgICAgTGlzdDxBUEtFbnRyeT4gZGV2aWNlWmlwRW50cmllcywgTGlzdDxBUEtFbnRyeT4gaG9zdFppcEVudHJpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gaWRlbnRpY2FsQ29udGVudHMgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PigpOwotCi0gICAgICAgIGZvciAoQVBLRW50cnkgZGV2aWNlWmlwRW50cnkgOiBkZXZpY2VaaXBFbnRyaWVzKSB7Ci0gICAgICAgICAgICBmb3IgKEFQS0VudHJ5IGhvc3RaaXBFbnRyeSA6IGhvc3RaaXBFbnRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZVppcEVudHJ5LmdldENyYzMyKCkgPT0gaG9zdFppcEVudHJ5LmdldENyYzMyKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlWmlwRW50cnkuZ2V0RmlsZU5hbWUoKS5lcXVhbHMoaG9zdFppcEVudHJ5LmdldEZpbGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkZW50aWNhbENvbnRlbnRzLmFkZChuZXcgU2ltcGxlRW50cnkoZGV2aWNlWmlwRW50cnksIGhvc3RaaXBFbnRyeSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoaWRlbnRpY2FsQ29udGVudHMsIG5ldyBDb21wYXJhdG9yPFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoCi0gICAgICAgICAgICAgICAgU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBwMSwgU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBwMikgewotICAgICAgICAgICAgICAgIHJldHVybiBMb25nLmNvbXBhcmUocDEuZ2V0VmFsdWUoKS5nZXREYXRhT2Zmc2V0KCksIHAyLmdldFZhbHVlKCkuZ2V0RGF0YU9mZnNldCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIGlkZW50aWNhbENvbnRlbnRzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVwb3J0SWRlbnRpY2FsQ29udGVudHMoCi0gICAgICAgIExpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCwgRmlsZSBob3N0RmlsZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbG9uZyB0b3RhbEVxdWFsQnl0ZXMgPSAwOwotICAgICAgICBpbnQgdG90YWxFcXVhbEZpbGVzID0gMDsKLSAgICAgICAgZm9yIChTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+IGVudHJpZXMgOiBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0KSB7Ci0gICAgICAgICAgICBBUEtFbnRyeSBob3N0QVBLRW50cnkgPSBlbnRyaWVzLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB0b3RhbEVxdWFsQnl0ZXMgKz0gaG9zdEFQS0VudHJ5LmdldENvbXByZXNzZWRTaXplKCk7Ci0gICAgICAgICAgICB0b3RhbEVxdWFsRmlsZXMrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IHNhdmluZ1BlcmNlbnQgPSAoZmxvYXQpICh0b3RhbEVxdWFsQnl0ZXMgKiAxMDApIC8gaG9zdEZpbGUubGVuZ3RoKCk7Ci0KLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEZXRlY3RlZCAiICsgdG90YWxFcXVhbEZpbGVzICsgIiBlcXVhbCBBUEsgZW50cmllcyIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odG90YWxFcXVhbEJ5dGVzICsgIiBieXRlcyBhcmUgZXF1YWwgb3V0IG9mICIgKyBob3N0RmlsZS5sZW5ndGgoKSArICIgKCIKLSAgICAgICAgICAgICsgc2F2aW5nUGVyY2VudCArICIlKSIpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGNyZWF0ZVBhdGNoKExpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gemlwRW50cnlTaW1wbGVFbnRyeXMsCi0gICAgICAgIEZpbGUgaG9zdEZpbGUsIE91dHB1dFN0cmVhbSBwYXRjaFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXRjaEZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBob3N0RmlsZUlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShob3N0RmlsZSk7Ci0KLSAgICAgICAgcGF0Y2hTdHJlYW0ud3JpdGUoUGF0Y2hVdGlscy5TSUdOQVRVUkUuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpOwotICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhob3N0RmlsZS5sZW5ndGgoKSwgcGF0Y2hTdHJlYW0pOwotCi0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0gICAgICAgIGxvbmcgdG90YWxCeXRlc1dyaXR0ZW4gPSAwOwotICAgICAgICBJdGVyYXRvcjxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PiBlbnRyeVNpbXBsZUVudHJ5SXRlcmF0b3IgPQotICAgICAgICAgICAgemlwRW50cnlTaW1wbGVFbnRyeXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGVudHJ5U2ltcGxlRW50cnlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gZW50cnlTaW1wbGVFbnRyeSA9IGVudHJ5U2ltcGxlRW50cnlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBBUEtFbnRyeSBkZXZpY2VBUEtFbnRyeSA9IGVudHJ5U2ltcGxlRW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBBUEtFbnRyeSBob3N0QVBLRW50cnkgPSBlbnRyeVNpbXBsZUVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGxvbmcgbmV3RGF0YUxlbiA9IGhvc3RBUEtFbnRyeS5nZXREYXRhT2Zmc2V0KCkgLSB0b3RhbEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgIGxvbmcgb2xkRGF0YU9mZnNldCA9IGRldmljZUFQS0VudHJ5LmdldERhdGFPZmZzZXQoKTsKLSAgICAgICAgICAgIGxvbmcgb2xkRGF0YUxlbiA9IGRldmljZUFQS0VudHJ5LmdldENvbXByZXNzZWRTaXplKCk7Ci0KLSAgICAgICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKG5ld0RhdGFMZW4sIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgICAgIFBhdGNoVXRpbHMucGlwZShob3N0RmlsZUlucHV0U3RyZWFtLCBwYXRjaFN0cmVhbSwgYnVmZmVyLCBuZXdEYXRhTGVuKTsKLSAgICAgICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKG9sZERhdGFPZmZzZXQsIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKG9sZERhdGFMZW4sIHBhdGNoU3RyZWFtKTsKLQotICAgICAgICAgICAgbG9uZyBza2lwID0gaG9zdEZpbGVJbnB1dFN0cmVhbS5za2lwKG9sZERhdGFMZW4pOwotICAgICAgICAgICAgaWYgKHNraXAgIT0gb2xkRGF0YUxlbikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXRjaEZvcm1hdEV4Y2VwdGlvbigic2tpcCBlcnJvcjogYXR0ZW1wdGVkIHRvIHNraXAgIiArIG9sZERhdGFMZW4KLSAgICAgICAgICAgICAgICAgICAgKyAiIGJ5dGVzIGJ1dCByZXR1cm4gY29kZSB3YXMgIiArIHNraXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG90YWxCeXRlc1dyaXR0ZW4gKz0gb2xkRGF0YUxlbiArIG5ld0RhdGFMZW47Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyByZW1haW5kZXJMZW4gPSBob3N0RmlsZS5sZW5ndGgoKSAtIHRvdGFsQnl0ZXNXcml0dGVuOwotICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhyZW1haW5kZXJMZW4sIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgUGF0Y2hVdGlscy5waXBlKGhvc3RGaWxlSW5wdXRTdHJlYW0sIHBhdGNoU3RyZWFtLCBidWZmZXIsIHJlbWFpbmRlckxlbik7Ci0gICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKDAsIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcoMCwgcGF0Y2hTdHJlYW0pOwotICAgICAgICBwYXRjaFN0cmVhbS5mbHVzaCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtbWV0YWRhdGEtcmVsZWFzZS5kYXRhIGIvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1tZXRhZGF0YS1yZWxlYXNlLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3MWJmMwotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtbWV0YWRhdGEtcmVsZWFzZS5kYXRhCkBAIC0wLDAgKzEsNiBAQAorCisjCMeCz6sMEhRNRVRBLUlORi9NQU5JRkVTVC5NRhjHBiBRKFcKKyMIg42VjgcSE0FuZHJvaWRNYW5pZmVzdC54bWwYMSDkBSjoDworNgimtYA+EiNsaWIvYXJtZWFiaS12N2EvbGlidnVsa2FuX3NhbXBsZS5zbxiBDiDA0lEojLLsAQorIAiX45eRDhIOcmVzb3VyY2VzLmFyc2MY9OBRILQEKLQECiscCIucwskCEgtjbGFzc2VzLmRleBjBByD/BSj0CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIGIvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDdlMGVhCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwawpCaW5hcnkgZmlsZXMgZGlmZmVyCg==