ZGlmZiAtLWdpdCBhL2FkYi9BbmRyb2lkLmJwIGIvYWRiL0FuZHJvaWQuYnAKaW5kZXggNDdkYWZmZi4uMDZjZmNiZiAxMDA2NDQKLS0tIGEvYWRiL0FuZHJvaWQuYnAKKysrIGIvYWRiL0FuZHJvaWQuYnAKQEAgLTI3LDYgKzI3LDcgQEAKICAgICAgICAgIi1EQURCX0hPU1Q9MSIsICAgICAgICAgLy8gb3ZlcnJpZGRlbiBieSBhZGJkX2RlZmF1bHRzCiAgICAgICAgICItREFMTE9XX0FEQkRfUk9PVD0wIiwgIC8vIG92ZXJyaWRkZW4gYnkgYWRiZF9kZWZhdWx0cwogICAgICAgICAiLURBTkRST0lEX0JBU0VfVU5JUVVFX0ZEX0RJU0FCTEVfSU1QTElDSVRfQ09OVkVSU0lPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0ZBU1RERVBMT1k9MSIsIC8vIGVuYWJsZSBmYXN0IGRlcGxveQogICAgIF0sCiAgICAgY3BwX3N0ZDogImV4cGVyaW1lbnRhbCIsCiAKQEAgLTI3MCwyMiArMjcxLDMzIEBACiAgICAgICAgICJjbGllbnQvY29uc29sZS5jcHAiLAogICAgICAgICAiY2xpZW50L2FkYl9pbnN0YWxsLmNwcCIsCiAgICAgICAgICJjbGllbnQvbGluZV9wcmludGVyLmNwcCIsCisgICAgICAgICJjbGllbnQvZmFzdGRlcGxveS5jcHAiLAorICAgICAgICAiY2xpZW50L2Zhc3RkZXBsb3ljYWxsYmFja3MuY3BwIiwKICAgICAgICAgInNoZWxsX3NlcnZpY2VfcHJvdG9jb2wuY3BwIiwKICAgICBdLAogCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICAgICAgImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgICAgICJiaW4yY19mYXN0ZGVwbG95YWdlbnRzY3JpcHQiCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhZGJfaG9zdCIsCisgICAgICAgICJsaWJhbmRyb2lkZnciLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliY3J5cHRvX3V0aWxzIiwKICAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJmYXN0ZGVwbG95X2hvc3QiLAogICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZG5zc2QiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlidXNiIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliemlwYXJjaGl2ZSIsCisgICAgICAgICJsaWJ6IiwKICAgICBdLAogCiAgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCkBAIC0yOTUsMTAgKzMwNyw2IEBACiAgICAgLy8gd2lsbCB2aW9sYXRlIE9EUgogICAgIHNoYXJlZF9saWJzOiBbXSwKIAotICAgIHJlcXVpcmVkOiBbCi0gICAgICAgICJkZXBsb3lwYXRjaGdlbmVyYXRvciIsCi0gICAgXSwKLQogICAgIC8vIEFyY2hpdmUgYWRiLCBhZGIuZXhlLgogICAgIGRpc3Q6IHsKICAgICAgICAgdGFyZ2V0czogWwpAQCAtNjU4LDMgKzY2Niw5MCBAQAogICAgICAgICB9LAogICAgIH0sCiB9CisKKy8vIE5vdGU6IHVzaW5nIHBpcGUgZm9yIHh4ZCB0byBjb250cm9sIHRoZSB2YXJpYWJsZSBuYW1lIGdlbmVyYXRlZAorLy8gdGhlIGRlZmF1bHQgbmFtZSB1c2VkIGJ5IHh4ZCBpcyB0aGUgcGF0aCB0byB0aGUgaW5wdXQgZmlsZS4KK2phdmFfZ2VucnVsZSB7CisgICAgbmFtZTogImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgb3V0OiBbImRlcGxveWFnZW50LmluYyJdLAorICAgIHNyY3M6IFsiOmRlcGxveWFnZW50Il0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiYmluMmNfZmFzdGRlcGxveWFnZW50c2NyaXB0IiwKKyAgICBvdXQ6IFsiZGVwbG95YWdlbnRzY3JpcHQuaW5jIl0sCisgICAgc3JjczogWyJmYXN0ZGVwbG95L2RlcGxveWFnZW50L2RlcGxveWFnZW50LnNoIl0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50U2NyaXB0W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitjY19saWJyYXJ5X2hvc3Rfc3RhdGljIHsKKyAgICBuYW1lOiAibGliZmFzdGRlcGxveV9ob3N0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucHJvdG8iLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFkYl9ob3N0IiwKKyAgICAgICAgImxpYmFuZHJvaWRmdyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjcnlwdG9fdXRpbHMiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmRpYWdub3NlX3VzYiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICB9LAorICAgIHRhcmdldDogeworICAgICAgICB3aW5kb3dzOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsiQWRiV2luQXBpIl0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZmFzdGRlcGxveV90ZXN0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAiLAorICAgICAgICAiZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWRiX2hvc3QiLAorICAgICAgICAibGliYW5kcm9pZGZ3IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNyeXB0b191dGlscyIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKKyAgICAgICAgImxpYmZhc3RkZXBsb3lfaG9zdCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIHdpbmRvd3M6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgICAgICBzaGFyZWRfbGliczogWyJBZGJXaW5BcGkiXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGRhdGE6IFsKKyAgICAgICAgImZhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2FkYi9jbGllbnQvZmFzdGRlcGxveS5jcHAgYi9hZGIvY2xpZW50L2Zhc3RkZXBsb3kuY3BwCmluZGV4IGY0ZTg2NjQuLmZiYWUyMTkgMTAwNjQ0Ci0tLSBhL2FkYi9jbGllbnQvZmFzdGRlcGxveS5jcHAKKysrIGIvYWRiL2NsaWVudC9mYXN0ZGVwbG95LmNwcApAQCAtMjcsNiArMjcsOSBAQAogI2luY2x1ZGUgImFuZHJvaWRmdy9aaXBGaWxlUk8uaCIKICNpbmNsdWRlICJjbGllbnQvZmlsZV9zeW5jX2NsaWVudC5oIgogI2luY2x1ZGUgImNvbW1hbmRsaW5lLmgiCisjaW5jbHVkZSAiZGVwbG95YWdlbnQuaW5jIiAgICAgICAgLy8gR2VuZXJhdGVkIGluY2x1ZGUgdmlhIGJ1aWxkIHJ1bGUuCisjaW5jbHVkZSAiZGVwbG95YWdlbnRzY3JpcHQuaW5jIiAgLy8gR2VuZXJhdGVkIGluY2x1ZGUgdmlhIGJ1aWxkIHJ1bGUuCisjaW5jbHVkZSAiZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgiCiAjaW5jbHVkZSAiZmFzdGRlcGxveWNhbGxiYWNrcy5oIgogI2luY2x1ZGUgInN5c2RlcHMuaCIKIApAQCAtMzUsNiArMzgsOCBAQAogc3RhdGljIGNvbnN0ZXhwciBsb25nIGtSZXF1aXJlZEFnZW50VmVyc2lvbiA9IDB4MDAwMDAwMDI7CiAKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0RldmljZUFnZW50UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvIjsKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0RldmljZUFnZW50RmlsZSA9ICIvZGF0YS9sb2NhbC90bXAvZGVwbG95YWdlbnQuamFyIjsKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0RldmljZUFnZW50U2NyaXB0ID0gIi9kYXRhL2xvY2FsL3RtcC9kZXBsb3lhZ2VudCI7CiAKIHN0YXRpYyBib29sIGdfdXNlX2xvY2FsYWdlbnQgPSBmYWxzZTsKIApAQCAtNzEsNDYgKzc2LDMyIEBACiAgICAgZ191c2VfbG9jYWxhZ2VudCA9IHVzZV9sb2NhbGFnZW50OwogfQogCi0vLyBsb2NhbF9wYXRoIC0gbXVzdCBzdGFydCB3aXRoIGEgJy8nIGFuZCBiZSByZWxhdGl2ZSB0byAkQU5EUk9JRF9QUk9EVUNUX09VVAotc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9hZ2VudF9jb21wb25lbnRfaG9zdF9wYXRoKGNvbnN0IGNoYXIqIGxvY2FsX3BhdGgsIGNvbnN0IGNoYXIqIHNka19wYXRoKSB7Ci0gICAgc3RkOjpzdHJpbmcgYWRiX2RpciA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBpZiAoYWRiX2Rpci5lbXB0eSgpKSB7Ci0gICAgICAgIGVycm9yX2V4aXQoIkNvdWxkIG5vdCBkZXRlcm1pbmUgbG9jYXRpb24gb2YgYWRiISIpOwotICAgIH0KLQotICAgIGlmIChnX3VzZV9sb2NhbGFnZW50KSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHByb2R1Y3Rfb3V0ID0gZ2V0ZW52KCJBTkRST0lEX1BST0RVQ1RfT1VUIik7Ci0gICAgICAgIGlmIChwcm9kdWN0X291dCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBlcnJvcl9leGl0KCJDb3VsZCBub3QgbG9jYXRlICVzIGJlY2F1c2UgJEFORFJPSURfUFJPRFVDVF9PVVQgaXMgbm90IGRlZmluZWQiLAotICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wYXRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIlcyVzIiwgcHJvZHVjdF9vdXQsIGxvY2FsX3BhdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBhZGJfZGlyICsgc2RrX3BhdGg7Ci0gICAgfQotfQotCiBzdGF0aWMgYm9vbCBkZXBsb3lfYWdlbnQoYm9vbCBjaGVja1RpbWVTdGFtcHMpIHsKICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gc3JjczsKLSAgICBzdGQ6OnN0cmluZyBqYXJfcGF0aCA9Ci0gICAgICAgICAgICBnZXRfYWdlbnRfY29tcG9uZW50X2hvc3RfcGF0aCgiL3N5c3RlbS9mcmFtZXdvcmsvZGVwbG95YWdlbnQuamFyIiwgIi9kZXBsb3lhZ2VudC5qYXIiKTsKLSAgICBzdGQ6OnN0cmluZyBzY3JpcHRfcGF0aCA9Ci0gICAgICAgICAgICBnZXRfYWdlbnRfY29tcG9uZW50X2hvc3RfcGF0aCgiL3N5c3RlbS9iaW4vZGVwbG95YWdlbnQiLCAiL2RlcGxveWFnZW50Iik7Ci0gICAgc3Jjcy5wdXNoX2JhY2soamFyX3BhdGguY19zdHIoKSk7Ci0gICAgc3Jjcy5wdXNoX2JhY2soc2NyaXB0X3BhdGguY19zdHIoKSk7Ci0KLSAgICBpZiAoZG9fc3luY19wdXNoKHNyY3MsIGtEZXZpY2VBZ2VudFBhdGgsIGNoZWNrVGltZVN0YW1wcykpIHsKLSAgICAgICAgLy8gb24gd2luZG93cyB0aGUgc2hlbGwgc2NyaXB0IG1pZ2h0IGhhdmUgbG9zdCBleGVjdXRlIHBlcm1pc3Npb24KLSAgICAgICAgLy8gc28gbmVlZCB0byBzZXQgdGhpcyBleHBsaWNpdGx5Ci0gICAgICAgIGNvbnN0IGNoYXIqIGtDaG1vZENvbW1hbmRQYXR0ZXJuID0gImNobW9kIDc3NyAlc2RlcGxveWFnZW50IjsKLSAgICAgICAgc3RkOjpzdHJpbmcgY2htb2RDb21tYW5kID0KLSAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoa0NobW9kQ29tbWFuZFBhdHRlcm4sIGtEZXZpY2VBZ2VudFBhdGgpOwotICAgICAgICBpbnQgcmV0ID0gc2VuZF9zaGVsbF9jb21tYW5kKGNobW9kQ29tbWFuZCk7Ci0gICAgICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICAgICAgZXJyb3JfZXhpdCgiRXJyb3IgZXhlY3V0aW5nICVzIHJldHVybmNvZGU6ICVkIiwgY2htb2RDb21tYW5kLmNfc3RyKCksIHJldCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBlcnJvcl9leGl0KCJFcnJvciBwdXNoaW5nIGFnZW50IGZpbGVzIHRvIGRldmljZSIpOworICAgIC8vIFRPRE86IERlcGxveSBhZ2VudCBmcm9tIGJpbjJjIGRpcmVjdGx5IGluc3RlYWQgb2Ygd3JpdGluZyB0byBkaXNrIGZpcnN0LgorICAgIFRlbXBvcmFyeUZpbGUgdGVtcEFnZW50OworICAgIGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkodGVtcEFnZW50LmZkLCBrRGVwbG95QWdlbnQsIHNpemVvZihrRGVwbG95QWdlbnQpKTsKKyAgICBzcmNzLnB1c2hfYmFjayh0ZW1wQWdlbnQucGF0aCk7CisgICAgaWYgKCFkb19zeW5jX3B1c2goc3Jjcywga0RldmljZUFnZW50RmlsZSwgY2hlY2tUaW1lU3RhbXBzKSkgeworICAgICAgICBlcnJvcl9leGl0KCJGYWlsZWQgdG8gcHVzaCBmYXN0ZGVwbG95IGFnZW50IHRvIGRldmljZS4iKTsKKyAgICB9CisgICAgc3Jjcy5jbGVhcigpOworICAgIC8vIFRPRE86IERlcGxveSBhZ2VudCBmcm9tIGJpbjJjIGRpcmVjdGx5IGluc3RlYWQgb2Ygd3JpdGluZyB0byBkaXNrIGZpcnN0LgorICAgIFRlbXBvcmFyeUZpbGUgdGVtcEFnZW50U2NyaXB0OworICAgIGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkodGVtcEFnZW50U2NyaXB0LmZkLCBrRGVwbG95QWdlbnRTY3JpcHQsIHNpemVvZihrRGVwbG95QWdlbnRTY3JpcHQpKTsKKyAgICBzcmNzLnB1c2hfYmFjayh0ZW1wQWdlbnRTY3JpcHQucGF0aCk7CisgICAgaWYgKCFkb19zeW5jX3B1c2goc3Jjcywga0RldmljZUFnZW50U2NyaXB0LCBjaGVja1RpbWVTdGFtcHMpKSB7CisgICAgICAgIGVycm9yX2V4aXQoIkZhaWxlZCB0byBwdXNoIGZhc3RkZXBsb3kgYWdlbnQgc2NyaXB0IHRvIGRldmljZS4iKTsKKyAgICB9CisgICAgc3Jjcy5jbGVhcigpOworICAgIC8vIG9uIHdpbmRvd3MgdGhlIHNoZWxsIHNjcmlwdCBtaWdodCBoYXZlIGxvc3QgZXhlY3V0ZSBwZXJtaXNzaW9uCisgICAgLy8gc28gbmVlZCB0byBzZXQgdGhpcyBleHBsaWNpdGx5CisgICAgY29uc3QgY2hhcioga0NobW9kQ29tbWFuZFBhdHRlcm4gPSAiY2htb2QgNzc3ICVzIjsKKyAgICBzdGQ6OnN0cmluZyBjaG1vZENvbW1hbmQgPQorICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKGtDaG1vZENvbW1hbmRQYXR0ZXJuLCBrRGV2aWNlQWdlbnRTY3JpcHQpOworICAgIGludCByZXQgPSBzZW5kX3NoZWxsX2NvbW1hbmQoY2htb2RDb21tYW5kKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgZXJyb3JfZXhpdCgiRXJyb3IgZXhlY3V0aW5nICVzIHJldHVybmNvZGU6ICVkIiwgY2htb2RDb21tYW5kLmNfc3RyKCksIHJldCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC0yMzgsMzQgKzIyOSwxNSBAQAogICAgIH0KIH0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9wYXRjaF9nZW5lcmF0b3JfY29tbWFuZCgpIHsKLSAgICBpZiAoZ191c2VfbG9jYWxhZ2VudCkgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb24gYSBXaW5kb3dzIG1hY2hpbmUKLSAgICAgICAgY29uc3QgY2hhciogaG9zdF9vdXQgPSBnZXRlbnYoIkFORFJPSURfSE9TVF9PVVQiKTsKLSAgICAgICAgaWYgKGhvc3Rfb3V0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGVycm9yX2V4aXQoCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgbG9jYXRlIGRlcGxveXBhdGNoZ2VuZXJhdG9yLmphciBiZWNhdXNlICRBTkRST0lEX0hPU1RfT1VUICIKLSAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBkZWZpbmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiamF2YSAtamFyICVzL2ZyYW1ld29yay9kZXBsb3lwYXRjaGdlbmVyYXRvci5qYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Rfb3V0KTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBhZGJfZGlyID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGlmIChhZGJfZGlyLmVtcHR5KCkpIHsKLSAgICAgICAgZXJyb3JfZXhpdCgiQ291bGQgbm90IGxvY2F0ZSBkZXBsb3lwYXRjaGdlbmVyYXRvci5qYXIiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZihSIihqYXZhIC1qYXIgIiVzL2RlcGxveXBhdGNoZ2VuZXJhdG9yLmphciIpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYl9kaXIuY19zdHIoKSk7Ci19Ci0KIHZvaWQgY3JlYXRlX3BhdGNoKGNvbnN0IGNoYXIqIGFwa1BhdGgsIGNvbnN0IGNoYXIqIG1ldGFkYXRhUGF0aCwgY29uc3QgY2hhciogcGF0Y2hQYXRoKSB7Ci0gICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVQYXRjaENvbW1hbmQgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICBSIiglcyAiJXMiICIlcyIgPiAiJXMiKSIsIGdldF9wYXRjaF9nZW5lcmF0b3JfY29tbWFuZCgpLmNfc3RyKCksIGFwa1BhdGgsIG1ldGFkYXRhUGF0aCwKLSAgICAgICAgICAgIHBhdGNoUGF0aCk7Ci0gICAgaW50IHJldHVybkNvZGUgPSBzeXN0ZW0oZ2VuZXJhdGVQYXRjaENvbW1hbmQuY19zdHIoKSk7Ci0gICAgaWYgKHJldHVybkNvZGUgIT0gMCkgewotICAgICAgICBlcnJvcl9leGl0KCJFeGVjdXRpbmcgJXMgcmV0dXJuZWQgJWQiLCBnZW5lcmF0ZVBhdGNoQ29tbWFuZC5jX3N0cigpLCByZXR1cm5Db2RlKTsKKyAgICBEZXBsb3lQYXRjaEdlbmVyYXRvciBnZW5lcmF0b3IoZmFsc2UpOworICAgIHVuaXF1ZV9mZCBwYXRjaEZkKGFkYl9vcGVuKHBhdGNoUGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19DTE9FWEVDKSk7CisgICAgaWYgKHBhdGNoRmQgPCAwKSB7CisgICAgICAgIHBlcnJvcl9leGl0KCJhZGI6IGZhaWxlZCB0byBjcmVhdGUgJXMiLCBwYXRjaFBhdGgpOworICAgIH0KKyAgICBib29sIHN1Y2Nlc3MgPSBnZW5lcmF0b3IuQ3JlYXRlUGF0Y2goYXBrUGF0aCwgbWV0YWRhdGFQYXRoLCBwYXRjaEZkKTsKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgZXJyb3JfZXhpdCgiRmFpbGVkIHRvIGNyZWF0ZSBwYXRjaCBmb3IgJXMiLCBhcGtQYXRoKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L0FuZHJvaWQuYnAgYi9hZGIvZmFzdGRlcGxveS9BbmRyb2lkLmJwCmluZGV4IDFiYTBkZTAuLjk1ZTFhMjggMTAwNjQ0Ci0tLSBhL2FkYi9mYXN0ZGVwbG95L0FuZHJvaWQuYnAKKysrIGIvYWRiL2Zhc3RkZXBsb3kvQW5kcm9pZC5icApAQCAtMTMsMjcgKzEzLDE1IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCi0KIGphdmFfYmluYXJ5IHsKICAgICBuYW1lOiAiZGVwbG95YWdlbnQiLAogICAgIHNka192ZXJzaW9uOiAiMjQiLAogICAgIHNyY3M6IFsiZGVwbG95YWdlbnQvc3JjLyoqLyouamF2YSIsICJkZXBsb3lsaWIvc3JjLyoqLyouamF2YSIsICJwcm90by8qKi8qLnByb3RvIl0sCiAgICAgc3RhdGljX2xpYnM6IFsiYXBremxpYl96aXAiXSwKLSAgICB3cmFwcGVyOiAiZGVwbG95YWdlbnQvZGVwbG95YWdlbnQuc2giLAogICAgIHByb3RvOiB7CiAgICAgICAgIHR5cGU6ICJsaXRlIiwKICAgICB9LAogICAgIGRleF9wcmVvcHQ6IHsKICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgfQotfQotCi1qYXZhX2JpbmFyeV9ob3N0IHsKLSAgICBuYW1lOiAiZGVwbG95cGF0Y2hnZW5lcmF0b3IiLAotICAgIHNyY3M6IFsiZGVwbG95cGF0Y2hnZW5lcmF0b3Ivc3JjLyoqLyouamF2YSIsICJkZXBsb3lsaWIvc3JjLyoqLyouamF2YSIsICJwcm90by8qKi8qLnByb3RvIl0sCi0gICAgc3RhdGljX2xpYnM6IFsiYXBremxpYiJdLAotICAgIG1hbmlmZXN0OiAiZGVwbG95cGF0Y2hnZW5lcmF0b3IvbWFuaWZlc3QudHh0IiwKLSAgICBwcm90bzogewotICAgICAgICB0eXBlOiAiZnVsbCIsCi0gICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveWFnZW50L3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveUFnZW50LmphdmEgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lhZ2VudC9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lBZ2VudC5qYXZhCmluZGV4IDJkM2IxMzUuLmE4MTAzYzQgMTAwNjQ0Ci0tLSBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveWFnZW50L3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveUFnZW50LmphdmEKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95YWdlbnQvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95QWdlbnQuamF2YQpAQCAtMTgxLDcgKzE4MSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHRyYWN0TWV0YURhdGEoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGaWxlIGFwa0ZpbGUgPSBnZXRGaWxlRnJvbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKICAgICAgICAgQVBLTWV0YURhdGEgYXBrTWV0YURhdGEgPSBQYXRjaFV0aWxzLmdldEFQS01ldGFEYXRhKGFwa0ZpbGUpOwotICAgICAgICBhcGtNZXRhRGF0YS53cml0ZURlbGltaXRlZFRvKFN5c3RlbS5vdXQpOworICAgICAgICBhcGtNZXRhRGF0YS53cml0ZVRvKFN5c3RlbS5vdXQpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGludCBjcmVhdGVJbnN0YWxsU2Vzc2lvbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMjIzLDcgKzIyMyw2IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQgd3JpdGVFeGl0Q29kZSA9IHdyaXRlUGF0Y2hlZERhdGFUb1Nlc3Npb24obmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZGV2aWNlRmlsZSwgInIiKSwgZGVsdGFTdHJlYW0sIHNlc3Npb25JZCk7Ci0KICAgICAgICAgaWYgKHdyaXRlRXhpdENvZGUgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGNvbW1pdEluc3RhbGxTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yODUsNyArMjg0LDYgQEAKICAgICAgICAgICAgIGlmIChvbGREYXRhTGVuID4gMCkgewogICAgICAgICAgICAgICAgIFBhdGNoVXRpbHMucGlwZShvbGREYXRhLCBvdXRwdXRTdHJlYW0sIGJ1ZmZlciwgKGludCkgb2xkRGF0YUxlbik7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIG5ld0RhdGFCeXRlc1dyaXR0ZW4gKz0gY29weUxlbiArIG9sZERhdGFMZW47CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95bGliL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L1BhdGNoVXRpbHMuamF2YSBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveWxpYi9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9QYXRjaFV0aWxzLmphdmEKaW5kZXggZjBmMDBlMS4uYzYwZjlhNiAxMDA2NDQKLS0tIGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95bGliL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L1BhdGNoVXRpbHMuamF2YQorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lsaWIvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvUGF0Y2hVdGlscy5qYXZhCkBAIC0zOSw3ICszOSw3IEBACiBjbGFzcyBQYXRjaFV0aWxzIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5FR0FUSVZFX01BU0sgPSAxTCA8PCA2MzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5FR0FUSVZFX0xPTkdfU0lHTl9NQVNLID0gMUwgPDwgNjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFID0gIkhBTUFESS9JSEQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05BVFVSRSA9ICJGQVNUREVQTE9ZIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0T2Zmc2V0RnJvbUVudHJ5KFN0b3JlZEVudHJ5IGVudHJ5KSB7CiAgICAgICAgIHJldHVybiBlbnRyeS5nZXRDZW50cmFsRGlyZWN0b3J5SGVhZGVyKCkuZ2V0T2Zmc2V0KCkgKyBlbnRyeS5nZXRMb2NhbEhlYWRlclNpemUoKTsKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjOTI0MwotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImRlcGxveV9wYXRjaF9nZW5lcmF0b3IuaCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJhZGJfdW5pcXVlX2ZkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL2ZpbGUuaCIKKyNpbmNsdWRlICJwYXRjaF91dGlscy5oIgorI2luY2x1ZGUgInN5c2RlcHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTsKKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6TG9nKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgICAgaWYgKCFpc192ZXJib3NlXykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdnByaW50ZihmbXQsIGFwKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6QVBLRW50cnlUb0xvZyhjb25zdCBBUEtFbnRyeSYgZW50cnkpIHsKKyAgICBMb2coIkZpbGVuYW1lOiAlcyIsIGVudHJ5LmZpbGVuYW1lKCkuY19zdHIoKSk7CisgICAgTG9nKCJDUkMzMjogMHglMDhsbFgiLCBlbnRyeS5jcmMzMigpKTsKKyAgICBMb2coIkRhdGEgT2Zmc2V0OiAlbGxkIiwgZW50cnkuZGF0YW9mZnNldCgpKTsKKyAgICBMb2coIkNvbXByZXNzZWQgU2l6ZTogJWxsZCIsIGVudHJ5LmNvbXByZXNzZWRzaXplKCkpOworICAgIExvZygiVW5jb21wcmVzc2VkIFNpemU6ICVsbGQiLCBlbnRyeS51bmNvbXByZXNzZWRzaXplKCkpOworfQorCit2b2lkIERlcGxveVBhdGNoR2VuZXJhdG9yOjpBUEtNZXRhRGF0YVRvTG9nKGNvbnN0IGNoYXIqIGZpbGUsIGNvbnN0IEFQS01ldGFEYXRhJiBtZXRhZGF0YSkgeworICAgIGlmICghaXNfdmVyYm9zZV8pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMb2coIkFQSyBNZXRhZGF0YTogJXMiLCBmaWxlKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGFkYXRhLmVudHJpZXNfc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVBLRW50cnkmIGVudHJ5ID0gbWV0YWRhdGEuZW50cmllcyhpKTsKKyAgICAgICAgQVBLRW50cnlUb0xvZyhlbnRyeSk7CisgICAgfQorfQorCit2b2lkIERlcGxveVBhdGNoR2VuZXJhdG9yOjpSZXBvcnRTYXZpbmdzKGNvbnN0IHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgaWRlbnRpY2FsRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdG90YWxTaXplKSB7CisgICAgbG9uZyB0b3RhbEVxdWFsQnl0ZXMgPSAwOworICAgIGludCB0b3RhbEVxdWFsRmlsZXMgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaWRlbnRpY2FsRW50cmllcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaWRlbnRpY2FsRW50cmllc1tpXS5kZXZpY2VFbnRyeSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICB0b3RhbEVxdWFsQnl0ZXMgKz0gaWRlbnRpY2FsRW50cmllc1tpXS5sb2NhbEVudHJ5LT5jb21wcmVzc2Vkc2l6ZSgpOworICAgICAgICAgICAgdG90YWxFcXVhbEZpbGVzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZmxvYXQgc2F2aW5nUGVyY2VudCA9ICh0b3RhbEVxdWFsQnl0ZXMgKiAxMDAuMGYpIC8gdG90YWxTaXplOworICAgIGZwcmludGYoc3RkZXJyLCAiRGV0ZWN0ZWQgJWQgZXF1YWwgQVBLIGVudHJpZXNcbiIsIHRvdGFsRXF1YWxGaWxlcyk7CisgICAgZnByaW50ZihzdGRlcnIsICIlbGQgYnl0ZXMgYXJlIGVxdWFsIG91dCBvZiAlIiBQUkl1NjQgIiAoJS4yZiUlKVxuIiwgdG90YWxFcXVhbEJ5dGVzLCB0b3RhbFNpemUsCisgICAgICAgICAgICBzYXZpbmdQZXJjZW50KTsKK30KKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6R2VuZXJhdGVQYXRjaChjb25zdCBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIGVudHJpZXNUb1VzZU9uRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhbEFwa1BhdGgsIGJvcnJvd2VkX2ZkIG91dHB1dCkgeworICAgIHVuaXF1ZV9mZCBpbnB1dChhZGJfb3Blbihsb2NhbEFwa1BhdGgsIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgc2l6ZV90IG5ld0Fwa1NpemUgPSBhZGJfbHNlZWsoaW5wdXQsIDBMLCBTRUVLX0VORCk7CisgICAgYWRiX2xzZWVrKGlucHV0LCAwTCwgU0VFS19TRVQpOworCisgICAgUGF0Y2hVdGlsczo6V3JpdGVTaWduYXR1cmUob3V0cHV0KTsKKyAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcobmV3QXBrU2l6ZSwgb3V0cHV0KTsKKyAgICBzaXplX3QgY3VycmVudFNpemVPdXQgPSAwOworICAgIC8vIFdyaXRlIGRhdGEgZnJvbSB0aGUgaG9zdCB1cHRvIHRoZSBmaXJzdCBlbnRyeSB3ZSBoYXZlIHRoYXQgbWF0Y2hlcyBhIGRldmljZSBlbnRyeS4gVGhlbiB3cml0ZQorICAgIC8vIHRoZSBtZXRhZGF0YSBhYm91dCB0aGUgZGV2aWNlIGVudHJ5IGFuZCByZXBlYXQgZm9yIGFsbCBlbnRyaWVzIHRoYXQgbWF0Y2ggb24gZGV2aWNlLiBGaW5hbGx5CisgICAgLy8gd3JpdGUgb3V0IGFueSBkYXRhIGxlZnQuIElmIHRoZSBkZXZpY2UgYW5kIGhvc3QgQVBLcyBhcmUgZXhhY3RseSB0aGUgc2FtZSB0aGlzIGVuZHMgdXAKKyAgICAvLyB3cml0aW5nIG91dCB6aXAgbWV0YWRhdGEgZnJvbSB0aGUgbG9jYWwgQVBLIGZvbGxvd2VkIGJ5IG9mZnNldHMgdG8gdGhlIGRhdGEgdG8gdXNlIGZyb20gdGhlCisgICAgLy8gZGV2aWNlIEFQSy4KKyAgICBmb3IgKGF1dG8mJiBlbnRyeSA6IGVudHJpZXNUb1VzZU9uRGV2aWNlKSB7CisgICAgICAgIGludDY0X3QgZGV2aWNlRGF0YU9mZnNldCA9IGVudHJ5LmRldmljZUVudHJ5LT5kYXRhb2Zmc2V0KCk7CisgICAgICAgIGludDY0X3QgaG9zdERhdGFPZmZzZXQgPSBlbnRyeS5sb2NhbEVudHJ5LT5kYXRhb2Zmc2V0KCk7CisgICAgICAgIGludDY0X3QgZGV2aWNlRGF0YUxlbmd0aCA9IGVudHJ5LmRldmljZUVudHJ5LT5jb21wcmVzc2Vkc2l6ZSgpOworICAgICAgICBpbnQ2NF90IGRlbHRhRnJvbURldmljZURhdGFTdGFydCA9IGhvc3REYXRhT2Zmc2V0IC0gY3VycmVudFNpemVPdXQ7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQsIG91dHB1dCk7CisgICAgICAgIGlmIChkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQgPiAwKSB7CisgICAgICAgICAgICBQYXRjaFV0aWxzOjpQaXBlKGlucHV0LCBvdXRwdXQsIGRlbHRhRnJvbURldmljZURhdGFTdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKGRldmljZURhdGFPZmZzZXQsIG91dHB1dCk7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhkZXZpY2VEYXRhTGVuZ3RoLCBvdXRwdXQpOworICAgICAgICBhZGJfbHNlZWsoaW5wdXQsIGRldmljZURhdGFMZW5ndGgsIFNFRUtfQ1VSKTsKKyAgICAgICAgY3VycmVudFNpemVPdXQgKz0gZGVsdGFGcm9tRGV2aWNlRGF0YVN0YXJ0ICsgZGV2aWNlRGF0YUxlbmd0aDsKKyAgICB9CisgICAgaWYgKGN1cnJlbnRTaXplT3V0ICE9IG5ld0Fwa1NpemUpIHsKKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKG5ld0Fwa1NpemUgLSBjdXJyZW50U2l6ZU91dCwgb3V0cHV0KTsKKyAgICAgICAgUGF0Y2hVdGlsczo6UGlwZShpbnB1dCwgb3V0cHV0LCBuZXdBcGtTaXplIC0gY3VycmVudFNpemVPdXQpOworICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoMCwgb3V0cHV0KTsKKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKDAsIG91dHB1dCk7CisgICAgfQorfQorCitib29sIERlcGxveVBhdGNoR2VuZXJhdG9yOjpDcmVhdGVQYXRjaChjb25zdCBjaGFyKiBsb2NhbEFwa1BhdGgsIGNvbnN0IGNoYXIqIGRldmljZUFwa01ldGFkYXRhUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcnJvd2VkX2ZkIG91dHB1dCkgeworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7CisgICAgQVBLTWV0YURhdGEgZGV2aWNlQXBrTWV0YWRhdGE7CisgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoZGV2aWNlQXBrTWV0YWRhdGFQYXRoLCAmY29udGVudCkpIHsKKyAgICAgICAgZGV2aWNlQXBrTWV0YWRhdGEuUGFyc2VQYXJ0aWFsRnJvbVN0cmluZyhjb250ZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBXaGF0IGRvIHdlIHdhbnQgdG8gZG8gaWYgd2UgZG9uJ3QgZmluZCBhbnkgbWV0YWRhdGEuCisgICAgICAgIC8vIFRoZSBjdXJyZW50IGZhbGxiYWNrIGJlaGF2aW9yIGlzIHRvIGJ1aWxkIGEgcGF0Y2ggd2l0aCB0aGUgY29udGVudHMgb2YgfGxvY2FsQXBrUGF0aHwuCisgICAgfQorCisgICAgQVBLTWV0YURhdGEgbG9jYWxBcGtNZXRhZGF0YSA9IFBhdGNoVXRpbHM6OkdldEFQS01ldGFEYXRhKGxvY2FsQXBrUGF0aCk7CisgICAgLy8gTG9nIGdhdGhlcmVkIG1ldGFkYXRhIGluZm8uCisgICAgQVBLTWV0YURhdGFUb0xvZyhkZXZpY2VBcGtNZXRhZGF0YVBhdGgsIGRldmljZUFwa01ldGFkYXRhKTsKKyAgICBBUEtNZXRhRGF0YVRvTG9nKGxvY2FsQXBrUGF0aCwgbG9jYWxBcGtNZXRhZGF0YSk7CisKKyAgICBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4gaWRlbnRpY2FsRW50cmllczsKKyAgICB1aW50NjRfdCB0b3RhbFNpemUgPQorICAgICAgICAgICAgQnVpbGRJZGVudGljYWxFbnRyaWVzKGlkZW50aWNhbEVudHJpZXMsIGxvY2FsQXBrTWV0YWRhdGEsIGRldmljZUFwa01ldGFkYXRhKTsKKyAgICBSZXBvcnRTYXZpbmdzKGlkZW50aWNhbEVudHJpZXMsIHRvdGFsU2l6ZSk7CisgICAgR2VuZXJhdGVQYXRjaChpZGVudGljYWxFbnRyaWVzLCBsb2NhbEFwa1BhdGgsIG91dHB1dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3VpbnQ2NF90IERlcGxveVBhdGNoR2VuZXJhdG9yOjpCdWlsZElkZW50aWNhbEVudHJpZXMoc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBvdXRJZGVudGljYWxFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEtNZXRhRGF0YSYgbG9jYWxBcGtNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBLTWV0YURhdGEmIGRldmljZUFwa01ldGFkYXRhKSB7CisgICAgdWludDY0X3QgdG90YWxTaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsQXBrTWV0YWRhdGEuZW50cmllc19zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBBUEtFbnRyeSYgbG9jYWxFbnRyeSA9IGxvY2FsQXBrTWV0YWRhdGEuZW50cmllcyhpKTsKKyAgICAgICAgdG90YWxTaXplICs9IGxvY2FsRW50cnkuY29tcHJlc3NlZHNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXZpY2VBcGtNZXRhZGF0YS5lbnRyaWVzX3NpemUoKTsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBBUEtFbnRyeSYgZGV2aWNlRW50cnkgPSBkZXZpY2VBcGtNZXRhZGF0YS5lbnRyaWVzKGopOworICAgICAgICAgICAgaWYgKGRldmljZUVudHJ5LmNyYzMyKCkgPT0gbG9jYWxFbnRyeS5jcmMzMigpICYmCisgICAgICAgICAgICAgICAgZGV2aWNlRW50cnkuZmlsZW5hbWUoKS5jb21wYXJlKGxvY2FsRW50cnkuZmlsZW5hbWUoKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIFNpbXBsZUVudHJ5IHNpbXBsZUVudHJ5OworICAgICAgICAgICAgICAgIHNpbXBsZUVudHJ5LmxvY2FsRW50cnkgPSBjb25zdF9jYXN0PEFQS0VudHJ5Kj4oJmxvY2FsRW50cnkpOworICAgICAgICAgICAgICAgIHNpbXBsZUVudHJ5LmRldmljZUVudHJ5ID0gY29uc3RfY2FzdDxBUEtFbnRyeSo+KCZkZXZpY2VFbnRyeSk7CisgICAgICAgICAgICAgICAgQVBLRW50cnlUb0xvZyhsb2NhbEVudHJ5KTsKKyAgICAgICAgICAgICAgICBvdXRJZGVudGljYWxFbnRyaWVzLnB1c2hfYmFjayhzaW1wbGVFbnRyeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjpzb3J0KG91dElkZW50aWNhbEVudHJpZXMuYmVnaW4oKSwgb3V0SWRlbnRpY2FsRW50cmllcy5lbmQoKSwKKyAgICAgICAgICAgICAgW10oY29uc3QgU2ltcGxlRW50cnkmIGxocywgY29uc3QgU2ltcGxlRW50cnkmIHJocykgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIGxocy5sb2NhbEVudHJ5LT5kYXRhb2Zmc2V0KCkgPCByaHMubG9jYWxFbnRyeS0+ZGF0YW9mZnNldCgpOworICAgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gdG90YWxTaXplOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuaCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGU0MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJhZGJfdW5pcXVlX2ZkLmgiCisjaW5jbHVkZSAiZmFzdGRlcGxveS9wcm90by9BcGtFbnRyeS5wYi5oIgorCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgcGF0Y2ggdGhhdCBjYW4gYmUgYWNjZXB0ZWQgYnkgdGhlIGRlcGxveWFnZW50LiBUaGUKKyAqIHBhdGNoIGZvcm1hdCBpcyBkb2N1bWVudGVkIGluIEdlbmVyYXRlUGF0Y2guCisgKi8KK2NsYXNzIERlcGxveVBhdGNoR2VuZXJhdG9yIHsKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIFNpbXBsZSBzdHJ1Y3QgdG8gaG9sZCBtYXBwaW5nIGJldHdlZW4gbG9jYWwgbWV0YWRhdGEgYW5kIGRldmljZSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgU2ltcGxlRW50cnkgeworICAgICAgICBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS0VudHJ5KiBsb2NhbEVudHJ5OworICAgICAgICBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS0VudHJ5KiBkZXZpY2VFbnRyeTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogSWYgfGlzX3ZlcmJvc2V8IGlzIHRydWUgQXBrRW50cmllcyB0aGF0IGFyZSBzaW1pbGFyIGJldHdlZW4gZGV2aWNlIGFuZCBob3N0IGFyZSB3cml0dGVuIHRvCisgICAgICogdGhlIGNvbnNvbGUuCisgICAgICovCisgICAgZXhwbGljaXQgRGVwbG95UGF0Y2hHZW5lcmF0b3IoYm9vbCBpc192ZXJib3NlKSA6IGlzX3ZlcmJvc2VfKGlzX3ZlcmJvc2UpIHt9CisgICAgLyoqCisgICAgICogR2l2ZW4gYSB8bG9jYWxBcGtQYXRofCwgYW5kIHRoZSB8ZGV2aWNlQXBrTWV0YWRhdGFQYXRofCBmcm9tIGFuIGluc3RhbGxlZCBBUEsgdGhpcyBmdW5jdGlvbgorICAgICAqIHdyaXRlcyBhIHBhdGNoIHRvIHRoZSBnaXZlbiB8b3V0cHV0fC4KKyAgICAgKi8KKyAgICBib29sIENyZWF0ZVBhdGNoKGNvbnN0IGNoYXIqIGxvY2FsQXBrUGF0aCwgY29uc3QgY2hhciogZGV2aWNlQXBrTWV0YWRhdGFQYXRoLAorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgb3V0cHV0KTsKKworICBwcml2YXRlOgorICAgIGJvb2wgaXNfdmVyYm9zZV87CisKKyAgICAvKioKKyAgICAgKiBMb2cgZnVuY3Rpb24gb25seSBsb2dzIGRhdGEgdG8gc3Rkb3V0IHdoZW4gfGlzX3ZlcmJvc2VffCBpcyB0cnVlLgorICAgICAqLworICAgIHZvaWQgTG9nKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18sIDIsIDMpKSk7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gbG9nIHRoZSBBUEtNZXRhRGF0YSBzdHJ1Y3R1cmUuIElmIHxpc192ZXJib3NlX3wgaXMgZmFsc2UgdGhpcyBmdW5jdGlvbgorICAgICAqIGVhcmx5IG91dHMuIHxmaWxlfCBpcyB0aGUgcGF0aCB0byB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB8bWV0YWRhdGF8LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQKKyAgICAgKiBmb3IgZGVidWdnaW5nIC8gaW5mb3JtYXRpb24uCisgICAgICovCisgICAgdm9pZCBBUEtNZXRhRGF0YVRvTG9nKGNvbnN0IGNoYXIqIGZpbGUsIGNvbnN0IGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLTWV0YURhdGEmIG1ldGFkYXRhKTsKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gbG9nIEFQS0VudHJ5LgorICAgICAqLworICAgIHZvaWQgQVBLRW50cnlUb0xvZyhjb25zdCBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS0VudHJ5JiBlbnRyeSk7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVwb3J0IHNhdmluZ3MgYnkgZmFzdGRlcGxveS4gVGhpcyBmdW5jdGlvbiBwcmludHMgb3V0IHNhdmluZ3MgZXZlbiB3aXRoCisgICAgICogfGlzX3ZlcmJvc2VffCBzZXQgdG8gZmFsc2UuIHx0b3RhbFNpemV8IGlzIHVzZWQgdG8gc2hvdyBhIHBlcmNlbnRhZ2Ugb2Ygc2F2aW5ncy4gTm90ZToKKyAgICAgKiB8dG90YWxTaXplfCBpcyB0aGUgc2l6ZSBvZiB0aGUgWmlwRW50cmllcy4gTm90IHRoZSBzaXplIG9mIHRoZSBlbnRpcmUgZmlsZS4gVGhlIG1ldGFkYXRhIG9mCisgICAgICogdGhlIHppcCBkYXRhIG5lZWRzIHRvIGJlIHNlbnQgYWNyb3NzIHdpdGggZXZlcnkgaXRlcmF0aW9uLgorICAgICAqIFtQYXRjaCBmb3JtYXRdCisgICAgICogfEZpeGVkIFN0cmluZ3wgU2lnbmF0dXJlCisgICAgICogfGxvbmd8ICAgICAgICAgTmV3IFNpemUgb2YgQXBrCisgICAgICogfFBhY2tldHNbXXwgICAgQXJyYXkgb2YgUGFja2V0cworICAgICAqCisgICAgICogW1BhY2tldCBGb3JtYXRdCisgICAgICogfGxvbmd8ICAgICBTaXplIG9mIGRhdGEgdG8gdXNlIGZyb20gcGF0Y2gKKyAgICAgKiB8Ynl0ZVtdfCAgIFBhdGNoIGRhdGEKKyAgICAgKiB8bG9uZ3wgICAgIE9mZnNldCBvZiBkYXRhIHRvIHVzZSBhbHJlYWR5IG9uIGRldmljZQorICAgICAqIHxsb25nfCAgICAgTGVuZ3RoIG9mIGRhdGEgdG8gcmVhZCBmcm9tIGRldmljZSBBUEsKKyAgICAgKiBUT0RPKGIvMTM4MzA2Nzg0KTogTW92ZSB0aGUgcGF0Y2ggZm9ybWF0IHRvIGEgcHJvdG8uCisgICAgICovCisgICAgdm9pZCBSZXBvcnRTYXZpbmdzKGNvbnN0IHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgaWRlbnRpY2FsRW50cmllcywgdWludDY0X3QgdG90YWxTaXplKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgZW51bWVyYXRlcyBlYWNoIGVudHJ5IGluIHxlbnRyaWVzVG9Vc2VPbkRldmljZXwgYW5kIGJ1aWxkcyBhIHBhdGNoIGZpbGUgY29weWluZyBkYXRhCisgICAgICogZnJvbSB8bG9jYWxBcGtQYXRofCB3aGVyZSB3ZSBhcmUgdW5hYmxlIHRvIHVzZSBlbnRyaWVzIGFscmVhZHkgb24gdGhlIGRldmljZS4gVGhlIG5ldyBwYXRjaAorICAgICAqIGlzIHdyaXR0ZW4gdG8gfG91dHB1dHwuIFRoZSBlbnRyaWVzIGFyZSBleHBlY3RlZCB0byBiZSBzb3J0ZWQgYnkgZGF0YSBvZmZzZXQgZnJvbSBsb3dlc3QgdG8KKyAgICAgKiBoaWdoZXN0LgorICAgICAqLworICAgIHZvaWQgR2VuZXJhdGVQYXRjaChjb25zdCBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIGVudHJpZXNUb1VzZU9uRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhbEFwa1BhdGgsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCk7CisKKyAgcHJvdGVjdGVkOgorICAgIHVpbnQ2NF90IEJ1aWxkSWRlbnRpY2FsRW50cmllcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgb3V0SWRlbnRpY2FsRW50cmllcywKKyAgICAgICAgICAgIGNvbnN0IGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLTWV0YURhdGEmIGxvY2FsQXBrTWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS01ldGFEYXRhJiBkZXZpY2VBcGtNZXRhZGF0YVBhdGgpOworfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yX3Rlc3QuY3BwIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2RjNDRlCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvcl90ZXN0LmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImRlcGxveV9wYXRjaF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJwYXRjaF91dGlscy5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInN5c2RlcHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTsKKworc3RhdGljIHN0ZDo6c3RyaW5nIEdldFRlc3RGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgcmV0dXJuICJmYXN0ZGVwbG95L3Rlc3RkYXRhLyIgKyBuYW1lOworfQorCitjbGFzcyBUZXN0UGF0Y2hHZW5lcmF0b3IgOiBEZXBsb3lQYXRjaEdlbmVyYXRvciB7CisgIHB1YmxpYzoKKyAgICBUZXN0UGF0Y2hHZW5lcmF0b3IoKSA6IERlcGxveVBhdGNoR2VuZXJhdG9yKGZhbHNlKSB7fQorICAgIHZvaWQgR2F0aGVySWRlbnRpY2FsRW50cmllcyhzdGQ6OnZlY3RvcjxEZXBsb3lQYXRjaEdlbmVyYXRvcjo6U2ltcGxlRW50cnk+JiBvdXRJZGVudGljYWxFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEtNZXRhRGF0YSYgbWV0YWRhdGFBLCBjb25zdCBBUEtNZXRhRGF0YSYgbWV0YWRhdGFCKSB7CisgICAgICAgIEJ1aWxkSWRlbnRpY2FsRW50cmllcyhvdXRJZGVudGljYWxFbnRyaWVzLCBtZXRhZGF0YUEsIG1ldGFkYXRhQik7CisgICAgfQorfTsKKworVEVTVChEZXBsb3lQYXRjaEdlbmVyYXRvclRlc3QsIElkZW50aWNhbEZpbGVFbnRyaWVzKSB7CisgICAgc3RkOjpzdHJpbmcgYXBrUGF0aCA9IEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIik7CisgICAgQVBLTWV0YURhdGEgbWV0YWRhdGFBID0gUGF0Y2hVdGlsczo6R2V0QVBLTWV0YURhdGEoYXBrUGF0aC5jX3N0cigpKTsKKyAgICBUZXN0UGF0Y2hHZW5lcmF0b3IgZ2VuZXJhdG9yOworICAgIHN0ZDo6dmVjdG9yPERlcGxveVBhdGNoR2VuZXJhdG9yOjpTaW1wbGVFbnRyeT4gZW50cmllczsKKyAgICBnZW5lcmF0b3IuR2F0aGVySWRlbnRpY2FsRW50cmllcyhlbnRyaWVzLCBtZXRhZGF0YUEsIG1ldGFkYXRhQSk7CisgICAgLy8gRXhwZWN0IHRoZSBlbnRyeSBjb3VudCB0byBtYXRjaCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1ldGFkYXRhLgorICAgIGNvbnN0IHVpbnQzMl90IGlkZW50aWNhbENvdW50ID0gZW50cmllcy5zaXplKCk7CisgICAgY29uc3QgdWludDMyX3QgZW50cmllc0NvdW50ID0gbWV0YWRhdGFBLmVudHJpZXNfc2l6ZSgpOworICAgIEVYUEVDVF9FUShpZGVudGljYWxDb3VudCwgZW50cmllc0NvdW50KTsKK30KKworVEVTVChEZXBsb3lQYXRjaEdlbmVyYXRvclRlc3QsIE5vRGV2aWNlTWV0YWRhdGEpIHsKKyAgICBzdGQ6OnN0cmluZyBhcGtQYXRoID0gR2V0VGVzdEZpbGUoInJvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsiKTsKKyAgICAvLyBHZXQgc2l6ZSBvZiBvdXIgdGVzdCBhcGsuCisgICAgbG9uZyBhcGtTaXplID0gMDsKKyAgICB7CisgICAgICAgIHVuaXF1ZV9mZCBhcGtGaWxlKGFkYl9vcGVuKGFwa1BhdGguY19zdHIoKSwgT19SRFdSKSk7CisgICAgICAgIGFwa1NpemUgPSBhZGJfbHNlZWsoYXBrRmlsZSwgMEwsIFNFRUtfRU5EKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBwYXRjaCB0aGF0IGlzIDEwMCUgZGlmZmVyZW50LgorICAgIFRlbXBvcmFyeUZpbGUgb3V0cHV0OworICAgIERlcGxveVBhdGNoR2VuZXJhdG9yIGdlbmVyYXRvcih0cnVlKTsKKyAgICBnZW5lcmF0b3IuQ3JlYXRlUGF0Y2goYXBrUGF0aC5jX3N0cigpLCAiIiwgb3V0cHV0LmZkKTsKKworICAgIC8vIEV4cGVjdCBhIHBhdGNoIGZpbGUgdGhhdCBoYXMgYSBzaXplIGF0IGxlYXN0IHRoZSBzaXplIG9mIG91ciBpbml0aWFsIEFQSy4KKyAgICBsb25nIHBhdGNoU2l6ZSA9IGFkYl9sc2VlayhvdXRwdXQuZmQsIDBMLCBTRUVLX0VORCk7CisgICAgRVhQRUNUX0dUKHBhdGNoU2l6ZSwgYXBrU2l6ZSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvbWFuaWZlc3QudHh0IGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvbWFuaWZlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzAwNTA1Li4wMDAwMDAwCi0tLSBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1haW4tQ2xhc3M6IGNvbS5hbmRyb2lkLmZhc3RkZXBsb3kuRGVwbG95UGF0Y2hHZW5lcmF0b3IKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTFkZGQxCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicGF0Y2hfdXRpbHMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWRmdy9aaXBGaWxlUk8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYWRiX2lvLmgiCisjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL2VuZGlhbi5oIgorI2luY2x1ZGUgInN5c2RlcHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKKworc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtTaWduYXR1cmVbXSA9ICJGQVNUREVQTE9ZIjsKKworQVBLTWV0YURhdGEgUGF0Y2hVdGlsczo6R2V0QVBLTWV0YURhdGEoY29uc3QgY2hhciogYXBrUGF0aCkgeworICAgIEFQS01ldGFEYXRhIGFwa01ldGFEYXRhOworI3VuZGVmIG9wZW4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6WmlwRmlsZVJPPiB6aXBGaWxlKGFuZHJvaWQ6OlppcEZpbGVSTzo6b3BlbihhcGtQYXRoKSk7CisjZGVmaW5lIG9wZW4gX19feHh4X3VuaXhfb3BlbgorICAgIGlmICh6aXBGaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJDb3VsZCBub3Qgb3BlbiAlcyIsIGFwa1BhdGgpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICB2b2lkKiBjb29raWU7CisgICAgaWYgKHppcEZpbGUtPnN0YXJ0SXRlcmF0aW9uKCZjb29raWUpKSB7CisgICAgICAgIGFuZHJvaWQ6OlppcEVudHJ5Uk8gZW50cnk7CisgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aXBGaWxlLT5uZXh0RW50cnkoY29va2llKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgY2hhciBmaWxlTmFtZVsyNTZdOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBmaWxlIG5hbWUuCisgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgZmlsZW5hbWVzIGxvbmdlciB0aGFuIDI1Ni4KKyAgICAgICAgICAgIGlmICh6aXBGaWxlLT5nZXRFbnRyeUZpbGVOYW1lKGVudHJ5LCBmaWxlTmFtZSwgc2l6ZW9mKGZpbGVOYW1lKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgdW5jb21wcmVzc2VkU2l6ZSwgY29tcHJlc3NlZFNpemUsIGNyYzMyOworICAgICAgICAgICAgaW50NjRfdCBkYXRhT2Zmc2V0OworICAgICAgICAgICAgemlwRmlsZS0+Z2V0RW50cnlJbmZvKGVudHJ5LCBudWxscHRyLCAmdW5jb21wcmVzc2VkU2l6ZSwgJmNvbXByZXNzZWRTaXplLCAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmY3JjMzIpOworICAgICAgICAgICAgQVBLRW50cnkqIGFwa0VudHJ5ID0gYXBrTWV0YURhdGEuYWRkX2VudHJpZXMoKTsKKyAgICAgICAgICAgIGFwa0VudHJ5LT5zZXRfY3JjMzIoY3JjMzIpOworICAgICAgICAgICAgYXBrRW50cnktPnNldF9maWxlbmFtZShmaWxlTmFtZSk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X2NvbXByZXNzZWRzaXplKGNvbXByZXNzZWRTaXplKTsKKyAgICAgICAgICAgIGFwa0VudHJ5LT5zZXRfdW5jb21wcmVzc2Vkc2l6ZSh1bmNvbXByZXNzZWRTaXplKTsKKyAgICAgICAgICAgIGFwa0VudHJ5LT5zZXRfZGF0YW9mZnNldChkYXRhT2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXBrTWV0YURhdGE7Cit9CisKK3ZvaWQgUGF0Y2hVdGlsczo6V3JpdGVTaWduYXR1cmUoYm9ycm93ZWRfZmQgb3V0cHV0KSB7CisgICAgV3JpdGVGZEV4YWN0bHkob3V0cHV0LCBrU2lnbmF0dXJlLCBzaXplb2Yoa1NpZ25hdHVyZSkgLSAxKTsKK30KKwordm9pZCBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoaW50NjRfdCB2YWx1ZSwgYm9ycm93ZWRfZmQgb3V0cHV0KSB7CisgICAgaW50NjRfdCB0b0xpdHRsZUVuZGlhbiA9IGh0b2xlNjQodmFsdWUpOworICAgIFdyaXRlRmRFeGFjdGx5KG91dHB1dCwgJnRvTGl0dGxlRW5kaWFuLCBzaXplb2YoaW50NjRfdCkpOworfQorCit2b2lkIFBhdGNoVXRpbHM6OlBpcGUoYm9ycm93ZWRfZmQgaW5wdXQsIGJvcnJvd2VkX2ZkIG91dHB1dCwgc2l6ZV90IGFtb3VudCkgeworICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50IEJVRkZFUl9TSVpFID0gMTI4ICogMTAyNDsKKyAgICBjaGFyIGJ1ZmZlcltCVUZGRVJfU0laRV07CisgICAgc2l6ZV90IHRyYW5zZmVyQW1vdW50ID0gMDsKKyAgICB3aGlsZSAodHJhbnNmZXJBbW91bnQgIT0gYW1vdW50KSB7CisgICAgICAgIGxvbmcgY2h1bmtBbW91bnQgPQorICAgICAgICAgICAgICAgIGFtb3VudCAtIHRyYW5zZmVyQW1vdW50ID4gQlVGRkVSX1NJWkUgPyBCVUZGRVJfU0laRSA6IGFtb3VudCAtIHRyYW5zZmVyQW1vdW50OworICAgICAgICBsb25nIHJlYWRBbW91bnQgPSBhZGJfcmVhZChpbnB1dCwgYnVmZmVyLCBjaHVua0Ftb3VudCk7CisgICAgICAgIFdyaXRlRmRFeGFjdGx5KG91dHB1dCwgYnVmZmVyLCByZWFkQW1vdW50KTsKKyAgICAgICAgdHJhbnNmZXJBbW91bnQgKz0gcmVhZEFtb3VudDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuaCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYWRiX3VuaXF1ZV9mZC5oIgorI2luY2x1ZGUgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucGIuaCIKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdGhhdCBtaXJyb3JzIHRoZSBQYXRjaFV0aWxzIGZyb20gZGVwbG95IGFnZW50LgorICovCitjbGFzcyBQYXRjaFV0aWxzIHsKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBsb2NhbCBBUEsgZmlsZSBhbmQgYnVpbGRzIHRoZSBBUEtNZXRhRGF0YSByZXF1aXJlZCBieSB0aGUgcGF0Y2hpbmcKKyAgICAgKiBhbGdvcml0aG0uIFRoZSBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBhbiBlcnJvciBhIHN0cmluZyBpcyBwcmludGVkIHRvIHRoZSB0ZXJtaW5hbCBhbmQgZXhpdCgxKQorICAgICAqIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtNZXRhRGF0YSBHZXRBUEtNZXRhRGF0YShjb25zdCBjaGFyKiBmaWxlKTsKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBmaXhlZCBzaWduYXR1cmUgc3RyaW5nIHRvIHRoZSBoZWFkZXIgb2YgdGhlIHBhdGNoLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIFdyaXRlU2lnbmF0dXJlKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCk7CisgICAgLyoqCisgICAgICogV3JpdGVzIGFuIGludDY0IHRvIHRoZSB8b3V0cHV0fCByZXZlcnNpbmcgdGhlIGJ5dGVzLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIFdyaXRlTG9uZyhpbnQ2NF90IHZhbHVlLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBvdXRwdXQpOworICAgIC8qKgorICAgICAqIENvcHkgfGFtb3VudHwgb2YgZGF0YSBmcm9tIHxpbnB1dHwgdG8gfG91dHB1dHwuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgUGlwZShhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBpbnB1dCwgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFtb3VudCk7Cit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzX3Rlc3QuY3BwIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlZWViZgotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicGF0Y2hfdXRpbHMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYWRiX2lvLmgiCisjaW5jbHVkZSAic3lzZGVwcy5oIgorCit1c2luZyBuYW1lc3BhY2UgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OworCitzdGF0aWMgc3RkOjpzdHJpbmcgR2V0VGVzdEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICByZXR1cm4gImZhc3RkZXBsb3kvdGVzdGRhdGEvIiArIG5hbWU7Cit9CisKK2Jvb2wgRmlsZU1hdGNoZXNDb250ZW50KGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGlucHV0LCBjb25zdCBjaGFyKiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgY29udGVudHNTaXplKSB7CisgICAgYWRiX2xzZWVrKGlucHV0LCAwLCBTRUVLX1NFVCk7CisgICAgLy8gVXNlIGEgdGVtcCBidWZmZXIgbGFyZ2VyIHRoYW4gYW55IHRlc3QgY29udGVudHMuCisgICAgY29uc3RleHByIGludCBCVUZGRVJfU0laRSA9IDIwNDg7CisgICAgY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdOworICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKKyAgICAvLyBWYWxpZGF0ZSBzaXplIG9mIGZpbGVzIGlzIGVxdWFsLgorICAgIHNzaXplX3QgcmVhZEFtb3VudCA9IGFkYl9yZWFkKGlucHV0LCBidWZmZXIsIEJVRkZFUl9TSVpFKTsKKyAgICBFWFBFQ1RfRVEocmVhZEFtb3VudCwgY29udGVudHNTaXplKTsKKyAgICByZXN1bHQgPSBtZW1jbXAoYnVmZmVyLCBjb250ZW50cywgcmVhZEFtb3VudCkgPT0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlYWRBbW91bnQ7IGkrKykgeworICAgICAgICBwcmludGYoIiV4IiwgYnVmZmVyW2ldKTsKKyAgICB9CisgICAgcHJpbnRmKCIgPT0gIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50c1NpemU7IGkrKykgeworICAgICAgICBwcmludGYoIiV4IiwgY29udGVudHNbaV0pOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitURVNUKFBhdGNoVXRpbHNUZXN0LCBTd2FwTG9uZ1dyaXRlcykgeworICAgIFRlbXBvcmFyeUZpbGUgb3V0cHV0OworICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZygweDAwMTEyMjMzNDQ1NTY2NzcsIG91dHB1dC5mZCk7CisgICAgYWRiX2xzZWVrKG91dHB1dC5mZCwgMCwgU0VFS19TRVQpOworICAgIGNvbnN0IGNoYXIgZXhwZWN0ZWRbXSA9IHsweDc3LCAweDY2LCAweDU1LCAweDQ0LCAweDMzLCAweDIyLCAweDExLCAweDAwfTsKKyAgICBFWFBFQ1RfVFJVRShGaWxlTWF0Y2hlc0NvbnRlbnQob3V0cHV0LmZkLCBleHBlY3RlZCwgOCkpOworfQorCitURVNUKFBhdGNoVXRpbHNUZXN0LCBQaXBlV3JpdGVzQW1vdW50VG9PdXRwdXQpIHsKKyAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCgiU29tZSBEYXRhIik7CisgICAgVGVtcG9yYXJ5RmlsZSBpbnB1dDsKKyAgICBUZW1wb3JhcnlGaWxlIG91dHB1dDsKKyAgICAvLyBQb3B1bGF0ZSBpbnB1dCBmaWxlLgorICAgIFdyaXRlRmRFeGFjdGx5KGlucHV0LmZkLCBleHBlY3RlZCk7CisgICAgYWRiX2xzZWVrKGlucHV0LmZkLCAwLCBTRUVLX1NFVCk7CisgICAgLy8gT3BlbiBpbnB1dCBmaWxlIGZvciByZWFkLCBhbmQgb3V0cHV0IGZpbGUgZm9yIHdyaXRlLgorICAgIFBhdGNoVXRpbHM6OlBpcGUoaW5wdXQuZmQsIG91dHB1dC5mZCwgZXhwZWN0ZWQuc2l6ZSgpKTsKKyAgICAvLyBWYWxpZGF0ZSBwaXBlIHdvcmtlZAorICAgIEVYUEVDVF9UUlVFKEZpbGVNYXRjaGVzQ29udGVudChvdXRwdXQuZmQsIGV4cGVjdGVkLmNfc3RyKCksIGV4cGVjdGVkLnNpemUoKSkpOworfQorCitURVNUKFBhdGNoVXRpbHNUZXN0LCBTaWduYXR1cmVDb25zdE1hdGNoZXMpIHsKKyAgICBzdGQ6OnN0cmluZyBhcGtGaWxlID0gR2V0VGVzdEZpbGUoInJvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsiKTsKKyAgICBUZW1wb3JhcnlGaWxlIG91dHB1dDsKKyAgICBQYXRjaFV0aWxzOjpXcml0ZVNpZ25hdHVyZShvdXRwdXQuZmQpOworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKCJGQVNUREVQTE9ZIik7CisgICAgRVhQRUNUX1RSVUUoRmlsZU1hdGNoZXNDb250ZW50KG91dHB1dC5mZCwgY29udGVudHMuY19zdHIoKSwgY29udGVudHMuc2l6ZSgpKSk7Cit9CisKK1RFU1QoUGF0Y2hVdGlsc1Rlc3QsIEdhdGhlck1ldGFkYXRhKSB7CisgICAgc3RkOjpzdHJpbmcgYXBrRmlsZSA9IEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIik7CisgICAgQVBLTWV0YURhdGEgbWV0YWRhdGEgPSBQYXRjaFV0aWxzOjpHZXRBUEtNZXRhRGF0YShhcGtGaWxlLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkTWV0YWRhdGE7CisgICAgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhHZXRUZXN0RmlsZSgicm90YXRpbmdfY3ViZS1tZXRhZGF0YS1yZWxlYXNlLmRhdGEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHBlY3RlZE1ldGFkYXRhKTsKKyAgICBzdGQ6OnN0cmluZyBhY3R1YWxNZXRhZGF0YTsKKyAgICBtZXRhZGF0YS5TZXJpYWxpemVUb1N0cmluZygmYWN0dWFsTWV0YWRhdGEpOworICAgIEVYUEVDVF9FUShleHBlY3RlZE1ldGFkYXRhLCBhY3R1YWxNZXRhZGF0YSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3Ivc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95UGF0Y2hHZW5lcmF0b3IuamF2YSBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveVBhdGNoR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjJlYWIuLjAwMDAwMDAKLS0tIGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3Ivc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95UGF0Y2hHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5mYXN0ZGVwbG95OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcuU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcC5TaW1wbGVFbnRyeTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmZhc3RkZXBsb3kuQVBLTWV0YURhdGE7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZmFzdGRlcGxveS5BUEtFbnRyeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIERlcGxveVBhdGNoR2VuZXJhdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAxMjggKiAxMDI0OwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikgewotICAgICAgICAgICAgICAgIHNob3dVc2FnZSgwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAyKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZlcmJvc2VGbGFnID0gYXJnc1syXTsKLSAgICAgICAgICAgICAgICBpZiAodmVyYm9zZUZsYWcuY29tcGFyZVRvKCItLXZlcmJvc2UiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgYXBrUGF0aCA9IGFyZ3NbMF07Ci0gICAgICAgICAgICBTdHJpbmcgZGV2aWNlTWV0YWRhdGFQYXRoID0gYXJnc1sxXTsKLSAgICAgICAgICAgIEZpbGUgaG9zdEZpbGUgPSBuZXcgRmlsZShhcGtQYXRoKTsKLQotICAgICAgICAgICAgTGlzdDxBUEtFbnRyeT4gZGV2aWNlWmlwRW50cmllcyA9IGdldE1ldGFkYXRhRnJvbUZpbGUoZGV2aWNlTWV0YWRhdGFQYXRoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGV2aWNlIEVudHJpZXMgKCIgKyBkZXZpY2VaaXBFbnRyaWVzLnNpemUoKSArICIpIik7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEFQS0VudHJ5IGVudHJ5IDogZGV2aWNlWmlwRW50cmllcykgewotICAgICAgICAgICAgICAgICAgICBBUEtFbnRyeVRvU3RyaW5nKGVudHJ5LCBzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxBUEtFbnRyeT4gaG9zdEZpbGVFbnRyaWVzID0gUGF0Y2hVdGlscy5nZXRBUEtNZXRhRGF0YShob3N0RmlsZSkuZ2V0RW50cmllc0xpc3QoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSG9zdCBFbnRyaWVzICgiICsgaG9zdEZpbGVFbnRyaWVzLnNpemUoKSArICIpIik7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEFQS0VudHJ5IGVudHJ5IDogaG9zdEZpbGVFbnRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFQS0VudHJ5VG9TdHJpbmcoZW50cnksIHNiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQgPQotICAgICAgICAgICAgICAgIGdldElkZW50aWNhbENvbnRlbnRzKGRldmljZVppcEVudHJpZXMsIGhvc3RGaWxlRW50cmllcyk7Ci0gICAgICAgICAgICByZXBvcnRJZGVudGljYWxDb250ZW50cyhpZGVudGljYWxDb250ZW50c0VudHJ5U2V0LCBob3N0RmlsZSk7Ci0KLSAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBpZGVudGljYWxFbnRyeSA6IGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgQVBLRW50cnkgZW50cnkgPSBpZGVudGljYWxFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBBUEtFbnRyeVRvU3RyaW5nKGVudHJ5LCBzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSWRlbnRpY2FsIEVudHJpZXMgKCIgKyBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0LnNpemUoKSArICIpIik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjcmVhdGVQYXRjaChpZGVudGljYWxDb250ZW50c0VudHJ5U2V0LCBob3N0RmlsZSwgU3lzdGVtLm91dCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiAiICsgZSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMik7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaG93VXNhZ2UoaW50IGV4aXRDb2RlKSB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigidXNhZ2U6IGRlcGxveXBhdGNoZ2VuZXJhdG9yIDxhcGtwYXRoPiA8ZGV2aWNlYXBrbWV0YWRhdGE+IFstLXZlcmJvc2VdIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KGV4aXRDb2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFQS0VudHJ5VG9TdHJpbmcoQVBLRW50cnkgZW50cnksIFN0cmluZ0J1aWxkZXIgb3V0cHV0U3RyaW5nKSB7Ci0gICAgICAgIG91dHB1dFN0cmluZy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiRmlsZW5hbWU6ICVzXG4iLCBlbnRyeS5nZXRGaWxlTmFtZSgpKSk7Ci0gICAgICAgIG91dHB1dFN0cmluZy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiQ1JDMzI6IDB4JTA4WFxuIiwgZW50cnkuZ2V0Q3JjMzIoKSkpOwotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkRhdGEgT2Zmc2V0OiAlZFxuIiwgZW50cnkuZ2V0RGF0YU9mZnNldCgpKSk7Ci0gICAgICAgIG91dHB1dFN0cmluZy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiQ29tcHJlc3NlZCBTaXplOiAlZFxuIiwgZW50cnkuZ2V0Q29tcHJlc3NlZFNpemUoKSkpOwotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlVuY29tcHJlc3NlZCBTaXplOiAlZFxuIiwgZW50cnkuZ2V0VW5jb21wcmVzc2VkU2l6ZSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxBUEtFbnRyeT4gZ2V0TWV0YWRhdGFGcm9tRmlsZShTdHJpbmcgZGV2aWNlTWV0YWRhdGFQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoZGV2aWNlTWV0YWRhdGFQYXRoKSk7Ci0gICAgICAgIEFQS01ldGFEYXRhIGFwa01ldGFEYXRhID0gQVBLTWV0YURhdGEucGFyc2VEZWxpbWl0ZWRGcm9tKGlzKTsKLSAgICAgICAgcmV0dXJuIGFwa01ldGFEYXRhLmdldEVudHJpZXNMaXN0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PiBnZXRJZGVudGljYWxDb250ZW50cygKLSAgICAgICAgTGlzdDxBUEtFbnRyeT4gZGV2aWNlWmlwRW50cmllcywgTGlzdDxBUEtFbnRyeT4gaG9zdFppcEVudHJpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gaWRlbnRpY2FsQ29udGVudHMgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PigpOwotCi0gICAgICAgIGZvciAoQVBLRW50cnkgZGV2aWNlWmlwRW50cnkgOiBkZXZpY2VaaXBFbnRyaWVzKSB7Ci0gICAgICAgICAgICBmb3IgKEFQS0VudHJ5IGhvc3RaaXBFbnRyeSA6IGhvc3RaaXBFbnRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZVppcEVudHJ5LmdldENyYzMyKCkgPT0gaG9zdFppcEVudHJ5LmdldENyYzMyKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlWmlwRW50cnkuZ2V0RmlsZU5hbWUoKS5lcXVhbHMoaG9zdFppcEVudHJ5LmdldEZpbGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkZW50aWNhbENvbnRlbnRzLmFkZChuZXcgU2ltcGxlRW50cnkoZGV2aWNlWmlwRW50cnksIGhvc3RaaXBFbnRyeSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoaWRlbnRpY2FsQ29udGVudHMsIG5ldyBDb21wYXJhdG9yPFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoCi0gICAgICAgICAgICAgICAgU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBwMSwgU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBwMikgewotICAgICAgICAgICAgICAgIHJldHVybiBMb25nLmNvbXBhcmUocDEuZ2V0VmFsdWUoKS5nZXREYXRhT2Zmc2V0KCksIHAyLmdldFZhbHVlKCkuZ2V0RGF0YU9mZnNldCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIGlkZW50aWNhbENvbnRlbnRzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVwb3J0SWRlbnRpY2FsQ29udGVudHMoCi0gICAgICAgIExpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCwgRmlsZSBob3N0RmlsZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgbG9uZyB0b3RhbEVxdWFsQnl0ZXMgPSAwOwotICAgICAgICBpbnQgdG90YWxFcXVhbEZpbGVzID0gMDsKLSAgICAgICAgZm9yIChTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+IGVudHJpZXMgOiBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0KSB7Ci0gICAgICAgICAgICBBUEtFbnRyeSBob3N0QVBLRW50cnkgPSBlbnRyaWVzLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB0b3RhbEVxdWFsQnl0ZXMgKz0gaG9zdEFQS0VudHJ5LmdldENvbXByZXNzZWRTaXplKCk7Ci0gICAgICAgICAgICB0b3RhbEVxdWFsRmlsZXMrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IHNhdmluZ1BlcmNlbnQgPSAoZmxvYXQpICh0b3RhbEVxdWFsQnl0ZXMgKiAxMDApIC8gaG9zdEZpbGUubGVuZ3RoKCk7Ci0KLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEZXRlY3RlZCAiICsgdG90YWxFcXVhbEZpbGVzICsgIiBlcXVhbCBBUEsgZW50cmllcyIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4odG90YWxFcXVhbEJ5dGVzICsgIiBieXRlcyBhcmUgZXF1YWwgb3V0IG9mICIgKyBob3N0RmlsZS5sZW5ndGgoKSArICIgKCIKLSAgICAgICAgICAgICsgc2F2aW5nUGVyY2VudCArICIlKSIpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGNyZWF0ZVBhdGNoKExpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gemlwRW50cnlTaW1wbGVFbnRyeXMsCi0gICAgICAgIEZpbGUgaG9zdEZpbGUsIE91dHB1dFN0cmVhbSBwYXRjaFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXRjaEZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBob3N0RmlsZUlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShob3N0RmlsZSk7Ci0KLSAgICAgICAgcGF0Y2hTdHJlYW0ud3JpdGUoUGF0Y2hVdGlscy5TSUdOQVRVUkUuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpOwotICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhob3N0RmlsZS5sZW5ndGgoKSwgcGF0Y2hTdHJlYW0pOwotCi0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0gICAgICAgIGxvbmcgdG90YWxCeXRlc1dyaXR0ZW4gPSAwOwotICAgICAgICBJdGVyYXRvcjxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PiBlbnRyeVNpbXBsZUVudHJ5SXRlcmF0b3IgPQotICAgICAgICAgICAgemlwRW50cnlTaW1wbGVFbnRyeXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGVudHJ5U2ltcGxlRW50cnlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gZW50cnlTaW1wbGVFbnRyeSA9IGVudHJ5U2ltcGxlRW50cnlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBBUEtFbnRyeSBkZXZpY2VBUEtFbnRyeSA9IGVudHJ5U2ltcGxlRW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBBUEtFbnRyeSBob3N0QVBLRW50cnkgPSBlbnRyeVNpbXBsZUVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGxvbmcgbmV3RGF0YUxlbiA9IGhvc3RBUEtFbnRyeS5nZXREYXRhT2Zmc2V0KCkgLSB0b3RhbEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgIGxvbmcgb2xkRGF0YU9mZnNldCA9IGRldmljZUFQS0VudHJ5LmdldERhdGFPZmZzZXQoKTsKLSAgICAgICAgICAgIGxvbmcgb2xkRGF0YUxlbiA9IGRldmljZUFQS0VudHJ5LmdldENvbXByZXNzZWRTaXplKCk7Ci0KLSAgICAgICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKG5ld0RhdGFMZW4sIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgICAgIFBhdGNoVXRpbHMucGlwZShob3N0RmlsZUlucHV0U3RyZWFtLCBwYXRjaFN0cmVhbSwgYnVmZmVyLCBuZXdEYXRhTGVuKTsKLSAgICAgICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKG9sZERhdGFPZmZzZXQsIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKG9sZERhdGFMZW4sIHBhdGNoU3RyZWFtKTsKLQotICAgICAgICAgICAgbG9uZyBza2lwID0gaG9zdEZpbGVJbnB1dFN0cmVhbS5za2lwKG9sZERhdGFMZW4pOwotICAgICAgICAgICAgaWYgKHNraXAgIT0gb2xkRGF0YUxlbikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXRjaEZvcm1hdEV4Y2VwdGlvbigic2tpcCBlcnJvcjogYXR0ZW1wdGVkIHRvIHNraXAgIiArIG9sZERhdGFMZW4KLSAgICAgICAgICAgICAgICAgICAgKyAiIGJ5dGVzIGJ1dCByZXR1cm4gY29kZSB3YXMgIiArIHNraXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG90YWxCeXRlc1dyaXR0ZW4gKz0gb2xkRGF0YUxlbiArIG5ld0RhdGFMZW47Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyByZW1haW5kZXJMZW4gPSBob3N0RmlsZS5sZW5ndGgoKSAtIHRvdGFsQnl0ZXNXcml0dGVuOwotICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhyZW1haW5kZXJMZW4sIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgUGF0Y2hVdGlscy5waXBlKGhvc3RGaWxlSW5wdXRTdHJlYW0sIHBhdGNoU3RyZWFtLCBidWZmZXIsIHJlbWFpbmRlckxlbik7Ci0gICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKDAsIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcoMCwgcGF0Y2hTdHJlYW0pOwotICAgICAgICBwYXRjaFN0cmVhbS5mbHVzaCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtbWV0YWRhdGEtcmVsZWFzZS5kYXRhIGIvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1tZXRhZGF0YS1yZWxlYXNlLmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3MWJmMwotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtbWV0YWRhdGEtcmVsZWFzZS5kYXRhCkBAIC0wLDAgKzEsNiBAQAorCisjCMeCz6sMEhRNRVRBLUlORi9NQU5JRkVTVC5NRhjHBiBRKFcKKyMIg42VjgcSE0FuZHJvaWRNYW5pZmVzdC54bWwYMSDkBSjoDworNgimtYA+EiNsaWIvYXJtZWFiaS12N2EvbGlidnVsa2FuX3NhbXBsZS5zbxiBDiDA0lEojLLsAQorIAiX45eRDhIOcmVzb3VyY2VzLmFyc2MY9OBRILQEKLQECiscCIucwskCEgtjbGFzc2VzLmRleBjBByD/BSj0CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIGIvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDdlMGVhCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX292ZXJsYXlmcy5jcHAgYi9mc19tZ3IvZnNfbWdyX292ZXJsYXlmcy5jcHAKaW5kZXggYWMxNWNlNC4uMmYwYmY3ZCAxMDA2NDQKLS0tIGEvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnMuY3BwCisrKyBiL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzLmNwcApAQCAtMTAwOSw3ICsxMDA5LDcgQEAKICAgICBGc3RhYiBjYW5kaWRhdGVzOwogICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBmc3RhYikgewogICAgICAgICBGc3RhYkVudHJ5IG5ld19lbnRyeSA9IGVudHJ5OwotICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGVudHJ5Lm1vdW50X3BvaW50KSAmJgorICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGVudHJ5Lm1vdW50X3BvaW50KSB8fAogICAgICAgICAgICAgIWZzX21ncl93YW50c19vdmVybGF5ZnMoJm5ld19lbnRyeSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vZG0uY3BwIGIvZnNfbWdyL2xpYmRtL2RtLmNwcAppbmRleCAwYWQ4ZDlkLi5hNGUwZDc2IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZG0vZG0uY3BwCisrKyBiL2ZzX21nci9saWJkbS9kbS5jcHAKQEAgLTE1MCw2ICsxNTAsMTUgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RkOjpvcHRpb25hbDxEZXZpY2VNYXBwZXI6OkluZm8+IERldmljZU1hcHBlcjo6R2V0RGV0YWlsZWRJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCB7CisgICAgc3RydWN0IGRtX2lvY3RsIGlvOworICAgIEluaXRJbygmaW8sIG5hbWUpOworICAgIGlmIChpb2N0bChmZF8sIERNX0RFVl9TVEFUVVMsICZpbykgPCAwKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIHJldHVybiBJbmZvKGlvLmZsYWdzKTsKK30KKwogRG1EZXZpY2VTdGF0ZSBEZXZpY2VNYXBwZXI6OkdldFN0YXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCB7CiAgICAgc3RydWN0IGRtX2lvY3RsIGlvOwogICAgIEluaXRJbygmaW8sIG5hbWUpOwpAQCAtMTYyLDYgKzE3MSwyNCBAQAogICAgIHJldHVybiBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQ7CiB9CiAKK2Jvb2wgRGV2aWNlTWFwcGVyOjpDaGFuZ2VTdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgRG1EZXZpY2VTdGF0ZSBzdGF0ZSkgeworICAgIGlmIChzdGF0ZSAhPSBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQgJiYgc3RhdGUgIT0gRG1EZXZpY2VTdGF0ZTo6QUNUSVZFKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgZG1faW9jdGwgaW87CisgICAgSW5pdElvKCZpbywgbmFtZSk7CisKKyAgICBpZiAoc3RhdGUgPT0gRG1EZXZpY2VTdGF0ZTo6U1VTUEVOREVEKSBpby5mbGFncyA9IERNX1NVU1BFTkRfRkxBRzsKKworICAgIGlmIChpb2N0bChmZF8sIERNX0RFVl9TVVNQRU5ELCAmaW8pIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRE1fREVWX1NVU1BFTkQgIgorICAgICAgICAgICAgICAgICAgICA8PCAoc3RhdGUgPT0gRG1EZXZpY2VTdGF0ZTo6U1VTUEVOREVEID8gInN1c3BlbmQiIDogInJlc3VtZSIpIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBEZXZpY2VNYXBwZXI6OkNyZWF0ZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgRG1UYWJsZSYgdGFibGUpIHsKICAgICBzdGQ6OnN0cmluZyBpZ25vcmVfcGF0aDsKICAgICBpZiAoIUNyZWF0ZURldmljZShuYW1lLCB0YWJsZSwgJmlnbm9yZV9wYXRoLCAwbXMpKSB7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vZG1fdGVzdC5jcHAgYi9mc19tZ3IvbGliZG0vZG1fdGVzdC5jcHAKaW5kZXggYjI4YThmMi4uZGExYzRhOSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmRtL2RtX3Rlc3QuY3BwCisrKyBiL2ZzX21nci9saWJkbS9kbV90ZXN0LmNwcApAQCAtMTY2LDYgKzE2NiwzNCBAQAogICAgIEFTU0VSVF9UUlVFKGRldi5EZXN0cm95KCkpOwogfQogCitURVNUKGxpYmRtLCBEbVN1c3BlbmRSZXN1bWUpIHsKKyAgICB1bmlxdWVfZmQgdG1wMShDcmVhdGVUZW1wRmlsZSgiZmlsZV9zdXNwZW5kX3Jlc3VtZSIsIDUxMikpOworICAgIEFTU0VSVF9HRSh0bXAxLCAwKTsKKworICAgIExvb3BEZXZpY2UgbG9vcF9hKHRtcDEsIDEwcyk7CisgICAgQVNTRVJUX1RSVUUobG9vcF9hLnZhbGlkKCkpOworCisgICAgRG1UYWJsZSB0YWJsZTsKKyAgICBBU1NFUlRfVFJVRSh0YWJsZS5FbXBsYWNlPERtVGFyZ2V0TGluZWFyPigwLCAxLCBsb29wX2EuZGV2aWNlKCksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh0YWJsZS52YWxpZCgpKTsKKworICAgIFRlbXBEZXZpY2UgZGV2KCJsaWJkbS10ZXN0LWRtLXN1c3BlbmQtcmVzdW1lIiwgdGFibGUpOworICAgIEFTU0VSVF9UUlVFKGRldi52YWxpZCgpKTsKKyAgICBBU1NFUlRfRkFMU0UoZGV2LnBhdGgoKS5lbXB0eSgpKTsKKworICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworCisgICAgLy8gVGVzdCBTZXQgYW5kIEdldCBzdGF0dXMgb2YgZGV2aWNlLgorICAgIHZlY3RvcjxEZXZpY2VNYXBwZXI6OlRhcmdldEluZm8+IHRhcmdldHM7CisgICAgQVNTRVJUX0VRKGRtLkdldFN0YXRlKGRldi5uYW1lKCkpLCBEbURldmljZVN0YXRlOjpBQ1RJVkUpOworCisgICAgQVNTRVJUX1RSVUUoZG0uQ2hhbmdlU3RhdGUoZGV2Lm5hbWUoKSwgRG1EZXZpY2VTdGF0ZTo6U1VTUEVOREVEKSk7CisgICAgQVNTRVJUX0VRKGRtLkdldFN0YXRlKGRldi5uYW1lKCkpLCBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQpOworCisgICAgQVNTRVJUX1RSVUUoZG0uQ2hhbmdlU3RhdGUoZGV2Lm5hbWUoKSwgRG1EZXZpY2VTdGF0ZTo6QUNUSVZFKSk7CisgICAgQVNTRVJUX0VRKGRtLkdldFN0YXRlKGRldi5uYW1lKCkpLCBEbURldmljZVN0YXRlOjpBQ1RJVkUpOworfQorCiBURVNUKGxpYmRtLCBEbVZlcml0eUFyZ3NBdmIyKSB7CiAgICAgc3RkOjpzdHJpbmcgZGV2aWNlID0gIi9kZXYvYmxvY2svcGxhdGZvcm0vc29jLzFkYTQwMDAudWZzaGMvYnktbmFtZS92ZW5kb3JfYSI7CiAgICAgc3RkOjpzdHJpbmcgYWxnb3JpdGhtID0gInNoYTEiOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaCBiL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtLmgKaW5kZXggOWMwYzJmMy4uYzZiMzdjZiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaAorKysgYi9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTcwLDE1ICs3MSwzNyBAQAogICAgICAgICB1aW50NjRfdCBkZXZfOwogICAgIH07CiAKKyAgICBjbGFzcyBJbmZvIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3NfOworCisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluZm8odWludDMyX3QgZmxhZ3MpIDogZmxhZ3NfKGZsYWdzKSB7fQorCisgICAgICAgIGJvb2wgSXNBY3RpdmVUYWJsZVByZXNlbnQoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9BQ1RJVkVfUFJFU0VOVF9GTEFHOyB9CisgICAgICAgIGJvb2wgSXNCdWZmZXJGdWxsKCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fQlVGRkVSX0ZVTExfRkxBRzsgfQorICAgICAgICBib29sIElzSW5hY3RpdmVUYWJsZVByZXNlbnQoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7IH0KKyAgICAgICAgYm9vbCBJc1JlYWRPbmx5KCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fUkVBRE9OTFlfRkxBRzsgfQorICAgICAgICBib29sIElzU3VzcGVuZGVkKCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fU1VTUEVORF9GTEFHOyB9CisgICAgfTsKKwogICAgIC8vIFJlbW92ZXMgYSBkZXZpY2UgbWFwcGVyIGRldmljZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgogICAgIC8vIFJldHVybnMgJ3RydWUnIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KICAgICBib29sIERlbGV0ZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CiAKKyAgICAvLyBGZXRjaGVzIGFuZCByZXR1cm5zIHRoZSBjb21wbGV0ZSBzdGF0ZSBvZiB0aGUgdW5kZXJseWluZyBkZXZpY2UgbWFwcGVyCisgICAgLy8gZGV2aWNlIHdpdGggZ2l2ZW4gbmFtZS4KKyAgICBzdGQ6Om9wdGlvbmFsPEluZm8+IEdldERldGFpbGVkSW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Q7CisKICAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB1bmRlcmx5aW5nIGRldmljZSBtYXBwZXIgZGV2aWNlCiAgICAgLy8gd2l0aCBnaXZlbiBuYW1lLgogICAgIC8vIE9uZSBvZiBJTlZBTElELCBTVVNQRU5ERUQgb3IgQUNUSVZFLgogICAgIERtRGV2aWNlU3RhdGUgR2V0U3RhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0OwogCisgICAgLy8gUHV0cyB0aGUgZ2l2ZW4gZGV2aWNlIHRvIHRoZSBzcGVjaWZpZWQgc3RhdHVzLCB3aGljaCBtdXN0IGJlIGVpdGhlcjoKKyAgICAvLyAtIFNVU1BFTkRFRDogc3VzcGVuZCB0aGUgZGV2aWNlLCBvcgorICAgIC8vIC0gQUNUSVZFOiByZXN1bWVzIHRoZSBkZXZpY2UuCisgICAgYm9vbCBDaGFuZ2VTdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgRG1EZXZpY2VTdGF0ZSBzdGF0ZSk7CisKICAgICAvLyBDcmVhdGVzIGEgZGV2aWNlLCBsb2FkcyB0aGUgZ2l2ZW4gdGFibGUsIGFuZCBhY3RpdmF0ZXMgaXQuIElmIHRoZSBkZXZpY2UKICAgICAvLyBpcyBub3QgYWJsZSB0byBiZSBhY3RpdmF0ZWQsIGl0IGlzIGRlc3Ryb3llZCwgYW5kIGZhbHNlIGlzIHJldHVybmVkLgogICAgIC8vIEFmdGVyIGNyZWF0aW9uLCB8cGF0aHwgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlibHAvYnVpbGRlci5jcHAgYi9mc19tZ3IvbGlibHAvYnVpbGRlci5jcHAKaW5kZXggYzEyZTNiMi4uODc5N2VhOSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmxwL2J1aWxkZXIuY3BwCisrKyBiL2ZzX21nci9saWJscC9idWlsZGVyLmNwcApAQCAtMTA2MCw3ICsxMDYwLDcgQEAKICAgICBpZiAoc1JldHJvZml0RGFwLmhhc192YWx1ZSgpKSB7CiAgICAgICAgIHJldHVybiAqc1JldHJvZml0RGFwOwogICAgIH0KLSAgICByZXR1cm4gIWFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8uYm9vdC5keW5hbWljX3BhcnRpdGlvbnNfcmV0cm9maXQiLCBmYWxzZSk7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8uYm9vdC5keW5hbWljX3BhcnRpdGlvbnNfcmV0cm9maXQiLCBmYWxzZSk7CiB9CiAKIGJvb2wgTWV0YWRhdGFCdWlsZGVyOjpJc1JldHJvZml0TWV0YWRhdGEoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9mc19tZ3IvdG9vbHMvZG1jdGwuY3BwIGIvZnNfbWdyL3Rvb2xzL2RtY3RsLmNwcAppbmRleCA3ZTZhZDViLi5kNmZiMDA2IDEwMDY0NAotLS0gYS9mc19tZ3IvdG9vbHMvZG1jdGwuY3BwCisrKyBiL2ZzX21nci90b29scy9kbWN0bC5jcHAKQEAgLTUwLDYgKzUwLDggQEAKICAgICBzdGQ6OmNlcnIgPDwgIiAgbGlzdCA8ZGV2aWNlcyB8IHRhcmdldHM+IFstdl0iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgZ2V0cGF0aCA8ZG0tbmFtZT4iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgc3RhdHVzIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiICByZXN1bWUgPGRtLW5hbWU+IiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICIgIHN1c3BlbmQgPGRtLW5hbWU+IiA8PCBzdGQ6OmVuZGw7CiAgICAgc3RkOjpjZXJyIDw8ICIgIHRhYmxlIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICBoZWxwIiA8PCBzdGQ6OmVuZGw7CiAgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKQEAgLTM5OSw2ICs0MDEsMzQgQEAKICAgICByZXR1cm4gRHVtcFRhYmxlKCJzdGF0dXMiLCBhcmdjLCBhcmd2KTsKIH0KIAorc3RhdGljIGludCBSZXN1bWVDbWRIYW5kbGVyKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGlmIChhcmdjICE9IDEpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJJbnZhbGlkIGFyZ3VtZW50cywgc2VlIFwnZG1jdGwgaGVscFwnIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIERldmljZU1hcHBlciYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisgICAgaWYgKCFkbS5DaGFuZ2VTdGF0ZShhcmd2WzBdLCBEbURldmljZVN0YXRlOjpBQ1RJVkUpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IHJlc3VtZSBkZXZpY2UgXCIiIDw8IGFyZ3ZbMF0gPDwgIlwiLiIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgU3VzcGVuZENtZEhhbmRsZXIoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgaWYgKGFyZ2MgIT0gMSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgYXJndW1lbnRzLCBzZWUgXCdkbWN0bCBoZWxwXCciIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgRGV2aWNlTWFwcGVyJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBpZiAoIWRtLkNoYW5nZVN0YXRlKGFyZ3ZbMF0sIERtRGV2aWNlU3RhdGU6OlNVU1BFTkRFRCkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJDb3VsZCBub3Qgc3VzcGVuZCBkZXZpY2UgXCIiIDw8IGFyZ3ZbMF0gPDwgIlwiLiIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpmdW5jdGlvbjxpbnQoaW50LCBjaGFyKiopPj4gY21kbWFwID0gewogICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgICAgIHsiY3JlYXRlIiwgRG1DcmVhdGVDbWRIYW5kbGVyfSwKQEAgLTQwOCw2ICs0MzgsOCBAQAogICAgICAgICB7ImdldHBhdGgiLCBHZXRQYXRoQ21kSGFuZGxlcn0sCiAgICAgICAgIHsidGFibGUiLCBUYWJsZUNtZEhhbmRsZXJ9LAogICAgICAgICB7InN0YXR1cyIsIFN0YXR1c0NtZEhhbmRsZXJ9LAorICAgICAgICB7InJlc3VtZSIsIFJlc3VtZUNtZEhhbmRsZXJ9LAorICAgICAgICB7InN1c3BlbmQiLCBTdXNwZW5kQ21kSGFuZGxlcn0sCiAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgogfTsKIApkaWZmIC0tZ2l0IGEvbGliaW9uL09XTkVSUyBiL2xpYmlvbi9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzYWQyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmlvbi9PV05FUlMKQEAgLTAsMCArMSwyIEBACitzc3BhdGlsQGdvb2dsZS5jb20KK2hyaWR5YUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9saWJuYXRpdmVsb2FkZXIvbGlicmFyeV9uYW1lc3BhY2VzLmNwcCBiL2xpYm5hdGl2ZWxvYWRlci9saWJyYXJ5X25hbWVzcGFjZXMuY3BwCmluZGV4IGMyMmNlOGEuLmE5ZWVhOGMgMTAwNjQ0Ci0tLSBhL2xpYm5hdGl2ZWxvYWRlci9saWJyYXJ5X25hbWVzcGFjZXMuY3BwCisrKyBiL2xpYm5hdGl2ZWxvYWRlci9saWJyYXJ5X25hbWVzcGFjZXMuY3BwCkBAIC0zMyw2ICszMyw4IEBACiAjaW5jbHVkZSAicHVibGljX2xpYnJhcmllcy5oIgogI2luY2x1ZGUgInV0aWxzLmgiCiAKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkVycm9yOworCiBuYW1lc3BhY2UgYW5kcm9pZDo6bmF0aXZlbG9hZGVyIHsKIAogbmFtZXNwYWNlIHsKQEAgLTEyOCwxMSArMTMwLDExIEBACiAgIH0KIH0KIAotTmF0aXZlTG9hZGVyTmFtZXNwYWNlKiBMaWJyYXJ5TmFtZXNwYWNlczo6Q3JlYXRlKEpOSUVudiogZW52LCB1aW50MzJfdCB0YXJnZXRfc2RrX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBjbGFzc19sb2FkZXIsIGJvb2wgaXNfc2hhcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgZGV4X3BhdGgsIGpzdHJpbmcgamF2YV9saWJyYXJ5X3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBqYXZhX3Blcm1pdHRlZF9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBlcnJvcl9tc2cpIHsKK1Jlc3VsdDxOYXRpdmVMb2FkZXJOYW1lc3BhY2UqPiBMaWJyYXJ5TmFtZXNwYWNlczo6Q3JlYXRlKEpOSUVudiogZW52LCB1aW50MzJfdCB0YXJnZXRfc2RrX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGNsYXNzX2xvYWRlciwgYm9vbCBpc19zaGFyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIGRleF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBqYXZhX2xpYnJhcnlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgamF2YV9wZXJtaXR0ZWRfcGF0aCkgewogICBzdGQ6OnN0cmluZyBsaWJyYXJ5X3BhdGg7ICAvLyBlbXB0eSBzdHJpbmcgYnkgZGVmYXVsdC4KIAogICBpZiAoamF2YV9saWJyYXJ5X3BhdGggIT0gbnVsbHB0cikgewpAQCAtMTU4LDE0ICsxNjAsMTQgQEAKICAgfQogCiAgIC8vIEluaXRpYWxpemUgdGhlIGFub255bW91cyBuYW1lc3BhY2Ugd2l0aCB0aGUgZmlyc3Qgbm9uLWVtcHR5IGxpYnJhcnkgcGF0aC4KKyAgUmVzdWx0PHZvaWQ+IHJldDsKICAgaWYgKCFsaWJyYXJ5X3BhdGguZW1wdHkoKSAmJiAhaW5pdGlhbGl6ZWRfICYmCi0gICAgICAhSW5pdFB1YmxpY05hbWVzcGFjZShsaWJyYXJ5X3BhdGguY19zdHIoKSwgZXJyb3JfbXNnKSkgewotICAgIHJldHVybiBudWxscHRyOworICAgICAgIShyZXQgPSBJbml0UHVibGljTmFtZXNwYWNlKGxpYnJhcnlfcGF0aC5jX3N0cigpKSkpIHsKKyAgICByZXR1cm4gcmV0LmVycm9yKCk7CiAgIH0KIAotICBib29sIGZvdW5kID0gRmluZE5hbWVzcGFjZUJ5Q2xhc3NMb2FkZXIoZW52LCBjbGFzc19sb2FkZXIpOwotCi0gIExPR19BTFdBWVNfRkFUQUxfSUYoZm91bmQsICJUaGVyZSBpcyBhbHJlYWR5IGEgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXNzbG9hZGVyIik7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoRmluZE5hbWVzcGFjZUJ5Q2xhc3NMb2FkZXIoZW52LCBjbGFzc19sb2FkZXIpICE9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGlzIGFscmVhZHkgYSBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3Nsb2FkZXIiKTsKIAogICBzdGQ6OnN0cmluZyBzeXN0ZW1fZXhwb3NlZF9saWJyYXJpZXMgPSBkZWZhdWx0X3B1YmxpY19saWJyYXJpZXMoKTsKICAgY29uc3QgY2hhciogbmFtZXNwYWNlX25hbWUgPSBrQ2xhc3Nsb2FkZXJOYW1lc3BhY2VOYW1lOwpAQCAtMjE2LDU4ICsyMTgsNjYgQEAKICAgYXV0byBhcHBfbnMgPQogICAgICAgTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpDcmVhdGUobmFtZXNwYWNlX25hbWUsIGxpYnJhcnlfcGF0aCwgcGVybWl0dGVkX3BhdGgsIHBhcmVudF9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3NoYXJlZCwgdGFyZ2V0X3Nka192ZXJzaW9uIDwgMjQgLyogaXNfZ3JleWxpc3RfZW5hYmxlZCAqLyk7Ci0gIGlmIChhcHBfbnMuSXNOaWwoKSkgewotICAgICplcnJvcl9tc2cgPSBhcHBfbnMuR2V0RXJyb3IoKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKCFhcHBfbnMpIHsKKyAgICByZXR1cm4gYXBwX25zLmVycm9yKCk7CiAgIH0KIAogICAvLyAuLi4gYW5kIGxpbmsgdG8gb3RoZXIgbmFtZXNwYWNlcyB0byBhbGxvdyBhY2Nlc3MgdG8gc29tZSBwdWJsaWMgbGlicmFyaWVzCi0gIGJvb2wgaXNfYnJpZGdlZCA9IGFwcF9ucy5Jc0JyaWRnZWQoKTsKKyAgYm9vbCBpc19icmlkZ2VkID0gYXBwX25zLT5Jc0JyaWRnZWQoKTsKIAogICBhdXRvIHBsYXRmb3JtX25zID0gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpHZXRQbGF0Zm9ybU5hbWVzcGFjZShpc19icmlkZ2VkKTsKLSAgaWYgKCFhcHBfbnMuTGluayhwbGF0Zm9ybV9ucywgc3lzdGVtX2V4cG9zZWRfbGlicmFyaWVzKSkgewotICAgICplcnJvcl9tc2cgPSBhcHBfbnMuR2V0RXJyb3IoKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKCFwbGF0Zm9ybV9ucykgeworICAgIHJldHVybiBwbGF0Zm9ybV9ucy5lcnJvcigpOworICB9CisKKyAgYXV0byBsaW5rZWQgPSBhcHBfbnMtPkxpbmsoKnBsYXRmb3JtX25zLCBzeXN0ZW1fZXhwb3NlZF9saWJyYXJpZXMpOworICBpZiAoIWxpbmtlZCkgeworICAgIHJldHVybiBsaW5rZWQuZXJyb3IoKTsKICAgfQogCiAgIGF1dG8gcnVudGltZV9ucyA9IE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6R2V0RXhwb3J0ZWROYW1lc3BhY2Uoa1J1bnRpbWVOYW1lc3BhY2VOYW1lLCBpc19icmlkZ2VkKTsKICAgLy8gUnVudGltZSBhcGV4IGRvZXMgbm90IGV4aXN0IGluIGhvc3QsIGFuZCB1bmRlciBjZXJ0YWluIGJ1aWxkIGNvbmRpdGlvbnMuCi0gIGlmICghcnVudGltZV9ucy5Jc05pbCgpKSB7Ci0gICAgaWYgKCFhcHBfbnMuTGluayhydW50aW1lX25zLCBydW50aW1lX3B1YmxpY19saWJyYXJpZXMoKSkpIHsKLSAgICAgICplcnJvcl9tc2cgPSBhcHBfbnMuR2V0RXJyb3IoKTsKLSAgICAgIHJldHVybiBudWxscHRyOworICBpZiAocnVudGltZV9ucykgeworICAgIGxpbmtlZCA9IGFwcF9ucy0+TGluaygqcnVudGltZV9ucywgcnVudGltZV9wdWJsaWNfbGlicmFyaWVzKCkpOworICAgIGlmICghbGlua2VkKSB7CisgICAgICByZXR1cm4gbGlua2VkLmVycm9yKCk7CiAgICAgfQogICB9CiAKICAgLy8gR2l2ZSBhY2Nlc3MgdG8gTk5BUEkgbGlicmFyaWVzIChhcGV4LXVwZGF0ZWQgTExOREsgbGlicmFyeSkuCiAgIGF1dG8gbm5hcGlfbnMgPQogICAgICAgTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpHZXRFeHBvcnRlZE5hbWVzcGFjZShrTmV1cmFsTmV0d29ya3NOYW1lc3BhY2VOYW1lLCBpc19icmlkZ2VkKTsKLSAgaWYgKCFhcHBfbnMuTGluayhubmFwaV9ucywgbmV1cmFsbmV0d29ya3NfcHVibGljX2xpYnJhcmllcygpKSkgewotICAgICplcnJvcl9tc2cgPSBhcHBfbnMuR2V0RXJyb3IoKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKG5uYXBpX25zKSB7CisgICAgbGlua2VkID0gYXBwX25zLT5MaW5rKCpubmFwaV9ucywgbmV1cmFsbmV0d29ya3NfcHVibGljX2xpYnJhcmllcygpKTsKKyAgICBpZiAoIWxpbmtlZCkgeworICAgICAgcmV0dXJuIGxpbmtlZC5lcnJvcigpOworICAgIH0KICAgfQogCiAgIC8vIEdpdmUgYWNjZXNzIHRvIFZOREstU1AgbGlicmFyaWVzIGZyb20gdGhlICd2bmRrJyBuYW1lc3BhY2UuCiAgIGlmICh1bmJ1bmRsZWRfdmVuZG9yX29yX3Byb2R1Y3RfYXBwICYmICF2bmRrc3BfbGlicmFyaWVzKCkuZW1wdHkoKSkgewogICAgIGF1dG8gdm5ka19ucyA9IE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6R2V0RXhwb3J0ZWROYW1lc3BhY2Uoa1ZuZGtOYW1lc3BhY2VOYW1lLCBpc19icmlkZ2VkKTsKLSAgICBpZiAoIXZuZGtfbnMuSXNOaWwoKSAmJiAhYXBwX25zLkxpbmsodm5ka19ucywgdm5ka3NwX2xpYnJhcmllcygpKSkgewotICAgICAgKmVycm9yX21zZyA9IGFwcF9ucy5HZXRFcnJvcigpOwotICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgaWYgKHZuZGtfbnMpIHsKKyAgICAgIGxpbmtlZCA9IGFwcF9ucy0+TGluaygqdm5ka19ucywgdm5ka3NwX2xpYnJhcmllcygpKTsKKyAgICAgIGlmICghbGlua2VkKSB7CisgICAgICAgIHJldHVybiBsaW5rZWQuZXJyb3IoKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIAotICAvLyBOb3RlIHRoYXQgd2hlbiB2ZW5kb3JfbnMgaXMgbm90IGNvbmZpZ3VyZWQsIHZlbmRvcl9ucy5Jc05pbCgpIHdpbGwgYmUgdHJ1ZQotICAvLyBhbmQgaXQgd2lsbCByZXN1bHQgaW4gbGlua2luZyB0byB0aGUgZGVmYXVsdCBuYW1lc3BhY2Ugd2hpY2ggaXMgZXhwZWN0ZWQKLSAgLy8gYmVoYXZpb3IgaW4gdGhpcyBjYXNlLgogICBpZiAoIXZlbmRvcl9wdWJsaWNfbGlicmFyaWVzKCkuZW1wdHkoKSkgewogICAgIGF1dG8gdmVuZG9yX25zID0gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpHZXRFeHBvcnRlZE5hbWVzcGFjZShrVmVuZG9yTmFtZXNwYWNlTmFtZSwgaXNfYnJpZGdlZCk7Ci0gICAgaWYgKCFhcHBfbnMuTGluayh2ZW5kb3JfbnMsIHZlbmRvcl9wdWJsaWNfbGlicmFyaWVzKCkpKSB7Ci0gICAgICAqZXJyb3JfbXNnID0gZGxlcnJvcigpOwotICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgLy8gd2hlbiB2ZW5kb3JfbnMgaXMgbm90IGNvbmZpZ3VyZWQsIGxpbmsgdG8gdGhlIHBsYXRmb3JtIG5hbWVzcGFjZQorICAgIGF1dG8gdGFyZ2V0X25zID0gdmVuZG9yX25zID8gdmVuZG9yX25zIDogcGxhdGZvcm1fbnM7CisgICAgaWYgKHRhcmdldF9ucykgeworICAgICAgbGlua2VkID0gYXBwX25zLT5MaW5rKCp0YXJnZXRfbnMsIHZlbmRvcl9wdWJsaWNfbGlicmFyaWVzKCkpOworICAgICAgaWYgKCFsaW5rZWQpIHsKKyAgICAgICAgcmV0dXJuIGxpbmtlZC5lcnJvcigpOworICAgICAgfQogICAgIH0KICAgfQogCi0gIG5hbWVzcGFjZXNfLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihlbnYtPk5ld1dlYWtHbG9iYWxSZWYoY2xhc3NfbG9hZGVyKSwgYXBwX25zKSk7CisgIG5hbWVzcGFjZXNfLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihlbnYtPk5ld1dlYWtHbG9iYWxSZWYoY2xhc3NfbG9hZGVyKSwgKmFwcF9ucykpOwogCiAgIHJldHVybiAmKG5hbWVzcGFjZXNfLmJhY2soKS5zZWNvbmQpOwogfQpAQCAtMjg1LDcgKzI5NSw3IEBACiAgIHJldHVybiBudWxscHRyOwogfQogCi1ib29sIExpYnJhcnlOYW1lc3BhY2VzOjpJbml0UHVibGljTmFtZXNwYWNlKGNvbnN0IGNoYXIqIGxpYnJhcnlfcGF0aCwgc3RkOjpzdHJpbmcqIGVycm9yX21zZykgeworUmVzdWx0PHZvaWQ+IExpYnJhcnlOYW1lc3BhY2VzOjpJbml0UHVibGljTmFtZXNwYWNlKGNvbnN0IGNoYXIqIGxpYnJhcnlfcGF0aCkgewogICAvLyBBc2sgbmF0aXZlIGJyaWRlIGlmIHRoaXMgYXBwcyBsaWJyYXJ5IHBhdGggc2hvdWxkIGJlIGhhbmRsZWQgYnkgaXQKICAgYm9vbCBpc19uYXRpdmVfYnJpZGdlID0gTmF0aXZlQnJpZGdlSXNQYXRoU3VwcG9ydGVkKGxpYnJhcnlfcGF0aCk7CiAKQEAgLTI5Niw4ICszMDYsNyBAQAogICBpbml0aWFsaXplZF8gPSBhbmRyb2lkX2luaXRfYW5vbnltb3VzX25hbWVzcGFjZShkZWZhdWx0X3B1YmxpY19saWJyYXJpZXMoKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19uYXRpdmVfYnJpZGdlID8gbnVsbHB0ciA6IGxpYnJhcnlfcGF0aCk7CiAgIGlmICghaW5pdGlhbGl6ZWRfKSB7Ci0gICAgKmVycm9yX21zZyA9IGRsZXJyb3IoKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEVycm9yKCkgPDwgZGxlcnJvcigpOwogICB9CiAKICAgLy8gYW5kIG5vdyBpbml0aWFsaXplIG5hdGl2ZSBicmlkZ2UgbmFtZXNwYWNlcyBpZiBuZWNlc3NhcnkuCkBAIC0zMDUsMTEgKzMxNCwxMSBAQAogICAgIGluaXRpYWxpemVkXyA9IE5hdGl2ZUJyaWRnZUluaXRBbm9ueW1vdXNOYW1lc3BhY2UoZGVmYXVsdF9wdWJsaWNfbGlicmFyaWVzKCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25hdGl2ZV9icmlkZ2UgPyBsaWJyYXJ5X3BhdGggOiBudWxscHRyKTsKICAgICBpZiAoIWluaXRpYWxpemVkXykgewotICAgICAgKmVycm9yX21zZyA9IE5hdGl2ZUJyaWRnZUdldEVycm9yKCk7CisgICAgICByZXR1cm4gRXJyb3IoKSA8PCBOYXRpdmVCcmlkZ2VHZXRFcnJvcigpOwogICAgIH0KICAgfQogCi0gIHJldHVybiBpbml0aWFsaXplZF87CisgIHJldHVybiB7fTsKIH0KIAogTmF0aXZlTG9hZGVyTmFtZXNwYWNlKiBMaWJyYXJ5TmFtZXNwYWNlczo6RmluZFBhcmVudE5hbWVzcGFjZUJ5Q2xhc3NMb2FkZXIoSk5JRW52KiBlbnYsCmRpZmYgLS1naXQgYS9saWJuYXRpdmVsb2FkZXIvbGlicmFyeV9uYW1lc3BhY2VzLmggYi9saWJuYXRpdmVsb2FkZXIvbGlicmFyeV9uYW1lc3BhY2VzLmgKaW5kZXggNmU5YTE5MC4uZTU0YmMwYSAxMDA2NDQKLS0tIGEvbGlibmF0aXZlbG9hZGVyL2xpYnJhcnlfbmFtZXNwYWNlcy5oCisrKyBiL2xpYm5hdGl2ZWxvYWRlci9saWJyYXJ5X25hbWVzcGFjZXMuaApAQCAtMjUsMTAgKzI1LDEzIEBACiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxzdHJpbmc+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CiAjaW5jbHVkZSA8am5pLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkOjpuYXRpdmVsb2FkZXIgewogCit1c2luZyBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ7CisKIC8vIExpYnJhcnlOYW1lc3BhY2VzIGlzIGEgc2luZ2xldG9uIG9iamVjdCB0aGF0IG1hbmFnZXMgTmF0aXZlTG9hZGVyTmFtZXNwYWNlCiAvLyBvYmplY3RzIGZvciBhbiBhcHAgcHJvY2Vzcy4gSXRzIG1haW4gam9iIGlzIHRvIGNyZWF0ZSAoYW5kIGNvbmZpZ3VyZSkgYSBuZXcKIC8vIE5hdGl2ZUxvYWRlck5hbWVzcGFjZSBvYmplY3QgZm9yIGEgSmF2YSBDbGFzc0xvYWRlciwgYW5kIHRvIGZpbmQgYW4gZXhpc3RpbmcKQEAgLTQ2LDEzICs0OSwxMyBAQAogICAgIG5hbWVzcGFjZXNfLmNsZWFyKCk7CiAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7CiAgIH0KLSAgTmF0aXZlTG9hZGVyTmFtZXNwYWNlKiBDcmVhdGUoSk5JRW52KiBlbnYsIHVpbnQzMl90IHRhcmdldF9zZGtfdmVyc2lvbiwgam9iamVjdCBjbGFzc19sb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc2hhcmVkLCBqc3RyaW5nIGRleF9wYXRoLCBqc3RyaW5nIGphdmFfbGlicmFyeV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIGphdmFfcGVybWl0dGVkX3BhdGgsIHN0ZDo6c3RyaW5nKiBlcnJvcl9tc2cpOworICBSZXN1bHQ8TmF0aXZlTG9hZGVyTmFtZXNwYWNlKj4gQ3JlYXRlKEpOSUVudiogZW52LCB1aW50MzJfdCB0YXJnZXRfc2RrX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBjbGFzc19sb2FkZXIsIGJvb2wgaXNfc2hhcmVkLCBqc3RyaW5nIGRleF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgamF2YV9saWJyYXJ5X3BhdGgsIGpzdHJpbmcgamF2YV9wZXJtaXR0ZWRfcGF0aCk7CiAgIE5hdGl2ZUxvYWRlck5hbWVzcGFjZSogRmluZE5hbWVzcGFjZUJ5Q2xhc3NMb2FkZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhc3NfbG9hZGVyKTsKIAogIHByaXZhdGU6Ci0gIGJvb2wgSW5pdFB1YmxpY05hbWVzcGFjZShjb25zdCBjaGFyKiBsaWJyYXJ5X3BhdGgsIHN0ZDo6c3RyaW5nKiBlcnJvcl9tc2cpOworICBSZXN1bHQ8dm9pZD4gSW5pdFB1YmxpY05hbWVzcGFjZShjb25zdCBjaGFyKiBsaWJyYXJ5X3BhdGgpOwogICBOYXRpdmVMb2FkZXJOYW1lc3BhY2UqIEZpbmRQYXJlbnROYW1lc3BhY2VCeUNsYXNzTG9hZGVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXNzX2xvYWRlcik7CiAKICAgYm9vbCBpbml0aWFsaXplZF87CmRpZmYgLS1naXQgYS9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlci5jcHAgYi9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlci5jcHAKaW5kZXggMGMyOTMyNC4uNmQzYzA1NyAxMDA2NDQKLS0tIGEvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXIuY3BwCisrKyBiL2xpYm5hdGl2ZWxvYWRlci9uYXRpdmVfbG9hZGVyLmNwcApAQCAtOTIsMTIgKzkyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgcGVybWl0dGVkX3BhdGgpIHsKICNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQogICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQoZ19uYW1lc3BhY2VzX211dGV4KTsKLQotICBzdGQ6OnN0cmluZyBlcnJvcl9tc2c7Ci0gIGJvb2wgc3VjY2VzcyA9IGdfbmFtZXNwYWNlcy0+Q3JlYXRlKGVudiwgdGFyZ2V0X3Nka192ZXJzaW9uLCBjbGFzc19sb2FkZXIsIGlzX3NoYXJlZCwgZGV4X3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlfcGF0aCwgcGVybWl0dGVkX3BhdGgsICZlcnJvcl9tc2cpICE9IG51bGxwdHI7Ci0gIGlmICghc3VjY2VzcykgewotICAgIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURihlcnJvcl9tc2cuY19zdHIoKSk7CisgIGF1dG8gbnMgPSBnX25hbWVzcGFjZXMtPkNyZWF0ZShlbnYsIHRhcmdldF9zZGtfdmVyc2lvbiwgY2xhc3NfbG9hZGVyLCBpc19zaGFyZWQsIGRleF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9wYXRoLCBwZXJtaXR0ZWRfcGF0aCk7CisgIGlmICghbnMpIHsKKyAgICByZXR1cm4gZW52LT5OZXdTdHJpbmdVVEYobnMuZXJyb3IoKS5tZXNzYWdlKCkuY19zdHIoKSk7CiAgIH0KICNlbHNlCiAgIFVOVVNFRChlbnYsIHRhcmdldF9zZGtfdmVyc2lvbiwgY2xhc3NfbG9hZGVyLCBpc19zaGFyZWQsIGRleF9wYXRoLCBsaWJyYXJ5X3BhdGgsIHBlcm1pdHRlZF9wYXRoKTsKQEAgLTEzOSwxMSArMTM3LDE0IEBACiAgIGlmICgobnMgPSBnX25hbWVzcGFjZXMtPkZpbmROYW1lc3BhY2VCeUNsYXNzTG9hZGVyKGVudiwgY2xhc3NfbG9hZGVyKSkgPT0gbnVsbHB0cikgewogICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIGNsYXNzbG9hZGVyIHdhcyBub3QgY3JlYXRlZCBieSBBcHBsaWNhdGlvbkxvYWRlcnMKICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgY3JlYXRlIGFuIGlzb2xhdGVkIG5vdC1zaGFyZWQgbmFtZXNwYWNlIGZvciBpdC4KLSAgICBzdGQ6OnN0cmluZyBjcmVhdGVfZXJyb3JfbXNnOwotICAgIGlmICgobnMgPSBnX25hbWVzcGFjZXMtPkNyZWF0ZShlbnYsIHRhcmdldF9zZGtfdmVyc2lvbiwgY2xhc3NfbG9hZGVyLCBmYWxzZSAvKiBpc19zaGFyZWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIGxpYnJhcnlfcGF0aCwgbnVsbHB0ciwgJmNyZWF0ZV9lcnJvcl9tc2cpKSA9PSBudWxscHRyKSB7Ci0gICAgICAqZXJyb3JfbXNnID0gc3RyZHVwKGNyZWF0ZV9lcnJvcl9tc2cuY19zdHIoKSk7CisgICAgUmVzdWx0PE5hdGl2ZUxvYWRlck5hbWVzcGFjZSo+IGlzb2xhdGVkX25zID0KKyAgICAgICAgZ19uYW1lc3BhY2VzLT5DcmVhdGUoZW52LCB0YXJnZXRfc2RrX3ZlcnNpb24sIGNsYXNzX2xvYWRlciwgZmFsc2UgLyogaXNfc2hhcmVkICovLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5X3BhdGgsIG51bGxwdHIpOworICAgIGlmICghaXNvbGF0ZWRfbnMpIHsKKyAgICAgICplcnJvcl9tc2cgPSBzdHJkdXAoaXNvbGF0ZWRfbnMuZXJyb3IoKS5tZXNzYWdlKCkuY19zdHIoKSk7CiAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgbnMgPSAqaXNvbGF0ZWRfbnM7CiAgICAgfQogICB9CiAKQEAgLTIyMiwxMiArMjIzLDE0IEBACiAjaWYgZGVmaW5lZChfX0FORFJPSURfXykKIHZvaWQqIE9wZW5OYXRpdmVMaWJyYXJ5SW5OYW1lc3BhY2UoTmF0aXZlTG9hZGVyTmFtZXNwYWNlKiBucywgY29uc3QgY2hhciogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogbmVlZHNfbmF0aXZlX2JyaWRnZSwgY2hhcioqIGVycm9yX21zZykgewotICB2b2lkKiBoYW5kbGUgPSBucy0+TG9hZChwYXRoKTsKLSAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7Ci0gICAgKmVycm9yX21zZyA9IG5zLT5HZXRFcnJvcigpOworICBhdXRvIGhhbmRsZSA9IG5zLT5Mb2FkKHBhdGgpOworICBpZiAoIWhhbmRsZSAmJiBlcnJvcl9tc2cgIT0gbnVsbHB0cikgeworICAgICplcnJvcl9tc2cgPSBzdHJkdXAoaGFuZGxlLmVycm9yKCkubWVzc2FnZSgpLmNfc3RyKCkpOwogICB9Ci0gICpuZWVkc19uYXRpdmVfYnJpZGdlID0gbnMtPklzQnJpZGdlZCgpOwotICByZXR1cm4gaGFuZGxlOworICBpZiAobmVlZHNfbmF0aXZlX2JyaWRnZSAhPSBudWxscHRyKSB7CisgICAgKm5lZWRzX25hdGl2ZV9icmlkZ2UgPSBucy0+SXNCcmlkZ2VkKCk7CisgIH0KKyAgcmV0dXJuIGhhbmRsZSA/ICpoYW5kbGUgOiBudWxscHRyOwogfQogCiAvLyBuYXRpdmVfYnJpZGdlX25hbWVzcGFjZXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbi4KZGlmZiAtLWdpdCBhL2xpYm5hdGl2ZWxvYWRlci9uYXRpdmVfbG9hZGVyX25hbWVzcGFjZS5jcHAgYi9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl9uYW1lc3BhY2UuY3BwCmluZGV4IDU4YWM2ODYuLjRiMDIxMTYgMTAwNjQ0Ci0tLSBhL2xpYm5hdGl2ZWxvYWRlci9uYXRpdmVfbG9hZGVyX25hbWVzcGFjZS5jcHAKKysrIGIvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfbmFtZXNwYWNlLmNwcApAQCAtMjgsNiArMjgsOSBAQAogCiAjaW5jbHVkZSAibmF0aXZlbG9hZGVyL2RsZXh0X25hbWVzcGFjZXMuaCIKIAordXNpbmcgYW5kcm9pZDo6YmFzZTo6RXJyb3I7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpFcnJvcmY7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIHsKQEAgLTM1LDQxICszOCw0NiBAQAogY29uc3RleHByIGNvbnN0IGNoYXIqIGtEZWZhdWx0TmFtZXNwYWNlTmFtZSA9ICJkZWZhdWx0IjsKIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrUGxhdGZvcm1OYW1lc3BhY2VOYW1lID0gInBsYXRmb3JtIjsKIAotfSAgLy8gbmFtZXNwYWNlCi0KLU5hdGl2ZUxvYWRlck5hbWVzcGFjZSBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkdldEV4cG9ydGVkTmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19icmlkZ2VkKSB7Ci0gIGlmICghaXNfYnJpZGdlZCkgewotICAgIHJldHVybiBOYXRpdmVMb2FkZXJOYW1lc3BhY2UobmFtZSwgYW5kcm9pZF9nZXRfZXhwb3J0ZWRfbmFtZXNwYWNlKG5hbWUuY19zdHIoKSkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBOYXRpdmVMb2FkZXJOYW1lc3BhY2UobmFtZSwgTmF0aXZlQnJpZGdlR2V0RXhwb3J0ZWROYW1lc3BhY2UobmFtZS5jX3N0cigpKSk7CitzdGQ6OnN0cmluZyBHZXRMaW5rZXJFcnJvcihib29sIGlzX2JyaWRnZWQpIHsKKyAgY29uc3QgY2hhciogbXNnID0gaXNfYnJpZGdlZCA/IE5hdGl2ZUJyaWRnZUdldEVycm9yKCkgOiBkbGVycm9yKCk7CisgIGlmIChtc2cgPT0gbnVsbHB0cikgeworICAgIHJldHVybiAibm8gZXJyb3IiOwogICB9CisgIHJldHVybiBzdGQ6OnN0cmluZyhtc2cpOwogfQogCi1jaGFyKiBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkdldEVycm9yKCkgY29uc3QgewotICBpZiAoIUlzQnJpZGdlZCgpKSB7Ci0gICAgcmV0dXJuIHN0cmR1cChkbGVycm9yKCkpOworfSAgLy8gbmFtZXNwYWNlCisKK1Jlc3VsdDxOYXRpdmVMb2FkZXJOYW1lc3BhY2U+IE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6R2V0RXhwb3J0ZWROYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYnJpZGdlZCkgeworICBpZiAoIWlzX2JyaWRnZWQpIHsKKyAgICBhdXRvIHJhdyA9IGFuZHJvaWRfZ2V0X2V4cG9ydGVkX25hbWVzcGFjZShuYW1lLmNfc3RyKCkpOworICAgIGlmIChyYXcgIT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShuYW1lLCByYXcpOworICAgIH0KICAgfSBlbHNlIHsKLSAgICByZXR1cm4gc3RyZHVwKE5hdGl2ZUJyaWRnZUdldEVycm9yKCkpOworICAgIGF1dG8gcmF3ID0gTmF0aXZlQnJpZGdlR2V0RXhwb3J0ZWROYW1lc3BhY2UobmFtZS5jX3N0cigpKTsKKyAgICBpZiAocmF3ICE9IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBOYXRpdmVMb2FkZXJOYW1lc3BhY2UobmFtZSwgcmF3KTsKKyAgICB9CiAgIH0KKyAgcmV0dXJuIEVycm9yZigibmFtZXNwYWNlIHt9IGRvZXMgbm90IGV4aXN0IG9yIGV4cG9ydGVkIiwgbmFtZSk7CiB9CiAKIC8vIFRoZSBwbGF0Zm9ybSBuYW1lc3BhY2UgaXMgY2FsbGVkICJkZWZhdWx0IiBmb3IgYmluYXJpZXMgaW4gL3N5c3RlbSBhbmQKIC8vICJwbGF0Zm9ybSIgZm9yIHRob3NlIGluIHRoZSBSdW50aW1lIEFQRVguIFRyeSAicGxhdGZvcm0iIGZpcnN0IHNpbmNlCiAvLyAiZGVmYXVsdCIgYWx3YXlzIGV4aXN0cy4KLU5hdGl2ZUxvYWRlck5hbWVzcGFjZSBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkdldFBsYXRmb3JtTmFtZXNwYWNlKGJvb2wgaXNfYnJpZGdlZCkgewotICBOYXRpdmVMb2FkZXJOYW1lc3BhY2UgbnMgPSBHZXRFeHBvcnRlZE5hbWVzcGFjZShrUGxhdGZvcm1OYW1lc3BhY2VOYW1lLCBpc19icmlkZ2VkKTsKLSAgaWYgKG5zLklzTmlsKCkpIHsKK1Jlc3VsdDxOYXRpdmVMb2FkZXJOYW1lc3BhY2U+IE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6R2V0UGxhdGZvcm1OYW1lc3BhY2UoYm9vbCBpc19icmlkZ2VkKSB7CisgIGF1dG8gbnMgPSBHZXRFeHBvcnRlZE5hbWVzcGFjZShrUGxhdGZvcm1OYW1lc3BhY2VOYW1lLCBpc19icmlkZ2VkKTsKKyAgaWYgKCFucykgewogICAgIG5zID0gR2V0RXhwb3J0ZWROYW1lc3BhY2Uoa0RlZmF1bHROYW1lc3BhY2VOYW1lLCBpc19icmlkZ2VkKTsKICAgfQogICByZXR1cm4gbnM7CiB9CiAKLU5hdGl2ZUxvYWRlck5hbWVzcGFjZSBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkNyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VhcmNoX3BhdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwZXJtaXR0ZWRfcGF0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmF0aXZlTG9hZGVyTmFtZXNwYWNlKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19zaGFyZWQsIGJvb2wgaXNfZ3JleWxpc3RfZW5hYmxlZCkgeworUmVzdWx0PE5hdGl2ZUxvYWRlck5hbWVzcGFjZT4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpDcmVhdGUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWFyY2hfcGF0aHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwZXJtaXR0ZWRfcGF0aHMsCisgICAgY29uc3QgTmF0aXZlTG9hZGVyTmFtZXNwYWNlKiBwYXJlbnQsIGJvb2wgaXNfc2hhcmVkLCBib29sIGlzX2dyZXlsaXN0X2VuYWJsZWQpIHsKICAgYm9vbCBpc19icmlkZ2VkID0gZmFsc2U7CiAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgewogICAgIGlzX2JyaWRnZWQgPSBwYXJlbnQtPklzQnJpZGdlZCgpOwpAQCAtNzgsOCArODYsMTEgQEAKICAgfQogCiAgIC8vIEZhbGwgYmFjayB0byB0aGUgcGxhdGZvcm0gbmFtZXNwYWNlIGlmIG5vIHBhcmVudCBpcyBzZXQuCi0gIGNvbnN0IE5hdGl2ZUxvYWRlck5hbWVzcGFjZSYgZWZmZWN0aXZlX3BhcmVudCA9Ci0gICAgICBwYXJlbnQgIT0gbnVsbHB0ciA/ICpwYXJlbnQgOiBHZXRQbGF0Zm9ybU5hbWVzcGFjZShpc19icmlkZ2VkKTsKKyAgYXV0byBwbGF0Zm9ybV9ucyA9IEdldFBsYXRmb3JtTmFtZXNwYWNlKGlzX2JyaWRnZWQpOworICBpZiAoIXBsYXRmb3JtX25zKSB7CisgICAgcmV0dXJuIHBsYXRmb3JtX25zLmVycm9yKCk7CisgIH0KKyAgY29uc3QgTmF0aXZlTG9hZGVyTmFtZXNwYWNlJiBlZmZlY3RpdmVfcGFyZW50ID0gcGFyZW50ICE9IG51bGxwdHIgPyAqcGFyZW50IDogKnBsYXRmb3JtX25zOwogCiAgIHVpbnQ2NF90IHR5cGUgPSBBTkRST0lEX05BTUVTUEFDRV9UWVBFX0lTT0xBVEVEOwogICBpZiAoaXNfc2hhcmVkKSB7CkBAIC05MywzNyArMTA0LDU2IEBACiAgICAgYW5kcm9pZF9uYW1lc3BhY2VfdCogcmF3ID0KICAgICAgICAgYW5kcm9pZF9jcmVhdGVfbmFtZXNwYWNlKG5hbWUuY19zdHIoKSwgbnVsbHB0ciwgc2VhcmNoX3BhdGhzLmNfc3RyKCksIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXR0ZWRfcGF0aHMuY19zdHIoKSwgZWZmZWN0aXZlX3BhcmVudC5Ub1Jhd0FuZHJvaWROYW1lc3BhY2UoKSk7Ci0gICAgcmV0dXJuIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShuYW1lLCByYXcpOworICAgIGlmIChyYXcgIT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShuYW1lLCByYXcpOworICAgIH0KICAgfSBlbHNlIHsKICAgICBuYXRpdmVfYnJpZGdlX25hbWVzcGFjZV90KiByYXcgPSBOYXRpdmVCcmlkZ2VDcmVhdGVOYW1lc3BhY2UoCiAgICAgICAgIG5hbWUuY19zdHIoKSwgbnVsbHB0ciwgc2VhcmNoX3BhdGhzLmNfc3RyKCksIHR5cGUsIHBlcm1pdHRlZF9wYXRocy5jX3N0cigpLAogICAgICAgICBlZmZlY3RpdmVfcGFyZW50LlRvUmF3TmF0aXZlQnJpZGdlTmFtZXNwYWNlKCkpOwotICAgIHJldHVybiBOYXRpdmVMb2FkZXJOYW1lc3BhY2UobmFtZSwgcmF3KTsKKyAgICBpZiAocmF3ICE9IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBOYXRpdmVMb2FkZXJOYW1lc3BhY2UobmFtZSwgcmF3KTsKKyAgICB9CiAgIH0KKyAgcmV0dXJuIEVycm9yZigiZmFpbGVkIHRvIGNyZWF0ZSB7fSBuYW1lc3BhY2UgbmFtZTp7fSwgc2VhcmNoX3BhdGhzOnt9LCBwZXJtaXR0ZWRfcGF0aHM6e30iLAorICAgICAgICAgICAgICAgIGlzX2JyaWRnZWQgPyAiYnJpZGdlZCIgOiAibmF0aXZlIiwgbmFtZSwgc2VhcmNoX3BhdGhzLCBwZXJtaXR0ZWRfcGF0aHMpOwogfQogCi1ib29sIE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6TGluayhjb25zdCBOYXRpdmVMb2FkZXJOYW1lc3BhY2UmIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaGFyZWRfbGlicykgY29uc3QgeworUmVzdWx0PHZvaWQ+IE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6TGluayhjb25zdCBOYXRpdmVMb2FkZXJOYW1lc3BhY2UmIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNoYXJlZF9saWJzKSBjb25zdCB7CiAgIExPR19BTFdBWVNfRkFUQUxfSUYoc2hhcmVkX2xpYnMuZW1wdHkoKSwgImVtcHR5IHNoYXJlIGxpYiB3aGVuIGxpbmtpbmcgJXMgdG8gJXMiLAogICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPm5hbWUoKS5jX3N0cigpLCB0YXJnZXQubmFtZSgpLmNfc3RyKCkpOwogICBpZiAoIUlzQnJpZGdlZCgpKSB7Ci0gICAgcmV0dXJuIGFuZHJvaWRfbGlua19uYW1lc3BhY2VzKHRoaXMtPlRvUmF3QW5kcm9pZE5hbWVzcGFjZSgpLCB0YXJnZXQuVG9SYXdBbmRyb2lkTmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9saWJzLmNfc3RyKCkpOworICAgIGlmIChhbmRyb2lkX2xpbmtfbmFtZXNwYWNlcyh0aGlzLT5Ub1Jhd0FuZHJvaWROYW1lc3BhY2UoKSwgdGFyZ2V0LlRvUmF3QW5kcm9pZE5hbWVzcGFjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGlicy5jX3N0cigpKSkgeworICAgICAgcmV0dXJuIHt9OworICAgIH0KICAgfSBlbHNlIHsKLSAgICByZXR1cm4gTmF0aXZlQnJpZGdlTGlua05hbWVzcGFjZXModGhpcy0+VG9SYXdOYXRpdmVCcmlkZ2VOYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LlRvUmF3TmF0aXZlQnJpZGdlTmFtZXNwYWNlKCksIHNoYXJlZF9saWJzLmNfc3RyKCkpOworICAgIGlmIChOYXRpdmVCcmlkZ2VMaW5rTmFtZXNwYWNlcyh0aGlzLT5Ub1Jhd05hdGl2ZUJyaWRnZU5hbWVzcGFjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuVG9SYXdOYXRpdmVCcmlkZ2VOYW1lc3BhY2UoKSwgc2hhcmVkX2xpYnMuY19zdHIoKSkpIHsKKyAgICAgIHJldHVybiB7fTsKKyAgICB9CiAgIH0KKyAgcmV0dXJuIEVycm9yKCkgPDwgR2V0TGlua2VyRXJyb3IoSXNCcmlkZ2VkKCkpOwogfQogCi12b2lkKiBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkxvYWQoY29uc3QgY2hhciogbGliX25hbWUpIGNvbnN0IHsKK1Jlc3VsdDx2b2lkKj4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpMb2FkKGNvbnN0IGNoYXIqIGxpYl9uYW1lKSBjb25zdCB7CiAgIGlmICghSXNCcmlkZ2VkKCkpIHsKICAgICBhbmRyb2lkX2RsZXh0aW5mbyBleHRpbmZvOwogICAgIGV4dGluZm8uZmxhZ3MgPSBBTkRST0lEX0RMRVhUX1VTRV9OQU1FU1BBQ0U7CiAgICAgZXh0aW5mby5saWJyYXJ5X25hbWVzcGFjZSA9IHRoaXMtPlRvUmF3QW5kcm9pZE5hbWVzcGFjZSgpOwotICAgIHJldHVybiBhbmRyb2lkX2Rsb3Blbl9leHQobGliX25hbWUsIFJUTERfTk9XLCAmZXh0aW5mbyk7CisgICAgdm9pZCogaGFuZGxlID0gYW5kcm9pZF9kbG9wZW5fZXh0KGxpYl9uYW1lLCBSVExEX05PVywgJmV4dGluZm8pOworICAgIGlmIChoYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIGhhbmRsZTsKKyAgICB9CiAgIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5hdGl2ZUJyaWRnZUxvYWRMaWJyYXJ5RXh0KGxpYl9uYW1lLCBSVExEX05PVywgdGhpcy0+VG9SYXdOYXRpdmVCcmlkZ2VOYW1lc3BhY2UoKSk7CisgICAgdm9pZCogaGFuZGxlID0KKyAgICAgICAgTmF0aXZlQnJpZGdlTG9hZExpYnJhcnlFeHQobGliX25hbWUsIFJUTERfTk9XLCB0aGlzLT5Ub1Jhd05hdGl2ZUJyaWRnZU5hbWVzcGFjZSgpKTsKKyAgICBpZiAoaGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBoYW5kbGU7CisgICAgfQogICB9CisgIHJldHVybiBFcnJvcigpIDw8IEdldExpbmtlckVycm9yKElzQnJpZGdlZCgpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYm5hdGl2ZWxvYWRlci9uYXRpdmVfbG9hZGVyX25hbWVzcGFjZS5oIGIvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfbmFtZXNwYWNlLmgKaW5kZXggNzFlNDI0Ny4uMjliNzU5YyAxMDA2NDQKLS0tIGEvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfbmFtZXNwYWNlLmgKKysrIGIvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfbmFtZXNwYWNlLmgKQEAgLTIxLDIyICsyMSwyNSBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvZGxleHQuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8bmF0aXZlYnJpZGdlL25hdGl2ZV9icmlkZ2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ7CisKIC8vIE5hdGl2ZUxvYWRlck5hbWVzcGFjZSBhYnN0cmFjdHMgYSBsaW5rZXIgbmFtZXNwYWNlIGZvciB0aGUgbmF0aXZlCiAvLyBhcmNoaXRlY3R1cmUgKGV4OiBhcm0gb24gYXJtKSBvciB0aGUgdHJhbnNsYXRlZCBhcmNoaXRlY3R1cmUgKGV4OiBhcm0gb24KIC8vIHg4NikuIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBtYW5hZ2VkIGJ5IExpYnJhcnlOYW1lc3BhY2VzIG9iamVjdC4KIHN0cnVjdCBOYXRpdmVMb2FkZXJOYW1lc3BhY2UgewogIHB1YmxpYzoKLSAgLy8gVE9ETyhyZXR1cm4gd2l0aCBlcnJvcnMpCi0gIHN0YXRpYyBOYXRpdmVMb2FkZXJOYW1lc3BhY2UgQ3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VhcmNoX3BhdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGVybWl0dGVkX3BhdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYXRpdmVMb2FkZXJOYW1lc3BhY2UqIHBhcmVudCwgYm9vbCBpc19zaGFyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZ3JleWxpc3RfZW5hYmxlZCk7CisgIHN0YXRpYyBSZXN1bHQ8TmF0aXZlTG9hZGVyTmFtZXNwYWNlPiBDcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlYXJjaF9wYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGVybWl0dGVkX3BhdGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hdGl2ZUxvYWRlck5hbWVzcGFjZSogcGFyZW50LCBib29sIGlzX3NoYXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2dyZXlsaXN0X2VuYWJsZWQpOwogCiAgIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShOYXRpdmVMb2FkZXJOYW1lc3BhY2UmJikgPSBkZWZhdWx0OwogICBOYXRpdmVMb2FkZXJOYW1lc3BhY2UoY29uc3QgTmF0aXZlTG9hZGVyTmFtZXNwYWNlJikgPSBkZWZhdWx0OwpAQCAtNDcsMTYgKzUwLDEzIEBACiAKICAgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CiAgIGJvb2wgSXNCcmlkZ2VkKCkgY29uc3QgeyByZXR1cm4gcmF3Xy5pbmRleCgpID09IDE7IH0KLSAgYm9vbCBJc05pbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gSXNCcmlkZ2VkKCkgPyBzdGQ6OmdldDwxPihyYXdfKSA9PSBudWxscHRyIDogc3RkOjpnZXQ8MD4ocmF3XykgPT0gbnVsbHB0cjsKLSAgfQogCi0gIGJvb2wgTGluayhjb25zdCBOYXRpdmVMb2FkZXJOYW1lc3BhY2UmIHRhcmdldCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNoYXJlZF9saWJzKSBjb25zdDsKLSAgdm9pZCogTG9hZChjb25zdCBjaGFyKiBsaWJfbmFtZSkgY29uc3Q7Ci0gIGNoYXIqIEdldEVycm9yKCkgY29uc3Q7CisgIFJlc3VsdDx2b2lkPiBMaW5rKGNvbnN0IE5hdGl2ZUxvYWRlck5hbWVzcGFjZSYgdGFyZ2V0LCBjb25zdCBzdGQ6OnN0cmluZyYgc2hhcmVkX2xpYnMpIGNvbnN0OworICBSZXN1bHQ8dm9pZCo+IExvYWQoY29uc3QgY2hhciogbGliX25hbWUpIGNvbnN0OwogCi0gIHN0YXRpYyBOYXRpdmVMb2FkZXJOYW1lc3BhY2UgR2V0RXhwb3J0ZWROYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGJvb2wgaXNfYnJpZGdlZCk7Ci0gIHN0YXRpYyBOYXRpdmVMb2FkZXJOYW1lc3BhY2UgR2V0UGxhdGZvcm1OYW1lc3BhY2UoYm9vbCBpc19icmlkZ2VkKTsKKyAgc3RhdGljIFJlc3VsdDxOYXRpdmVMb2FkZXJOYW1lc3BhY2U+IEdldEV4cG9ydGVkTmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19icmlkZ2VkKTsKKyAgc3RhdGljIFJlc3VsdDxOYXRpdmVMb2FkZXJOYW1lc3BhY2U+IEdldFBsYXRmb3JtTmFtZXNwYWNlKGJvb2wgaXNfYnJpZGdlZCk7CiAKICBwcml2YXRlOgogICBleHBsaWNpdCBOYXRpdmVMb2FkZXJOYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGFuZHJvaWRfbmFtZXNwYWNlX3QqIG5zKQpkaWZmIC0tZ2l0IGEvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfdGVzdC5jcHAgYi9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl90ZXN0LmNwcAppbmRleCAzMjMyZTRjLi5iOTM5ZWVlIDEwMDY0NAotLS0gYS9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl90ZXN0LmNwcAorKysgYi9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl90ZXN0LmNwcApAQCAtOTksNyArOTksNyBAQAogICAgICAgICAgIGlmIChuYW1lc3BhY2VzLmZpbmQobmFtZSkgIT0gbmFtZXNwYWNlcy5lbmQoKSkgewogICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZXNbbmFtZV07CiAgICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgIHJldHVybiBUT19NT0NLX05BTUVTUEFDRShUT19BTkRST0lEX05BTUVTUEFDRSgiKG5hbWVzcGFjZSBub3QgZm91bmQiKSk7CiAgICAgICAgIH0pKTsKICAgfQogCmRpZmYgLS1naXQgYS9saWJuYXRpdmVsb2FkZXIvcHVibGljX2xpYnJhcmllcy5jcHAgYi9saWJuYXRpdmVsb2FkZXIvcHVibGljX2xpYnJhcmllcy5jcHAKaW5kZXggMTBlMjNmZC4uNmNlZTY2OCAxMDA2NDQKLS0tIGEvbGlibmF0aXZlbG9hZGVyL3B1YmxpY19saWJyYXJpZXMuY3BwCisrKyBiL2xpYm5hdGl2ZWxvYWRlci9wdWJsaWNfbGlicmFyaWVzLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIApAQCAtMzQsNiArMzUsOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQ6Om5hdGl2ZWxvYWRlciB7CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnN0cmluZ19saXRlcmFsczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkVycm5vRXJyb3I7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpFcnJvcmY7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ7CiAKIG5hbWVzcGFjZSB7CiAKQEAgLTkxLDIyICs5NSwyMSBAQAogICBmaWxlX25hbWUtPmluc2VydChpbnNlcnRfcG9zLCB2bmRrX3ZlcnNpb25fc3RyKCkpOwogfQogCi1jb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmLCBzdGQ6OnN0cmluZyopPiBhbHdheXNfdHJ1ZSA9Ci0gICAgW10oY29uc3Qgc3RkOjpzdHJpbmcmLCBzdGQ6OnN0cmluZyopIHsgcmV0dXJuIHRydWU7IH07Citjb25zdCBzdGQ6OmZ1bmN0aW9uPFJlc3VsdDx2b2lkPihjb25zdCBzdGQ6OnN0cmluZyYpPiBhbHdheXNfdHJ1ZSA9CisgICAgW10oY29uc3Qgc3RkOjpzdHJpbmcmKSAtPiBSZXN1bHQ8dm9pZD4geyByZXR1cm4ge307IH07CiAKLWJvb2wgUmVhZENvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgY29uZmlnRmlsZSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBzb25hbWVzLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnN0cmluZyYgLyogc29uYW1lICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogLyogZXJyb3JfbXNnICovKT4mIGNoZWNrX3NvbmFtZSwKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3JfbXNnID0gbnVsbHB0cikgeworUmVzdWx0PHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gUmVhZENvbmZpZygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29uZmlnRmlsZSwKKyAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPFJlc3VsdDx2b2lkPihjb25zdCBzdGQ6OnN0cmluZyYgLyogc29uYW1lICovKT4mIGNoZWNrX3NvbmFtZSkgewogICAvLyBSZWFkIGxpc3Qgb2YgcHVibGljIG5hdGl2ZSBsaWJyYXJpZXMgZnJvbSB0aGUgY29uZmlnIGZpbGUuCiAgIHN0ZDo6c3RyaW5nIGZpbGVfY29udGVudDsKICAgaWYgKCFiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKGNvbmZpZ0ZpbGUsICZmaWxlX2NvbnRlbnQpKSB7Ci0gICAgaWYgKGVycm9yX21zZykgKmVycm9yX21zZyA9IHN0cmVycm9yKGVycm5vKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEVycm5vRXJyb3IoKTsKICAgfQogCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lcyA9IGJhc2U6OlNwbGl0KGZpbGVfY29udGVudCwgIlxuIik7CiAKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNvbmFtZXM7CiAgIGZvciAoYXV0byYgbGluZSA6IGxpbmVzKSB7CiAgICAgYXV0byB0cmltbWVkX2xpbmUgPSBiYXNlOjpUcmltKGxpbmUpOwogICAgIGlmICh0cmltbWVkX2xpbmVbMF0gPT0gJyMnIHx8IHRyaW1tZWRfbGluZS5lbXB0eSgpKSB7CkBAIC0xMTYsOCArMTE5LDcgQEAKICAgICBpZiAoc3BhY2VfcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICBzdGQ6OnN0cmluZyB0eXBlID0gdHJpbW1lZF9saW5lLnN1YnN0cihzcGFjZV9wb3MgKyAxKTsKICAgICAgIGlmICh0eXBlICE9ICIzMiIgJiYgdHlwZSAhPSAiNjQiKSB7Ci0gICAgICAgIGlmIChlcnJvcl9tc2cpICplcnJvcl9tc2cgPSAiTWFsZm9ybWVkIGxpbmU6ICIgKyBsaW5lOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBFcnJvcmYoIk1hbGZvcm1lZCBsaW5lOiB7fSIsIGxpbmUpOwogICAgICAgfQogI2lmIGRlZmluZWQoX19MUDY0X18pCiAgICAgICAvLyBTa2lwIDMyIGJpdCBwdWJsaWMgbGlicmFyeS4KQEAgLTEzMywxMyArMTM1LDEzIEBACiAgICAgICB0cmltbWVkX2xpbmUucmVzaXplKHNwYWNlX3Bvcyk7CiAgICAgfQogCi0gICAgaWYgKGNoZWNrX3NvbmFtZSh0cmltbWVkX2xpbmUsIGVycm9yX21zZykpIHsKLSAgICAgIHNvbmFtZXMtPnB1c2hfYmFjayh0cmltbWVkX2xpbmUpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7CisgICAgYXV0byByZXQgPSBjaGVja19zb25hbWUodHJpbW1lZF9saW5lKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0dXJuIHJldC5lcnJvcigpOwogICAgIH0KKyAgICBzb25hbWVzLnB1c2hfYmFjayh0cmltbWVkX2xpbmUpOwogICB9Ci0gIHJldHVybiB0cnVlOworICByZXR1cm4gc29uYW1lczsKIH0KIAogdm9pZCBSZWFkRXh0ZW5zaW9uTGlicmFyaWVzKGNvbnN0IGNoYXIqIGRpcm5hbWUsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogc29uYW1lcykgewpAQCAtMTYyLDI0ICsxNjQsMjIgQEAKICAgICAgICAgICAgICJFcnJvciBleHRyYWN0aW5nIGNvbXBhbnkgbmFtZSBmcm9tIHB1YmxpYyBuYXRpdmUgbGlicmFyeSBsaXN0IGZpbGUgcGF0aCBcIiVzXCIiLAogICAgICAgICAgICAgY29uZmlnX2ZpbGVfcGF0aC5jX3N0cigpKTsKIAotICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9tc2c7Ci0KLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigKLSAgICAgICAgICAgICFSZWFkQ29uZmlnKGNvbmZpZ19maWxlX3BhdGgsIHNvbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBbJmNvbXBhbnlfbmFtZV0oY29uc3Qgc3RkOjpzdHJpbmcmIHNvbmFtZSwgc3RkOjpzdHJpbmcqIGVycm9yX21zZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChzb25hbWUsICJsaWIiKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgoc29uYW1lLCAiLiIgKyBjb21wYW55X25hbWUgKyAiLnNvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gIkxpYnJhcnkgbmFtZSBcIiIgKyBzb25hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgZG9lcyBub3QgZW5kIHdpdGggdGhlIGNvbXBhbnkgbmFtZTogIiArIGNvbXBhbnlfbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JfbXNnKSwKLSAgICAgICAgICAgICJFcnJvciByZWFkaW5nIHB1YmxpYyBuYXRpdmUgbGlicmFyeSBsaXN0IGZyb20gXCIlc1wiOiAlcyIsIGNvbmZpZ19maWxlX3BhdGguY19zdHIoKSwKLSAgICAgICAgICAgIGVycm9yX21zZy5jX3N0cigpKTsKKyAgICAgICAgYXV0byByZXQgPSBSZWFkQ29uZmlnKAorICAgICAgICAgICAgY29uZmlnX2ZpbGVfcGF0aCwgWyZjb21wYW55X25hbWVdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb25hbWUpIC0+IFJlc3VsdDx2b2lkPiB7CisgICAgICAgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHNvbmFtZSwgImxpYiIpICYmCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aChzb25hbWUsICIuIiArIGNvbXBhbnlfbmFtZSArICIuc28iKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JmKCJMaWJyYXJ5IG5hbWUgXCJ7fVwiIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBjb21wYW55IG5hbWUge30uIiwgc29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueV9uYW1lKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICBzb25hbWVzLT5pbnNlcnQoc29uYW1lcy0+ZW5kKCksIHJldC0+YmVnaW4oKSwgcmV0LT5lbmQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiRXJyb3IgcmVhZGluZyBwdWJsaWMgbmF0aXZlIGxpYnJhcnkgbGlzdCBmcm9tIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2ZpbGVfcGF0aC5jX3N0cigpLCByZXQuZXJyb3IoKS5tZXNzYWdlKCkuY19zdHIoKSk7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE4NywxNiArMTg3LDE3IEBACiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBJbml0RGVmYXVsdFB1YmxpY0xpYnJhcmllcygpIHsKICAgc3RkOjpzdHJpbmcgY29uZmlnX2ZpbGUgPSByb290X2RpcigpICsga0RlZmF1bHRQdWJsaWNMaWJyYXJpZXNGaWxlOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc29uYW1lczsKLSAgc3RkOjpzdHJpbmcgZXJyb3JfbXNnOwotICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFSZWFkQ29uZmlnKGNvbmZpZ19maWxlLCAmc29uYW1lcywgYWx3YXlzX3RydWUsICZlcnJvcl9tc2cpLAotICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIHB1YmxpYyBuYXRpdmUgbGlicmFyeSBsaXN0IGZyb20gXCIlc1wiOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2ZpbGUuY19zdHIoKSwgZXJyb3JfbXNnLmNfc3RyKCkpOworICBhdXRvIHNvbmFtZXMgPSBSZWFkQ29uZmlnKGNvbmZpZ19maWxlLCBhbHdheXNfdHJ1ZSk7CisgIGlmICghc29uYW1lcykgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkVycm9yIHJlYWRpbmcgcHVibGljIG5hdGl2ZSBsaWJyYXJ5IGxpc3QgZnJvbSBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19maWxlLmNfc3RyKCksIHNvbmFtZXMuZXJyb3IoKS5tZXNzYWdlKCkuY19zdHIoKSk7CisgICAgcmV0dXJuICIiOworICB9CiAKICAgc3RkOjpzdHJpbmcgYWRkaXRpb25hbF9saWJzID0gYWRkaXRpb25hbF9wdWJsaWNfbGlicmFyaWVzKCk7CiAgIGlmICghYWRkaXRpb25hbF9saWJzLmVtcHR5KCkpIHsKICAgICBhdXRvIHZlYyA9IGJhc2U6OlNwbGl0KGFkZGl0aW9uYWxfbGlicywgIjoiKTsKLSAgICBzdGQ6OmNvcHkodmVjLmJlZ2luKCksIHZlYy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHNvbmFtZXMpKTsKKyAgICBzdGQ6OmNvcHkodmVjLmJlZ2luKCksIHZlYy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKCpzb25hbWVzKSk7CiAgIH0KIAogICAvLyBSZW1vdmUgdGhlIHB1YmxpYyBsaWJzIGluIHRoZSBydW50aW1lIG5hbWVzcGFjZS4KQEAgLTIxNiwxOCArMjE3LDE4IEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKHNvbmFtZXMuYmVnaW4oKSwgc29uYW1lcy5lbmQoKSwgbGliX25hbWUpOwotICAgIGlmIChpdCAhPSBzb25hbWVzLmVuZCgpKSB7Ci0gICAgICBzb25hbWVzLmVyYXNlKGl0KTsKKyAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKHNvbmFtZXMtPmJlZ2luKCksIHNvbmFtZXMtPmVuZCgpLCBsaWJfbmFtZSk7CisgICAgaWYgKGl0ICE9IHNvbmFtZXMtPmVuZCgpKSB7CisgICAgICBzb25hbWVzLT5lcmFzZShpdCk7CiAgICAgfQogICB9CiAKICAgLy8gUmVtb3ZlIHRoZSBwdWJsaWMgbGlicyBpbiB0aGUgbm5hcGkgbmFtZXNwYWNlLgotICBhdXRvIGl0ID0gc3RkOjpmaW5kKHNvbmFtZXMuYmVnaW4oKSwgc29uYW1lcy5lbmQoKSwga05ldXJhbE5ldHdvcmtzQXBleFB1YmxpY0xpYnJhcnkpOwotICBpZiAoaXQgIT0gc29uYW1lcy5lbmQoKSkgewotICAgIHNvbmFtZXMuZXJhc2UoaXQpOworICBhdXRvIGl0ID0gc3RkOjpmaW5kKHNvbmFtZXMtPmJlZ2luKCksIHNvbmFtZXMtPmVuZCgpLCBrTmV1cmFsTmV0d29ya3NBcGV4UHVibGljTGlicmFyeSk7CisgIGlmIChpdCAhPSBzb25hbWVzLT5lbmQoKSkgeworICAgIHNvbmFtZXMtPmVyYXNlKGl0KTsKICAgfQotICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6Sm9pbihzb25hbWVzLCAnOicpOworICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6Sm9pbigqc29uYW1lcywgJzonKTsKIH0KIAogc3RhdGljIHN0ZDo6c3RyaW5nIEluaXRSdW50aW1lUHVibGljTGlicmFyaWVzKCkgewpAQCAtMjQzLDkgKzI0NCwxMSBAQAogCiBzdGF0aWMgc3RkOjpzdHJpbmcgSW5pdFZlbmRvclB1YmxpY0xpYnJhcmllcygpIHsKICAgLy8gVGhpcyBmaWxlIGlzIG9wdGlvbmFsLCBxdWlldGx5IGlnbm9yZSBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNvbmFtZXM7Ci0gIFJlYWRDb25maWcoa1ZlbmRvclB1YmxpY0xpYnJhcmllc0ZpbGUsICZzb25hbWVzLCBhbHdheXNfdHJ1ZSwgbnVsbHB0cik7Ci0gIHJldHVybiBhbmRyb2lkOjpiYXNlOjpKb2luKHNvbmFtZXMsICc6Jyk7CisgIGF1dG8gc29uYW1lcyA9IFJlYWRDb25maWcoa1ZlbmRvclB1YmxpY0xpYnJhcmllc0ZpbGUsIGFsd2F5c190cnVlKTsKKyAgaWYgKCFzb25hbWVzKSB7CisgICAgcmV0dXJuICIiOworICB9CisgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpKb2luKCpzb25hbWVzLCAnOicpOwogfQogCiAvLyByZWFkIC9zeXN0ZW0vZXRjL3B1YmxpYy5saWJyYXJpZXMtPGNvbXBhbnluYW1lPi50eHQgYW5kCkBAIC0yNjIsMTcgKzI2NSwyMyBAQAogc3RhdGljIHN0ZDo6c3RyaW5nIEluaXRMbG5ka0xpYnJhcmllcygpIHsKICAgc3RkOjpzdHJpbmcgY29uZmlnX2ZpbGUgPSBrTGxuZGtMaWJyYXJpZXNGaWxlOwogICBJbnNlcnRWbmRrVmVyc2lvblN0cigmY29uZmlnX2ZpbGUpOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc29uYW1lczsKLSAgUmVhZENvbmZpZyhjb25maWdfZmlsZSwgJnNvbmFtZXMsIGFsd2F5c190cnVlLCBudWxscHRyKTsKLSAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkpvaW4oc29uYW1lcywgJzonKTsKKyAgYXV0byBzb25hbWVzID0gUmVhZENvbmZpZyhjb25maWdfZmlsZSwgYWx3YXlzX3RydWUpOworICBpZiAoIXNvbmFtZXMpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyIsIHNvbmFtZXMuZXJyb3IoKS5tZXNzYWdlKCkuY19zdHIoKSk7CisgICAgcmV0dXJuICIiOworICB9CisgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpKb2luKCpzb25hbWVzLCAnOicpOwogfQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgSW5pdFZuZGtzcExpYnJhcmllcygpIHsKICAgc3RkOjpzdHJpbmcgY29uZmlnX2ZpbGUgPSBrVm5ka0xpYnJhcmllc0ZpbGU7CiAgIEluc2VydFZuZGtWZXJzaW9uU3RyKCZjb25maWdfZmlsZSk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzb25hbWVzOwotICBSZWFkQ29uZmlnKGNvbmZpZ19maWxlLCAmc29uYW1lcywgYWx3YXlzX3RydWUsIG51bGxwdHIpOwotICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6Sm9pbihzb25hbWVzLCAnOicpOworICBhdXRvIHNvbmFtZXMgPSBSZWFkQ29uZmlnKGNvbmZpZ19maWxlLCBhbHdheXNfdHJ1ZSk7CisgIGlmICghc29uYW1lcykgeworICAgIExPR19BTFdBWVNfRkFUQUwoIiVzIiwgc29uYW1lcy5lcnJvcigpLm1lc3NhZ2UoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkpvaW4oKnNvbmFtZXMsICc6Jyk7CiB9CiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBJbml0TmV1cmFsTmV0d29ya3NQdWJsaWNMaWJyYXJpZXMoKSB7CmRpZmYgLS1naXQgYS9zaGVsbF9hbmRfdXRpbGl0aWVzL0FuZHJvaWQuYnAgYi9zaGVsbF9hbmRfdXRpbGl0aWVzL0FuZHJvaWQuYnAKaW5kZXggYmFjM2RjMy4uNjk0YjUwZSAxMDA2NDQKLS0tIGEvc2hlbGxfYW5kX3V0aWxpdGllcy9BbmRyb2lkLmJwCisrKyBiL3NoZWxsX2FuZF91dGlsaXRpZXMvQW5kcm9pZC5icApAQCAtMTMsNiArMTMsNyBAQAogICAgICAgICAiYXVkaXRjdGwiLAogICAgICAgICAiYXdrIiwKICAgICAgICAgImJ6aXAyIiwKKyAgICAgICAgImxkZCIsCiAgICAgICAgICJsb2d3cmFwcGVyIiwKICAgICAgICAgIm1pbmkta2V5Y3RsIiwKICAgICAgICAgIm1rc2hyYyIsCg==