ZGlmZiAtLWdpdCBhL1RFU1RfTUFQUElORyBiL1RFU1RfTUFQUElORwppbmRleCA2NmQwYzkyLi5hM2JkNDRmIDEwMDY0NAotLS0gYS9URVNUX01BUFBJTkcKKysrIGIvVEVTVF9NQVBQSU5HCkBAIC0xOSw2ICsxOSw5IEBACiAgICAgICAibmFtZSI6ICJsaWJiYXNlX3Rlc3QiCiAgICAgfSwKICAgICB7CisgICAgICAibmFtZSI6ICJsaWJwYWNrYWdlbGlzdHBhcnNlcl90ZXN0IgorICAgIH0sCisgICAgewogICAgICAgIm5hbWUiOiAibGlicHJvY2luZm9fdGVzdCIKICAgICB9LAogICAgIHsKZGlmZiAtLWdpdCBhL2FkYi9BbmRyb2lkLmJwIGIvYWRiL0FuZHJvaWQuYnAKaW5kZXggNDdkYWZmZi4uMDZjZmNiZiAxMDA2NDQKLS0tIGEvYWRiL0FuZHJvaWQuYnAKKysrIGIvYWRiL0FuZHJvaWQuYnAKQEAgLTI3LDYgKzI3LDcgQEAKICAgICAgICAgIi1EQURCX0hPU1Q9MSIsICAgICAgICAgLy8gb3ZlcnJpZGRlbiBieSBhZGJkX2RlZmF1bHRzCiAgICAgICAgICItREFMTE9XX0FEQkRfUk9PVD0wIiwgIC8vIG92ZXJyaWRkZW4gYnkgYWRiZF9kZWZhdWx0cwogICAgICAgICAiLURBTkRST0lEX0JBU0VfVU5JUVVFX0ZEX0RJU0FCTEVfSU1QTElDSVRfQ09OVkVSU0lPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0ZBU1RERVBMT1k9MSIsIC8vIGVuYWJsZSBmYXN0IGRlcGxveQogICAgIF0sCiAgICAgY3BwX3N0ZDogImV4cGVyaW1lbnRhbCIsCiAKQEAgLTI3MCwyMiArMjcxLDMzIEBACiAgICAgICAgICJjbGllbnQvY29uc29sZS5jcHAiLAogICAgICAgICAiY2xpZW50L2FkYl9pbnN0YWxsLmNwcCIsCiAgICAgICAgICJjbGllbnQvbGluZV9wcmludGVyLmNwcCIsCisgICAgICAgICJjbGllbnQvZmFzdGRlcGxveS5jcHAiLAorICAgICAgICAiY2xpZW50L2Zhc3RkZXBsb3ljYWxsYmFja3MuY3BwIiwKICAgICAgICAgInNoZWxsX3NlcnZpY2VfcHJvdG9jb2wuY3BwIiwKICAgICBdLAogCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICAgICAgImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgICAgICJiaW4yY19mYXN0ZGVwbG95YWdlbnRzY3JpcHQiCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhZGJfaG9zdCIsCisgICAgICAgICJsaWJhbmRyb2lkZnciLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliY3J5cHRvX3V0aWxzIiwKICAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJmYXN0ZGVwbG95X2hvc3QiLAogICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZG5zc2QiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlidXNiIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliemlwYXJjaGl2ZSIsCisgICAgICAgICJsaWJ6IiwKICAgICBdLAogCiAgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCkBAIC0yOTUsMTAgKzMwNyw2IEBACiAgICAgLy8gd2lsbCB2aW9sYXRlIE9EUgogICAgIHNoYXJlZF9saWJzOiBbXSwKIAotICAgIHJlcXVpcmVkOiBbCi0gICAgICAgICJkZXBsb3lwYXRjaGdlbmVyYXRvciIsCi0gICAgXSwKLQogICAgIC8vIEFyY2hpdmUgYWRiLCBhZGIuZXhlLgogICAgIGRpc3Q6IHsKICAgICAgICAgdGFyZ2V0czogWwpAQCAtNjU4LDMgKzY2Niw5MCBAQAogICAgICAgICB9LAogICAgIH0sCiB9CisKKy8vIE5vdGU6IHVzaW5nIHBpcGUgZm9yIHh4ZCB0byBjb250cm9sIHRoZSB2YXJpYWJsZSBuYW1lIGdlbmVyYXRlZAorLy8gdGhlIGRlZmF1bHQgbmFtZSB1c2VkIGJ5IHh4ZCBpcyB0aGUgcGF0aCB0byB0aGUgaW5wdXQgZmlsZS4KK2phdmFfZ2VucnVsZSB7CisgICAgbmFtZTogImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgb3V0OiBbImRlcGxveWFnZW50LmluYyJdLAorICAgIHNyY3M6IFsiOmRlcGxveWFnZW50Il0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiYmluMmNfZmFzdGRlcGxveWFnZW50c2NyaXB0IiwKKyAgICBvdXQ6IFsiZGVwbG95YWdlbnRzY3JpcHQuaW5jIl0sCisgICAgc3JjczogWyJmYXN0ZGVwbG95L2RlcGxveWFnZW50L2RlcGxveWFnZW50LnNoIl0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50U2NyaXB0W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitjY19saWJyYXJ5X2hvc3Rfc3RhdGljIHsKKyAgICBuYW1lOiAibGliZmFzdGRlcGxveV9ob3N0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucHJvdG8iLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFkYl9ob3N0IiwKKyAgICAgICAgImxpYmFuZHJvaWRmdyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjcnlwdG9fdXRpbHMiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmRpYWdub3NlX3VzYiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICB9LAorICAgIHRhcmdldDogeworICAgICAgICB3aW5kb3dzOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsiQWRiV2luQXBpIl0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZmFzdGRlcGxveV90ZXN0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAiLAorICAgICAgICAiZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWRiX2hvc3QiLAorICAgICAgICAibGliYW5kcm9pZGZ3IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNyeXB0b191dGlscyIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKKyAgICAgICAgImxpYmZhc3RkZXBsb3lfaG9zdCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIHdpbmRvd3M6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgICAgICBzaGFyZWRfbGliczogWyJBZGJXaW5BcGkiXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGRhdGE6IFsKKyAgICAgICAgImZhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2FkYi9hZGIuY3BwIGIvYWRiL2FkYi5jcHAKaW5kZXggMjRkNDI5Mi4uN2RmZjFiOCAxMDA2NDQKLS0tIGEvYWRiL2FkYi5jcHAKKysrIGIvYWRiL2FkYi5jcHAKQEAgLTEyNDMsMTEgKzEyNDMsNyBAQAogICAgIC8vIFRPRE86IFN3aXRjaCBoYW5kbGVfZm9yd2FyZF9yZXF1ZXN0IHRvIHN0cmluZ192aWV3LgogICAgIHN0ZDo6c3RyaW5nIHNlcnZpY2Vfc3RyKHNlcnZpY2UpOwogICAgIGlmIChoYW5kbGVfZm9yd2FyZF9yZXF1ZXN0KAotICAgICAgICAgICAgICAgIHNlcnZpY2Vfc3RyLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgWz1dKHN0ZDo6c3RyaW5nKiBlcnJvcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNxdWlyZV9vbmVfdHJhbnNwb3J0KHR5cGUsIHNlcmlhbCwgdHJhbnNwb3J0X2lkLCBudWxscHRyLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICByZXBseV9mZCkpIHsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlX3N0ci5jX3N0cigpLCBbPV0oc3RkOjpzdHJpbmcqIGVycm9yKSB7IHJldHVybiBzLT50cmFuc3BvcnQ7IH0sIHJlcGx5X2ZkKSkgewogICAgICAgICByZXR1cm4gSG9zdFJlcXVlc3RSZXN1bHQ6OkhhbmRsZWQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9hZGIvYWRiX3V0aWxzLmNwcCBiL2FkYi9hZGJfdXRpbHMuY3BwCmluZGV4IGNmNWZiYzguLmQxOTEwZjEgMTAwNjQ0Ci0tLSBhL2FkYi9hZGJfdXRpbHMuY3BwCisrKyBiL2FkYi9hZGJfdXRpbHMuY3BwCkBAIC0zMjAsNiArMzIwLDEwIEBACiB9CiAKIHN0ZDo6c3RyaW5nIEdldExvZ0ZpbGVQYXRoKCkgeworICAgIC8vIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vMTEyNTg4NDkzCisgICAgY29uc3QgY2hhciogcGF0aCA9IGdldGVudigiQU5EUk9JRF9BREJfTE9HX1BBVEgiKTsKKyAgICBpZiAocGF0aCkgcmV0dXJuIHBhdGg7CisKICNpZiBkZWZpbmVkKF9XSU4zMikKICAgICBjb25zdCBjaGFyIGxvZ19uYW1lW10gPSAiYWRiLmxvZyI7CiAgICAgV0NIQVIgdGVtcF9wYXRoW01BWF9QQVRIXTsKZGlmZiAtLWdpdCBhL2FkYi9jbGllbnQvYWRiX2NsaWVudC5jcHAgYi9hZGIvY2xpZW50L2FkYl9jbGllbnQuY3BwCmluZGV4IDdlNDA4YTguLmQ5MWFlMzUgMTAwNjQ0Ci0tLSBhL2FkYi9jbGllbnQvYWRiX2NsaWVudC5jcHAKKysrIGIvYWRiL2NsaWVudC9hZGJfY2xpZW50LmNwcApAQCAtMTQ5LDcgKzE0OSw4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW50IF9hZGJfY29ubmVjdChzdGQ6OnN0cmluZ192aWV3IHNlcnZpY2UsIFRyYW5zcG9ydElkKiB0cmFuc3BvcnQsIHN0ZDo6c3RyaW5nKiBlcnJvcikgeworc3RhdGljIGludCBfYWRiX2Nvbm5lY3Qoc3RkOjpzdHJpbmdfdmlldyBzZXJ2aWNlLCBUcmFuc3BvcnRJZCogdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyogZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX3N3aXRjaCA9IGZhbHNlKSB7CiAgICAgTE9HKERFQlVHKSA8PCAiX2FkYl9jb25uZWN0OiAiIDw8IHNlcnZpY2U7CiAgICAgaWYgKHNlcnZpY2UuZW1wdHkoKSB8fCBzZXJ2aWNlLnNpemUoKSA+IE1BWF9QQVlMT0FEKSB7CiAgICAgICAgICplcnJvciA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiYmFkIHNlcnZpY2UgbmFtZSBsZW5ndGggKCV6ZCkiLCBzZXJ2aWNlLnNpemUoKSk7CkBAIC0xNjQsNyArMTY1LDcgQEAKICAgICAgICAgcmV0dXJuIC0yOwogICAgIH0KIAotICAgIGlmICghc2VydmljZS5zdGFydHNfd2l0aCgiaG9zdCIpKSB7CisgICAgaWYgKCFzZXJ2aWNlLnN0YXJ0c193aXRoKCJob3N0IikgfHwgZm9yY2Vfc3dpdGNoKSB7CiAgICAgICAgIHN0ZDo6b3B0aW9uYWw8VHJhbnNwb3J0SWQ+IHRyYW5zcG9ydF9yZXN1bHQgPSBzd2l0Y2hfc29ja2V0X3RyYW5zcG9ydChmZC5nZXQoKSwgZXJyb3IpOwogICAgICAgICBpZiAoIXRyYW5zcG9ydF9yZXN1bHQpIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTMyMyw3ICszMjQsOCBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWludCBhZGJfY29ubmVjdChUcmFuc3BvcnRJZCogdHJhbnNwb3J0LCBzdGQ6OnN0cmluZ192aWV3IHNlcnZpY2UsIHN0ZDo6c3RyaW5nKiBlcnJvcikgeworaW50IGFkYl9jb25uZWN0KFRyYW5zcG9ydElkKiB0cmFuc3BvcnQsIHN0ZDo6c3RyaW5nX3ZpZXcgc2VydmljZSwgc3RkOjpzdHJpbmcqIGVycm9yLAorICAgICAgICAgICAgICAgIGJvb2wgZm9yY2Vfc3dpdGNoX2RldmljZSkgewogICAgIExPRyhERUJVRykgPDwgImFkYl9jb25uZWN0OiBzZXJ2aWNlOiAiIDw8IHNlcnZpY2U7CiAKICAgICAvLyBRdWVyeSB0aGUgYWRiIHNlcnZlcidzIHZlcnNpb24uCkBAIC0zMzYsNyArMzM4LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdW5pcXVlX2ZkIGZkKF9hZGJfY29ubmVjdChzZXJ2aWNlLCB0cmFuc3BvcnQsIGVycm9yKSk7CisgICAgdW5pcXVlX2ZkIGZkKF9hZGJfY29ubmVjdChzZXJ2aWNlLCB0cmFuc3BvcnQsIGVycm9yLCBmb3JjZV9zd2l0Y2hfZGV2aWNlKSk7CiAgICAgaWYgKGZkID09IC0xKSB7CiAgICAgICAgIEQoIl9hZGJfY29ubmVjdCBlcnJvcjogJXMiLCBlcnJvci0+Y19zdHIoKSk7CiAgICAgfSBlbHNlIGlmKGZkID09IC0yKSB7CkBAIC0zOTgsOSArNDAwLDE1IEBACiB9CiAKIGJvb2wgYWRiX2dldF9mZWF0dXJlX3NldChGZWF0dXJlU2V0KiBmZWF0dXJlX3NldCwgc3RkOjpzdHJpbmcqIGVycm9yKSB7Ci0gICAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICAgIGlmIChhZGJfcXVlcnkoZm9ybWF0X2hvc3RfY29tbWFuZCgiZmVhdHVyZXMiKSwgJnJlc3VsdCwgZXJyb3IpKSB7Ci0gICAgICAgICpmZWF0dXJlX3NldCA9IFN0cmluZ1RvRmVhdHVyZVNldChyZXN1bHQpOworICAgIHN0YXRpYyBGZWF0dXJlU2V0KiBmZWF0dXJlcyA9IG51bGxwdHI7CisgICAgaWYgKCFmZWF0dXJlcykgeworICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICAgIGlmIChhZGJfcXVlcnkoZm9ybWF0X2hvc3RfY29tbWFuZCgiZmVhdHVyZXMiKSwgJnJlc3VsdCwgZXJyb3IpKSB7CisgICAgICAgICAgICBmZWF0dXJlcyA9IG5ldyBGZWF0dXJlU2V0KFN0cmluZ1RvRmVhdHVyZVNldChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmVhdHVyZXMpIHsKKyAgICAgICAgKmZlYXR1cmVfc2V0ID0gKmZlYXR1cmVzOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgZmVhdHVyZV9zZXQtPmNsZWFyKCk7CmRpZmYgLS1naXQgYS9hZGIvY2xpZW50L2FkYl9jbGllbnQuaCBiL2FkYi9jbGllbnQvYWRiX2NsaWVudC5oCmluZGV4IGZlMWU1ODQuLmJhNTMwNDEgMTAwNjQ0Ci0tLSBhL2FkYi9jbGllbnQvYWRiX2NsaWVudC5oCisrKyBiL2FkYi9jbGllbnQvYWRiX2NsaWVudC5oCkBAIC0zNCw3ICszNCwxMSBAQAogaW50IGFkYl9jb25uZWN0KHN0ZDo6c3RyaW5nX3ZpZXcgc2VydmljZSwgc3RkOjpzdHJpbmcqIF9Ob25udWxsIGVycm9yKTsKIAogLy8gU2FtZSBhcyBhYm92ZSwgZXhjZXB0IHJldHVybmluZyB0aGUgVHJhbnNwb3J0SWQgZm9yIHRoZSBzZXJ2aWNlIHRoYXQgd2UndmUgY29ubmVjdGVkIHRvLgotaW50IGFkYl9jb25uZWN0KFRyYW5zcG9ydElkKiBfTnVsbGFibGUgaWQsIHN0ZDo6c3RyaW5nX3ZpZXcgc2VydmljZSwgc3RkOjpzdHJpbmcqIF9Ob25udWxsIGVycm9yKTsKKy8vIGZvcmNlX3N3aXRjaF9kZXZpY2UgZm9yY2VzIHRoZSBmdW5jdGlvbiB0byBhdHRlbXB0IHRvIHNlbGVjdCBhIGRldmljZSwgZXZlbiBpZiB0aGUgc2VydmljZQorLy8gc3RyaW5nIGFwcGVhcnMgdG8gYmUgYSBob3N0OiBzZXJ2aWNlIChmb3IgdXNlIHdpdGggaG9zdCBzZXJ2aWNlcyB0aGF0IGFyZSBkZXZpY2Ugc3BlY2lmaWMsIGxpa2UKKy8vIGZvcndhcmQpLgoraW50IGFkYl9jb25uZWN0KFRyYW5zcG9ydElkKiBfTnVsbGFibGUgaWQsIHN0ZDo6c3RyaW5nX3ZpZXcgc2VydmljZSwgc3RkOjpzdHJpbmcqIF9Ob25udWxsIGVycm9yLAorICAgICAgICAgICAgICAgIGJvb2wgZm9yY2Vfc3dpdGNoX2RldmljZSA9IGZhbHNlKTsKIAogLy8gS2lsbCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgYWRiIHNlcnZlciwgaWYgaXQgZXhpc3RzLgogYm9vbCBhZGJfa2lsbF9zZXJ2ZXIoKTsKZGlmZiAtLWdpdCBhL2FkYi9jbGllbnQvYWRiX2luc3RhbGwuY3BwIGIvYWRiL2NsaWVudC9hZGJfaW5zdGFsbC5jcHAKaW5kZXggMTZmYTIxNS4uYTZlODk5OCAxMDA2NDQKLS0tIGEvYWRiL2NsaWVudC9hZGJfaW5zdGFsbC5jcHAKKysrIGIvYWRiL2NsaWVudC9hZGJfaW5zdGFsbC5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgImFkYl9pbnN0YWxsLmgiCiAKKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC00MCwxOCArNDEsMzEgQEAKIHN0YXRpYyBjb25zdGV4cHIgaW50IGtGYXN0RGVwbG95TWluQXBpID0gMjQ7CiAjZW5kaWYKIAorbmFtZXNwYWNlIHsKKworZW51bSBJbnN0YWxsTW9kZSB7CisgICAgSU5TVEFMTF9ERUZBVUxULAorICAgIElOU1RBTExfUFVTSCwKKyAgICBJTlNUQUxMX1NUUkVBTSwKK307CisKK30KKwogc3RhdGljIGJvb2wgY2FuX3VzZV9mZWF0dXJlKGNvbnN0IGNoYXIqIGZlYXR1cmUpIHsKICAgICBGZWF0dXJlU2V0IGZlYXR1cmVzOwogICAgIHN0ZDo6c3RyaW5nIGVycm9yOwogICAgIGlmICghYWRiX2dldF9mZWF0dXJlX3NldCgmZmVhdHVyZXMsICZlcnJvcikpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXNcbiIsIGVycm9yLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gQ2FuVXNlRmVhdHVyZShmZWF0dXJlcywgZmVhdHVyZSk7CiB9CiAKLXN0YXRpYyBib29sIHVzZV9sZWdhY3lfaW5zdGFsbCgpIHsKLSAgICByZXR1cm4gIWNhbl91c2VfZmVhdHVyZShrRmVhdHVyZUNtZCk7CitzdGF0aWMgSW5zdGFsbE1vZGUgYmVzdF9pbnN0YWxsX21vZGUoKSB7CisgICAgaWYgKGNhbl91c2VfZmVhdHVyZShrRmVhdHVyZUNtZCkpIHsKKyAgICAgICAgcmV0dXJuIElOU1RBTExfU1RSRUFNOworICAgIH0KKyAgICByZXR1cm4gSU5TVEFMTF9QVVNIOwogfQogCiBzdGF0aWMgYm9vbCBpc19hcGV4X3N1cHBvcnRlZCgpIHsKQEAgLTExMiw3ICsxMjYsNyBAQAogfQogCiBpbnQgdW5pbnN0YWxsX2FwcChpbnQgYXJnYywgY29uc3QgY2hhcioqIGFyZ3YpIHsKLSAgICBpZiAodXNlX2xlZ2FjeV9pbnN0YWxsKCkpIHsKKyAgICBpZiAoYmVzdF9pbnN0YWxsX21vZGUoKSA9PSBJTlNUQUxMX1BVU0gpIHsKICAgICAgICAgcmV0dXJuIHVuaW5zdGFsbF9hcHBfbGVnYWN5KGFyZ2MsIGFyZ3YpOwogICAgIH0KICAgICByZXR1cm4gdW5pbnN0YWxsX2FwcF9zdHJlYW1lZChhcmdjLCBhcmd2KTsKQEAgLTIwMCwzMiArMjE0LDQ5IEBACiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgfQogCisjaWZkZWYgX19saW51eF9fCisgICAgICAgIHBvc2l4X2ZhZHZpc2UobG9jYWxfZmQuZ2V0KCksIDAsIDAsIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCB8IFBPU0lYX0ZBRFZfTk9SRVVTRSk7CisjZW5kaWYKKworICAgICAgICBjb25zdCBib29sIHVzZV9hYmIgPSBjYW5fdXNlX2ZlYXR1cmUoa0ZlYXR1cmVBYmIpOwogICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcjsKLSAgICAgICAgc3RkOjpzdHJpbmcgY21kID0gImV4ZWM6Y21kIHBhY2thZ2UiOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY21kX2FyZ3MgPSB7dXNlX2FiYiA/ICJwYWNrYWdlIiA6ICJleGVjOmNtZCBwYWNrYWdlIn07CisgICAgICAgIGNtZF9hcmdzLnJlc2VydmUoYXJnYyArIDMpOwogCiAgICAgICAgIC8vIGRvbid0IGNvcHkgdGhlIEFQSyBuYW1lLCBidXQsIGNvcHkgdGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBhcy1pcwogICAgICAgICB3aGlsZSAoYXJnYy0tID4gMSkgewotICAgICAgICAgICAgY21kICs9ICIgIiArIGVzY2FwZV9hcmcoc3RkOjpzdHJpbmcoKmFyZ3YrKykpOworICAgICAgICAgICAgaWYgKHVzZV9hYmIpIHsKKyAgICAgICAgICAgICAgICBjbWRfYXJncy5wdXNoX2JhY2soKmFyZ3YrKyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNtZF9hcmdzLnB1c2hfYmFjayhlc2NhcGVfYXJnKCphcmd2KyspKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIGFkZCBzaXplIHBhcmFtZXRlciBbcmVxdWlyZWQgZm9yIHN0cmVhbWluZyBpbnN0YWxsc10KICAgICAgICAgLy8gZG8gbGFzdCB0byBvdmVycmlkZSBhbnkgdXNlciBzcGVjaWZpZWQgdmFsdWUKLSAgICAgICAgY21kICs9ICIgIiArIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiLVMgJSIgUFJJdTY0LCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc2Iuc3Rfc2l6ZSkpOworICAgICAgICBjbWRfYXJncy5wdXNoX2JhY2soIi1TIik7CisgICAgICAgIGNtZF9hcmdzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIiUiIFBSSXU2NCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHNiLnN0X3NpemUpKSk7CiAKICAgICAgICAgaWYgKGlzX2FwZXgpIHsKLSAgICAgICAgICAgIGNtZCArPSAiIC0tYXBleCI7CisgICAgICAgICAgICBjbWRfYXJncy5wdXNoX2JhY2soIi0tYXBleCIpOwogICAgICAgICB9CiAKLSAgICAgICAgdW5pcXVlX2ZkIHJlbW90ZV9mZChhZGJfY29ubmVjdChjbWQsICZlcnJvcikpOworICAgICAgICB1bmlxdWVfZmQgcmVtb3RlX2ZkOworICAgICAgICBpZiAodXNlX2FiYikgeworICAgICAgICAgICAgcmVtb3RlX2ZkID0gc2VuZF9hYmJfZXhlY19jb21tYW5kKGNtZF9hcmdzLCAmZXJyb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVtb3RlX2ZkLnJlc2V0KGFkYl9jb25uZWN0KGFuZHJvaWQ6OmJhc2U6OkpvaW4oY21kX2FyZ3MsICIgIiksICZlcnJvcikpOworICAgICAgICB9CiAgICAgICAgIGlmIChyZW1vdGVfZmQgPCAwKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFkYjogY29ubmVjdCBlcnJvciBmb3Igd3JpdGU6ICVzXG4iLCBlcnJvci5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9CiAKLSAgICAgICAgY2hhciBidWZbQlVGU0laXTsKICAgICAgICAgY29weV90b19maWxlKGxvY2FsX2ZkLmdldCgpLCByZW1vdGVfZmQuZ2V0KCkpOwotICAgICAgICByZWFkX3N0YXR1c19saW5lKHJlbW90ZV9mZC5nZXQoKSwgYnVmLCBzaXplb2YoYnVmKSk7CiAKKyAgICAgICAgY2hhciBidWZbQlVGU0laXTsKKyAgICAgICAgcmVhZF9zdGF0dXNfbGluZShyZW1vdGVfZmQuZ2V0KCksIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogICAgICAgICBpZiAoIXN0cm5jbXAoIlN1Y2Nlc3MiLCBidWYsIDcpKSB7CiAgICAgICAgICAgICBmcHV0cyhidWYsIHN0ZG91dCk7CiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTI1Niw4ICsyODcsNyBAQAogCiAgICAgaW50IHJlc3VsdCA9IC0xOwogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBhcGtfZmlsZSA9IHthcmd2W2xhc3RfYXBrXX07Ci0gICAgc3RkOjpzdHJpbmcgYXBrX2Rlc3QgPQotICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC8iICsgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoYXJndltsYXN0X2Fwa10pOworICAgIHN0ZDo6c3RyaW5nIGFwa19kZXN0ID0gIi9kYXRhL2xvY2FsL3RtcC8iICsgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoYXJndltsYXN0X2Fwa10pOwogCiAgICAgaWYgKHVzZV9mYXN0ZGVwbG95ID09IHRydWUpIHsKICNpZiBkZWZpbmVkKEVOQUJMRV9GQVNUREVQTE9ZKQpAQCAtMjkyLDExICszMjIsNyBAQAogCiBpbnQgaW5zdGFsbF9hcHAoaW50IGFyZ2MsIGNvbnN0IGNoYXIqKiBhcmd2KSB7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBwcm9jZXNzZWRBcmdJbmRpY2llczsKLSAgICBlbnVtIGluc3RhbGxNb2RlIHsKLSAgICAgICAgSU5TVEFMTF9ERUZBVUxULAotICAgICAgICBJTlNUQUxMX1BVU0gsCi0gICAgICAgIElOU1RBTExfU1RSRUFNCi0gICAgfSBpbnN0YWxsTW9kZSA9IElOU1RBTExfREVGQVVMVDsKKyAgICBJbnN0YWxsTW9kZSBpbnN0YWxsTW9kZSA9IElOU1RBTExfREVGQVVMVDsKICAgICBib29sIHVzZV9mYXN0ZGVwbG95ID0gZmFsc2U7CiAgICAgYm9vbCBpc19yZWluc3RhbGwgPSBmYWxzZTsKICAgICBib29sIHVzZV9sb2NhbGFnZW50ID0gZmFsc2U7CkBAIC0zMzcsMTQgKzM2MywxMCBAQAogICAgIH0KIAogICAgIGlmIChpbnN0YWxsTW9kZSA9PSBJTlNUQUxMX0RFRkFVTFQpIHsKLSAgICAgICAgaWYgKHVzZV9sZWdhY3lfaW5zdGFsbCgpKSB7Ci0gICAgICAgICAgICBpbnN0YWxsTW9kZSA9IElOU1RBTExfUFVTSDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluc3RhbGxNb2RlID0gSU5TVEFMTF9TVFJFQU07Ci0gICAgICAgIH0KKyAgICAgICAgaW5zdGFsbE1vZGUgPSBiZXN0X2luc3RhbGxfbW9kZSgpOwogICAgIH0KIAotICAgIGlmIChpbnN0YWxsTW9kZSA9PSBJTlNUQUxMX1NUUkVBTSAmJiB1c2VfbGVnYWN5X2luc3RhbGwoKSA9PSB0cnVlKSB7CisgICAgaWYgKGluc3RhbGxNb2RlID09IElOU1RBTExfU1RSRUFNICYmIGJlc3RfaW5zdGFsbF9tb2RlKCkgPT0gSU5TVEFMTF9QVVNIKSB7CiAgICAgICAgIGVycm9yX2V4aXQoIkF0dGVtcHRpbmcgdG8gdXNlIHN0cmVhbWluZyBpbnN0YWxsIG9uIHVuc3VwcG9ydGVkIGRldmljZSIpOwogICAgIH0KIApAQCAtNDA5LDcgKzQzMSw4IEBACiAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aElnbm9yZUNhc2UoZmlsZSwgIi5kbSIpIHx8CiAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aElnbm9yZUNhc2UoZmlsZSwgIi5mc3Zfc2lnIikpIHsKICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHNiOwotICAgICAgICAgICAgaWYgKHN0YXQoZmlsZSwgJnNiKSAhPSAtMSkgdG90YWxfc2l6ZSArPSBzYi5zdF9zaXplOworICAgICAgICAgICAgaWYgKHN0YXQoZmlsZSwgJnNiKSA9PSAtMSkgcGVycm9yX2V4aXQoImZhaWxlZCB0byBzdGF0IFwiJXNcIiIsIGZpbGUpOworICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBzYi5zdF9zaXplOwogICAgICAgICAgICAgZmlyc3RfYXBrID0gaTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDE5LDcgKzQ0Miw3IEBACiAgICAgaWYgKGZpcnN0X2FwayA9PSAtMSkgZXJyb3JfZXhpdCgibmVlZCBBUEsgZmlsZSBvbiBjb21tYW5kIGxpbmUiKTsKIAogICAgIHN0ZDo6c3RyaW5nIGluc3RhbGxfY21kOwotICAgIGlmICh1c2VfbGVnYWN5X2luc3RhbGwoKSkgeworICAgIGlmIChiZXN0X2luc3RhbGxfbW9kZSgpID09IElOU1RBTExfUFVTSCkgewogICAgICAgICBpbnN0YWxsX2NtZCA9ICJleGVjOnBtIjsKICAgICB9IGVsc2UgewogICAgICAgICBpbnN0YWxsX2NtZCA9ICJleGVjOmNtZCBwYWNrYWdlIjsKQEAgLTQ1OSwxMyArNDgyLDEzIEBACiAgICAgfQogCiAgICAgLy8gVmFsaWQgc2Vzc2lvbiwgbm93IHN0cmVhbSB0aGUgQVBLcwotICAgIGludCBzdWNjZXNzID0gMTsKKyAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwogICAgIGZvciAoaW50IGkgPSBmaXJzdF9hcGs7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgY29uc3QgY2hhciogZmlsZSA9IGFyZ3ZbaV07CiAgICAgICAgIHN0cnVjdCBzdGF0IHNiOwogICAgICAgICBpZiAoc3RhdChmaWxlLCAmc2IpID09IC0xKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFkYjogZmFpbGVkIHRvIHN0YXQgJXM6ICVzXG4iLCBmaWxlLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFkYjogZmFpbGVkIHRvIHN0YXQgXCIlc1wiOiAlc1xuIiwgZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICAgICAgIGdvdG8gZmluYWxpemVfc2Vzc2lvbjsKICAgICAgICAgfQogCkBAIC00NzYsOCArNDk5LDggQEAKIAogICAgICAgICB1bmlxdWVfZmQgbG9jYWxfZmQoYWRiX29wZW4oZmlsZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKICAgICAgICAgaWYgKGxvY2FsX2ZkIDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZGI6IGZhaWxlZCB0byBvcGVuICVzOiAlc1xuIiwgZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSAwOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZGI6IGZhaWxlZCB0byBvcGVuIFwiJXNcIjogJXNcbiIsIGZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgICAgICBnb3RvIGZpbmFsaXplX3Nlc3Npb247CiAgICAgICAgIH0KIApAQCAtNDg1LDcgKzUwOCw3IEBACiAgICAgICAgIHVuaXF1ZV9mZCByZW1vdGVfZmQoYWRiX2Nvbm5lY3QoY21kLCAmZXJyb3IpKTsKICAgICAgICAgaWYgKHJlbW90ZV9mZCA8IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWRiOiBjb25uZWN0IGVycm9yIGZvciB3cml0ZTogJXNcbiIsIGVycm9yLmNfc3RyKCkpOwotICAgICAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgICAgICBnb3RvIGZpbmFsaXplX3Nlc3Npb247CiAgICAgICAgIH0KIApAQCAtNDkzLDE1ICs1MTYsMTUgQEAKICAgICAgICAgcmVhZF9zdGF0dXNfbGluZShyZW1vdGVfZmQuZ2V0KCksIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCiAgICAgICAgIGlmIChzdHJuY21wKCJTdWNjZXNzIiwgYnVmLCA3KSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZGI6IGZhaWxlZCB0byB3cml0ZSAlc1xuIiwgZmlsZSk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFkYjogZmFpbGVkIHRvIHdyaXRlIFwiJXNcIlxuIiwgZmlsZSk7CiAgICAgICAgICAgICBmcHV0cyhidWYsIHN0ZGVycik7Ci0gICAgICAgICAgICBzdWNjZXNzID0gMDsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICAgICAgIGdvdG8gZmluYWxpemVfc2Vzc2lvbjsKICAgICAgICAgfQogICAgIH0KIAogZmluYWxpemVfc2Vzc2lvbjoKLSAgICAvLyBDb21taXQgc2Vzc2lvbiBpZiB3ZSBzdHJlYW1lZCBldmVyeXRoaW5nIG9rYXk7IG90aGVyd2lzZSBhYmFuZG9uCisgICAgLy8gQ29tbWl0IHNlc3Npb24gaWYgd2Ugc3RyZWFtZWQgZXZlcnl0aGluZyBva2F5OyBvdGhlcndpc2UgYWJhbmRvbi4KICAgICBzdGQ6OnN0cmluZyBzZXJ2aWNlID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIlcyBpbnN0YWxsLSVzICVkIiwgaW5zdGFsbF9jbWQuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPyAiY29tbWl0IiA6ICJhYmFuZG9uIiwgc2Vzc2lvbl9pZCk7CiAgICAgewpAQCAtNTEyLDE0ICs1MzUsMTYgQEAKICAgICAgICAgfQogICAgICAgICByZWFkX3N0YXR1c19saW5lKGZkLmdldCgpLCBidWYsIHNpemVvZihidWYpKTsKICAgICB9CisgICAgaWYgKCFzdWNjZXNzKSByZXR1cm4gRVhJVF9GQUlMVVJFOwogCi0gICAgaWYgKCFzdHJuY21wKCJTdWNjZXNzIiwgYnVmLCA3KSkgewotICAgICAgICBmcHV0cyhidWYsIHN0ZG91dCk7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChzdHJuY21wKCJTdWNjZXNzIiwgYnVmLCA3KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFkYjogZmFpbGVkIHRvIGZpbmFsaXplIHNlc3Npb25cbiIpOworICAgICAgICBmcHV0cyhidWYsIHN0ZGVycik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiAgICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAiYWRiOiBmYWlsZWQgdG8gZmluYWxpemUgc2Vzc2lvblxuIik7Ci0gICAgZnB1dHMoYnVmLCBzdGRlcnIpOwotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisKKyAgICBmcHV0cyhidWYsIHN0ZG91dCk7CisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKIH0KIAogaW50IGluc3RhbGxfbXVsdGlfcGFja2FnZShpbnQgYXJnYywgY29uc3QgY2hhcioqIGFyZ3YpIHsKQEAgLTU0Miw3ICs1NjcsNyBAQAogCiAgICAgaWYgKGZpcnN0X3BhY2thZ2UgPT0gLTEpIGVycm9yX2V4aXQoIm5lZWQgQVBLIG9yIEFQRVggZmlsZXMgb24gY29tbWFuZCBsaW5lIik7CiAKLSAgICBpZiAodXNlX2xlZ2FjeV9pbnN0YWxsKCkpIHsKKyAgICBpZiAoYmVzdF9pbnN0YWxsX21vZGUoKSA9PSBJTlNUQUxMX1BVU0gpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZGI6IG11bHRpLXBhY2thZ2UgaW5zdGFsbCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlXG4iKTsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9CkBAIC03MzksNiArNzY0LDIwIEBACiB9CiAKIGludCBkZWxldGVfZGV2aWNlX2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gICAgc3RkOjpzdHJpbmcgY21kID0gInJtIC1mICIgKyBlc2NhcGVfYXJnKGZpbGVuYW1lKTsKLSAgICByZXR1cm4gc2VuZF9zaGVsbF9jb21tYW5kKGNtZCk7CisgICAgLy8gaHR0cDovL2IvMTczMzkyMjcgIlNpZGVsb2FkaW5nIGEgUmVhZG9ubHkgRmlsZSBSZXN1bHRzIGluIGEgUHJvbXB0IHRvCisgICAgLy8gRGVsZXRlIiBjYXVzZWQgdXMgdG8gYWRkIGAtZmAgaGVyZSwgdG8gYXZvaWQgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGAtaWAKKyAgICAvLyBwcm9tcHQgdGhhdCB5b3UgZ2V0IGZyb20gQlNEIHJtICh1c2VkIGluIEFuZHJvaWQgNSkgaWYgeW91IGhhdmUgYQorICAgIC8vIG5vbi13cml0YWJsZSBmaWxlIGFuZCBzdGRpbiBpcyBhIHR0eSAod2hpY2ggaXMgdHJ1ZSBmb3Igb2xkIHZlcnNpb25zIG9mCisgICAgLy8gYWRiZCkuCisgICAgLy8KKyAgICAvLyBVbmZvcnR1bmF0ZWx5LCBgcm0gLWZgIHJlcXVpcmVzIEFuZHJvaWQgNC4zLCBzbyB0aGF0IHdvcmthcm91bmQgYnJva2UKKyAgICAvLyBlYXJsaWVyIEFuZHJvaWQgcmVsZWFzZXMuIFRoaXMgd2FzIHJlcG9ydGVkIGFzIGh0dHA6Ly9iLzM3NzA0Mzg0ICJhZGIKKyAgICAvLyBpbnN0YWxsIC1yIHBhc3NlcyBpbnZhbGlkIGFyZ3VtZW50IHRvIHJtIG9uIEFuZHJvaWQgNC4xIiBhbmQKKyAgICAvLyBodHRwOi8vYi8zNzAzNTgxNyAiQURCIEZhaWxzOiBybSBmYWlsZWQgZm9yIC1mLCBObyBzdWNoIGZpbGUgb3IKKyAgICAvLyBkaXJlY3RvcnkiLgorICAgIC8vCisgICAgLy8gVGVzdGluZyBvbiBhIHZhcmlldHkgb2YgZGV2aWNlcyBhbmQgZW11bGF0b3JzIHNob3dzIHRoYXQgcmVkaXJlY3RpbmcKKyAgICAvLyBzdGRpbiBpcyBzdWZmaWNpZW50IHRvIGF2b2lkIHRoZSBwc2V1ZG8tYC1pYCwgYW5kIHdvcmtzIG9uIHRvb2xib3gsCisgICAgLy8gQlNELCBhbmQgdG95Ym94IHZlcnNpb25zIG9mIHJtLgorICAgIHJldHVybiBzZW5kX3NoZWxsX2NvbW1hbmQoInJtICIgKyBlc2NhcGVfYXJnKGZpbGVuYW1lKSArICIgPC9kZXYvbnVsbCIpOwogfQpkaWZmIC0tZ2l0IGEvYWRiL2NsaWVudC9jb21tYW5kbGluZS5jcHAgYi9hZGIvY2xpZW50L2NvbW1hbmRsaW5lLmNwcAppbmRleCAxMWEzZGZkLi41OTllMGU2IDEwMDY0NAotLS0gYS9hZGIvY2xpZW50L2NvbW1hbmRsaW5lLmNwcAorKysgYi9hZGIvY2xpZW50L2NvbW1hbmRsaW5lLmNwcApAQCAtOTYsOSArOTYsOCBAQAogICAgICAgICAiIHZlcnNpb24gICAgICAgICAgICAgICAgICBzaG93IHZlcnNpb24gbnVtXG4iCiAgICAgICAgICJcbiIKICAgICAgICAgIm5ldHdvcmtpbmc6XG4iCi0gICAgICAgICIgY29ubmVjdCBIT1NUWzpQT1JUXSAgICAgIGNvbm5lY3QgdG8gYSBkZXZpY2UgdmlhIFRDUC9JUCBbZGVmYXVsdCBwb3J0PTU1NTVdXG4iCi0gICAgICAgICIgZGlzY29ubmVjdCBbSE9TVFs6UE9SVF1dXG4iCi0gICAgICAgICIgICAgIGRpc2Nvbm5lY3QgZnJvbSBnaXZlbiBUQ1AvSVAgZGV2aWNlIFtkZWZhdWx0IHBvcnQ9NTU1NV0sIG9yIGFsbFxuIgorICAgICAgICAiIGNvbm5lY3QgSE9TVFs6UE9SVF0gICAgICBjb25uZWN0IHRvIGEgZGV2aWNlIHZpYSBUQ1AvSVBcbiIKKyAgICAgICAgIiBkaXNjb25uZWN0IFtbSE9TVF06UE9SVF0gZGlzY29ubmVjdCBmcm9tIGdpdmVuIFRDUC9JUCBkZXZpY2UsIG9yIGFsbFxuIgogICAgICAgICAiIGZvcndhcmQgLS1saXN0ICAgICAgICAgICBsaXN0IGFsbCBmb3J3YXJkIHNvY2tldCBjb25uZWN0aW9uc1xuIgogICAgICAgICAiIGZvcndhcmQgWy0tbm8tcmViaW5kXSBMT0NBTCBSRU1PVEVcbiIKICAgICAgICAgIiAgICAgZm9yd2FyZCBzb2NrZXQgY29ubmVjdGlvbiB1c2luZzpcbiIKQEAgLTEzMCw3ICsxMjksNyBAQAogICAgICAgICAiICAgICAtYTogcHJlc2VydmUgZmlsZSB0aW1lc3RhbXAgYW5kIG1vZGVcbiIKICAgICAgICAgIiBzeW5jIFthbGx8ZGF0YXxvZG18b2VtfHByb2R1Y3R8c3lzdGVtfHN5c3RlbV9leHR8dmVuZG9yXVxuIgogICAgICAgICAiICAgICBzeW5jIGEgbG9jYWwgYnVpbGQgZnJvbSAkQU5EUk9JRF9QUk9EVUNUX09VVCB0byB0aGUgZGV2aWNlIChkZWZhdWx0IGFsbClcbiIKLSAgICAgICAgIiAgICAgLWw6IGxpc3QgYnV0IGRvbid0IGNvcHlcbiIKKyAgICAgICAgIiAgICAgLWw6IGxpc3QgZmlsZXMgdGhhdCB3b3VsZCBiZSBjb3BpZWQsIGJ1dCBkb24ndCBjb3B5IHRoZW1cbiIKICAgICAgICAgIlxuIgogICAgICAgICAic2hlbGw6XG4iCiAgICAgICAgICIgc2hlbGwgWy1lIEVTQ0FQRV0gWy1uXSBbLVR0XSBbLXhdIFtDT01NQU5ELi4uXVxuIgpAQCAtMTU0LDYgKzE1Myw3IEBACiAgICAgICAgICIgICAgIC1kOiBhbGxvdyB2ZXJzaW9uIGNvZGUgZG93bmdyYWRlIChkZWJ1Z2dhYmxlIHBhY2thZ2VzIG9ubHkpXG4iCiAgICAgICAgICIgICAgIC1wOiBwYXJ0aWFsIGFwcGxpY2F0aW9uIGluc3RhbGwgKGluc3RhbGwtbXVsdGlwbGUgb25seSlcbiIKICAgICAgICAgIiAgICAgLWc6IGdyYW50IGFsbCBydW50aW1lIHBlcm1pc3Npb25zXG4iCisgICAgICAgICIgICAgIC0tYWJpIEFCSTogb3ZlcnJpZGUgcGxhdGZvcm0ncyBkZWZhdWx0IEFCSVxuIgogICAgICAgICAiICAgICAtLWluc3RhbnQ6IGNhdXNlIHRoZSBhcHAgdG8gYmUgaW5zdGFsbGVkIGFzIGFuIGVwaGVtZXJhbCBpbnN0YWxsIGFwcFxuIgogICAgICAgICAiICAgICAtLW5vLXN0cmVhbWluZzogYWx3YXlzIHB1c2ggQVBLIHRvIGRldmljZSBhbmQgaW52b2tlIFBhY2thZ2UgTWFuYWdlciBhcyBzZXBhcmF0ZSBzdGVwc1xuIgogICAgICAgICAiICAgICAtLXN0cmVhbWluZzogZm9yY2Ugc3RyZWFtaW5nIEFQSyBkaXJlY3RseSBpbnRvIFBhY2thZ2UgTWFuYWdlclxuIgpAQCAtMTY1LDYgKzE2NSw3IEBACiAjaWZuZGVmIF9XSU4zMgogICAgICAgICAiICAgICAtLWxvY2FsLWFnZW50OiBsb2NhdGUgYWdlbnQgZmlsZXMgZnJvbSBsb2NhbCBzb3VyY2UgYnVpbGQgKGluc3RlYWQgb2YgU0RLIGxvY2F0aW9uKVxuIgogI2VuZGlmCisgICAgICAgICIgICAgIChTZWUgYWxzbyBgYWRiIHNoZWxsIHBtIGhlbHBgIGZvciBtb3JlIG9wdGlvbnMuKVxuIgogICAgICAgICAvL1RPRE8tLWluc3RhbGxsb2cgPGZpbGVuYW1lPgogICAgICAgICAiIHVuaW5zdGFsbCBbLWtdIFBBQ0tBR0VcbiIKICAgICAgICAgIiAgICAgcmVtb3ZlIHRoaXMgYXBwIHBhY2thZ2UgZnJvbSB0aGUgZGV2aWNlXG4iCkBAIC0zNTYsNyArMzU3LDcgQEAKIH0KIAogdm9pZCBjb3B5X3RvX2ZpbGUoaW50IGluRmQsIGludCBvdXRGZCkgewotICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZigzMiAqIDEwMjQpOworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1Zig2NCAqIDEwMjQpOwogICAgIGludCBsZW47CiAgICAgbG9uZyB0b3RhbCA9IDA7CiAgICAgaW50IG9sZF9zdGRpbl9tb2RlID0gLTE7CkBAIC0xNjE1LDEzICsxNjE2LDEzIEBACiAgICAgICAgIHJldHVybiBhZGJfcXVlcnlfY29tbWFuZChxdWVyeSk7CiAgICAgfQogICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgImNvbm5lY3QiKSkgewotICAgICAgICBpZiAoYXJnYyAhPSAyKSBlcnJvcl9leGl0KCJ1c2FnZTogYWRiIGNvbm5lY3QgPGhvc3Q+Wzo8cG9ydD5dIik7CisgICAgICAgIGlmIChhcmdjICE9IDIpIGVycm9yX2V4aXQoInVzYWdlOiBhZGIgY29ubmVjdCBIT1NUWzpQT1JUPl0iKTsKIAogICAgICAgICBzdGQ6OnN0cmluZyBxdWVyeSA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiaG9zdDpjb25uZWN0OiVzIiwgYXJndlsxXSk7CiAgICAgICAgIHJldHVybiBhZGJfcXVlcnlfY29tbWFuZChxdWVyeSk7CiAgICAgfQogICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgImRpc2Nvbm5lY3QiKSkgewotICAgICAgICBpZiAoYXJnYyA+IDIpIGVycm9yX2V4aXQoInVzYWdlOiBhZGIgZGlzY29ubmVjdCBbPGhvc3Q+Wzo8cG9ydD5dXSIpOworICAgICAgICBpZiAoYXJnYyA+IDIpIGVycm9yX2V4aXQoInVzYWdlOiBhZGIgZGlzY29ubmVjdCBbSE9TVFs6UE9SVF1dIik7CiAKICAgICAgICAgc3RkOjpzdHJpbmcgcXVlcnkgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoImhvc3Q6ZGlzY29ubmVjdDolcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdjID09IDIpID8gYXJndlsxXSA6ICIiKTsKQEAgLTE3MzgsNDEgKzE3MzksMzMgQEAKICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSA8aG9zdC1wcmVmaXg+IGZvciB0aGlzIGNvbW1hbmQuCiAgICAgICAgIHN0ZDo6c3RyaW5nIGhvc3RfcHJlZml4OwogICAgICAgICBpZiAocmV2ZXJzZSkgewotICAgICAgICAgICAgaG9zdF9wcmVmaXggPSAicmV2ZXJzZSI7CisgICAgICAgICAgICBob3N0X3ByZWZpeCA9ICJyZXZlcnNlOiI7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2VyaWFsKSB7Ci0gICAgICAgICAgICAgICAgaG9zdF9wcmVmaXggPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoImhvc3Qtc2VyaWFsOiVzIiwgc2VyaWFsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0ga1RyYW5zcG9ydFVzYikgewotICAgICAgICAgICAgICAgIGhvc3RfcHJlZml4ID0gImhvc3QtdXNiIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0ga1RyYW5zcG9ydExvY2FsKSB7Ci0gICAgICAgICAgICAgICAgaG9zdF9wcmVmaXggPSAiaG9zdC1sb2NhbCI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhvc3RfcHJlZml4ID0gImhvc3QiOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaG9zdF9wcmVmaXggPSAiaG9zdDoiOwogICAgICAgICB9CiAKICAgICAgICAgc3RkOjpzdHJpbmcgY21kLCBlcnJvcl9tZXNzYWdlOwogICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbMF0sICItLWxpc3QiKSA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoYXJnYyAhPSAxKSBlcnJvcl9leGl0KCItLWxpc3QgZG9lc24ndCB0YWtlIGFueSBhcmd1bWVudHMiKTsKLSAgICAgICAgICAgIHJldHVybiBhZGJfcXVlcnlfY29tbWFuZChob3N0X3ByZWZpeCArICI6bGlzdC1mb3J3YXJkIik7CisgICAgICAgICAgICByZXR1cm4gYWRiX3F1ZXJ5X2NvbW1hbmQoaG9zdF9wcmVmaXggKyAibGlzdC1mb3J3YXJkIik7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICItLXJlbW92ZS1hbGwiKSA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoYXJnYyAhPSAxKSBlcnJvcl9leGl0KCItLXJlbW92ZS1hbGwgZG9lc24ndCB0YWtlIGFueSBhcmd1bWVudHMiKTsKLSAgICAgICAgICAgIGNtZCA9IGhvc3RfcHJlZml4ICsgIjpraWxsZm9yd2FyZC1hbGwiOworICAgICAgICAgICAgY21kID0gImtpbGxmb3J3YXJkLWFsbCI7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICItLXJlbW92ZSIpID09IDApIHsKICAgICAgICAgICAgIC8vIGZvcndhcmQgLS1yZW1vdmUgPGxvY2FsPgogICAgICAgICAgICAgaWYgKGFyZ2MgIT0gMikgZXJyb3JfZXhpdCgiLS1yZW1vdmUgcmVxdWlyZXMgYW4gYXJndW1lbnQiKTsKLSAgICAgICAgICAgIGNtZCA9IGhvc3RfcHJlZml4ICsgIjpraWxsZm9yd2FyZDoiICsgYXJndlsxXTsKKyAgICAgICAgICAgIGNtZCA9IHN0ZDo6c3RyaW5nKCJraWxsZm9yd2FyZDoiKSArIGFyZ3ZbMV07CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICItLW5vLXJlYmluZCIpID09IDApIHsKICAgICAgICAgICAgIC8vIGZvcndhcmQgLS1uby1yZWJpbmQgPGxvY2FsPiA8cmVtb3RlPgogICAgICAgICAgICAgaWYgKGFyZ2MgIT0gMykgZXJyb3JfZXhpdCgiLS1uby1yZWJpbmQgdGFrZXMgdHdvIGFyZ3VtZW50cyIpOwogICAgICAgICAgICAgaWYgKGZvcndhcmRfdGFyZ2V0c19hcmVfdmFsaWQoYXJndlsxXSwgYXJndlsyXSwgJmVycm9yX21lc3NhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgY21kID0gaG9zdF9wcmVmaXggKyAiOmZvcndhcmQ6bm9yZWJpbmQ6IiArIGFyZ3ZbMV0gKyAiOyIgKyBhcmd2WzJdOworICAgICAgICAgICAgICAgIGNtZCA9IHN0ZDo6c3RyaW5nKCJmb3J3YXJkOm5vcmViaW5kOiIpICsgYXJndlsxXSArICI7IiArIGFyZ3ZbMl07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBmb3J3YXJkIDxsb2NhbD4gPHJlbW90ZT4KICAgICAgICAgICAgIGlmIChhcmdjICE9IDIpIGVycm9yX2V4aXQoImZvcndhcmQgdGFrZXMgdHdvIGFyZ3VtZW50cyIpOwogICAgICAgICAgICAgaWYgKGZvcndhcmRfdGFyZ2V0c19hcmVfdmFsaWQoYXJndlswXSwgYXJndlsxXSwgJmVycm9yX21lc3NhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgY21kID0gaG9zdF9wcmVmaXggKyAiOmZvcndhcmQ6IiArIGFyZ3ZbMF0gKyAiOyIgKyBhcmd2WzFdOworICAgICAgICAgICAgICAgIGNtZCA9IHN0ZDo6c3RyaW5nKCJmb3J3YXJkOiIpICsgYXJndlswXSArICI7IiArIGFyZ3ZbMV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTc4MCw3ICsxNzczLDcgQEAKICAgICAgICAgICAgIGVycm9yX2V4aXQoImVycm9yOiAlcyIsIGVycm9yX21lc3NhZ2UuY19zdHIoKSk7CiAgICAgICAgIH0KIAotICAgICAgICB1bmlxdWVfZmQgZmQoYWRiX2Nvbm5lY3QoY21kLCAmZXJyb3JfbWVzc2FnZSkpOworICAgICAgICB1bmlxdWVfZmQgZmQoYWRiX2Nvbm5lY3QobnVsbHB0ciwgaG9zdF9wcmVmaXggKyBjbWQsICZlcnJvcl9tZXNzYWdlLCB0cnVlKSk7CiAgICAgICAgIGlmIChmZCA8IDAgfHwgIWFkYl9zdGF0dXMoZmQuZ2V0KCksICZlcnJvcl9tZXNzYWdlKSkgewogICAgICAgICAgICAgZXJyb3JfZXhpdCgiZXJyb3I6ICVzIiwgZXJyb3JfbWVzc2FnZS5jX3N0cigpKTsKICAgICAgICAgfQpAQCAtMTg5MSw3ICsxODg0LDEwIEBACiAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJ0cmFjay1qZHdwIikpIHsKICAgICAgICAgcmV0dXJuIGFkYl9jb25uZWN0X2NvbW1hbmQoInRyYWNrLWpkd3AiKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInRyYWNrLWRldmljZXMiKSkgewotICAgICAgICByZXR1cm4gYWRiX2Nvbm5lY3RfY29tbWFuZCgiaG9zdDp0cmFjay1kZXZpY2VzIik7CisgICAgICAgIGlmIChhcmdjID4gMiB8fCAoYXJnYyA9PSAyICYmIHN0cmNtcChhcmd2WzFdLCAiLWwiKSkpIHsKKyAgICAgICAgICAgIGVycm9yX2V4aXQoInVzYWdlOiBhZGIgdHJhY2stZGV2aWNlcyBbLWxdIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkYl9jb25uZWN0X2NvbW1hbmQoYXJnYyA9PSAyID8gImhvc3Q6dHJhY2stZGV2aWNlcy1sIiA6ICJob3N0OnRyYWNrLWRldmljZXMiKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInJhdyIpKSB7CiAgICAgICAgIGlmIChhcmdjICE9IDIpIHsKICAgICAgICAgICAgIGVycm9yX2V4aXQoInVzYWdlOiBhZGIgcmF3IFNFUlZJQ0UiKTsKZGlmZiAtLWdpdCBhL2FkYi9jbGllbnQvY29tbWFuZGxpbmUuaCBiL2FkYi9jbGllbnQvY29tbWFuZGxpbmUuaAppbmRleCA2Y2ZkNGY3Li5jZDU5MzNhIDEwMDY0NAotLS0gYS9hZGIvY2xpZW50L2NvbW1hbmRsaW5lLmgKKysrIGIvYWRiL2NsaWVudC9jb21tYW5kbGluZS5oCkBAIC0xNyw3ICsxNywxMSBAQAogI2lmbmRlZiBDT01NQU5ETElORV9ICiAjZGVmaW5lIENPTU1BTkRMSU5FX0gKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisKICNpbmNsdWRlICJhZGIuaCIKKyNpbmNsdWRlICJhZGJfY2xpZW50LmgiCisjaW5jbHVkZSAiYWRiX3VuaXF1ZV9mZC5oIgogCiAvLyBDYWxsYmFjayB1c2VkIHRvIGhhbmRsZSB0aGUgc3RhbmRhcmQgc3RyZWFtcyAoc3Rkb3V0IGFuZCBzdGRlcnIpIHNlbnQgYnkgdGhlCiAvLyBkZXZpY2UncyB1cG9uIHJlY2VpdmluZyBhIGNvbW1hbmQuCkBAIC0xMDUsNCArMTA5LDE3IEBACiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tYW5kLCBib29sIGRpc2FibGVfc2hlbGxfcHJvdG9jb2wgPSBmYWxzZSwKICAgICAgICAgU3RhbmRhcmRTdHJlYW1zQ2FsbGJhY2tJbnRlcmZhY2UqIGNhbGxiYWNrID0gJkRFRkFVTFRfU1RBTkRBUkRfU1RSRUFNU19DQUxMQkFDSyk7CiAKKy8vIENvbm5lY3RzIHRvIHRoZSBkZXZpY2UgImFiYiIgc2VydmljZSB3aXRoIHxjb21tYW5kfCBhbmQgcmV0dXJucyB0aGUgZmQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyVD4KK3VuaXF1ZV9mZCBzZW5kX2FiYl9leGVjX2NvbW1hbmQoY29uc3QgQ29udGFpbmVyVCYgY29tbWFuZF9hcmdzLCBzdGQ6OnN0cmluZyogZXJyb3IpIHsKKyAgICBzdGQ6OnN0cmluZyBzZXJ2aWNlX3N0cmluZyA9ICJhYmJfZXhlYzoiICsgYW5kcm9pZDo6YmFzZTo6Sm9pbihjb21tYW5kX2FyZ3MsIEFCQl9BUkdfREVMSU1FVEVSKTsKKworICAgIHVuaXF1ZV9mZCBmZChhZGJfY29ubmVjdChzZXJ2aWNlX3N0cmluZywgZXJyb3IpKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWRiOiBmYWlsZWQgdG8gcnVuIGFiYl9leGVjLiBFcnJvcjogJXNcbiIsIGVycm9yLT5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHVuaXF1ZV9mZHt9OworICAgIH0KKyAgICByZXR1cm4gZmQ7Cit9CisKICNlbmRpZiAgLy8gQ09NTUFORExJTkVfSApkaWZmIC0tZ2l0IGEvYWRiL2NsaWVudC9mYXN0ZGVwbG95LmNwcCBiL2FkYi9jbGllbnQvZmFzdGRlcGxveS5jcHAKaW5kZXggZjRlODY2NC4uZmJhZTIxOSAxMDA2NDQKLS0tIGEvYWRiL2NsaWVudC9mYXN0ZGVwbG95LmNwcAorKysgYi9hZGIvY2xpZW50L2Zhc3RkZXBsb3kuY3BwCkBAIC0yNyw2ICsyNyw5IEBACiAjaW5jbHVkZSAiYW5kcm9pZGZ3L1ppcEZpbGVSTy5oIgogI2luY2x1ZGUgImNsaWVudC9maWxlX3N5bmNfY2xpZW50LmgiCiAjaW5jbHVkZSAiY29tbWFuZGxpbmUuaCIKKyNpbmNsdWRlICJkZXBsb3lhZ2VudC5pbmMiICAgICAgICAvLyBHZW5lcmF0ZWQgaW5jbHVkZSB2aWEgYnVpbGQgcnVsZS4KKyNpbmNsdWRlICJkZXBsb3lhZ2VudHNjcmlwdC5pbmMiICAvLyBHZW5lcmF0ZWQgaW5jbHVkZSB2aWEgYnVpbGQgcnVsZS4KKyNpbmNsdWRlICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuaCIKICNpbmNsdWRlICJmYXN0ZGVwbG95Y2FsbGJhY2tzLmgiCiAjaW5jbHVkZSAic3lzZGVwcy5oIgogCkBAIC0zNSw2ICszOCw4IEBACiBzdGF0aWMgY29uc3RleHByIGxvbmcga1JlcXVpcmVkQWdlbnRWZXJzaW9uID0gMHgwMDAwMDAwMjsKIAogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrRGV2aWNlQWdlbnRQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC8iOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrRGV2aWNlQWdlbnRGaWxlID0gIi9kYXRhL2xvY2FsL3RtcC9kZXBsb3lhZ2VudC5qYXIiOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrRGV2aWNlQWdlbnRTY3JpcHQgPSAiL2RhdGEvbG9jYWwvdG1wL2RlcGxveWFnZW50IjsKIAogc3RhdGljIGJvb2wgZ191c2VfbG9jYWxhZ2VudCA9IGZhbHNlOwogCkBAIC03MSw0NiArNzYsMzIgQEAKICAgICBnX3VzZV9sb2NhbGFnZW50ID0gdXNlX2xvY2FsYWdlbnQ7CiB9CiAKLS8vIGxvY2FsX3BhdGggLSBtdXN0IHN0YXJ0IHdpdGggYSAnLycgYW5kIGJlIHJlbGF0aXZlIHRvICRBTkRST0lEX1BST0RVQ1RfT1VUCi1zdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X2FnZW50X2NvbXBvbmVudF9ob3N0X3BhdGgoY29uc3QgY2hhciogbG9jYWxfcGF0aCwgY29uc3QgY2hhciogc2RrX3BhdGgpIHsKLSAgICBzdGQ6OnN0cmluZyBhZGJfZGlyID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGlmIChhZGJfZGlyLmVtcHR5KCkpIHsKLSAgICAgICAgZXJyb3JfZXhpdCgiQ291bGQgbm90IGRldGVybWluZSBsb2NhdGlvbiBvZiBhZGIhIik7Ci0gICAgfQotCi0gICAgaWYgKGdfdXNlX2xvY2FsYWdlbnQpIHsKLSAgICAgICAgY29uc3QgY2hhciogcHJvZHVjdF9vdXQgPSBnZXRlbnYoIkFORFJPSURfUFJPRFVDVF9PVVQiKTsKLSAgICAgICAgaWYgKHByb2R1Y3Rfb3V0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGVycm9yX2V4aXQoIkNvdWxkIG5vdCBsb2NhdGUgJXMgYmVjYXVzZSAkQU5EUk9JRF9QUk9EVUNUX09VVCBpcyBub3QgZGVmaW5lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIiVzJXMiLCBwcm9kdWN0X291dCwgbG9jYWxfcGF0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGFkYl9kaXIgKyBzZGtfcGF0aDsKLSAgICB9Ci19Ci0KIHN0YXRpYyBib29sIGRlcGxveV9hZ2VudChib29sIGNoZWNrVGltZVN0YW1wcykgewogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBzcmNzOwotICAgIHN0ZDo6c3RyaW5nIGphcl9wYXRoID0KLSAgICAgICAgICAgIGdldF9hZ2VudF9jb21wb25lbnRfaG9zdF9wYXRoKCIvc3lzdGVtL2ZyYW1ld29yay9kZXBsb3lhZ2VudC5qYXIiLCAiL2RlcGxveWFnZW50LmphciIpOwotICAgIHN0ZDo6c3RyaW5nIHNjcmlwdF9wYXRoID0KLSAgICAgICAgICAgIGdldF9hZ2VudF9jb21wb25lbnRfaG9zdF9wYXRoKCIvc3lzdGVtL2Jpbi9kZXBsb3lhZ2VudCIsICIvZGVwbG95YWdlbnQiKTsKLSAgICBzcmNzLnB1c2hfYmFjayhqYXJfcGF0aC5jX3N0cigpKTsKLSAgICBzcmNzLnB1c2hfYmFjayhzY3JpcHRfcGF0aC5jX3N0cigpKTsKLQotICAgIGlmIChkb19zeW5jX3B1c2goc3Jjcywga0RldmljZUFnZW50UGF0aCwgY2hlY2tUaW1lU3RhbXBzKSkgewotICAgICAgICAvLyBvbiB3aW5kb3dzIHRoZSBzaGVsbCBzY3JpcHQgbWlnaHQgaGF2ZSBsb3N0IGV4ZWN1dGUgcGVybWlzc2lvbgotICAgICAgICAvLyBzbyBuZWVkIHRvIHNldCB0aGlzIGV4cGxpY2l0bHkKLSAgICAgICAgY29uc3QgY2hhcioga0NobW9kQ29tbWFuZFBhdHRlcm4gPSAiY2htb2QgNzc3ICVzZGVwbG95YWdlbnQiOwotICAgICAgICBzdGQ6OnN0cmluZyBjaG1vZENvbW1hbmQgPQotICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZihrQ2htb2RDb21tYW5kUGF0dGVybiwga0RldmljZUFnZW50UGF0aCk7Ci0gICAgICAgIGludCByZXQgPSBzZW5kX3NoZWxsX2NvbW1hbmQoY2htb2RDb21tYW5kKTsKLSAgICAgICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgICAgICBlcnJvcl9leGl0KCJFcnJvciBleGVjdXRpbmcgJXMgcmV0dXJuY29kZTogJWQiLCBjaG1vZENvbW1hbmQuY19zdHIoKSwgcmV0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVycm9yX2V4aXQoIkVycm9yIHB1c2hpbmcgYWdlbnQgZmlsZXMgdG8gZGV2aWNlIik7CisgICAgLy8gVE9ETzogRGVwbG95IGFnZW50IGZyb20gYmluMmMgZGlyZWN0bHkgaW5zdGVhZCBvZiB3cml0aW5nIHRvIGRpc2sgZmlyc3QuCisgICAgVGVtcG9yYXJ5RmlsZSB0ZW1wQWdlbnQ7CisgICAgYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseSh0ZW1wQWdlbnQuZmQsIGtEZXBsb3lBZ2VudCwgc2l6ZW9mKGtEZXBsb3lBZ2VudCkpOworICAgIHNyY3MucHVzaF9iYWNrKHRlbXBBZ2VudC5wYXRoKTsKKyAgICBpZiAoIWRvX3N5bmNfcHVzaChzcmNzLCBrRGV2aWNlQWdlbnRGaWxlLCBjaGVja1RpbWVTdGFtcHMpKSB7CisgICAgICAgIGVycm9yX2V4aXQoIkZhaWxlZCB0byBwdXNoIGZhc3RkZXBsb3kgYWdlbnQgdG8gZGV2aWNlLiIpOworICAgIH0KKyAgICBzcmNzLmNsZWFyKCk7CisgICAgLy8gVE9ETzogRGVwbG95IGFnZW50IGZyb20gYmluMmMgZGlyZWN0bHkgaW5zdGVhZCBvZiB3cml0aW5nIHRvIGRpc2sgZmlyc3QuCisgICAgVGVtcG9yYXJ5RmlsZSB0ZW1wQWdlbnRTY3JpcHQ7CisgICAgYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseSh0ZW1wQWdlbnRTY3JpcHQuZmQsIGtEZXBsb3lBZ2VudFNjcmlwdCwgc2l6ZW9mKGtEZXBsb3lBZ2VudFNjcmlwdCkpOworICAgIHNyY3MucHVzaF9iYWNrKHRlbXBBZ2VudFNjcmlwdC5wYXRoKTsKKyAgICBpZiAoIWRvX3N5bmNfcHVzaChzcmNzLCBrRGV2aWNlQWdlbnRTY3JpcHQsIGNoZWNrVGltZVN0YW1wcykpIHsKKyAgICAgICAgZXJyb3JfZXhpdCgiRmFpbGVkIHRvIHB1c2ggZmFzdGRlcGxveSBhZ2VudCBzY3JpcHQgdG8gZGV2aWNlLiIpOworICAgIH0KKyAgICBzcmNzLmNsZWFyKCk7CisgICAgLy8gb24gd2luZG93cyB0aGUgc2hlbGwgc2NyaXB0IG1pZ2h0IGhhdmUgbG9zdCBleGVjdXRlIHBlcm1pc3Npb24KKyAgICAvLyBzbyBuZWVkIHRvIHNldCB0aGlzIGV4cGxpY2l0bHkKKyAgICBjb25zdCBjaGFyKiBrQ2htb2RDb21tYW5kUGF0dGVybiA9ICJjaG1vZCA3NzcgJXMiOworICAgIHN0ZDo6c3RyaW5nIGNobW9kQ29tbWFuZCA9CisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoa0NobW9kQ29tbWFuZFBhdHRlcm4sIGtEZXZpY2VBZ2VudFNjcmlwdCk7CisgICAgaW50IHJldCA9IHNlbmRfc2hlbGxfY29tbWFuZChjaG1vZENvbW1hbmQpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBlcnJvcl9leGl0KCJFcnJvciBleGVjdXRpbmcgJXMgcmV0dXJuY29kZTogJWQiLCBjaG1vZENvbW1hbmQuY19zdHIoKSwgcmV0KTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTIzOCwzNCArMjI5LDE1IEBACiAgICAgfQogfQogCi1zdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3BhdGNoX2dlbmVyYXRvcl9jb21tYW5kKCkgewotICAgIGlmIChnX3VzZV9sb2NhbGFnZW50KSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbiBhIFdpbmRvd3MgbWFjaGluZQotICAgICAgICBjb25zdCBjaGFyKiBob3N0X291dCA9IGdldGVudigiQU5EUk9JRF9IT1NUX09VVCIpOwotICAgICAgICBpZiAoaG9zdF9vdXQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgZXJyb3JfZXhpdCgKLSAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgZGVwbG95cGF0Y2hnZW5lcmF0b3IuamFyIGJlY2F1c2UgJEFORFJPSURfSE9TVF9PVVQgIgotICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGRlZmluZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCJqYXZhIC1qYXIgJXMvZnJhbWV3b3JrL2RlcGxveXBhdGNoZ2VuZXJhdG9yLmphciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9vdXQpOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIGFkYl9kaXIgPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgaWYgKGFkYl9kaXIuZW1wdHkoKSkgewotICAgICAgICBlcnJvcl9leGl0KCJDb3VsZCBub3QgbG9jYXRlIGRlcGxveXBhdGNoZ2VuZXJhdG9yLmphciIpOwotICAgIH0KLSAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKFIiKGphdmEgLWphciAiJXMvZGVwbG95cGF0Y2hnZW5lcmF0b3IuamFyIikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRiX2Rpci5jX3N0cigpKTsKLX0KLQogdm9pZCBjcmVhdGVfcGF0Y2goY29uc3QgY2hhciogYXBrUGF0aCwgY29uc3QgY2hhciogbWV0YWRhdGFQYXRoLCBjb25zdCBjaGFyKiBwYXRjaFBhdGgpIHsKLSAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVBhdGNoQ29tbWFuZCA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgIFIiKCVzICIlcyIgIiVzIiA+ICIlcyIpIiwgZ2V0X3BhdGNoX2dlbmVyYXRvcl9jb21tYW5kKCkuY19zdHIoKSwgYXBrUGF0aCwgbWV0YWRhdGFQYXRoLAotICAgICAgICAgICAgcGF0Y2hQYXRoKTsKLSAgICBpbnQgcmV0dXJuQ29kZSA9IHN5c3RlbShnZW5lcmF0ZVBhdGNoQ29tbWFuZC5jX3N0cigpKTsKLSAgICBpZiAocmV0dXJuQ29kZSAhPSAwKSB7Ci0gICAgICAgIGVycm9yX2V4aXQoIkV4ZWN1dGluZyAlcyByZXR1cm5lZCAlZCIsIGdlbmVyYXRlUGF0Y2hDb21tYW5kLmNfc3RyKCksIHJldHVybkNvZGUpOworICAgIERlcGxveVBhdGNoR2VuZXJhdG9yIGdlbmVyYXRvcihmYWxzZSk7CisgICAgdW5pcXVlX2ZkIHBhdGNoRmQoYWRiX29wZW4ocGF0Y2hQYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0NMT0VYRUMpKTsKKyAgICBpZiAocGF0Y2hGZCA8IDApIHsKKyAgICAgICAgcGVycm9yX2V4aXQoImFkYjogZmFpbGVkIHRvIGNyZWF0ZSAlcyIsIHBhdGNoUGF0aCk7CisgICAgfQorICAgIGJvb2wgc3VjY2VzcyA9IGdlbmVyYXRvci5DcmVhdGVQYXRjaChhcGtQYXRoLCBtZXRhZGF0YVBhdGgsIHBhdGNoRmQpOworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICBlcnJvcl9leGl0KCJGYWlsZWQgdG8gY3JlYXRlIHBhdGNoIGZvciAlcyIsIGFwa1BhdGgpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvYWRiL2RhZW1vbi9hYmIuY3BwIGIvYWRiL2RhZW1vbi9hYmIuY3BwCmluZGV4IDQyNTQzOGUuLjE3YzI1ZTggMTAwNjQ0Ci0tLSBhL2FkYi9kYWVtb24vYWJiLmNwcAorKysgYi9hZGIvZGFlbW9uL2FiYi5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJhZGJfaW8uaCIKICNpbmNsdWRlICJhZGJfdXRpbHMuaCIKICNpbmNsdWRlICJzaGVsbF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAic3lzZGVwcy5oIgogCiBuYW1lc3BhY2UgewogCkBAIC02OSw2ICs3MCwxMSBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIHN0YXRpYyBpbnQgZXhlY0NtZChzdGQ6OnN0cmluZ192aWV3IGFyZ3MsIGJvcnJvd2VkX2ZkIGluLCBib3Jyb3dlZF9mZCBvdXQsIGJvcnJvd2VkX2ZkIGVycikgeworICAgIGludCBtYXhfYnVmID0gTElOVVhfTUFYX1NPQ0tFVF9TSVpFOworICAgIGFkYl9zZXRzb2Nrb3B0KGluLCBTT0xfU09DS0VULCBTT19TTkRCVUYsICZtYXhfYnVmLCBzaXplb2YobWF4X2J1ZikpOworICAgIGFkYl9zZXRzb2Nrb3B0KG91dCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAmbWF4X2J1Ziwgc2l6ZW9mKG1heF9idWYpKTsKKyAgICBhZGJfc2V0c29ja29wdChlcnIsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgJm1heF9idWYsIHNpemVvZihtYXhfYnVmKSk7CisKICAgICBBZGJGZFRleHRPdXRwdXQgb2luKG91dCk7CiAgICAgQWRiRmRUZXh0T3V0cHV0IG9lcnIoZXJyKTsKICAgICByZXR1cm4gY21kTWFpbihwYXJzZUNtZEFyZ3MoYXJncyksIG9pbiwgb2VyciwgaW4uZ2V0KCksIG91dC5nZXQoKSwgZXJyLmdldCgpLApAQCAtOTgsNiArMTA0LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIHVuaXF1ZV9mZCByZXN1bHQgPSBTdGFydENvbW1hbmRJblByb2Nlc3Moc3RkOjpzdHJpbmcobmFtZSksICZleGVjQ21kLCBwcm90b2NvbCk7CisgICAgICAgIGludCBtYXhfYnVmID0gTElOVVhfTUFYX1NPQ0tFVF9TSVpFOworICAgICAgICBhZGJfc2V0c29ja29wdChyZXN1bHQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgJm1heF9idWYsIHNpemVvZihtYXhfYnVmKSk7CiAgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTZW5kRmlsZURlc2NyaXB0b3JzKGZkLCAiIiwgMSwgcmVzdWx0LmdldCgpKSAhPSAxKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlbmQgYW4gaW5wcm9jZXNzIGZkIGZvciBjb21tYW5kOiAiIDw8IGRhdGE7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2FkYi9kYWVtb24vYWJiX3NlcnZpY2UuY3BwIGIvYWRiL2RhZW1vbi9hYmJfc2VydmljZS5jcHAKaW5kZXggYTQzNTI3OS4uZTFkZjRhNSAxMDA2NDQKLS0tIGEvYWRiL2RhZW1vbi9hYmJfc2VydmljZS5jcHAKKysrIGIvYWRiL2RhZW1vbi9hYmJfc2VydmljZS5jcHAKQEAgLTUzLDE0ICs1MywxMyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycm9yX2ZkOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFTZW5kUHJvdG9jb2xTdHJpbmcoc29ja2V0X2ZkXywgc3RkOjpzdHJpbmcoY29tbWFuZCkpKSB7CisgICAgICAgIGlmICghU2VuZFByb3RvY29sU3RyaW5nKHNvY2tldF9mZF8sIGNvbW1hbmQpKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHNlbmQgY29tbWFuZCB0byBhYmIiOwogICAgICAgICAgICAgc29ja2V0X2ZkXy5yZXNldCgpOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICB1bmlxdWVfZmQgZmQ7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yOwogICAgICAgICBjaGFyIGJ1ZjsKICAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlJlY2VpdmVGaWxlRGVzY3JpcHRvcnMoc29ja2V0X2ZkXywgJmJ1ZiwgMSwgJmZkKSAhPSAxKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHJlY2VpdmUgRkQgZnJvbSBhYmIiOwpkaWZmIC0tZ2l0IGEvYWRiL2RhZW1vbi9zaGVsbF9zZXJ2aWNlLmNwcCBiL2FkYi9kYWVtb24vc2hlbGxfc2VydmljZS5jcHAKaW5kZXggZGU5NzA2OC4uMGZiMTRjNCAxMDA2NDQKLS0tIGEvYWRiL2RhZW1vbi9zaGVsbF9zZXJ2aWNlLmNwcAorKysgYi9hZGIvZGFlbW9uL3NoZWxsX3NlcnZpY2UuY3BwCkBAIC0yMjIsNyArMjIyLDcgQEAKIGJvb2wgU3VicHJvY2Vzczo6Rm9ya0FuZEV4ZWMoc3RkOjpzdHJpbmcqIGVycm9yKSB7CiAgICAgdW5pcXVlX2ZkIGNoaWxkX3N0ZGlub3V0X3NmZCwgY2hpbGRfc3RkZXJyX3NmZDsKICAgICB1bmlxdWVfZmQgcGFyZW50X2Vycm9yX3NmZCwgY2hpbGRfZXJyb3Jfc2ZkOwotICAgIGNoYXIgcHRzX25hbWVbUEFUSF9NQVhdOworICAgIGNvbnN0IGNoYXIqIHB0c19uYW1lID0gbnVsbHB0cjsKIAogICAgIGlmIChjb21tYW5kXy5lbXB0eSgpKSB7CiAgICAgICAgIF9fYW5kcm9pZF9sb2dfc2VjdXJpdHlfYnN3cml0ZShTRUNfVEFHX0FEQl9TSEVMTF9JTlRFUkFDVElWRSwgIiIpOwpAQCAtMjgzLDEwICsyODMsMjIgQEAKICAgICBjZW52LnB1c2hfYmFjayhudWxscHRyKTsKIAogICAgIGlmICh0eXBlXyA9PSBTdWJwcm9jZXNzVHlwZTo6a1B0eSkgewotICAgICAgICBpbnQgZmQ7Ci0gICAgICAgIHBpZF8gPSBmb3JrcHR5KCZmZCwgcHRzX25hbWUsIG51bGxwdHIsIG51bGxwdHIpOworICAgICAgICB1bmlxdWVfZmQgcHR5X21hc3Rlcihwb3NpeF9vcGVucHQoT19SRFdSIHwgT19OT0NUVFkgfCBPX0NMT0VYRUMpKTsKKyAgICAgICAgaWYgKHB0eV9tYXN0ZXIgPT0gLTEpIHsKKyAgICAgICAgICAgICplcnJvciA9CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiZmFpbGVkIHRvIGNyZWF0ZSBwdHkgbWFzdGVyOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVubG9ja3B0KHB0eV9tYXN0ZXIuZ2V0KCkpICE9IDApIHsKKyAgICAgICAgICAgICplcnJvciA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiZmFpbGVkIHRvIHVubG9ja3B0IHB0eSBtYXN0ZXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcGlkXyA9IGZvcmsoKTsKKyAgICAgICAgcHRzX25hbWUgPSBwdHNuYW1lKHB0eV9tYXN0ZXIuZ2V0KCkpOwogICAgICAgICBpZiAocGlkXyA+IDApIHsKLSAgICAgICAgICBzdGRpbm91dF9zZmRfLnJlc2V0KGZkKTsKKyAgICAgICAgICAgIHN0ZGlub3V0X3NmZF8gPSBzdGQ6Om1vdmUocHR5X21hc3Rlcik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIUNyZWF0ZVNvY2tldHBhaXIoJnN0ZGlub3V0X3NmZF8sICZjaGlsZF9zdGRpbm91dF9zZmQpKSB7CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9BbmRyb2lkLmJwIGIvYWRiL2Zhc3RkZXBsb3kvQW5kcm9pZC5icAppbmRleCAxYmEwZGUwLi45NWUxYTI4IDEwMDY0NAotLS0gYS9hZGIvZmFzdGRlcGxveS9BbmRyb2lkLmJwCisrKyBiL2FkYi9mYXN0ZGVwbG95L0FuZHJvaWQuYnAKQEAgLTEzLDI3ICsxMywxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwotCiBqYXZhX2JpbmFyeSB7CiAgICAgbmFtZTogImRlcGxveWFnZW50IiwKICAgICBzZGtfdmVyc2lvbjogIjI0IiwKICAgICBzcmNzOiBbImRlcGxveWFnZW50L3NyYy8qKi8qLmphdmEiLCAiZGVwbG95bGliL3NyYy8qKi8qLmphdmEiLCAicHJvdG8vKiovKi5wcm90byJdLAogICAgIHN0YXRpY19saWJzOiBbImFwa3psaWJfemlwIl0sCi0gICAgd3JhcHBlcjogImRlcGxveWFnZW50L2RlcGxveWFnZW50LnNoIiwKICAgICBwcm90bzogewogICAgICAgICB0eXBlOiAibGl0ZSIsCiAgICAgfSwKICAgICBkZXhfcHJlb3B0OiB7CiAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgIH0KLX0KLQotamF2YV9iaW5hcnlfaG9zdCB7Ci0gICAgbmFtZTogImRlcGxveXBhdGNoZ2VuZXJhdG9yIiwKLSAgICBzcmNzOiBbImRlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy8qKi8qLmphdmEiLCAiZGVwbG95bGliL3NyYy8qKi8qLmphdmEiLCAicHJvdG8vKiovKi5wcm90byJdLAotICAgIHN0YXRpY19saWJzOiBbImFwa3psaWIiXSwKLSAgICBtYW5pZmVzdDogImRlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dCIsCi0gICAgcHJvdG86IHsKLSAgICAgICAgdHlwZTogImZ1bGwiLAotICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lhZ2VudC9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lBZ2VudC5qYXZhIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95YWdlbnQvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95QWdlbnQuamF2YQppbmRleCAyZDNiMTM1Li5hODEwM2M0IDEwMDY0NAotLS0gYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lhZ2VudC9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lBZ2VudC5qYXZhCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveWFnZW50L3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveUFnZW50LmphdmEKQEAgLTE4MSw3ICsxODEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXh0cmFjdE1ldGFEYXRhKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBhcGtGaWxlID0gZ2V0RmlsZUZyb21QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CiAgICAgICAgIEFQS01ldGFEYXRhIGFwa01ldGFEYXRhID0gUGF0Y2hVdGlscy5nZXRBUEtNZXRhRGF0YShhcGtGaWxlKTsKLSAgICAgICAgYXBrTWV0YURhdGEud3JpdGVEZWxpbWl0ZWRUbyhTeXN0ZW0ub3V0KTsKKyAgICAgICAgYXBrTWV0YURhdGEud3JpdGVUbyhTeXN0ZW0ub3V0KTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgY3JlYXRlSW5zdGFsbFNlc3Npb24oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTIyMyw3ICsyMjMsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IHdyaXRlRXhpdENvZGUgPSB3cml0ZVBhdGNoZWREYXRhVG9TZXNzaW9uKG5ldyBSYW5kb21BY2Nlc3NGaWxlKGRldmljZUZpbGUsICJyIiksIGRlbHRhU3RyZWFtLCBzZXNzaW9uSWQpOwotCiAgICAgICAgIGlmICh3cml0ZUV4aXRDb2RlID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBjb21taXRJbnN0YWxsU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgICAgICB9IGVsc2UgewpAQCAtMjg1LDcgKzI4NCw2IEBACiAgICAgICAgICAgICBpZiAob2xkRGF0YUxlbiA+IDApIHsKICAgICAgICAgICAgICAgICBQYXRjaFV0aWxzLnBpcGUob2xkRGF0YSwgb3V0cHV0U3RyZWFtLCBidWZmZXIsIChpbnQpIG9sZERhdGFMZW4pOwogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBuZXdEYXRhQnl0ZXNXcml0dGVuICs9IGNvcHlMZW4gKyBvbGREYXRhTGVuOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveWxpYi9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9QYXRjaFV0aWxzLmphdmEgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lsaWIvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvUGF0Y2hVdGlscy5qYXZhCmluZGV4IGYwZjAwZTEuLmM2MGY5YTYgMTAwNjQ0Ci0tLSBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveWxpYi9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9QYXRjaFV0aWxzLmphdmEKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95bGliL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L1BhdGNoVXRpbHMuamF2YQpAQCAtMzksNyArMzksNyBAQAogY2xhc3MgUGF0Y2hVdGlscyB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBORUdBVElWRV9NQVNLID0gMUwgPDwgNjM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBORUdBVElWRV9MT05HX1NJR05fTUFTSyA9IDFMIDw8IDYzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05BVFVSRSA9ICJIQU1BREkvSUhEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQVRVUkUgPSAiRkFTVERFUExPWSI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldE9mZnNldEZyb21FbnRyeShTdG9yZWRFbnRyeSBlbnRyeSkgewogICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q2VudHJhbERpcmVjdG9yeUhlYWRlcigpLmdldE9mZnNldCgpICsgZW50cnkuZ2V0TG9jYWxIZWFkZXJTaXplKCk7CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzkyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmNwcApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJkZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYWRiX3VuaXF1ZV9mZC5oIgorI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9maWxlLmgiCisjaW5jbHVkZSAicGF0Y2hfdXRpbHMuaCIKKyNpbmNsdWRlICJzeXNkZXBzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k7CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkxvZyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICAgIGlmICghaXNfdmVyYm9zZV8pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZwcmludGYoZm10LCBhcCk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkFQS0VudHJ5VG9Mb2coY29uc3QgQVBLRW50cnkmIGVudHJ5KSB7CisgICAgTG9nKCJGaWxlbmFtZTogJXMiLCBlbnRyeS5maWxlbmFtZSgpLmNfc3RyKCkpOworICAgIExvZygiQ1JDMzI6IDB4JTA4bGxYIiwgZW50cnkuY3JjMzIoKSk7CisgICAgTG9nKCJEYXRhIE9mZnNldDogJWxsZCIsIGVudHJ5LmRhdGFvZmZzZXQoKSk7CisgICAgTG9nKCJDb21wcmVzc2VkIFNpemU6ICVsbGQiLCBlbnRyeS5jb21wcmVzc2Vkc2l6ZSgpKTsKKyAgICBMb2coIlVuY29tcHJlc3NlZCBTaXplOiAlbGxkIiwgZW50cnkudW5jb21wcmVzc2Vkc2l6ZSgpKTsKK30KKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6QVBLTWV0YURhdGFUb0xvZyhjb25zdCBjaGFyKiBmaWxlLCBjb25zdCBBUEtNZXRhRGF0YSYgbWV0YWRhdGEpIHsKKyAgICBpZiAoIWlzX3ZlcmJvc2VfKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTG9nKCJBUEsgTWV0YWRhdGE6ICVzIiwgZmlsZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRhZGF0YS5lbnRyaWVzX3NpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEFQS0VudHJ5JiBlbnRyeSA9IG1ldGFkYXRhLmVudHJpZXMoaSk7CisgICAgICAgIEFQS0VudHJ5VG9Mb2coZW50cnkpOworICAgIH0KK30KKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6UmVwb3J0U2F2aW5ncyhjb25zdCBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIGlkZW50aWNhbEVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRvdGFsU2l6ZSkgeworICAgIGxvbmcgdG90YWxFcXVhbEJ5dGVzID0gMDsKKyAgICBpbnQgdG90YWxFcXVhbEZpbGVzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlkZW50aWNhbEVudHJpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGlkZW50aWNhbEVudHJpZXNbaV0uZGV2aWNlRW50cnkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgdG90YWxFcXVhbEJ5dGVzICs9IGlkZW50aWNhbEVudHJpZXNbaV0ubG9jYWxFbnRyeS0+Y29tcHJlc3NlZHNpemUoKTsKKyAgICAgICAgICAgIHRvdGFsRXF1YWxGaWxlcysrOworICAgICAgICB9CisgICAgfQorICAgIGZsb2F0IHNhdmluZ1BlcmNlbnQgPSAodG90YWxFcXVhbEJ5dGVzICogMTAwLjBmKSAvIHRvdGFsU2l6ZTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRldGVjdGVkICVkIGVxdWFsIEFQSyBlbnRyaWVzXG4iLCB0b3RhbEVxdWFsRmlsZXMpOworICAgIGZwcmludGYoc3RkZXJyLCAiJWxkIGJ5dGVzIGFyZSBlcXVhbCBvdXQgb2YgJSIgUFJJdTY0ICIgKCUuMmYlJSlcbiIsIHRvdGFsRXF1YWxCeXRlcywgdG90YWxTaXplLAorICAgICAgICAgICAgc2F2aW5nUGVyY2VudCk7Cit9CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkdlbmVyYXRlUGF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBlbnRyaWVzVG9Vc2VPbkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYWxBcGtQYXRoLCBib3Jyb3dlZF9mZCBvdXRwdXQpIHsKKyAgICB1bmlxdWVfZmQgaW5wdXQoYWRiX29wZW4obG9jYWxBcGtQYXRoLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOworICAgIHNpemVfdCBuZXdBcGtTaXplID0gYWRiX2xzZWVrKGlucHV0LCAwTCwgU0VFS19FTkQpOworICAgIGFkYl9sc2VlayhpbnB1dCwgMEwsIFNFRUtfU0VUKTsKKworICAgIFBhdGNoVXRpbHM6OldyaXRlU2lnbmF0dXJlKG91dHB1dCk7CisgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKG5ld0Fwa1NpemUsIG91dHB1dCk7CisgICAgc2l6ZV90IGN1cnJlbnRTaXplT3V0ID0gMDsKKyAgICAvLyBXcml0ZSBkYXRhIGZyb20gdGhlIGhvc3QgdXB0byB0aGUgZmlyc3QgZW50cnkgd2UgaGF2ZSB0aGF0IG1hdGNoZXMgYSBkZXZpY2UgZW50cnkuIFRoZW4gd3JpdGUKKyAgICAvLyB0aGUgbWV0YWRhdGEgYWJvdXQgdGhlIGRldmljZSBlbnRyeSBhbmQgcmVwZWF0IGZvciBhbGwgZW50cmllcyB0aGF0IG1hdGNoIG9uIGRldmljZS4gRmluYWxseQorICAgIC8vIHdyaXRlIG91dCBhbnkgZGF0YSBsZWZ0LiBJZiB0aGUgZGV2aWNlIGFuZCBob3N0IEFQS3MgYXJlIGV4YWN0bHkgdGhlIHNhbWUgdGhpcyBlbmRzIHVwCisgICAgLy8gd3JpdGluZyBvdXQgemlwIG1ldGFkYXRhIGZyb20gdGhlIGxvY2FsIEFQSyBmb2xsb3dlZCBieSBvZmZzZXRzIHRvIHRoZSBkYXRhIHRvIHVzZSBmcm9tIHRoZQorICAgIC8vIGRldmljZSBBUEsuCisgICAgZm9yIChhdXRvJiYgZW50cnkgOiBlbnRyaWVzVG9Vc2VPbkRldmljZSkgeworICAgICAgICBpbnQ2NF90IGRldmljZURhdGFPZmZzZXQgPSBlbnRyeS5kZXZpY2VFbnRyeS0+ZGF0YW9mZnNldCgpOworICAgICAgICBpbnQ2NF90IGhvc3REYXRhT2Zmc2V0ID0gZW50cnkubG9jYWxFbnRyeS0+ZGF0YW9mZnNldCgpOworICAgICAgICBpbnQ2NF90IGRldmljZURhdGFMZW5ndGggPSBlbnRyeS5kZXZpY2VFbnRyeS0+Y29tcHJlc3NlZHNpemUoKTsKKyAgICAgICAgaW50NjRfdCBkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQgPSBob3N0RGF0YU9mZnNldCAtIGN1cnJlbnRTaXplT3V0OworICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoZGVsdGFGcm9tRGV2aWNlRGF0YVN0YXJ0LCBvdXRwdXQpOworICAgICAgICBpZiAoZGVsdGFGcm9tRGV2aWNlRGF0YVN0YXJ0ID4gMCkgeworICAgICAgICAgICAgUGF0Y2hVdGlsczo6UGlwZShpbnB1dCwgb3V0cHV0LCBkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQpOworICAgICAgICB9CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhkZXZpY2VEYXRhT2Zmc2V0LCBvdXRwdXQpOworICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoZGV2aWNlRGF0YUxlbmd0aCwgb3V0cHV0KTsKKyAgICAgICAgYWRiX2xzZWVrKGlucHV0LCBkZXZpY2VEYXRhTGVuZ3RoLCBTRUVLX0NVUik7CisgICAgICAgIGN1cnJlbnRTaXplT3V0ICs9IGRlbHRhRnJvbURldmljZURhdGFTdGFydCArIGRldmljZURhdGFMZW5ndGg7CisgICAgfQorICAgIGlmIChjdXJyZW50U2l6ZU91dCAhPSBuZXdBcGtTaXplKSB7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhuZXdBcGtTaXplIC0gY3VycmVudFNpemVPdXQsIG91dHB1dCk7CisgICAgICAgIFBhdGNoVXRpbHM6OlBpcGUoaW5wdXQsIG91dHB1dCwgbmV3QXBrU2l6ZSAtIGN1cnJlbnRTaXplT3V0KTsKKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKDAsIG91dHB1dCk7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZygwLCBvdXRwdXQpOworICAgIH0KK30KKworYm9vbCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6Q3JlYXRlUGF0Y2goY29uc3QgY2hhciogbG9jYWxBcGtQYXRoLCBjb25zdCBjaGFyKiBkZXZpY2VBcGtNZXRhZGF0YVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3Jyb3dlZF9mZCBvdXRwdXQpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgIEFQS01ldGFEYXRhIGRldmljZUFwa01ldGFkYXRhOworICAgIGlmIChhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKGRldmljZUFwa01ldGFkYXRhUGF0aCwgJmNvbnRlbnQpKSB7CisgICAgICAgIGRldmljZUFwa01ldGFkYXRhLlBhcnNlUGFydGlhbEZyb21TdHJpbmcoY29udGVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogV2hhdCBkbyB3ZSB3YW50IHRvIGRvIGlmIHdlIGRvbid0IGZpbmQgYW55IG1ldGFkYXRhLgorICAgICAgICAvLyBUaGUgY3VycmVudCBmYWxsYmFjayBiZWhhdmlvciBpcyB0byBidWlsZCBhIHBhdGNoIHdpdGggdGhlIGNvbnRlbnRzIG9mIHxsb2NhbEFwa1BhdGh8LgorICAgIH0KKworICAgIEFQS01ldGFEYXRhIGxvY2FsQXBrTWV0YWRhdGEgPSBQYXRjaFV0aWxzOjpHZXRBUEtNZXRhRGF0YShsb2NhbEFwa1BhdGgpOworICAgIC8vIExvZyBnYXRoZXJlZCBtZXRhZGF0YSBpbmZvLgorICAgIEFQS01ldGFEYXRhVG9Mb2coZGV2aWNlQXBrTWV0YWRhdGFQYXRoLCBkZXZpY2VBcGtNZXRhZGF0YSk7CisgICAgQVBLTWV0YURhdGFUb0xvZyhsb2NhbEFwa1BhdGgsIGxvY2FsQXBrTWV0YWRhdGEpOworCisgICAgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+IGlkZW50aWNhbEVudHJpZXM7CisgICAgdWludDY0X3QgdG90YWxTaXplID0KKyAgICAgICAgICAgIEJ1aWxkSWRlbnRpY2FsRW50cmllcyhpZGVudGljYWxFbnRyaWVzLCBsb2NhbEFwa01ldGFkYXRhLCBkZXZpY2VBcGtNZXRhZGF0YSk7CisgICAgUmVwb3J0U2F2aW5ncyhpZGVudGljYWxFbnRyaWVzLCB0b3RhbFNpemUpOworICAgIEdlbmVyYXRlUGF0Y2goaWRlbnRpY2FsRW50cmllcywgbG9jYWxBcGtQYXRoLCBvdXRwdXQpOworICAgIHJldHVybiB0cnVlOworfQorCit1aW50NjRfdCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6QnVpbGRJZGVudGljYWxFbnRyaWVzKHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgb3V0SWRlbnRpY2FsRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBLTWV0YURhdGEmIGxvY2FsQXBrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQS01ldGFEYXRhJiBkZXZpY2VBcGtNZXRhZGF0YSkgeworICAgIHVpbnQ2NF90IHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEFwa01ldGFkYXRhLmVudHJpZXNfc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVBLRW50cnkmIGxvY2FsRW50cnkgPSBsb2NhbEFwa01ldGFkYXRhLmVudHJpZXMoaSk7CisgICAgICAgIHRvdGFsU2l6ZSArPSBsb2NhbEVudHJ5LmNvbXByZXNzZWRzaXplKCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGV2aWNlQXBrTWV0YWRhdGEuZW50cmllc19zaXplKCk7IGorKykgeworICAgICAgICAgICAgY29uc3QgQVBLRW50cnkmIGRldmljZUVudHJ5ID0gZGV2aWNlQXBrTWV0YWRhdGEuZW50cmllcyhqKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VFbnRyeS5jcmMzMigpID09IGxvY2FsRW50cnkuY3JjMzIoKSAmJgorICAgICAgICAgICAgICAgIGRldmljZUVudHJ5LmZpbGVuYW1lKCkuY29tcGFyZShsb2NhbEVudHJ5LmZpbGVuYW1lKCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBTaW1wbGVFbnRyeSBzaW1wbGVFbnRyeTsKKyAgICAgICAgICAgICAgICBzaW1wbGVFbnRyeS5sb2NhbEVudHJ5ID0gY29uc3RfY2FzdDxBUEtFbnRyeSo+KCZsb2NhbEVudHJ5KTsKKyAgICAgICAgICAgICAgICBzaW1wbGVFbnRyeS5kZXZpY2VFbnRyeSA9IGNvbnN0X2Nhc3Q8QVBLRW50cnkqPigmZGV2aWNlRW50cnkpOworICAgICAgICAgICAgICAgIEFQS0VudHJ5VG9Mb2cobG9jYWxFbnRyeSk7CisgICAgICAgICAgICAgICAgb3V0SWRlbnRpY2FsRW50cmllcy5wdXNoX2JhY2soc2ltcGxlRW50cnkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6c29ydChvdXRJZGVudGljYWxFbnRyaWVzLmJlZ2luKCksIG91dElkZW50aWNhbEVudHJpZXMuZW5kKCksCisgICAgICAgICAgICAgIFtdKGNvbnN0IFNpbXBsZUVudHJ5JiBsaHMsIGNvbnN0IFNpbXBsZUVudHJ5JiByaHMpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMubG9jYWxFbnRyeS0+ZGF0YW9mZnNldCgpIDwgcmhzLmxvY2FsRW50cnktPmRhdGFvZmZzZXQoKTsKKyAgICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHRvdGFsU2l6ZTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmggYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlNDFhNQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYWRiX3VuaXF1ZV9mZC5oIgorI2luY2x1ZGUgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucGIuaCIKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIHBhdGNoIHRoYXQgY2FuIGJlIGFjY2VwdGVkIGJ5IHRoZSBkZXBsb3lhZ2VudC4gVGhlCisgKiBwYXRjaCBmb3JtYXQgaXMgZG9jdW1lbnRlZCBpbiBHZW5lcmF0ZVBhdGNoLgorICovCitjbGFzcyBEZXBsb3lQYXRjaEdlbmVyYXRvciB7CisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgc3RydWN0IHRvIGhvbGQgbWFwcGluZyBiZXR3ZWVuIGxvY2FsIG1ldGFkYXRhIGFuZCBkZXZpY2UgbWV0YWRhdGEuCisgICAgICovCisgICAgc3RydWN0IFNpbXBsZUVudHJ5IHsKKyAgICAgICAgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtFbnRyeSogbG9jYWxFbnRyeTsKKyAgICAgICAgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtFbnRyeSogZGV2aWNlRW50cnk7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIElmIHxpc192ZXJib3NlfCBpcyB0cnVlIEFwa0VudHJpZXMgdGhhdCBhcmUgc2ltaWxhciBiZXR3ZWVuIGRldmljZSBhbmQgaG9zdCBhcmUgd3JpdHRlbiB0bworICAgICAqIHRoZSBjb25zb2xlLgorICAgICAqLworICAgIGV4cGxpY2l0IERlcGxveVBhdGNoR2VuZXJhdG9yKGJvb2wgaXNfdmVyYm9zZSkgOiBpc192ZXJib3NlXyhpc192ZXJib3NlKSB7fQorICAgIC8qKgorICAgICAqIEdpdmVuIGEgfGxvY2FsQXBrUGF0aHwsIGFuZCB0aGUgfGRldmljZUFwa01ldGFkYXRhUGF0aHwgZnJvbSBhbiBpbnN0YWxsZWQgQVBLIHRoaXMgZnVuY3Rpb24KKyAgICAgKiB3cml0ZXMgYSBwYXRjaCB0byB0aGUgZ2l2ZW4gfG91dHB1dHwuCisgICAgICovCisgICAgYm9vbCBDcmVhdGVQYXRjaChjb25zdCBjaGFyKiBsb2NhbEFwa1BhdGgsIGNvbnN0IGNoYXIqIGRldmljZUFwa01ldGFkYXRhUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCk7CisKKyAgcHJpdmF0ZToKKyAgICBib29sIGlzX3ZlcmJvc2VfOworCisgICAgLyoqCisgICAgICogTG9nIGZ1bmN0aW9uIG9ubHkgbG9ncyBkYXRhIHRvIHN0ZG91dCB3aGVuIHxpc192ZXJib3NlX3wgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIExvZyhjb25zdCBjaGFyKiBmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLCAyLCAzKSkpOworCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvZyB0aGUgQVBLTWV0YURhdGEgc3RydWN0dXJlLiBJZiB8aXNfdmVyYm9zZV98IGlzIGZhbHNlIHRoaXMgZnVuY3Rpb24KKyAgICAgKiBlYXJseSBvdXRzLiB8ZmlsZXwgaXMgdGhlIHBhdGggdG8gdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgfG1ldGFkYXRhfC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkCisgICAgICogZm9yIGRlYnVnZ2luZyAvIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHZvaWQgQVBLTWV0YURhdGFUb0xvZyhjb25zdCBjaGFyKiBmaWxlLCBjb25zdCBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS01ldGFEYXRhJiBtZXRhZGF0YSk7CisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvZyBBUEtFbnRyeS4KKyAgICAgKi8KKyAgICB2b2lkIEFQS0VudHJ5VG9Mb2coY29uc3QgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtFbnRyeSYgZW50cnkpOworCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJlcG9ydCBzYXZpbmdzIGJ5IGZhc3RkZXBsb3kuIFRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCBzYXZpbmdzIGV2ZW4gd2l0aAorICAgICAqIHxpc192ZXJib3NlX3wgc2V0IHRvIGZhbHNlLiB8dG90YWxTaXplfCBpcyB1c2VkIHRvIHNob3cgYSBwZXJjZW50YWdlIG9mIHNhdmluZ3MuIE5vdGU6CisgICAgICogfHRvdGFsU2l6ZXwgaXMgdGhlIHNpemUgb2YgdGhlIFppcEVudHJpZXMuIE5vdCB0aGUgc2l6ZSBvZiB0aGUgZW50aXJlIGZpbGUuIFRoZSBtZXRhZGF0YSBvZgorICAgICAqIHRoZSB6aXAgZGF0YSBuZWVkcyB0byBiZSBzZW50IGFjcm9zcyB3aXRoIGV2ZXJ5IGl0ZXJhdGlvbi4KKyAgICAgKiBbUGF0Y2ggZm9ybWF0XQorICAgICAqIHxGaXhlZCBTdHJpbmd8IFNpZ25hdHVyZQorICAgICAqIHxsb25nfCAgICAgICAgIE5ldyBTaXplIG9mIEFwaworICAgICAqIHxQYWNrZXRzW118ICAgIEFycmF5IG9mIFBhY2tldHMKKyAgICAgKgorICAgICAqIFtQYWNrZXQgRm9ybWF0XQorICAgICAqIHxsb25nfCAgICAgU2l6ZSBvZiBkYXRhIHRvIHVzZSBmcm9tIHBhdGNoCisgICAgICogfGJ5dGVbXXwgICBQYXRjaCBkYXRhCisgICAgICogfGxvbmd8ICAgICBPZmZzZXQgb2YgZGF0YSB0byB1c2UgYWxyZWFkeSBvbiBkZXZpY2UKKyAgICAgKiB8bG9uZ3wgICAgIExlbmd0aCBvZiBkYXRhIHRvIHJlYWQgZnJvbSBkZXZpY2UgQVBLCisgICAgICogVE9ETyhiLzEzODMwNjc4NCk6IE1vdmUgdGhlIHBhdGNoIGZvcm1hdCB0byBhIHByb3RvLgorICAgICAqLworICAgIHZvaWQgUmVwb3J0U2F2aW5ncyhjb25zdCBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIGlkZW50aWNhbEVudHJpZXMsIHVpbnQ2NF90IHRvdGFsU2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGVudW1lcmF0ZXMgZWFjaCBlbnRyeSBpbiB8ZW50cmllc1RvVXNlT25EZXZpY2V8IGFuZCBidWlsZHMgYSBwYXRjaCBmaWxlIGNvcHlpbmcgZGF0YQorICAgICAqIGZyb20gfGxvY2FsQXBrUGF0aHwgd2hlcmUgd2UgYXJlIHVuYWJsZSB0byB1c2UgZW50cmllcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UuIFRoZSBuZXcgcGF0Y2gKKyAgICAgKiBpcyB3cml0dGVuIHRvIHxvdXRwdXR8LiBUaGUgZW50cmllcyBhcmUgZXhwZWN0ZWQgdG8gYmUgc29ydGVkIGJ5IGRhdGEgb2Zmc2V0IGZyb20gbG93ZXN0IHRvCisgICAgICogaGlnaGVzdC4KKyAgICAgKi8KKyAgICB2b2lkIEdlbmVyYXRlUGF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBlbnRyaWVzVG9Vc2VPbkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYWxBcGtQYXRoLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBvdXRwdXQpOworCisgIHByb3RlY3RlZDoKKyAgICB1aW50NjRfdCBCdWlsZElkZW50aWNhbEVudHJpZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIG91dElkZW50aWNhbEVudHJpZXMsCisgICAgICAgICAgICBjb25zdCBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS01ldGFEYXRhJiBsb2NhbEFwa01ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtNZXRhRGF0YSYgZGV2aWNlQXBrTWV0YWRhdGFQYXRoKTsKK307ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvcl90ZXN0LmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkYzQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJkZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAicGF0Y2hfdXRpbHMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJzeXNkZXBzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZXRUZXN0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIHJldHVybiAiZmFzdGRlcGxveS90ZXN0ZGF0YS8iICsgbmFtZTsKK30KKworY2xhc3MgVGVzdFBhdGNoR2VuZXJhdG9yIDogRGVwbG95UGF0Y2hHZW5lcmF0b3IgeworICBwdWJsaWM6CisgICAgVGVzdFBhdGNoR2VuZXJhdG9yKCkgOiBEZXBsb3lQYXRjaEdlbmVyYXRvcihmYWxzZSkge30KKyAgICB2b2lkIEdhdGhlcklkZW50aWNhbEVudHJpZXMoc3RkOjp2ZWN0b3I8RGVwbG95UGF0Y2hHZW5lcmF0b3I6OlNpbXBsZUVudHJ5PiYgb3V0SWRlbnRpY2FsRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBLTWV0YURhdGEmIG1ldGFkYXRhQSwgY29uc3QgQVBLTWV0YURhdGEmIG1ldGFkYXRhQikgeworICAgICAgICBCdWlsZElkZW50aWNhbEVudHJpZXMob3V0SWRlbnRpY2FsRW50cmllcywgbWV0YWRhdGFBLCBtZXRhZGF0YUIpOworICAgIH0KK307CisKK1RFU1QoRGVwbG95UGF0Y2hHZW5lcmF0b3JUZXN0LCBJZGVudGljYWxGaWxlRW50cmllcykgeworICAgIHN0ZDo6c3RyaW5nIGFwa1BhdGggPSBHZXRUZXN0RmlsZSgicm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIpOworICAgIEFQS01ldGFEYXRhIG1ldGFkYXRhQSA9IFBhdGNoVXRpbHM6OkdldEFQS01ldGFEYXRhKGFwa1BhdGguY19zdHIoKSk7CisgICAgVGVzdFBhdGNoR2VuZXJhdG9yIGdlbmVyYXRvcjsKKyAgICBzdGQ6OnZlY3RvcjxEZXBsb3lQYXRjaEdlbmVyYXRvcjo6U2ltcGxlRW50cnk+IGVudHJpZXM7CisgICAgZ2VuZXJhdG9yLkdhdGhlcklkZW50aWNhbEVudHJpZXMoZW50cmllcywgbWV0YWRhdGFBLCBtZXRhZGF0YUEpOworICAgIC8vIEV4cGVjdCB0aGUgZW50cnkgY291bnQgdG8gbWF0Y2ggdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBtZXRhZGF0YS4KKyAgICBjb25zdCB1aW50MzJfdCBpZGVudGljYWxDb3VudCA9IGVudHJpZXMuc2l6ZSgpOworICAgIGNvbnN0IHVpbnQzMl90IGVudHJpZXNDb3VudCA9IG1ldGFkYXRhQS5lbnRyaWVzX3NpemUoKTsKKyAgICBFWFBFQ1RfRVEoaWRlbnRpY2FsQ291bnQsIGVudHJpZXNDb3VudCk7Cit9CisKK1RFU1QoRGVwbG95UGF0Y2hHZW5lcmF0b3JUZXN0LCBOb0RldmljZU1ldGFkYXRhKSB7CisgICAgc3RkOjpzdHJpbmcgYXBrUGF0aCA9IEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIik7CisgICAgLy8gR2V0IHNpemUgb2Ygb3VyIHRlc3QgYXBrLgorICAgIGxvbmcgYXBrU2l6ZSA9IDA7CisgICAgeworICAgICAgICB1bmlxdWVfZmQgYXBrRmlsZShhZGJfb3BlbihhcGtQYXRoLmNfc3RyKCksIE9fUkRXUikpOworICAgICAgICBhcGtTaXplID0gYWRiX2xzZWVrKGFwa0ZpbGUsIDBMLCBTRUVLX0VORCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgcGF0Y2ggdGhhdCBpcyAxMDAlIGRpZmZlcmVudC4KKyAgICBUZW1wb3JhcnlGaWxlIG91dHB1dDsKKyAgICBEZXBsb3lQYXRjaEdlbmVyYXRvciBnZW5lcmF0b3IodHJ1ZSk7CisgICAgZ2VuZXJhdG9yLkNyZWF0ZVBhdGNoKGFwa1BhdGguY19zdHIoKSwgIiIsIG91dHB1dC5mZCk7CisKKyAgICAvLyBFeHBlY3QgYSBwYXRjaCBmaWxlIHRoYXQgaGFzIGEgc2l6ZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiBvdXIgaW5pdGlhbCBBUEsuCisgICAgbG9uZyBwYXRjaFNpemUgPSBhZGJfbHNlZWsob3V0cHV0LmZkLCAwTCwgU0VFS19FTkQpOworICAgIEVYUEVDVF9HVChwYXRjaFNpemUsIGFwa1NpemUpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMDUwNS4uMDAwMDAwMAotLS0gYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9tYW5pZmVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYWluLUNsYXNzOiBjb20uYW5kcm9pZC5mYXN0ZGVwbG95LkRlcGxveVBhdGNoR2VuZXJhdG9yCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5jcHAgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExZGRkMQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmNwcApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInBhdGNoX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkZncvWmlwRmlsZVJPLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFkYl9pby5oIgorI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9lbmRpYW4uaCIKKyNpbmNsdWRlICJzeXNkZXBzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrU2lnbmF0dXJlW10gPSAiRkFTVERFUExPWSI7CisKK0FQS01ldGFEYXRhIFBhdGNoVXRpbHM6OkdldEFQS01ldGFEYXRhKGNvbnN0IGNoYXIqIGFwa1BhdGgpIHsKKyAgICBBUEtNZXRhRGF0YSBhcGtNZXRhRGF0YTsKKyN1bmRlZiBvcGVuCisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OlppcEZpbGVSTz4gemlwRmlsZShhbmRyb2lkOjpaaXBGaWxlUk86Om9wZW4oYXBrUGF0aCkpOworI2RlZmluZSBvcGVuIF9fX3h4eF91bml4X29wZW4KKyAgICBpZiAoemlwRmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHByaW50ZigiQ291bGQgbm90IG9wZW4gJXMiLCBhcGtQYXRoKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgdm9pZCogY29va2llOworICAgIGlmICh6aXBGaWxlLT5zdGFydEl0ZXJhdGlvbigmY29va2llKSkgeworICAgICAgICBhbmRyb2lkOjpaaXBFbnRyeVJPIGVudHJ5OworICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemlwRmlsZS0+bmV4dEVudHJ5KGNvb2tpZSkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoYXIgZmlsZU5hbWVbMjU2XTsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZmlsZSBuYW1lLgorICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGZpbGVuYW1lcyBsb25nZXIgdGhhbiAyNTYuCisgICAgICAgICAgICBpZiAoemlwRmlsZS0+Z2V0RW50cnlGaWxlTmFtZShlbnRyeSwgZmlsZU5hbWUsIHNpemVvZihmaWxlTmFtZSkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHVuY29tcHJlc3NlZFNpemUsIGNvbXByZXNzZWRTaXplLCBjcmMzMjsKKyAgICAgICAgICAgIGludDY0X3QgZGF0YU9mZnNldDsKKyAgICAgICAgICAgIHppcEZpbGUtPmdldEVudHJ5SW5mbyhlbnRyeSwgbnVsbHB0ciwgJnVuY29tcHJlc3NlZFNpemUsICZjb21wcmVzc2VkU2l6ZSwgJmRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJmNyYzMyKTsKKyAgICAgICAgICAgIEFQS0VudHJ5KiBhcGtFbnRyeSA9IGFwa01ldGFEYXRhLmFkZF9lbnRyaWVzKCk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X2NyYzMyKGNyYzMyKTsKKyAgICAgICAgICAgIGFwa0VudHJ5LT5zZXRfZmlsZW5hbWUoZmlsZU5hbWUpOworICAgICAgICAgICAgYXBrRW50cnktPnNldF9jb21wcmVzc2Vkc2l6ZShjb21wcmVzc2VkU2l6ZSk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X3VuY29tcHJlc3NlZHNpemUodW5jb21wcmVzc2VkU2l6ZSk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X2RhdGFvZmZzZXQoZGF0YU9mZnNldCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFwa01ldGFEYXRhOworfQorCit2b2lkIFBhdGNoVXRpbHM6OldyaXRlU2lnbmF0dXJlKGJvcnJvd2VkX2ZkIG91dHB1dCkgeworICAgIFdyaXRlRmRFeGFjdGx5KG91dHB1dCwga1NpZ25hdHVyZSwgc2l6ZW9mKGtTaWduYXR1cmUpIC0gMSk7Cit9CisKK3ZvaWQgUGF0Y2hVdGlsczo6V3JpdGVMb25nKGludDY0X3QgdmFsdWUsIGJvcnJvd2VkX2ZkIG91dHB1dCkgeworICAgIGludDY0X3QgdG9MaXR0bGVFbmRpYW4gPSBodG9sZTY0KHZhbHVlKTsKKyAgICBXcml0ZUZkRXhhY3RseShvdXRwdXQsICZ0b0xpdHRsZUVuZGlhbiwgc2l6ZW9mKGludDY0X3QpKTsKK30KKwordm9pZCBQYXRjaFV0aWxzOjpQaXBlKGJvcnJvd2VkX2ZkIGlucHV0LCBib3Jyb3dlZF9mZCBvdXRwdXQsIHNpemVfdCBhbW91bnQpIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludCBCVUZGRVJfU0laRSA9IDEyOCAqIDEwMjQ7CisgICAgY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdOworICAgIHNpemVfdCB0cmFuc2ZlckFtb3VudCA9IDA7CisgICAgd2hpbGUgKHRyYW5zZmVyQW1vdW50ICE9IGFtb3VudCkgeworICAgICAgICBsb25nIGNodW5rQW1vdW50ID0KKyAgICAgICAgICAgICAgICBhbW91bnQgLSB0cmFuc2ZlckFtb3VudCA+IEJVRkZFUl9TSVpFID8gQlVGRkVSX1NJWkUgOiBhbW91bnQgLSB0cmFuc2ZlckFtb3VudDsKKyAgICAgICAgbG9uZyByZWFkQW1vdW50ID0gYWRiX3JlYWQoaW5wdXQsIGJ1ZmZlciwgY2h1bmtBbW91bnQpOworICAgICAgICBXcml0ZUZkRXhhY3RseShvdXRwdXQsIGJ1ZmZlciwgcmVhZEFtb3VudCk7CisgICAgICAgIHRyYW5zZmVyQW1vdW50ICs9IHJlYWRBbW91bnQ7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmggYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmZlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFkYl91bmlxdWVfZmQuaCIKKyNpbmNsdWRlICJmYXN0ZGVwbG95L3Byb3RvL0Fwa0VudHJ5LnBiLmgiCisKKy8qKgorICogSGVscGVyIGNsYXNzIHRoYXQgbWlycm9ycyB0aGUgUGF0Y2hVdGlscyBmcm9tIGRlcGxveSBhZ2VudC4KKyAqLworY2xhc3MgUGF0Y2hVdGlscyB7CisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbG9jYWwgQVBLIGZpbGUgYW5kIGJ1aWxkcyB0aGUgQVBLTWV0YURhdGEgcmVxdWlyZWQgYnkgdGhlIHBhdGNoaW5nCisgICAgICogYWxnb3JpdGhtLiBUaGUgaWYgdGhpcyBmdW5jdGlvbiBoYXMgYW4gZXJyb3IgYSBzdHJpbmcgaXMgcHJpbnRlZCB0byB0aGUgdGVybWluYWwgYW5kIGV4aXQoMSkKKyAgICAgKiBpcyBjYWxsZWQuCisgICAgICovCisgICAgc3RhdGljIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLTWV0YURhdGEgR2V0QVBLTWV0YURhdGEoY29uc3QgY2hhciogZmlsZSk7CisgICAgLyoqCisgICAgICogV3JpdGVzIGEgZml4ZWQgc2lnbmF0dXJlIHN0cmluZyB0byB0aGUgaGVhZGVyIG9mIHRoZSBwYXRjaC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBXcml0ZVNpZ25hdHVyZShhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBvdXRwdXQpOworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbiBpbnQ2NCB0byB0aGUgfG91dHB1dHwgcmV2ZXJzaW5nIHRoZSBieXRlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBXcml0ZUxvbmcoaW50NjRfdCB2YWx1ZSwgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgb3V0cHV0KTsKKyAgICAvKioKKyAgICAgKiBDb3B5IHxhbW91bnR8IG9mIGRhdGEgZnJvbSB8aW5wdXR8IHRvIHxvdXRwdXR8LgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIFBpcGUoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgaW5wdXQsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbW91bnQpOworfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWVlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInBhdGNoX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImFkYl9pby5oIgorI2luY2x1ZGUgInN5c2RlcHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTsKKworc3RhdGljIHN0ZDo6c3RyaW5nIEdldFRlc3RGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgcmV0dXJuICJmYXN0ZGVwbG95L3Rlc3RkYXRhLyIgKyBuYW1lOworfQorCitib29sIEZpbGVNYXRjaGVzQ29udGVudChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBpbnB1dCwgY29uc3QgY2hhciogY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGNvbnRlbnRzU2l6ZSkgeworICAgIGFkYl9sc2VlayhpbnB1dCwgMCwgU0VFS19TRVQpOworICAgIC8vIFVzZSBhIHRlbXAgYnVmZmVyIGxhcmdlciB0aGFuIGFueSB0ZXN0IGNvbnRlbnRzLgorICAgIGNvbnN0ZXhwciBpbnQgQlVGRkVSX1NJWkUgPSAyMDQ4OworICAgIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXTsKKyAgICBib29sIHJlc3VsdCA9IHRydWU7CisgICAgLy8gVmFsaWRhdGUgc2l6ZSBvZiBmaWxlcyBpcyBlcXVhbC4KKyAgICBzc2l6ZV90IHJlYWRBbW91bnQgPSBhZGJfcmVhZChpbnB1dCwgYnVmZmVyLCBCVUZGRVJfU0laRSk7CisgICAgRVhQRUNUX0VRKHJlYWRBbW91bnQsIGNvbnRlbnRzU2l6ZSk7CisgICAgcmVzdWx0ID0gbWVtY21wKGJ1ZmZlciwgY29udGVudHMsIHJlYWRBbW91bnQpID09IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkQW1vdW50OyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIleCIsIGJ1ZmZlcltpXSk7CisgICAgfQorICAgIHByaW50ZigiID09ICIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHNTaXplOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIleCIsIGNvbnRlbnRzW2ldKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVEVTVChQYXRjaFV0aWxzVGVzdCwgU3dhcExvbmdXcml0ZXMpIHsKKyAgICBUZW1wb3JhcnlGaWxlIG91dHB1dDsKKyAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoMHgwMDExMjIzMzQ0NTU2Njc3LCBvdXRwdXQuZmQpOworICAgIGFkYl9sc2VlayhvdXRwdXQuZmQsIDAsIFNFRUtfU0VUKTsKKyAgICBjb25zdCBjaGFyIGV4cGVjdGVkW10gPSB7MHg3NywgMHg2NiwgMHg1NSwgMHg0NCwgMHgzMywgMHgyMiwgMHgxMSwgMHgwMH07CisgICAgRVhQRUNUX1RSVUUoRmlsZU1hdGNoZXNDb250ZW50KG91dHB1dC5mZCwgZXhwZWN0ZWQsIDgpKTsKK30KKworVEVTVChQYXRjaFV0aWxzVGVzdCwgUGlwZVdyaXRlc0Ftb3VudFRvT3V0cHV0KSB7CisgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQoIlNvbWUgRGF0YSIpOworICAgIFRlbXBvcmFyeUZpbGUgaW5wdXQ7CisgICAgVGVtcG9yYXJ5RmlsZSBvdXRwdXQ7CisgICAgLy8gUG9wdWxhdGUgaW5wdXQgZmlsZS4KKyAgICBXcml0ZUZkRXhhY3RseShpbnB1dC5mZCwgZXhwZWN0ZWQpOworICAgIGFkYl9sc2VlayhpbnB1dC5mZCwgMCwgU0VFS19TRVQpOworICAgIC8vIE9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZCwgYW5kIG91dHB1dCBmaWxlIGZvciB3cml0ZS4KKyAgICBQYXRjaFV0aWxzOjpQaXBlKGlucHV0LmZkLCBvdXRwdXQuZmQsIGV4cGVjdGVkLnNpemUoKSk7CisgICAgLy8gVmFsaWRhdGUgcGlwZSB3b3JrZWQKKyAgICBFWFBFQ1RfVFJVRShGaWxlTWF0Y2hlc0NvbnRlbnQob3V0cHV0LmZkLCBleHBlY3RlZC5jX3N0cigpLCBleHBlY3RlZC5zaXplKCkpKTsKK30KKworVEVTVChQYXRjaFV0aWxzVGVzdCwgU2lnbmF0dXJlQ29uc3RNYXRjaGVzKSB7CisgICAgc3RkOjpzdHJpbmcgYXBrRmlsZSA9IEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIik7CisgICAgVGVtcG9yYXJ5RmlsZSBvdXRwdXQ7CisgICAgUGF0Y2hVdGlsczo6V3JpdGVTaWduYXR1cmUob3V0cHV0LmZkKTsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50cygiRkFTVERFUExPWSIpOworICAgIEVYUEVDVF9UUlVFKEZpbGVNYXRjaGVzQ29udGVudChvdXRwdXQuZmQsIGNvbnRlbnRzLmNfc3RyKCksIGNvbnRlbnRzLnNpemUoKSkpOworfQorCitURVNUKFBhdGNoVXRpbHNUZXN0LCBHYXRoZXJNZXRhZGF0YSkgeworICAgIHN0ZDo6c3RyaW5nIGFwa0ZpbGUgPSBHZXRUZXN0RmlsZSgicm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIpOworICAgIEFQS01ldGFEYXRhIG1ldGFkYXRhID0gUGF0Y2hVdGlsczo6R2V0QVBLTWV0YURhdGEoYXBrRmlsZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBleHBlY3RlZE1ldGFkYXRhOworICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoR2V0VGVzdEZpbGUoInJvdGF0aW5nX2N1YmUtbWV0YWRhdGEtcmVsZWFzZS5kYXRhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhwZWN0ZWRNZXRhZGF0YSk7CisgICAgc3RkOjpzdHJpbmcgYWN0dWFsTWV0YWRhdGE7CisgICAgbWV0YWRhdGEuU2VyaWFsaXplVG9TdHJpbmcoJmFjdHVhbE1ldGFkYXRhKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRNZXRhZGF0YSwgYWN0dWFsTWV0YWRhdGEpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveVBhdGNoR2VuZXJhdG9yLmphdmEgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lQYXRjaEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIyZWFiLi4wMDAwMDAwCi0tLSBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveVBhdGNoR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmFzdGRlcGxveTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXAuU2ltcGxlRW50cnk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mYXN0ZGVwbG95LkFQS01ldGFEYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLmZhc3RkZXBsb3kuQVBLRW50cnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXBsb3lQYXRjaEdlbmVyYXRvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTI4ICogMTAyNDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgICAgICBzaG93VXNhZ2UoMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikgewotICAgICAgICAgICAgICAgIFN0cmluZyB2ZXJib3NlRmxhZyA9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2VGbGFnLmNvbXBhcmVUbygiLS12ZXJib3NlIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGFwa1BhdGggPSBhcmdzWzBdOwotICAgICAgICAgICAgU3RyaW5nIGRldmljZU1ldGFkYXRhUGF0aCA9IGFyZ3NbMV07Ci0gICAgICAgICAgICBGaWxlIGhvc3RGaWxlID0gbmV3IEZpbGUoYXBrUGF0aCk7Ci0KLSAgICAgICAgICAgIExpc3Q8QVBLRW50cnk+IGRldmljZVppcEVudHJpZXMgPSBnZXRNZXRhZGF0YUZyb21GaWxlKGRldmljZU1ldGFkYXRhUGF0aCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRldmljZSBFbnRyaWVzICgiICsgZGV2aWNlWmlwRW50cmllcy5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBUEtFbnRyeSBlbnRyeSA6IGRldmljZVppcEVudHJpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQVBLRW50cnlUb1N0cmluZyhlbnRyeSwgc2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8QVBLRW50cnk+IGhvc3RGaWxlRW50cmllcyA9IFBhdGNoVXRpbHMuZ2V0QVBLTWV0YURhdGEoaG9zdEZpbGUpLmdldEVudHJpZXNMaXN0KCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkhvc3QgRW50cmllcyAoIiArIGhvc3RGaWxlRW50cmllcy5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBUEtFbnRyeSBlbnRyeSA6IGhvc3RGaWxlRW50cmllcykgewotICAgICAgICAgICAgICAgICAgICBBUEtFbnRyeVRvU3RyaW5nKGVudHJ5LCBzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PiBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0ID0KLSAgICAgICAgICAgICAgICBnZXRJZGVudGljYWxDb250ZW50cyhkZXZpY2VaaXBFbnRyaWVzLCBob3N0RmlsZUVudHJpZXMpOwotICAgICAgICAgICAgcmVwb3J0SWRlbnRpY2FsQ29udGVudHMoaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCwgaG9zdEZpbGUpOwotCi0gICAgICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gaWRlbnRpY2FsRW50cnkgOiBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFQS0VudHJ5IGVudHJ5ID0gaWRlbnRpY2FsRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgQVBLRW50cnlUb1N0cmluZyhlbnRyeSwgc2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklkZW50aWNhbCBFbnRyaWVzICgiICsgaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldC5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3JlYXRlUGF0Y2goaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCwgaG9zdEZpbGUsIFN5c3RlbS5vdXQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogIiArIGUpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDIpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2hvd1VzYWdlKGludCBleGl0Q29kZSkgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInVzYWdlOiBkZXBsb3lwYXRjaGdlbmVyYXRvciA8YXBrcGF0aD4gPGRldmljZWFwa21ldGFkYXRhPiBbLS12ZXJib3NlXSIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdChleGl0Q29kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBUEtFbnRyeVRvU3RyaW5nKEFQS0VudHJ5IGVudHJ5LCBTdHJpbmdCdWlsZGVyIG91dHB1dFN0cmluZykgewotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkZpbGVuYW1lOiAlc1xuIiwgZW50cnkuZ2V0RmlsZU5hbWUoKSkpOwotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkNSQzMyOiAweCUwOFhcbiIsIGVudHJ5LmdldENyYzMyKCkpKTsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJEYXRhIE9mZnNldDogJWRcbiIsIGVudHJ5LmdldERhdGFPZmZzZXQoKSkpOwotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkNvbXByZXNzZWQgU2l6ZTogJWRcbiIsIGVudHJ5LmdldENvbXByZXNzZWRTaXplKCkpKTsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJVbmNvbXByZXNzZWQgU2l6ZTogJWRcbiIsIGVudHJ5LmdldFVuY29tcHJlc3NlZFNpemUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QVBLRW50cnk+IGdldE1ldGFkYXRhRnJvbUZpbGUoU3RyaW5nIGRldmljZU1ldGFkYXRhUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGRldmljZU1ldGFkYXRhUGF0aCkpOwotICAgICAgICBBUEtNZXRhRGF0YSBhcGtNZXRhRGF0YSA9IEFQS01ldGFEYXRhLnBhcnNlRGVsaW1pdGVkRnJvbShpcyk7Ci0gICAgICAgIHJldHVybiBhcGtNZXRhRGF0YS5nZXRFbnRyaWVzTGlzdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gZ2V0SWRlbnRpY2FsQ29udGVudHMoCi0gICAgICAgIExpc3Q8QVBLRW50cnk+IGRldmljZVppcEVudHJpZXMsIExpc3Q8QVBLRW50cnk+IGhvc3RaaXBFbnRyaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IGlkZW50aWNhbENvbnRlbnRzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4oKTsKLQotICAgICAgICBmb3IgKEFQS0VudHJ5IGRldmljZVppcEVudHJ5IDogZGV2aWNlWmlwRW50cmllcykgewotICAgICAgICAgICAgZm9yIChBUEtFbnRyeSBob3N0WmlwRW50cnkgOiBob3N0WmlwRW50cmllcykgewotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VaaXBFbnRyeS5nZXRDcmMzMigpID09IGhvc3RaaXBFbnRyeS5nZXRDcmMzMigpICYmCi0gICAgICAgICAgICAgICAgICAgIGRldmljZVppcEVudHJ5LmdldEZpbGVOYW1lKCkuZXF1YWxzKGhvc3RaaXBFbnRyeS5nZXRGaWxlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZGVudGljYWxDb250ZW50cy5hZGQobmV3IFNpbXBsZUVudHJ5KGRldmljZVppcEVudHJ5LCBob3N0WmlwRW50cnkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGlkZW50aWNhbENvbnRlbnRzLCBuZXcgQ29tcGFyYXRvcjxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKAotICAgICAgICAgICAgICAgIFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gcDEsIFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gcDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5jb21wYXJlKHAxLmdldFZhbHVlKCkuZ2V0RGF0YU9mZnNldCgpLCBwMi5nZXRWYWx1ZSgpLmdldERhdGFPZmZzZXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiBpZGVudGljYWxDb250ZW50czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlcG9ydElkZW50aWNhbENvbnRlbnRzKAotICAgICAgICBMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQsIEZpbGUgaG9zdEZpbGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgdG90YWxFcXVhbEJ5dGVzID0gMDsKLSAgICAgICAgaW50IHRvdGFsRXF1YWxGaWxlcyA9IDA7Ci0gICAgICAgIGZvciAoU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBlbnRyaWVzIDogaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCkgewotICAgICAgICAgICAgQVBLRW50cnkgaG9zdEFQS0VudHJ5ID0gZW50cmllcy5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgdG90YWxFcXVhbEJ5dGVzICs9IGhvc3RBUEtFbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpOwotICAgICAgICAgICAgdG90YWxFcXVhbEZpbGVzKys7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBzYXZpbmdQZXJjZW50ID0gKGZsb2F0KSAodG90YWxFcXVhbEJ5dGVzICogMTAwKSAvIGhvc3RGaWxlLmxlbmd0aCgpOwotCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGV0ZWN0ZWQgIiArIHRvdGFsRXF1YWxGaWxlcyArICIgZXF1YWwgQVBLIGVudHJpZXMiKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHRvdGFsRXF1YWxCeXRlcyArICIgYnl0ZXMgYXJlIGVxdWFsIG91dCBvZiAiICsgaG9zdEZpbGUubGVuZ3RoKCkgKyAiICgiCi0gICAgICAgICAgICArIHNhdmluZ1BlcmNlbnQgKyAiJSkiKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBjcmVhdGVQYXRjaChMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IHppcEVudHJ5U2ltcGxlRW50cnlzLAotICAgICAgICBGaWxlIGhvc3RGaWxlLCBPdXRwdXRTdHJlYW0gcGF0Y2hTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgUGF0Y2hGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaG9zdEZpbGVJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaG9zdEZpbGUpOwotCi0gICAgICAgIHBhdGNoU3RyZWFtLndyaXRlKFBhdGNoVXRpbHMuU0lHTkFUVVJFLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKTsKLSAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcoaG9zdEZpbGUubGVuZ3RoKCksIHBhdGNoU3RyZWFtKTsKLQotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotICAgICAgICBsb25nIHRvdGFsQnl0ZXNXcml0dGVuID0gMDsKLSAgICAgICAgSXRlcmF0b3I8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gZW50cnlTaW1wbGVFbnRyeUl0ZXJhdG9yID0KLSAgICAgICAgICAgIHppcEVudHJ5U2ltcGxlRW50cnlzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChlbnRyeVNpbXBsZUVudHJ5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+IGVudHJ5U2ltcGxlRW50cnkgPSBlbnRyeVNpbXBsZUVudHJ5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgQVBLRW50cnkgZGV2aWNlQVBLRW50cnkgPSBlbnRyeVNpbXBsZUVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgQVBLRW50cnkgaG9zdEFQS0VudHJ5ID0gZW50cnlTaW1wbGVFbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICBsb25nIG5ld0RhdGFMZW4gPSBob3N0QVBLRW50cnkuZ2V0RGF0YU9mZnNldCgpIC0gdG90YWxCeXRlc1dyaXR0ZW47Ci0gICAgICAgICAgICBsb25nIG9sZERhdGFPZmZzZXQgPSBkZXZpY2VBUEtFbnRyeS5nZXREYXRhT2Zmc2V0KCk7Ci0gICAgICAgICAgICBsb25nIG9sZERhdGFMZW4gPSBkZXZpY2VBUEtFbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpOwotCi0gICAgICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhuZXdEYXRhTGVuLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgICAgICBQYXRjaFV0aWxzLnBpcGUoaG9zdEZpbGVJbnB1dFN0cmVhbSwgcGF0Y2hTdHJlYW0sIGJ1ZmZlciwgbmV3RGF0YUxlbik7Ci0gICAgICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhvbGREYXRhT2Zmc2V0LCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhvbGREYXRhTGVuLCBwYXRjaFN0cmVhbSk7Ci0KLSAgICAgICAgICAgIGxvbmcgc2tpcCA9IGhvc3RGaWxlSW5wdXRTdHJlYW0uc2tpcChvbGREYXRhTGVuKTsKLSAgICAgICAgICAgIGlmIChza2lwICE9IG9sZERhdGFMZW4pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGF0Y2hGb3JtYXRFeGNlcHRpb24oInNraXAgZXJyb3I6IGF0dGVtcHRlZCB0byBza2lwICIgKyBvbGREYXRhTGVuCi0gICAgICAgICAgICAgICAgICAgICsgIiBieXRlcyBidXQgcmV0dXJuIGNvZGUgd2FzICIgKyBza2lwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvdGFsQnl0ZXNXcml0dGVuICs9IG9sZERhdGFMZW4gKyBuZXdEYXRhTGVuOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgcmVtYWluZGVyTGVuID0gaG9zdEZpbGUubGVuZ3RoKCkgLSB0b3RhbEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcocmVtYWluZGVyTGVuLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgIFBhdGNoVXRpbHMucGlwZShob3N0RmlsZUlucHV0U3RyZWFtLCBwYXRjaFN0cmVhbSwgYnVmZmVyLCByZW1haW5kZXJMZW4pOwotICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZygwLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKDAsIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgcGF0Y2hTdHJlYW0uZmx1c2goKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLW1ldGFkYXRhLXJlbGVhc2UuZGF0YSBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtbWV0YWRhdGEtcmVsZWFzZS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzFiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLW1ldGFkYXRhLXJlbGVhc2UuZGF0YQpAQCAtMCwwICsxLDYgQEAKKworIwjHgs+rDBIUTUVUQS1JTkYvTUFOSUZFU1QuTUYYxwYgUShXCisjCIONlY4HEhNBbmRyb2lkTWFuaWZlc3QueG1sGDEg5AUo6A8KKzYIprWAPhIjbGliL2FybWVhYmktdjdhL2xpYnZ1bGthbl9zYW1wbGUuc28YgQ4gwNJRKIyy7AEKKyAIl+OXkQ4SDnJlc291cmNlcy5hcnNjGPTgUSC0BCi0BAorHAiLnMLJAhILY2xhc3Nlcy5kZXgYwQcg/wUo9ApkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3ZTBlYQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWRiL2ZkZXZlbnQvZmRldmVudC5oIGIvYWRiL2ZkZXZlbnQvZmRldmVudC5oCmluZGV4IGNjYjBjOTIuLjI0MjQyNTIgMTAwNjQ0Ci0tLSBhL2FkYi9mZGV2ZW50L2ZkZXZlbnQuaAorKysgYi9hZGIvZmRldmVudC9mZGV2ZW50LmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KZGlmZiAtLWdpdCBhL2FkYi9zb2NrZXRfc3BlYy5jcHAgYi9hZGIvc29ja2V0X3NwZWMuY3BwCmluZGV4IDEzMzM3MjQuLjk4NDY4YjUgMTAwNjQ0Ci0tLSBhL2FkYi9zb2NrZXRfc3BlYy5jcHAKKysrIGIvYWRiL3NvY2tldF9zcGVjLmNwcApAQCAtOTMsNyArOTMsNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RkOjpzdHJpbmcgYWRkcihzcGVjLnN1YnN0cig0KSk7Ci0gICAgICAgIHBvcnRfdmFsdWUgPSAtMTsKKyAgICAgICAgcG9ydF92YWx1ZSA9IERFRkFVTFRfQURCX0xPQ0FMX1RSQU5TUE9SVF9QT1JUOwogCiAgICAgICAgIC8vIEZJWE1FOiBQYXJzZU5ldEFkZHJlc3MgcmVqZWN0cyBwb3J0IDAuIFRoaXMgY3VycmVudGx5IGRvZXNuJ3QgaHVydCwgYmVjYXVzZSBsaXN0ZW5pbmcKICAgICAgICAgLy8gICAgICAgIG9uIGFuIGFkZHJlc3MgdGhhdCBpc24ndCAnbG9jYWxob3N0JyBpcyB1bnN1cHBvcnRlZC4KZGlmZiAtLWdpdCBhL2FkYi9zb2NrZXRfc3BlY190ZXN0LmNwcCBiL2FkYi9zb2NrZXRfc3BlY190ZXN0LmNwcAppbmRleCBmNWVjMGYxLi4zYTJmNjBjIDEwMDY0NAotLS0gYS9hZGIvc29ja2V0X3NwZWNfdGVzdC5jcHAKKysrIGIvYWRiL3NvY2tldF9zcGVjX3Rlc3QuY3BwCkBAIC0yMCwzOCArMjAsNzEgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLVRFU1Qoc29ja2V0X3NwZWMsIHBhcnNlX3RjcF9zb2NrZXRfc3BlYykgeworVEVTVChzb2NrZXRfc3BlYywgcGFyc2VfdGNwX3NvY2tldF9zcGVjX2p1c3RfcG9ydCkgewogICAgIHN0ZDo6c3RyaW5nIGhvc3RuYW1lLCBlcnJvciwgc2VyaWFsOwogICAgIGludCBwb3J0OwogICAgIEVYUEVDVF9UUlVFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOjUwMzciLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKICAgICBFWFBFQ1RfRVEoIiIsIGhvc3RuYW1lKTsKICAgICBFWFBFQ1RfRVEoNTAzNywgcG9ydCk7CiAgICAgRVhQRUNUX0VRKCIiLCBzZXJpYWwpOworfQogCi0gICAgLy8gQmFkIHBvcnRzOgorVEVTVChzb2NrZXRfc3BlYywgcGFyc2VfdGNwX3NvY2tldF9zcGVjX2JhZF9wb3J0cykgeworICAgIHN0ZDo6c3RyaW5nIGhvc3RuYW1lLCBlcnJvciwgc2VyaWFsOworICAgIGludCBwb3J0OwogICAgIEVYUEVDVF9GQUxTRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDoiLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKICAgICBFWFBFQ1RfRkFMU0UocGFyc2VfdGNwX3NvY2tldF9zcGVjKCJ0Y3A6LTEiLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKICAgICBFWFBFQ1RfRkFMU0UocGFyc2VfdGNwX3NvY2tldF9zcGVjKCJ0Y3A6NjU1MzYiLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKK30KIAorVEVTVChzb2NrZXRfc3BlYywgcGFyc2VfdGNwX3NvY2tldF9zcGVjX2hvc3RfYW5kX3BvcnQpIHsKKyAgICBzdGQ6OnN0cmluZyBob3N0bmFtZSwgZXJyb3IsIHNlcmlhbDsKKyAgICBpbnQgcG9ydDsKICAgICBFWFBFQ1RfVFJVRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDpsb2NhbGhvc3Q6MTIzNCIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOwogICAgIEVYUEVDVF9FUSgibG9jYWxob3N0IiwgaG9zdG5hbWUpOwogICAgIEVYUEVDVF9FUSgxMjM0LCBwb3J0KTsKICAgICBFWFBFQ1RfRVEoImxvY2FsaG9zdDoxMjM0Iiwgc2VyaWFsKTsKK30KIAotICAgIEVYUEVDVF9GQUxTRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDpsb2NhbGhvc3QiLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKK1RFU1Qoc29ja2V0X3NwZWMsIHBhcnNlX3RjcF9zb2NrZXRfc3BlY19ob3N0X25vX3BvcnQpIHsKKyAgICBzdGQ6OnN0cmluZyBob3N0bmFtZSwgZXJyb3IsIHNlcmlhbDsKKyAgICBpbnQgcG9ydDsKKyAgICBFWFBFQ1RfVFJVRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDpsb2NhbGhvc3QiLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKKyAgICBFWFBFQ1RfRVEoImxvY2FsaG9zdCIsIGhvc3RuYW1lKTsKKyAgICBFWFBFQ1RfRVEoNTU1NSwgcG9ydCk7CisgICAgRVhQRUNUX0VRKCJsb2NhbGhvc3Q6NTU1NSIsIHNlcmlhbCk7Cit9CisKK1RFU1Qoc29ja2V0X3NwZWMsIHBhcnNlX3RjcF9zb2NrZXRfc3BlY19ob3N0X2JhZF9wb3J0cykgeworICAgIHN0ZDo6c3RyaW5nIGhvc3RuYW1lLCBlcnJvciwgc2VyaWFsOworICAgIGludCBwb3J0OwogICAgIEVYUEVDVF9GQUxTRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDpsb2NhbGhvc3Q6IiwgJmhvc3RuYW1lLCAmcG9ydCwgJnNlcmlhbCwgJmVycm9yKSk7CiAgICAgRVhQRUNUX0ZBTFNFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOmxvY2FsaG9zdDotMSIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOwogICAgIEVYUEVDVF9GQUxTRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDpsb2NhbGhvc3Q6NjU1MzYiLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKK30KIAotICAgIC8vIElQdjY6CitURVNUKHNvY2tldF9zcGVjLCBwYXJzZV90Y3Bfc29ja2V0X3NwZWNfaXB2Nl9hbmRfcG9ydCkgeworICAgIHN0ZDo6c3RyaW5nIGhvc3RuYW1lLCBlcnJvciwgc2VyaWFsOworICAgIGludCBwb3J0OwogICAgIEVYUEVDVF9UUlVFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOls6OjFdOjEyMzQiLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKICAgICBFWFBFQ1RfRVEoIjo6MSIsIGhvc3RuYW1lKTsKICAgICBFWFBFQ1RfRVEoMTIzNCwgcG9ydCk7CiAgICAgRVhQRUNUX0VRKCJbOjoxXToxMjM0Iiwgc2VyaWFsKTsKK30KIAorVEVTVChzb2NrZXRfc3BlYywgcGFyc2VfdGNwX3NvY2tldF9zcGVjX2lwdjZfbm9fcG9ydCkgeworICAgIHN0ZDo6c3RyaW5nIGhvc3RuYW1lLCBlcnJvciwgc2VyaWFsOworICAgIGludCBwb3J0OworICAgIEVYUEVDVF9UUlVFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOjo6MSIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOworICAgIEVYUEVDVF9FUSgiOjoxIiwgaG9zdG5hbWUpOworICAgIEVYUEVDVF9FUSg1NTU1LCBwb3J0KTsKKyAgICBFWFBFQ1RfRVEoIls6OjFdOjU1NTUiLCBzZXJpYWwpOworfQorCitURVNUKHNvY2tldF9zcGVjLCBwYXJzZV90Y3Bfc29ja2V0X3NwZWNfaXB2Nl9iYWRfcG9ydHMpIHsKKyAgICBzdGQ6OnN0cmluZyBob3N0bmFtZSwgZXJyb3IsIHNlcmlhbDsKKyAgICBpbnQgcG9ydDsKICAgICBFWFBFQ1RfRkFMU0UocGFyc2VfdGNwX3NvY2tldF9zcGVjKCJ0Y3A6Wzo6MV0iLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKICAgICBFWFBFQ1RfRkFMU0UocGFyc2VfdGNwX3NvY2tldF9zcGVjKCJ0Y3A6Wzo6MV06IiwgJmhvc3RuYW1lLCAmcG9ydCwgJnNlcmlhbCwgJmVycm9yKSk7CiAgICAgRVhQRUNUX0ZBTFNFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOls6OjFdOi0xIiwgJmhvc3RuYW1lLCAmcG9ydCwgJnNlcmlhbCwgJmVycm9yKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOjo6MSIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOwotICAgIEVYUEVDVF9GQUxTRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDo6OjE6MTIzNCIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOwogfQpkaWZmIC0tZ2l0IGEvYWRiL3N5c2RlcHNfd2luMzIuY3BwIGIvYWRiL3N5c2RlcHNfd2luMzIuY3BwCmluZGV4IDYzNzJiM2QuLmRjMjUyNWMgMTAwNjQ0Ci0tLSBhL2FkYi9zeXNkZXBzX3dpbjMyLmNwcAorKysgYi9hZGIvc3lzZGVwc193aW4zMi5jcHAKQEAgLTY4OCw3ICs2ODgsNyBAQAogICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTeXN0ZW1FcnJvckNvZGVUb1N0cmluZyhlcnIpLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgICAgIF9zb2NrZXRfc2V0X2Vycm5vKGVycik7Ci0gICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIENIRUNLX0dFKHN0YXRpY19jYXN0PERXT1JEPihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKSwgYnl0ZXNfd3JpdHRlbik7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnl0ZXNfd3JpdHRlbik7CmRpZmYgLS1naXQgYS9hZGIvdHJhbnNwb3J0LmNwcCBiL2FkYi90cmFuc3BvcnQuY3BwCmluZGV4IDhiYzkyNWYuLjNkMWQ2MjAgMTAwNjQ0Ci0tLSBhL2FkYi90cmFuc3BvcnQuY3BwCisrKyBiL2FkYi90cmFuc3BvcnQuY3BwCkBAIC01NDIsOSArNTQyLDcgQEAKICAgICAvLyBmb3IgdGhlIGZpcnN0IHRpbWUsIGV2ZW4gaWYgbm8gdXBkYXRlIG9jY3VycmVkLgogICAgIGlmICh0cmFja2VyLT51cGRhdGVfbmVlZGVkKSB7CiAgICAgICAgIHRyYWNrZXItPnVwZGF0ZV9uZWVkZWQgPSBmYWxzZTsKLQotICAgICAgICBzdGQ6OnN0cmluZyB0cmFuc3BvcnRzID0gbGlzdF90cmFuc3BvcnRzKHRyYWNrZXItPmxvbmdfb3V0cHV0KTsKLSAgICAgICAgZGV2aWNlX3RyYWNrZXJfc2VuZCh0cmFja2VyLCB0cmFuc3BvcnRzKTsKKyAgICAgICAgZGV2aWNlX3RyYWNrZXJfc2VuZCh0cmFja2VyLCBsaXN0X3RyYW5zcG9ydHModHJhY2tlci0+bG9uZ19vdXRwdXQpKTsKICAgICB9CiB9CiAKQEAgLTU4NywxMyArNTg1LDExIEBACiAgICAgdXBkYXRlX3RyYW5zcG9ydF9zdGF0dXMoKTsKIAogICAgIC8vIE5vdGlmeSBgYWRiIHRyYWNrLWRldmljZXNgIGNsaWVudHMuCi0gICAgc3RkOjpzdHJpbmcgdHJhbnNwb3J0cyA9IGxpc3RfdHJhbnNwb3J0cyhmYWxzZSk7Ci0KICAgICBkZXZpY2VfdHJhY2tlciogdHJhY2tlciA9IGRldmljZV90cmFja2VyX2xpc3Q7CiAgICAgd2hpbGUgKHRyYWNrZXIgIT0gbnVsbHB0cikgewogICAgICAgICBkZXZpY2VfdHJhY2tlciogbmV4dCA9IHRyYWNrZXItPm5leHQ7CiAgICAgICAgIC8vIFRoaXMgbWF5IGRlc3Ryb3kgdGhlIHRyYWNrZXIgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgotICAgICAgICBkZXZpY2VfdHJhY2tlcl9zZW5kKHRyYWNrZXIsIHRyYW5zcG9ydHMpOworICAgICAgICBkZXZpY2VfdHJhY2tlcl9zZW5kKHRyYWNrZXIsIGxpc3RfdHJhbnNwb3J0cyh0cmFja2VyLT5sb25nX291dHB1dCkpOwogICAgICAgICB0cmFja2VyID0gbmV4dDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9hZGIvdHlwZXMuaCBiL2FkYi90eXBlcy5oCmluZGV4IGNkMTM2NmQuLjhiZDY2YmUgMTAwNjQ0Ci0tLSBhL2FkYi90eXBlcy5oCisrKyBiL2FkYi90eXBlcy5oCkBAIC0xNiw2ICsxNiw4IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8bWVtb3J5PgpkaWZmIC0tZ2l0IGEvYmFzZS9lcnJvcnNfdW5peC5jcHAgYi9iYXNlL2Vycm9yc191bml4LmNwcAppbmRleCAyOTY5OTVlLi40ODI2OWI2IDEwMDY0NAotLS0gYS9iYXNlL2Vycm9yc191bml4LmNwcAorKysgYi9iYXNlL2Vycm9yc191bml4LmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9lcnJvcnMuaCIKIAogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBiYXNlIHsKZGlmZiAtLWdpdCBhL2Jhc2UvaW5jbHVkZS9hbmRyb2lkLWJhc2UvZW5kaWFuLmggYi9iYXNlL2luY2x1ZGUvYW5kcm9pZC1iYXNlL2VuZGlhbi5oCmluZGV4IGNiYmQ4YzkuLjEwZWZhYTMgMTAwNjQ0Ci0tLSBhL2Jhc2UvaW5jbHVkZS9hbmRyb2lkLWJhc2UvZW5kaWFuLmgKKysrIGIvYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS9lbmRpYW4uaApAQCAtNDEsMjMgKzQxLDI4IEBACiAKICNlbHNlCiAKLS8qIE1hYyBPUyBhbmQgV2luZG93cyBoYXZlIG5vdGhpbmcuICovCi0KLSNkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDEyMzQKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKy8qIG1hY09TIGhhcyBzb21lIG9mIHRoZSBiYXNpY3MuICovCisjaW5jbHVkZSA8c3lzL19lbmRpYW4uaD4KKyNlbHNlCisvKiBXaW5kb3dzIHJlYWxseSBoYXMgbm90aGluZy4gKi8KICNkZWZpbmUgTElUVExFX0VORElBTiBfX0xJVFRMRV9FTkRJQU4KLQotI2RlZmluZSBfX0JJR19FTkRJQU4gNDMyMQogI2RlZmluZSBCSUdfRU5ESUFOIF9fQklHX0VORElBTgotCi0jZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KICNkZWZpbmUgQllURV9PUkRFUiBfX0JZVEVfT1JERVIKLQogI2RlZmluZSBodG9ucyh4KSBfX2J1aWx0aW5fYnN3YXAxNih4KQogI2RlZmluZSBodG9ubCh4KSBfX2J1aWx0aW5fYnN3YXAzMih4KQotI2RlZmluZSBodG9ucSh4KSBfX2J1aWx0aW5fYnN3YXA2NCh4KQotCiAjZGVmaW5lIG50b2hzKHgpIF9fYnVpbHRpbl9ic3dhcDE2KHgpCiAjZGVmaW5lIG50b2hsKHgpIF9fYnVpbHRpbl9ic3dhcDMyKHgpCisjZW5kaWYKKworLyogTmVpdGhlciBtYWNPUyBub3IgV2luZG93cyBoYXZlIHRoZSByZXN0LiAqLworCisjZGVmaW5lIF9fTElUVExFX0VORElBTiAxMjM0CisjZGVmaW5lIF9fQklHX0VORElBTiA0MzIxCisjZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KKworI2RlZmluZSBodG9ucSh4KSBfX2J1aWx0aW5fYnN3YXA2NCh4KQorCiAjZGVmaW5lIG50b2hxKHgpIF9fYnVpbHRpbl9ic3dhcDY0KHgpCiAKICNkZWZpbmUgaHRvYmUxNih4KSBfX2J1aWx0aW5fYnN3YXAxNih4KQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl9mc3RhYi5jcHAgYi9mc19tZ3IvZnNfbWdyX2ZzdGFiLmNwcAppbmRleCA5YTBmNGZlLi5iYzE5N2NkIDEwMDY0NAotLS0gYS9mc19tZ3IvZnNfbWdyX2ZzdGFiLmNwcAorKysgYi9mc19tZ3IvZnNfbWdyX2ZzdGFiLmNwcApAQCAtNDYsNyArNDYsNyBAQAogbmFtZXNwYWNlIGZzX21nciB7CiBuYW1lc3BhY2UgewogCi1jb25zdCBzdGQ6OnN0cmluZyBrRGVmYXVsdEFuZHJvaWREdERpcigiL3Byb2MvZGV2aWNlLXRyZWUvZmlybXdhcmUvYW5kcm9pZCIpOworY29uc3RleHByIGNoYXIga0RlZmF1bHRBbmRyb2lkRHREaXJbXSA9ICIvcHJvYy9kZXZpY2UtdHJlZS9maXJtd2FyZS9hbmRyb2lkIjsKIAogc3RydWN0IEZsYWdMaXN0IHsKICAgICBjb25zdCBjaGFyICpuYW1lOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnMuY3BwIGIvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnMuY3BwCmluZGV4IGFjMTVjZTQuLjRlZTdkYjkgMTAwNjQ0Ci0tLSBhL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzLmNwcAorKysgYi9mc19tZ3IvZnNfbWdyX292ZXJsYXlmcy5jcHAKQEAgLTE1MCw2ICsxNTAsMzEgQEAKICAgICByZXR1cm4gKHZzdC5mX2JmcmVlID49ICh2c3QuZl9ibG9ja3MgKiBrUGVyY2VudFRocmVzaG9sZCAvIDEwMCkpOwogfQogCitjb25zdCBhdXRvIGtQaHlzaWNhbERldmljZSA9ICIvZGV2L2Jsb2NrL2J5LW5hbWUvInM7CisKK2Jvb2wgZnNfbWdyX3VwZGF0ZV9ibGtfZGV2aWNlKEZzdGFiRW50cnkqIGVudHJ5KSB7CisgICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3MubG9naWNhbCkgeworICAgICAgICBmc19tZ3JfdXBkYXRlX2xvZ2ljYWxfcGFydGl0aW9uKGVudHJ5KTsKKyAgICB9CisgICAgaWYgKGZzX21ncl9hY2Nlc3MoZW50cnktPmJsa19kZXZpY2UpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZW50cnktPmJsa19kZXZpY2UgIT0gIi9kZXYvcm9vdCIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3Igc3lzdGVtLWFzLXJvb3QgKHRhaW1lbiBhbmQgb3RoZXJzKQorICAgIGF1dG8gYmxrX2RldmljZSA9IGtQaHlzaWNhbERldmljZSArICJzeXN0ZW0iOworICAgIGlmICghZnNfbWdyX2FjY2VzcyhibGtfZGV2aWNlKSkgeworICAgICAgICBibGtfZGV2aWNlICs9IGZzX21ncl9nZXRfc2xvdF9zdWZmaXgoKTsKKyAgICAgICAgaWYgKCFmc19tZ3JfYWNjZXNzKGJsa19kZXZpY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZW50cnktPmJsa19kZXZpY2UgPSBibGtfZGV2aWNlOworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIGZzX21ncl9vdmVybGF5ZnNfZW5hYmxlZChGc3RhYkVudHJ5KiBlbnRyeSkgewogICAgIC8vIHJlYWRvbmx5IGZpbGVzeXN0ZW0sIGNhbiBub3QgYmUgbW91bnQgLW8gcmVtb3VudCxydwogICAgIC8vIGZvciBzcXVhc2hmcywgZXJvZnMgb3IgaWYgZnJlZSBzcGFjZSBpcyAobmVhcikgemVybyBtYWtpbmcgc3VjaCBhIHJlbW91bnQKQEAgLTE1NywxOSArMTgyLDE5IEBACiAgICAgaWYgKCFmc19tZ3JfZmlsZXN5c3RlbV9oYXNfc3BhY2UoZW50cnktPm1vdW50X3BvaW50KSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3MubG9naWNhbCkgewotICAgICAgICBmc19tZ3JfdXBkYXRlX2xvZ2ljYWxfcGFydGl0aW9uKGVudHJ5KTsKKworICAgIC8vIGJsa19kZXZpY2UgbmVlZHMgdG8gYmUgc2V0dXAgc28gd2UgY2FuIGNoZWNrIHN1cGVyYmxvY2suCisgICAgLy8gSWYgd2UgZmFpbCBoZXJlLCBiZWNhdXNlIGR1cmluZyBpbml0IGZpcnN0IHN0YWdlIGFuZCBoYXZlIGRvdWJ0cy4KKyAgICBpZiAoIWZzX21ncl91cGRhdGVfYmxrX2RldmljZShlbnRyeSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorCisgICAgLy8gY2hlY2sgaWYgZXh0NCBkZS1kdXBlCiAgICAgYXV0byBzYXZlX2Vycm5vID0gZXJybm87Ci0gICAgZXJybm8gPSAwOwogICAgIGF1dG8gaGFzX3NoYXJlZF9ibG9ja3MgPSBmc19tZ3JfaGFzX3NoYXJlZF9ibG9ja3MoZW50cnktPm1vdW50X3BvaW50LCBlbnRyeS0+YmxrX2RldmljZSk7CiAgICAgaWYgKCFoYXNfc2hhcmVkX2Jsb2NrcyAmJiAoZW50cnktPm1vdW50X3BvaW50ID09ICIvc3lzdGVtIikpIHsKICAgICAgICAgaGFzX3NoYXJlZF9ibG9ja3MgPSBmc19tZ3JfaGFzX3NoYXJlZF9ibG9ja3MoIi8iLCBlbnRyeS0+YmxrX2RldmljZSk7CiAgICAgfQotICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgZmlyc3Qgc3RhZ2UgaW5pdCBmb3Igc3lzdGVtIGFzIHJvb3QgKHRhaW1lbikKLSAgICBpZiAoIWhhc19zaGFyZWRfYmxvY2tzICYmIChlcnJubyA9PSBFTk9FTlQpICYmIChlbnRyeS0+YmxrX2RldmljZSA9PSAiL2Rldi9yb290IikpIHsKLSAgICAgICAgaGFzX3NoYXJlZF9ibG9ja3MgPSB0cnVlOwotICAgIH0KICAgICBlcnJubyA9IHNhdmVfZXJybm87CiAgICAgcmV0dXJuIGhhc19zaGFyZWRfYmxvY2tzOwogfQpAQCAtMzg4LDggKzQxMyw2IEBACiAgICAgcmV0dXJuIFNsb3ROdW1iZXJGb3JTbG90U3VmZml4KGZzX21ncl9nZXRfc2xvdF9zdWZmaXgoKSk7CiB9CiAKLWNvbnN0IGF1dG8ga1BoeXNpY2FsRGV2aWNlID0gIi9kZXYvYmxvY2svYnktbmFtZS8iczsKLQogc3RkOjpzdHJpbmcgZnNfbWdyX292ZXJsYXlmc19zdXBlcl9kZXZpY2UodWludDMyX3Qgc2xvdF9udW1iZXIpIHsKICAgICByZXR1cm4ga1BoeXNpY2FsRGV2aWNlICsgZnNfbWdyX2dldF9zdXBlcl9wYXJ0aXRpb25fbmFtZShzbG90X251bWJlcik7CiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vZG0uY3BwIGIvZnNfbWdyL2xpYmRtL2RtLmNwcAppbmRleCAwYWQ4ZDlkLi5hNGUwZDc2IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZG0vZG0uY3BwCisrKyBiL2ZzX21nci9saWJkbS9kbS5jcHAKQEAgLTE1MCw2ICsxNTAsMTUgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RkOjpvcHRpb25hbDxEZXZpY2VNYXBwZXI6OkluZm8+IERldmljZU1hcHBlcjo6R2V0RGV0YWlsZWRJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCB7CisgICAgc3RydWN0IGRtX2lvY3RsIGlvOworICAgIEluaXRJbygmaW8sIG5hbWUpOworICAgIGlmIChpb2N0bChmZF8sIERNX0RFVl9TVEFUVVMsICZpbykgPCAwKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIHJldHVybiBJbmZvKGlvLmZsYWdzKTsKK30KKwogRG1EZXZpY2VTdGF0ZSBEZXZpY2VNYXBwZXI6OkdldFN0YXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCB7CiAgICAgc3RydWN0IGRtX2lvY3RsIGlvOwogICAgIEluaXRJbygmaW8sIG5hbWUpOwpAQCAtMTYyLDYgKzE3MSwyNCBAQAogICAgIHJldHVybiBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQ7CiB9CiAKK2Jvb2wgRGV2aWNlTWFwcGVyOjpDaGFuZ2VTdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgRG1EZXZpY2VTdGF0ZSBzdGF0ZSkgeworICAgIGlmIChzdGF0ZSAhPSBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQgJiYgc3RhdGUgIT0gRG1EZXZpY2VTdGF0ZTo6QUNUSVZFKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgZG1faW9jdGwgaW87CisgICAgSW5pdElvKCZpbywgbmFtZSk7CisKKyAgICBpZiAoc3RhdGUgPT0gRG1EZXZpY2VTdGF0ZTo6U1VTUEVOREVEKSBpby5mbGFncyA9IERNX1NVU1BFTkRfRkxBRzsKKworICAgIGlmIChpb2N0bChmZF8sIERNX0RFVl9TVVNQRU5ELCAmaW8pIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRE1fREVWX1NVU1BFTkQgIgorICAgICAgICAgICAgICAgICAgICA8PCAoc3RhdGUgPT0gRG1EZXZpY2VTdGF0ZTo6U1VTUEVOREVEID8gInN1c3BlbmQiIDogInJlc3VtZSIpIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBEZXZpY2VNYXBwZXI6OkNyZWF0ZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgRG1UYWJsZSYgdGFibGUpIHsKICAgICBzdGQ6OnN0cmluZyBpZ25vcmVfcGF0aDsKICAgICBpZiAoIUNyZWF0ZURldmljZShuYW1lLCB0YWJsZSwgJmlnbm9yZV9wYXRoLCAwbXMpKSB7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vZG1fdGFyZ2V0LmNwcCBiL2ZzX21nci9saWJkbS9kbV90YXJnZXQuY3BwCmluZGV4IGRhMTAxM2UuLjdjOTgwNGMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9kbV90YXJnZXQuY3BwCisrKyBiL2ZzX21nci9saWJkbS9kbV90YXJnZXQuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlICJsaWJkbS9kbV90YXJnZXQuaCIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIApAQCAtMTQ5LDYgKzE1MCwyNSBAQAogICAgIHJldHVybiBiYXNlX2RldmljZV8gKyAiICIgKyBjb3dfZGV2aWNlXyArICIgIiArIG1vZGUgKyAiICIgKyBzdGQ6OnRvX3N0cmluZyhjaHVua19zaXplXyk7CiB9CiAKKy8vIENvbXB1dGVzIHRoZSBwZXJjZW50YWdlIG9mIGNvbXBsaXRpb24gZm9yIHNuYXBzaG90IHN0YXR1cy4KKy8vIEBzZWN0b3JzX2luaXRpYWwgaXMgdGhlIG51bWJlciBvZiBzZWN0b3JzX2FsbG9jYXRlZCBzdG9yZWQgcmlnaHQgYmVmb3JlCisvLyBzdGFydGluZyB0aGUgbWVyZ2UuCitkb3VibGUgRG1UYXJnZXRTbmFwc2hvdDo6TWVyZ2VQZXJjZW50KGNvbnN0IERtVGFyZ2V0U25hcHNob3Q6OlN0YXR1cyYgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZWN0b3JzX2luaXRpYWwpIHsKKyAgICB1aW50NjRfdCBzID0gc3RhdHVzLnNlY3RvcnNfYWxsb2NhdGVkOworICAgIHVpbnQ2NF90IHQgPSBzdGF0dXMudG90YWxfc2VjdG9yczsKKyAgICB1aW50NjRfdCBtID0gc3RhdHVzLm1ldGFkYXRhX3NlY3RvcnM7CisgICAgdWludDY0X3QgaSA9IHNlY3RvcnNfaW5pdGlhbCA9PSAwID8gdCA6IHNlY3RvcnNfaW5pdGlhbDsKKworICAgIGlmICh0IDw9IHMgfHwgaSA8PSBzKSB7CisgICAgICAgIHJldHVybiAwLjA7CisgICAgfQorICAgIGlmIChzID09IDAgfHwgdCA9PSAwIHx8IHMgPD0gbSkgeworICAgICAgICByZXR1cm4gMTAwLjA7CisgICAgfQorICAgIHJldHVybiAxMDAuMCAvIChpIC0gbSkgKiAoaSAtIHMpOworfQorCiBib29sIERtVGFyZ2V0U25hcHNob3Q6OlJlcG9ydHNPdmVyZmxvdyhjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X3R5cGUpIHsKICAgICBEZXZpY2VNYXBwZXImIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwogICAgIERtVGFyZ2V0VHlwZUluZm8gaW5mbzsKQEAgLTE2NSwzNCArMTg1LDQwIEBACiB9CiAKIGJvb2wgRG1UYXJnZXRTbmFwc2hvdDo6UGFyc2VTdGF0dXNUZXh0KGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0LCBTdGF0dXMqIHN0YXR1cykgeworICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgbGluZSBhcyBpdCBzaG91bGQgYmUKKyAgICBpbnQgYXJncyA9IHNzY2FuZih0ZXh0LmNfc3RyKCksICIlIiBQUkl1NjQgIi8lIiBQUkl1NjQgIiAlIiBQUkl1NjQsICZzdGF0dXMtPnNlY3RvcnNfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMtPnRvdGFsX3NlY3RvcnMsICZzdGF0dXMtPm1ldGFkYXRhX3NlY3RvcnMpOworICAgIGlmIChhcmdzID09IDMpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogICAgIGF1dG8gc2VjdGlvbnMgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdCh0ZXh0LCAiICIpOworICAgIGlmIChzZWN0aW9ucy5zaXplKCkgPT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb3VsZCBub3QgcGFyc2UgZW1wdHkgc3RhdHVzIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBFcnJvciBjb2RlcyBhcmU6ICJJbnZhbGlkIiwgIk92ZXJmbG93IiBhbmQgIk1lcmdlIGZhaWxlZCIKICAgICBpZiAoc2VjdGlvbnMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBhbiBlcnJvciBjb2RlLCAiSW52YWxpZCIgaXMgcG9zc2libGUgYXMgaXMgIk92ZXJmbG93IgotICAgICAgICAvLyBvbiA0LjQrLgorICAgICAgICBpZiAodGV4dCA9PSAiSW52YWxpZCIgfHwgdGV4dCA9PSAiT3ZlcmZsb3ciKSB7CisgICAgICAgICAgICBzdGF0dXMtPmVycm9yID0gdGV4dDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzZWN0aW9ucy5zaXplKCkgPT0gMiAmJiB0ZXh0ID09ICJNZXJnZSBmYWlsZWQiKSB7CiAgICAgICAgIHN0YXR1cy0+ZXJyb3IgPSB0ZXh0OwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgaWYgKHNlY3Rpb25zLnNpemUoKSAhPSAyKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgInNuYXBzaG90IHN0YXR1cyBzaG91bGQgaGF2ZSB0d28gY29tcG9uZW50cyI7CisgICAgTE9HKEVSUk9SKSA8PCAiY291bGQgbm90IHBhcnNlIHNuYXBzaG90IHN0YXR1czogd3JvbmcgZm9ybWF0IjsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRG1UYXJnZXRTbmFwc2hvdDo6R2V0RGV2aWNlc0Zyb21QYXJhbXMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtcywgc3RkOjpzdHJpbmcqIGJhc2VfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogY293X2RldmljZSkgeworICAgIGF1dG8gcGllY2VzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQocGFyYW1zLCAiICIpOworICAgIGlmIChwaWVjZXMuc2l6ZSgpIDwgMikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJQYXJhbWV0ZXIgc3RyaW5nIGlzIGludmFsaWQ6ICIgPDwgcGFyYW1zOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGF1dG8gc2VjdG9yX2luZm8gPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChzZWN0aW9uc1swXSwgIi8iKTsKLSAgICBpZiAoc2VjdG9yX2luZm8uc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAic25hcHNob3Qgc2VjdG9yIGluZm8gc2hvdWxkIGhhdmUgdHdvIGNvbXBvbmVudHMiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50KHNlY3Rpb25zWzFdLCAmc3RhdHVzLT5tZXRhZGF0YV9zZWN0b3JzKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJjb3VsZCBub3QgcGFyc2UgbWV0YWRhdGEgc2VjdG9ycyI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQoc2VjdG9yX2luZm9bMF0sICZzdGF0dXMtPnNlY3RvcnNfYWxsb2NhdGVkKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJjb3VsZCBub3QgcGFyc2Ugc2VjdG9ycyBhbGxvY2F0ZWQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50KHNlY3Rvcl9pbmZvWzFdLCAmc3RhdHVzLT50b3RhbF9zZWN0b3JzKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJjb3VsZCBub3QgcGFyc2UgdG90YWwgc2VjdG9ycyI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgKmJhc2VfZGV2aWNlID0gcGllY2VzWzBdOworICAgICpjb3dfZGV2aWNlID0gcGllY2VzWzFdOwogICAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vZG1fdGVzdC5jcHAgYi9mc19tZ3IvbGliZG0vZG1fdGVzdC5jcHAKaW5kZXggYjI4YThmMi4uZWVkMjFkYyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmRtL2RtX3Rlc3QuY3BwCisrKyBiL2ZzX21nci9saWJkbS9kbV90ZXN0LmNwcApAQCAtMTY2LDYgKzE2NiwzNCBAQAogICAgIEFTU0VSVF9UUlVFKGRldi5EZXN0cm95KCkpOwogfQogCitURVNUKGxpYmRtLCBEbVN1c3BlbmRSZXN1bWUpIHsKKyAgICB1bmlxdWVfZmQgdG1wMShDcmVhdGVUZW1wRmlsZSgiZmlsZV9zdXNwZW5kX3Jlc3VtZSIsIDUxMikpOworICAgIEFTU0VSVF9HRSh0bXAxLCAwKTsKKworICAgIExvb3BEZXZpY2UgbG9vcF9hKHRtcDEsIDEwcyk7CisgICAgQVNTRVJUX1RSVUUobG9vcF9hLnZhbGlkKCkpOworCisgICAgRG1UYWJsZSB0YWJsZTsKKyAgICBBU1NFUlRfVFJVRSh0YWJsZS5FbXBsYWNlPERtVGFyZ2V0TGluZWFyPigwLCAxLCBsb29wX2EuZGV2aWNlKCksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh0YWJsZS52YWxpZCgpKTsKKworICAgIFRlbXBEZXZpY2UgZGV2KCJsaWJkbS10ZXN0LWRtLXN1c3BlbmQtcmVzdW1lIiwgdGFibGUpOworICAgIEFTU0VSVF9UUlVFKGRldi52YWxpZCgpKTsKKyAgICBBU1NFUlRfRkFMU0UoZGV2LnBhdGgoKS5lbXB0eSgpKTsKKworICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworCisgICAgLy8gVGVzdCBTZXQgYW5kIEdldCBzdGF0dXMgb2YgZGV2aWNlLgorICAgIHZlY3RvcjxEZXZpY2VNYXBwZXI6OlRhcmdldEluZm8+IHRhcmdldHM7CisgICAgQVNTRVJUX0VRKGRtLkdldFN0YXRlKGRldi5uYW1lKCkpLCBEbURldmljZVN0YXRlOjpBQ1RJVkUpOworCisgICAgQVNTRVJUX1RSVUUoZG0uQ2hhbmdlU3RhdGUoZGV2Lm5hbWUoKSwgRG1EZXZpY2VTdGF0ZTo6U1VTUEVOREVEKSk7CisgICAgQVNTRVJUX0VRKGRtLkdldFN0YXRlKGRldi5uYW1lKCkpLCBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQpOworCisgICAgQVNTRVJUX1RSVUUoZG0uQ2hhbmdlU3RhdGUoZGV2Lm5hbWUoKSwgRG1EZXZpY2VTdGF0ZTo6QUNUSVZFKSk7CisgICAgQVNTRVJUX0VRKGRtLkdldFN0YXRlKGRldi5uYW1lKCkpLCBEbURldmljZVN0YXRlOjpBQ1RJVkUpOworfQorCiBURVNUKGxpYmRtLCBEbVZlcml0eUFyZ3NBdmIyKSB7CiAgICAgc3RkOjpzdHJpbmcgZGV2aWNlID0gIi9kZXYvYmxvY2svcGxhdGZvcm0vc29jLzFkYTQwMDAudWZzaGMvYnktbmFtZS92ZW5kb3JfYSI7CiAgICAgc3RkOjpzdHJpbmcgYWxnb3JpdGhtID0gInNoYTEiOwpAQCAtNDI4LDYgKzQ1Niw4NyBAQAogICAgIH0KIH0KIAorVEVTVChsaWJkbSwgUGFyc2VTdGF0dXNUZXh0KSB7CisgICAgRG1UYXJnZXRTbmFwc2hvdDo6U3RhdHVzIHN0YXR1czsKKworICAgIC8vIEJhZCBpbnB1dHMKKyAgICBFWFBFQ1RfRkFMU0UoRG1UYXJnZXRTbmFwc2hvdDo6UGFyc2VTdGF0dXNUZXh0KCIiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiWCIsICZzdGF0dXMpKTsKKyAgICBFWFBFQ1RfRkFMU0UoRG1UYXJnZXRTbmFwc2hvdDo6UGFyc2VTdGF0dXNUZXh0KCIxMjMiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiMTIzLzQ1NiIsICZzdGF0dXMpKTsKKyAgICBFWFBFQ1RfRkFMU0UoRG1UYXJnZXRTbmFwc2hvdDo6UGFyc2VTdGF0dXNUZXh0KCIxMjMgNDU2IiwgJnN0YXR1cykpOworICAgIEVYUEVDVF9GQUxTRShEbVRhcmdldFNuYXBzaG90OjpQYXJzZVN0YXR1c1RleHQoIjEyMyA0NTYiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiMTIzIDQ1NiA3ODkiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiMTIzIDQ1Ni83ODkiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiMTIzLzQ1Ni83ODkiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiMTIzIC8gNDU2IDc4OSIsICZzdGF0dXMpKTsKKworICAgIC8vIEdvb2QgaW5wdXQKKyAgICBFWFBFQ1RfVFJVRShEbVRhcmdldFNuYXBzaG90OjpQYXJzZVN0YXR1c1RleHQoIjEyMy80NTYgNzg5IiwgJnN0YXR1cykpOworICAgIEVYUEVDVF9FUShzdGF0dXMuc2VjdG9yc19hbGxvY2F0ZWQsIDEyMyk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy50b3RhbF9zZWN0b3JzLCA0NTYpOworICAgIEVYUEVDVF9FUShzdGF0dXMubWV0YWRhdGFfc2VjdG9ycywgNzg5KTsKKworICAgIC8vIEtub3duIGVycm9yIGNvZGVzCisgICAgRVhQRUNUX1RSVUUoRG1UYXJnZXRTbmFwc2hvdDo6UGFyc2VTdGF0dXNUZXh0KCJJbnZhbGlkIiwgJnN0YXR1cykpOworICAgIEVYUEVDVF9UUlVFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiTWVyZ2UgZmFpbGVkIiwgJnN0YXR1cykpOworICAgIEVYUEVDVF9UUlVFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiT3ZlcmZsb3ciLCAmc3RhdHVzKSk7Cit9CisKK1RFU1QobGliZG0sIERtU25hcHNob3RNZXJnZVBlcmNlbnQpIHsKKyAgICBEbVRhcmdldFNuYXBzaG90OjpTdGF0dXMgc3RhdHVzOworCisgICAgLy8gQ29ycmVjdCBpbnB1dAorICAgIHN0YXR1cy5zZWN0b3JzX2FsbG9jYXRlZCA9IDEwMDA7CisgICAgc3RhdHVzLnRvdGFsX3NlY3RvcnMgPSAxMDAwOworICAgIHN0YXR1cy5tZXRhZGF0YV9zZWN0b3JzID0gMDsKKyAgICBFWFBFQ1RfTEUoRG1UYXJnZXRTbmFwc2hvdDo6TWVyZ2VQZXJjZW50KHN0YXR1cyksIDEuMCk7CisKKyAgICBzdGF0dXMuc2VjdG9yc19hbGxvY2F0ZWQgPSA1MDA7CisgICAgc3RhdHVzLnRvdGFsX3NlY3RvcnMgPSAxMDAwOworICAgIHN0YXR1cy5tZXRhZGF0YV9zZWN0b3JzID0gMDsKKyAgICBFWFBFQ1RfR0UoRG1UYXJnZXRTbmFwc2hvdDo6TWVyZ2VQZXJjZW50KHN0YXR1cyksIDQ5LjApOworICAgIEVYUEVDVF9MRShEbVRhcmdldFNuYXBzaG90OjpNZXJnZVBlcmNlbnQoc3RhdHVzKSwgNTEuMCk7CisKKyAgICBzdGF0dXMuc2VjdG9yc19hbGxvY2F0ZWQgPSAwOworICAgIHN0YXR1cy50b3RhbF9zZWN0b3JzID0gMTAwMDsKKyAgICBzdGF0dXMubWV0YWRhdGFfc2VjdG9ycyA9IDA7CisgICAgRVhQRUNUX0dFKERtVGFyZ2V0U25hcHNob3Q6Ok1lcmdlUGVyY2VudChzdGF0dXMpLCA5OS4wKTsKKworICAgIHN0YXR1cy5zZWN0b3JzX2FsbG9jYXRlZCA9IDUwMDsKKyAgICBzdGF0dXMudG90YWxfc2VjdG9ycyA9IDEwMDA7CisgICAgc3RhdHVzLm1ldGFkYXRhX3NlY3RvcnMgPSA1MDA7CisgICAgRVhQRUNUX0dFKERtVGFyZ2V0U25hcHNob3Q6Ok1lcmdlUGVyY2VudChzdGF0dXMpLCA5OS4wKTsKKworICAgIHN0YXR1cy5zZWN0b3JzX2FsbG9jYXRlZCA9IDUwMDsKKyAgICBzdGF0dXMudG90YWxfc2VjdG9ycyA9IDEwMDA7CisgICAgc3RhdHVzLm1ldGFkYXRhX3NlY3RvcnMgPSAwOworICAgIEVYUEVDVF9MRShEbVRhcmdldFNuYXBzaG90OjpNZXJnZVBlcmNlbnQoc3RhdHVzLCA1MDApLCAxLjApOworICAgIEVYUEVDVF9MRShEbVRhcmdldFNuYXBzaG90OjpNZXJnZVBlcmNlbnQoc3RhdHVzLCAxMDAwKSwgNTEuMCk7CisgICAgRVhQRUNUX0dFKERtVGFyZ2V0U25hcHNob3Q6Ok1lcmdlUGVyY2VudChzdGF0dXMsIDEwMDApLCA0OS4wKTsKKworICAgIC8vIFJvYnVzdG5lc3MKKyAgICBzdGF0dXMuc2VjdG9yc19hbGxvY2F0ZWQgPSAyMDAwOworICAgIHN0YXR1cy50b3RhbF9zZWN0b3JzID0gMTAwMDsKKyAgICBzdGF0dXMubWV0YWRhdGFfc2VjdG9ycyA9IDA7CisgICAgRVhQRUNUX0xFKERtVGFyZ2V0U25hcHNob3Q6Ok1lcmdlUGVyY2VudChzdGF0dXMpLCAwLjApOworCisgICAgc3RhdHVzLnNlY3RvcnNfYWxsb2NhdGVkID0gMjAwMDsKKyAgICBzdGF0dXMudG90YWxfc2VjdG9ycyA9IDEwMDA7CisgICAgc3RhdHVzLm1ldGFkYXRhX3NlY3RvcnMgPSAyMDAwOworICAgIEVYUEVDVF9MRShEbVRhcmdldFNuYXBzaG90OjpNZXJnZVBlcmNlbnQoc3RhdHVzKSwgMC4wKTsKKworICAgIHN0YXR1cy5zZWN0b3JzX2FsbG9jYXRlZCA9IDIwMDA7CisgICAgc3RhdHVzLnRvdGFsX3NlY3RvcnMgPSAwOworICAgIHN0YXR1cy5tZXRhZGF0YV9zZWN0b3JzID0gMjAwMDsKKyAgICBFWFBFQ1RfTEUoRG1UYXJnZXRTbmFwc2hvdDo6TWVyZ2VQZXJjZW50KHN0YXR1cyksIDAuMCk7CisKKyAgICBzdGF0dXMuc2VjdG9yc19hbGxvY2F0ZWQgPSAxMDAwOworICAgIHN0YXR1cy50b3RhbF9zZWN0b3JzID0gMDsKKyAgICBzdGF0dXMubWV0YWRhdGFfc2VjdG9ycyA9IDEwMDA7CisgICAgRVhQRUNUX0xFKERtVGFyZ2V0U25hcHNob3Q6Ok1lcmdlUGVyY2VudChzdGF0dXMsIDApLCAwLjApOworfQorCiBURVNUKGxpYmRtLCBDcnlwdEFyZ3MpIHsKICAgICBEbVRhcmdldENyeXB0IHRhcmdldDEoMCwgNTEyLCAic2hhMSIsICJhYmNkZWZnaCIsIDUwLCAiL2Rldi9sb29wMCIsIDEwMCk7CiAgICAgQVNTRVJUX0VRKHRhcmdldDEubmFtZSgpLCAiY3J5cHQiKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtLmggYi9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oCmluZGV4IDljMGMyZjMuLmNmMzA2ZjMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtLmgKKysrIGIvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaApAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CkBAIC00Niw2ICs0Nyw4IEBACiAKIGVudW0gY2xhc3MgRG1EZXZpY2VTdGF0ZSB7IElOVkFMSUQsIFNVU1BFTkRFRCwgQUNUSVZFIH07CiAKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1NlY3RvclNpemUgPSA1MTI7CisKIGNsYXNzIERldmljZU1hcHBlciBmaW5hbCB7CiAgIHB1YmxpYzoKICAgICBjbGFzcyBEbUJsb2NrRGV2aWNlIGZpbmFsIHsKQEAgLTcwLDE1ICs3MywzNyBAQAogICAgICAgICB1aW50NjRfdCBkZXZfOwogICAgIH07CiAKKyAgICBjbGFzcyBJbmZvIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3NfOworCisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluZm8odWludDMyX3QgZmxhZ3MpIDogZmxhZ3NfKGZsYWdzKSB7fQorCisgICAgICAgIGJvb2wgSXNBY3RpdmVUYWJsZVByZXNlbnQoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9BQ1RJVkVfUFJFU0VOVF9GTEFHOyB9CisgICAgICAgIGJvb2wgSXNCdWZmZXJGdWxsKCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fQlVGRkVSX0ZVTExfRkxBRzsgfQorICAgICAgICBib29sIElzSW5hY3RpdmVUYWJsZVByZXNlbnQoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7IH0KKyAgICAgICAgYm9vbCBJc1JlYWRPbmx5KCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fUkVBRE9OTFlfRkxBRzsgfQorICAgICAgICBib29sIElzU3VzcGVuZGVkKCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fU1VTUEVORF9GTEFHOyB9CisgICAgfTsKKwogICAgIC8vIFJlbW92ZXMgYSBkZXZpY2UgbWFwcGVyIGRldmljZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgogICAgIC8vIFJldHVybnMgJ3RydWUnIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KICAgICBib29sIERlbGV0ZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CiAKKyAgICAvLyBGZXRjaGVzIGFuZCByZXR1cm5zIHRoZSBjb21wbGV0ZSBzdGF0ZSBvZiB0aGUgdW5kZXJseWluZyBkZXZpY2UgbWFwcGVyCisgICAgLy8gZGV2aWNlIHdpdGggZ2l2ZW4gbmFtZS4KKyAgICBzdGQ6Om9wdGlvbmFsPEluZm8+IEdldERldGFpbGVkSW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Q7CisKICAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB1bmRlcmx5aW5nIGRldmljZSBtYXBwZXIgZGV2aWNlCiAgICAgLy8gd2l0aCBnaXZlbiBuYW1lLgogICAgIC8vIE9uZSBvZiBJTlZBTElELCBTVVNQRU5ERUQgb3IgQUNUSVZFLgogICAgIERtRGV2aWNlU3RhdGUgR2V0U3RhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0OwogCisgICAgLy8gUHV0cyB0aGUgZ2l2ZW4gZGV2aWNlIHRvIHRoZSBzcGVjaWZpZWQgc3RhdHVzLCB3aGljaCBtdXN0IGJlIGVpdGhlcjoKKyAgICAvLyAtIFNVU1BFTkRFRDogc3VzcGVuZCB0aGUgZGV2aWNlLCBvcgorICAgIC8vIC0gQUNUSVZFOiByZXN1bWVzIHRoZSBkZXZpY2UuCisgICAgYm9vbCBDaGFuZ2VTdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgRG1EZXZpY2VTdGF0ZSBzdGF0ZSk7CisKICAgICAvLyBDcmVhdGVzIGEgZGV2aWNlLCBsb2FkcyB0aGUgZ2l2ZW4gdGFibGUsIGFuZCBhY3RpdmF0ZXMgaXQuIElmIHRoZSBkZXZpY2UKICAgICAvLyBpcyBub3QgYWJsZSB0byBiZSBhY3RpdmF0ZWQsIGl0IGlzIGRlc3Ryb3llZCwgYW5kIGZhbHNlIGlzIHJldHVybmVkLgogICAgIC8vIEFmdGVyIGNyZWF0aW9uLCB8cGF0aHwgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nCkBAIC0xNzIsNiArMTk3LDcgQEAKICAgICBzdHJ1Y3QgVGFyZ2V0SW5mbyB7CiAgICAgICAgIHN0cnVjdCBkbV90YXJnZXRfc3BlYyBzcGVjOwogICAgICAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgICAgICBUYXJnZXRJbmZvKCkge30KICAgICAgICAgVGFyZ2V0SW5mbyhjb25zdCBzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMmIHNwZWMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhKQogICAgICAgICAgICAgOiBzcGVjKHNwZWMpLCBkYXRhKGRhdGEpIHt9CiAgICAgfTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtX3RhcmdldC5oIGIvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG1fdGFyZ2V0LmgKaW5kZXggNzIyOTIyZC4uYTY2YWI3YSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG1fdGFyZ2V0LmgKKysrIGIvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG1fdGFyZ2V0LmgKQEAgLTIxNiw4ICsyMTYsMTEgQEAKICAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3I7CiAgICAgfTsKIAorICAgIHN0YXRpYyBkb3VibGUgTWVyZ2VQZXJjZW50KGNvbnN0IFN0YXR1cyYgc3RhdHVzLCB1aW50NjRfdCBzZWN0b3JzX2luaXRpYWwgPSAwKTsKICAgICBzdGF0aWMgYm9vbCBQYXJzZVN0YXR1c1RleHQoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQsIFN0YXR1cyogc3RhdHVzKTsKICAgICBzdGF0aWMgYm9vbCBSZXBvcnRzT3ZlcmZsb3coY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldF90eXBlKTsKKyAgICBzdGF0aWMgYm9vbCBHZXREZXZpY2VzRnJvbVBhcmFtcyhjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1zLCBzdGQ6OnN0cmluZyogYmFzZV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGNvd19kZXZpY2UpOwogCiAgIHByaXZhdGU6CiAgICAgc3RkOjpzdHJpbmcgYmFzZV9kZXZpY2VfOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL0FuZHJvaWQuYnAgYi9mc19tZ3IvbGlibHAvQW5kcm9pZC5icAppbmRleCBiNTA0MTYxLi41YjM3N2FlIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlibHAvQW5kcm9pZC5icAorKysgYi9mc19tZ3IvbGlibHAvQW5kcm9pZC5icApAQCAtMzYsNiArMzYsNyBAQAogICAgICAgICAiYnVpbGRlci5jcHAiLAogICAgICAgICAiaW1hZ2VzLmNwcCIsCiAgICAgICAgICJwYXJ0aXRpb25fb3BlbmVyLmNwcCIsCisgICAgICAgICJwcm9wZXJ0eV9mZXRjaGVyLmNwcCIsCiAgICAgICAgICJyZWFkZXIuY3BwIiwKICAgICAgICAgInV0aWxpdHkuY3BwIiwKICAgICAgICAgIndyaXRlci5jcHAiLApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL2J1aWxkZXIuY3BwIGIvZnNfbWdyL2xpYmxwL2J1aWxkZXIuY3BwCmluZGV4IGMxMmUzYjIuLjc3Nzc0M2MgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJscC9idWlsZGVyLmNwcAorKysgYi9mc19tZ3IvbGlibHAvYnVpbGRlci5jcHAKQEAgLTIwLDIxICsyMCwxNiBAQAogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAKICNpbmNsdWRlICJsaWJscC9saWJscC5oIgorI2luY2x1ZGUgImxpYmxwL3Byb3BlcnR5X2ZldGNoZXIuaCIKICNpbmNsdWRlICJyZWFkZXIuaCIKICNpbmNsdWRlICJ1dGlsaXR5LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBmc19tZ3IgewogCi1zdGQ6Om9wdGlvbmFsPGJvb2w+IE1ldGFkYXRhQnVpbGRlcjo6c0FCT3ZlcnJpZGU7Ci1zdGQ6Om9wdGlvbmFsPGJvb2w+IE1ldGFkYXRhQnVpbGRlcjo6c1JldHJvZml0RGFwOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0RlZmF1bHRHcm91cCA9ICJkZWZhdWx0IjsKLQogYm9vbCBMaW5lYXJFeHRlbnQ6OkFkZFRvKExwTWV0YWRhdGEqIG91dCkgY29uc3QgewogICAgIGlmIChkZXZpY2VfaW5kZXhfID49IG91dC0+YmxvY2tfZGV2aWNlcy5zaXplKCkpIHsKICAgICAgICAgTEVSUk9SIDw8ICJFeHRlbnQgcmVmZXJlbmNlcyB1bmtub3duIGJsb2NrIGRldmljZS4iOwpAQCAtMTY0LDE2ICsxNTksMjcgQEAKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogCi0gICAgLy8gT24gbm9uLXJldHJvZml0IGRldmljZXMgdGhlcmUgaXMgb25seSBvbmUgbG9jYXRpb24gZm9yIG1ldGFkYXRhOiB0aGUKLSAgICAvLyBzdXBlciBwYXJ0aXRpb24uIHVwZGF0ZV9lbmdpbmUgd2lsbCByZW1vdmUgYW5kIHJlc2l6ZSBwYXJ0aXRpb25zIGFzCi0gICAgLy8gbmVlZGVkLiBPbiB0aGUgb3RoZXIgaGFuZCwgZm9yIHJldHJvZml0IGRldmljZXMsIHdlJ2xsIG5lZWQgdG8KLSAgICAvLyB0cmFuc2xhdGUgYmxvY2sgZGV2aWNlIGFuZCBncm91cCBuYW1lcyB0byB1cGRhdGUgdGhlaXIgc2xvdCBzdWZmaXhlcy4KKyAgICAvLyBPbiByZXRyb2ZpdCBEQVAgZGV2aWNlcywgbW9kaWZ5IHRoZSBtZXRhZGF0YSBzbyB0aGF0IGl0IGlzIHN1aXRhYmxlIGZvciBiZWluZyB3cml0dGVuCisgICAgLy8gdG8gdGhlIHRhcmdldCBzbG90IGxhdGVyLiBXZSBkZXRlY3QgcmV0cm9maXQgREFQIGRldmljZXMgYnkgY2hlY2tpbmcgdGhlIHN1cGVyIHBhcnRpdGlvbgorICAgIC8vIG5hbWUgYW5kIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgIC8vIFNlZSBjb21tZW50cyBmb3IgVXBkYXRlTWV0YWRhdGFGb3JPdGhlclN1cGVyLgogICAgIGF1dG8gc3VwZXJfZGV2aWNlID0gR2V0TWV0YWRhdGFTdXBlckJsb2NrRGV2aWNlKCptZXRhZGF0YS5nZXQoKSk7Ci0gICAgaWYgKEdldEJsb2NrRGV2aWNlUGFydGl0aW9uTmFtZSgqc3VwZXJfZGV2aWNlKSA9PSAic3VwZXIiIHx8Ci0gICAgICAgICFJc1JldHJvZml0RHluYW1pY1BhcnRpdGlvbnNEZXZpY2UoKSkgewotICAgICAgICByZXR1cm4gTmV3KCptZXRhZGF0YS5nZXQoKSwgJm9wZW5lcik7CisgICAgaWYgKEdldEJsb2NrRGV2aWNlUGFydGl0aW9uTmFtZSgqc3VwZXJfZGV2aWNlKSAhPSAic3VwZXIiICYmCisgICAgICAgIElzUmV0cm9maXREeW5hbWljUGFydGl0aW9uc0RldmljZSgpKSB7CisgICAgICAgIGlmICghVXBkYXRlTWV0YWRhdGFGb3JPdGhlclN1cGVyKG1ldGFkYXRhLmdldCgpLCBzb3VyY2Vfc2xvdF9udW1iZXIsIHRhcmdldF9zbG90X251bWJlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CiAgICAgfQogCisgICAgcmV0dXJuIE5ldygqbWV0YWRhdGEuZ2V0KCksICZvcGVuZXIpOworfQorCisvLyBGb3IgcmV0cm9maXQgREFQIGRldmljZXMsIHRoZXJlIGFyZSAoY29uY2VwdHVhbGx5KSB0d28gc3VwZXIgcGFydGl0aW9ucy4gV2UnbGwgbmVlZCB0byB0cmFuc2xhdGUKKy8vIGJsb2NrIGRldmljZSBhbmQgZ3JvdXAgbmFtZXMgdG8gdXBkYXRlIHRoZWlyIHNsb3Qgc3VmZml4ZXMuCisvLyAoT24gdGhlIG90aGVyIGhhbmQsIE9uIG5vbi1yZXRyb2ZpdCBEQVAgZGV2aWNlcyB0aGVyZSBpcyBvbmx5IG9uZSBsb2NhdGlvbiBmb3IgbWV0YWRhdGE6IHRoZQorLy8gc3VwZXIgcGFydGl0aW9uLiB1cGRhdGVfZW5naW5lIHdpbGwgcmVtb3ZlIGFuZCByZXNpemUgcGFydGl0aW9ucyBhcyBuZWVkZWQuKQorYm9vbCBNZXRhZGF0YUJ1aWxkZXI6OlVwZGF0ZU1ldGFkYXRhRm9yT3RoZXJTdXBlcihMcE1ldGFkYXRhKiBtZXRhZGF0YSwgdWludDMyX3Qgc291cmNlX3Nsb3RfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0YXJnZXRfc2xvdF9udW1iZXIpIHsKICAgICAvLyBDbGVhciBwYXJ0aXRpb25zIGFuZCBleHRlbnRzLCBzaW5jZSB0aGV5IGhhdmUgbm8gbWVhbmluZyBvbiB0aGUgdGFyZ2V0CiAgICAgLy8gc2xvdC4gV2UgYWxzbyBjbGVhciBncm91cHMgc2luY2UgdGhleSBhcmUgcmUtYWRkZWQgZHVyaW5nIE9UQS4KICAgICBtZXRhZGF0YS0+cGFydGl0aW9ucy5jbGVhcigpOwpAQCAtMTkzLDcgKzE5OSw3IEBACiAgICAgICAgICAgICAvLyByZWZlcnMgdG8gYSB0YXJnZXQgb3IgdW5rbm93biBibG9jayBkZXZpY2UuCiAgICAgICAgICAgICBMRVJST1IgPDwgIkludmFsaWQgYmxvY2sgZGV2aWNlIGZvciBzbG90ICIgPDwgc291cmNlX3Nsb3Rfc3VmZml4IDw8ICI6ICIKICAgICAgICAgICAgICAgICAgICA8PCBwYXJ0aXRpb25fbmFtZTsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHN0ZDo6c3RyaW5nIG5ld19uYW1lID0KICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZS5zdWJzdHIoMCwgcGFydGl0aW9uX25hbWUuc2l6ZSgpIC0gc2xvdF9zdWZmaXguc2l6ZSgpKSArCkBAIC0yMDIsMjAgKzIwOCwxMiBAQAogICAgICAgICBhdXRvIG5ld19kZXZpY2UgPSBzb3VyY2VfYmxvY2tfZGV2aWNlOwogICAgICAgICBpZiAoIVVwZGF0ZUJsb2NrRGV2aWNlUGFydGl0aW9uTmFtZSgmbmV3X2RldmljZSwgbmV3X25hbWUpKSB7CiAgICAgICAgICAgICBMRVJST1IgPDwgIlBhcnRpdGlvbiBuYW1lIHRvbyBsb25nOiAiIDw8IG5ld19uYW1lOwotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbWV0YWRhdGEtPmJsb2NrX2RldmljZXMuZW1wbGFjZV9iYWNrKG5ld19kZXZpY2UpOwogICAgIH0KIAotICAgIHJldHVybiBOZXcoKm1ldGFkYXRhLmdldCgpLCAmb3BlbmVyKTsKLX0KLQotdm9pZCBNZXRhZGF0YUJ1aWxkZXI6Ok92ZXJyaWRlQUJGb3JUZXN0aW5nKGJvb2wgYWJfZGV2aWNlKSB7Ci0gICAgc0FCT3ZlcnJpZGUgPSBhYl9kZXZpY2U7Ci19Ci0KLXZvaWQgTWV0YWRhdGFCdWlsZGVyOjpPdmVycmlkZVJldHJvZml0RHluYW1pY1Bhcml0aXRvbnNGb3JUZXN0aW5nKGJvb2wgcmV0cm9maXQpIHsKLSAgICBzUmV0cm9maXREYXAgPSByZXRyb2ZpdDsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogTWV0YWRhdGFCdWlsZGVyOjpNZXRhZGF0YUJ1aWxkZXIoKSA6IGF1dG9fc2xvdF9zdWZmaXhpbmdfKGZhbHNlKSB7CkBAIC00MTQsNyArNDEyLDcgQEAKICAgICBnZW9tZXRyeV8ubWV0YWRhdGFfc2xvdF9jb3VudCA9IG1ldGFkYXRhX3Nsb3RfY291bnQ7CiAgICAgZ2VvbWV0cnlfLmxvZ2ljYWxfYmxvY2tfc2l6ZSA9IGxvZ2ljYWxfYmxvY2tfc2l6ZTsKIAotICAgIGlmICghQWRkR3JvdXAoa0RlZmF1bHRHcm91cCwgMCkpIHsKKyAgICBpZiAoIUFkZEdyb3VwKHN0ZDo6c3RyaW5nKGtEZWZhdWx0R3JvdXApLCAwKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwpAQCAtNDMwLDcgKzQyOCw3IEBACiB9CiAKIFBhcnRpdGlvbiogTWV0YWRhdGFCdWlsZGVyOjpBZGRQYXJ0aXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHVpbnQzMl90IGF0dHJpYnV0ZXMpIHsKLSAgICByZXR1cm4gQWRkUGFydGl0aW9uKG5hbWUsIGtEZWZhdWx0R3JvdXAsIGF0dHJpYnV0ZXMpOworICAgIHJldHVybiBBZGRQYXJ0aXRpb24obmFtZSwgc3RkOjpzdHJpbmcoa0RlZmF1bHRHcm91cCksIGF0dHJpYnV0ZXMpOwogfQogCiBQYXJ0aXRpb24qIE1ldGFkYXRhQnVpbGRlcjo6QWRkUGFydGl0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZ3JvdXBfbmFtZSwKQEAgLTEwNTAsMTcgKzEwNDgsMTIgQEAKIH0KIAogYm9vbCBNZXRhZGF0YUJ1aWxkZXI6OklzQUJEZXZpY2UoKSB7Ci0gICAgaWYgKHNBQk92ZXJyaWRlLmhhc192YWx1ZSgpKSB7Ci0gICAgICAgIHJldHVybiAqc0FCT3ZlcnJpZGU7Ci0gICAgfQotICAgIHJldHVybiAhYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLmJvb3Quc2xvdF9zdWZmaXgiLCAiIikuZW1wdHkoKTsKKyAgICByZXR1cm4gIUlQcm9wZXJ0eUZldGNoZXI6OkdldEluc3RhbmNlKCktPkdldFByb3BlcnR5KCJyby5ib290LnNsb3Rfc3VmZml4IiwgIiIpLmVtcHR5KCk7CiB9CiAKIGJvb2wgTWV0YWRhdGFCdWlsZGVyOjpJc1JldHJvZml0RHluYW1pY1BhcnRpdGlvbnNEZXZpY2UoKSB7Ci0gICAgaWYgKHNSZXRyb2ZpdERhcC5oYXNfdmFsdWUoKSkgewotICAgICAgICByZXR1cm4gKnNSZXRyb2ZpdERhcDsKLSAgICB9Ci0gICAgcmV0dXJuICFhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLmJvb3QuZHluYW1pY19wYXJ0aXRpb25zX3JldHJvZml0IiwgZmFsc2UpOworICAgIHJldHVybiBJUHJvcGVydHlGZXRjaGVyOjpHZXRJbnN0YW5jZSgpLT5HZXRCb29sUHJvcGVydHkoInJvLmJvb3QuZHluYW1pY19wYXJ0aXRpb25zX3JldHJvZml0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKIH0KIAogYm9vbCBNZXRhZGF0YUJ1aWxkZXI6OklzUmV0cm9maXRNZXRhZGF0YSgpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9idWlsZGVyX3Rlc3QuY3BwIGIvZnNfbWdyL2xpYmxwL2J1aWxkZXJfdGVzdC5jcHAKaW5kZXggMzc3ZWM2OC4uNmQyNzg3MyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmxwL2J1aWxkZXJfdGVzdC5jcHAKKysrIGIvZnNfbWdyL2xpYmxwL2J1aWxkZXJfdGVzdC5jcHAKQEAgLTE5LDM2ICsxOSw0MCBAQAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8bGlibHAvYnVpbGRlci5oPgogCisjaW5jbHVkZSAibW9ja19wcm9wZXJ0eV9mZXRjaGVyLmgiCiAjaW5jbHVkZSAidXRpbGl0eS5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmZzX21ncjsKK3VzaW5nIDo6YW5kcm9pZDo6ZnNfbWdyOjpNb2NrUHJvcGVydHlGZXRjaGVyOwordXNpbmcgOjp0ZXN0aW5nOjpfOwordXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7CiB1c2luZyA6OnRlc3Rpbmc6OkVsZW1lbnRzQXJlOwordXNpbmcgOjp0ZXN0aW5nOjpOaWNlTW9jazsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOworCitzdGF0aWMgdm9pZCBSZXNldFByb3BlcnR5RmV0Y2hlcigpIHsKKyAgICBJUHJvcGVydHlGZXRjaGVyOjpPdmVycmlkZUZvclRlc3Rpbmcoc3RkOjptYWtlX3VuaXF1ZTxOaWNlTW9jazxNb2NrUHJvcGVydHlGZXRjaGVyPj4oKSk7Cit9CisKK01vY2tQcm9wZXJ0eUZldGNoZXIqIEdldE1vY2tlZEluc3RhbmNlKCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNb2NrUHJvcGVydHlGZXRjaGVyKj4oSVByb3BlcnR5RmV0Y2hlcjo6R2V0SW5zdGFuY2UoKSk7Cit9CiAKIGNsYXNzIEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgewogICBwdWJsaWM6Ci0gICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICAgICAgTWV0YWRhdGFCdWlsZGVyOjpPdmVycmlkZUFCRm9yVGVzdGluZyhmYWxzZSk7Ci0gICAgICAgIE1ldGFkYXRhQnVpbGRlcjo6T3ZlcnJpZGVSZXRyb2ZpdER5bmFtaWNQYXJpdGl0b25zRm9yVGVzdGluZyhmYWxzZSk7Ci0gICAgfQorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IFJlc2V0UHJvcGVydHlGZXRjaGVyKCk7IH0KIH07CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyBFbnZpcm9ubWVudCk7CiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKIH0KIAogY2xhc3MgQnVpbGRlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKICAgcHVibGljOgotICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgICAgIE1ldGFkYXRhQnVpbGRlcjo6T3ZlcnJpZGVBQkZvclRlc3RpbmcoZmFsc2UpOwotICAgICAgICBNZXRhZGF0YUJ1aWxkZXI6Ok92ZXJyaWRlUmV0cm9maXREeW5hbWljUGFyaXRpdG9uc0ZvclRlc3RpbmcoZmFsc2UpOwotICAgIH0KLSAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgICAgICBNZXRhZGF0YUJ1aWxkZXI6Ok92ZXJyaWRlQUJGb3JUZXN0aW5nKGZhbHNlKTsKLSAgICAgICAgTWV0YWRhdGFCdWlsZGVyOjpPdmVycmlkZVJldHJvZml0RHluYW1pY1Bhcml0aXRvbnNGb3JUZXN0aW5nKGZhbHNlKTsKLSAgICB9CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgUmVzZXRQcm9wZXJ0eUZldGNoZXIoKTsgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IFJlc2V0UHJvcGVydHlGZXRjaGVyKCk7IH0KIH07CiAKIFRFU1RfRihCdWlsZGVyVGVzdCwgQnVpbGRCYXNpYykgewpAQCAtNzg1LDcgKzc4OSw5IEBACiAKICAgICAvLyBBIGFuZCBCIHNsb3RzIHNob3VsZCBiZSBhbGxvY2F0ZWQgZnJvbSBzZXBhcmF0ZSBoYWx2ZXMgb2YgdGhlIHBhcnRpdGlvbiwKICAgICAvLyB0byBtaXRpZ2F0ZSBhbGxvY2F0aW5nIHRvbyBtYW55IGV4dGVudHMuIChiLzEyMDQzMzI4OCkKLSAgICBNZXRhZGF0YUJ1aWxkZXI6Ok92ZXJyaWRlQUJGb3JUZXN0aW5nKHRydWUpOworICAgIE9OX0NBTEwoKkdldE1vY2tlZEluc3RhbmNlKCksIEdldFByb3BlcnR5KCJyby5ib290LnNsb3Rfc3VmZml4IiwgXykpCisgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oIl9hIikpOworCiAgICAgYXV0byBidWlsZGVyID0gTWV0YWRhdGFCdWlsZGVyOjpOZXcoZGV2aWNlX2luZm8sIDY1NTM2LCAyKTsKICAgICBBU1NFUlRfTkUoYnVpbGRlciwgbnVsbHB0cik7CiAgICAgUGFydGl0aW9uKiBzeXN0ZW1fYSA9IGJ1aWxkZXItPkFkZFBhcnRpdGlvbigic3lzdGVtX2EiLCAwKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9pbmNsdWRlL2xpYmxwL2J1aWxkZXIuaCBiL2ZzX21nci9saWJscC9pbmNsdWRlL2xpYmxwL2J1aWxkZXIuaAppbmRleCBhMjIyMWVmLi4zYjIyOWJkIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlibHAvaW5jbHVkZS9saWJscC9idWlsZGVyLmgKKysrIGIvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvYnVpbGRlci5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmdfdmlldz4KIAogI2luY2x1ZGUgImxpYmxwLmgiCiAjaW5jbHVkZSAicGFydGl0aW9uX29wZW5lci5oIgpAQCAtMzcsNiArMzgsOSBAQAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtEZWZhdWx0UGFydGl0aW9uQWxpZ25tZW50ID0gMTAyNCAqIDEwMjQ7CiBzdGF0aWMgY29uc3QgdWludDMyX3Qga0RlZmF1bHRCbG9ja1NpemUgPSA0MDk2OwogCisvLyBOYW1lIG9mIHRoZSBkZWZhdWx0IGdyb3VwIGluIGEgbWV0YWRhdGEuCitzdGF0aWMgY29uc3RleHByIHN0ZDo6c3RyaW5nX3ZpZXcga0RlZmF1bHRHcm91cCA9ICJkZWZhdWx0IjsKKwogLy8gQWJzdHJhY3Rpb24gYXJvdW5kIGRtLXRhcmdldHMgdGhhdCBjYW4gYmUgZW5jb2RlZCBpbnRvIGxvZ2ljYWwgcGFydGl0aW9uIHRhYmxlcy4KIGNsYXNzIEV4dGVudCB7CiAgIHB1YmxpYzoKQEAgLTE5NiwxMiArMjAwLDYgQEAKICAgICAgICAgcmV0dXJuIE5ldyhkZXZpY2VfaW5mbywgbWV0YWRhdGFfbWF4X3NpemUsIG1ldGFkYXRhX3Nsb3RfY291bnQpOwogICAgIH0KIAotICAgIC8vIFVzZWQgYnkgdGhlIHRlc3QgaGFybmVzcyB0byBvdmVycmlkZSB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgIkEvQiIuCi0gICAgc3RhdGljIHZvaWQgT3ZlcnJpZGVBQkZvclRlc3RpbmcoYm9vbCBhYl9kZXZpY2UpOwotCi0gICAgLy8gVXNlZCBieSB0aGUgdGVzdCBoYXJuZXNzIHRvIG92ZXJyaWRlIHdoZXRoZXIgdGhlIGRldmljZSBpcyAicmV0cm9maXR0aW5nIGR5bmFtaWMgcGFydGl0aW9ucyIuCi0gICAgc3RhdGljIHZvaWQgT3ZlcnJpZGVSZXRyb2ZpdER5bmFtaWNQYXJpdGl0b25zRm9yVGVzdGluZyhib29sIHJldHJvZml0KTsKLQogICAgIC8vIERlZmluZSBhIG5ldyBwYXJ0aXRpb24gZ3JvdXAuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgb25lIGdyb3VwIGNhbGxlZAogICAgIC8vICJkZWZhdWx0Iiwgd2l0aCBhbiB1bnJlc3RyaWN0ZWQgc2l6ZS4gQSBub24temVybyBzaXplIHdpbGwgcmVzdHJpY3QgdGhlCiAgICAgLy8gdG90YWwgc3BhY2UgdXNlZCBieSBhbGwgcGFydGl0aW9ucyBpbiB0aGUgZ3JvdXAuCkBAIC0zNDcsOCArMzQ1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxJbnRlcnZhbD4mIGZyZWVfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZWN0b3JzX25lZWRlZCkgY29uc3Q7CiAKLSAgICBzdGF0aWMgc3RkOjpvcHRpb25hbDxib29sPiBzQUJPdmVycmlkZTsKLSAgICBzdGF0aWMgc3RkOjpvcHRpb25hbDxib29sPiBzUmV0cm9maXREYXA7CisgICAgc3RhdGljIGJvb2wgVXBkYXRlTWV0YWRhdGFGb3JPdGhlclN1cGVyKExwTWV0YWRhdGEqIG1ldGFkYXRhLCB1aW50MzJfdCBzb3VyY2Vfc2xvdF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhcmdldF9zbG90X251bWJlcik7CiAKICAgICBMcE1ldGFkYXRhR2VvbWV0cnkgZ2VvbWV0cnlfOwogICAgIExwTWV0YWRhdGFIZWFkZXIgaGVhZGVyXzsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9pbmNsdWRlL2xpYmxwL3Byb3BlcnR5X2ZldGNoZXIuaCBiL2ZzX21nci9saWJscC9pbmNsdWRlL2xpYmxwL3Byb3BlcnR5X2ZldGNoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzNhMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvcHJvcGVydHlfZmV0Y2hlci5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnNfbWdyIHsKKworY2xhc3MgSVByb3BlcnR5RmV0Y2hlciB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5JUHJvcGVydHlGZXRjaGVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRWYWx1ZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBHZXRCb29sUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgYm9vbCBkZWZhdWx0VmFsdWUpID0gMDsKKworICAgIHN0YXRpYyBJUHJvcGVydHlGZXRjaGVyKiBHZXRJbnN0YW5jZSgpOworICAgIHN0YXRpYyB2b2lkIE92ZXJyaWRlRm9yVGVzdGluZyhzdGQ6OnVuaXF1ZV9wdHI8SVByb3BlcnR5RmV0Y2hlcj4mJik7Cit9OworCitjbGFzcyBQcm9wZXJ0eUZldGNoZXIgOiBwdWJsaWMgSVByb3BlcnR5RmV0Y2hlciB7CisgIHB1YmxpYzoKKyAgICB+UHJvcGVydHlGZXRjaGVyKCkgPSBkZWZhdWx0OworICAgIHN0ZDo6c3RyaW5nIEdldFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0VmFsdWUpIG92ZXJyaWRlOworICAgIGJvb2wgR2V0Qm9vbFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGJvb2wgZGVmYXVsdFZhbHVlKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBmc19tZ3IKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlibHAvaW9fdGVzdC5jcHAgYi9mc19tZ3IvbGlibHAvaW9fdGVzdC5jcHAKaW5kZXggNzBkZDg1Zi4uMjk5MDg2MyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmxwL2lvX3Rlc3QuY3BwCisrKyBiL2ZzX21nci9saWJscC9pb190ZXN0LmNwcApAQCAtMjMsMTAgKzIzLDEyIEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPGZzX21nci5oPgogI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+CisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogI2luY2x1ZGUgPGxpYmxwL2J1aWxkZXIuaD4KIAogI2luY2x1ZGUgImltYWdlcy5oIgorI2luY2x1ZGUgIm1vY2tfcHJvcGVydHlfZmV0Y2hlci5oIgogI2luY2x1ZGUgInJlYWRlci5oIgogI2luY2x1ZGUgInRlc3RfcGFydGl0aW9uX29wZW5lci5oIgogI2luY2x1ZGUgInV0aWxpdHkuaCIKQEAgLTM0LDYgKzM2LDggQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpmc19tZ3I7Cit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OlJldHVybjsKIHVzaW5nIHVuaXF1ZV9mZCA9IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKIAogLy8gT3VyIHRlc3RzIGFzc3VtZSBhIDEyOEtpQiBkaXNrIHdpdGggdHdvIDUxMiBieXRlIG1ldGFkYXRhIHNsb3RzLgpAQCAtNjY0LDcgKzY2OCw4IEBACiB9CiAKIFRFU1QobGlibHAsIFVwZGF0ZVJldHJvZml0KSB7Ci0gICAgTWV0YWRhdGFCdWlsZGVyOjpPdmVycmlkZVJldHJvZml0RHluYW1pY1Bhcml0aXRvbnNGb3JUZXN0aW5nKHRydWUpOworICAgIE9OX0NBTEwoKkdldE1vY2tlZEluc3RhbmNlKCksIEdldEJvb2xQcm9wZXJ0eSgicm8uYm9vdC5keW5hbWljX3BhcnRpdGlvbnNfcmV0cm9maXQiLCBfKSkKKyAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7CiAKICAgICB1bmlxdWVfcHRyPE1ldGFkYXRhQnVpbGRlcj4gYnVpbGRlciA9IENyZWF0ZURlZmF1bHRCdWlsZGVyKCk7CiAgICAgQVNTRVJUX05FKGJ1aWxkZXIsIG51bGxwdHIpOwpAQCAtNjk1LDcgKzcwMCw4IEBACiB9CiAKIFRFU1QobGlibHAsIFVwZGF0ZU5vblJldHJvZml0KSB7Ci0gICAgTWV0YWRhdGFCdWlsZGVyOjpPdmVycmlkZVJldHJvZml0RHluYW1pY1Bhcml0aXRvbnNGb3JUZXN0aW5nKGZhbHNlKTsKKyAgICBPTl9DQUxMKCpHZXRNb2NrZWRJbnN0YW5jZSgpLCBHZXRCb29sUHJvcGVydHkoInJvLmJvb3QuZHluYW1pY19wYXJ0aXRpb25zX3JldHJvZml0IiwgXykpCisgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChSZXR1cm4oZmFsc2UpKTsKIAogICAgIHVuaXF1ZV9mZCBmZCA9IENyZWF0ZUZsYXNoZWREaXNrKCk7CiAgICAgQVNTRVJUX0dFKGZkLCAwKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9tb2NrX3Byb3BlcnR5X2ZldGNoZXIuaCBiL2ZzX21nci9saWJscC9tb2NrX3Byb3BlcnR5X2ZldGNoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjkxZGUyCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmxwL21vY2tfcHJvcGVydHlfZmV0Y2hlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CisKKyNpbmNsdWRlIDxsaWJscC9wcm9wZXJ0eV9mZXRjaGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmc19tZ3IgeworCitjbGFzcyBNb2NrUHJvcGVydHlGZXRjaGVyIDogcHVibGljIElQcm9wZXJ0eUZldGNoZXIgeworICBwdWJsaWM6CisgICAgTU9DS19NRVRIT0QyKEdldFByb3BlcnR5LCBzdGQ6OnN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYsIGNvbnN0IHN0ZDo6c3RyaW5nJikpOworICAgIE1PQ0tfTUVUSE9EMihHZXRCb29sUHJvcGVydHksIGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmLCBib29sKSk7CisKKyAgICAvLyBCeSBkZWZhdWx0LCByZXR1cm4gZGVmYXVsdF92YWx1ZSBmb3IgYWxsIGZ1bmN0aW9ucy4KKyAgICBNb2NrUHJvcGVydHlGZXRjaGVyKCkgeworICAgICAgICB1c2luZyA6OnRlc3Rpbmc6Ol87CisgICAgICAgIHVzaW5nIDo6dGVzdGluZzo6SW52b2tlOworICAgICAgICBPTl9DQUxMKCp0aGlzLCBHZXRQcm9wZXJ0eShfLCBfKSkuV2lsbEJ5RGVmYXVsdChJbnZva2UoW10oY29uc3QgYXV0byYsIGNvbnN0IGF1dG8mIGRlZikgeworICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgfSkpOworICAgICAgICBPTl9DQUxMKCp0aGlzLCBHZXRCb29sUHJvcGVydHkoXywgXykpLldpbGxCeURlZmF1bHQoSW52b2tlKFtdKGNvbnN0IGF1dG8mLCBhdXRvIGRlZikgeworICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgfSkpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBmc19tZ3IKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OmZzX21ncjo6TW9ja1Byb3BlcnR5RmV0Y2hlciogR2V0TW9ja2VkSW5zdGFuY2UoKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9wcm9wZXJ0eV9mZXRjaGVyLmNwcCBiL2ZzX21nci9saWJscC9wcm9wZXJ0eV9mZXRjaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzhlZjRkCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmxwL3Byb3BlcnR5X2ZldGNoZXIuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibGlibHAvcHJvcGVydHlfZmV0Y2hlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZzX21nciB7CisKK3N0ZDo6c3RyaW5nIFByb3BlcnR5RmV0Y2hlcjo6R2V0UHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRfdmFsdWUpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoa2V5LCBkZWZhdWx0X3ZhbHVlKTsKK30KKworYm9vbCBQcm9wZXJ0eUZldGNoZXI6OkdldEJvb2xQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBib29sIGRlZmF1bHRfdmFsdWUpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KGtleSwgZGVmYXVsdF92YWx1ZSk7Cit9CisKK3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SVByb3BlcnR5RmV0Y2hlcj4qIEdldEluc3RhbmNlQWxsb2NhdGlvbigpIHsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElQcm9wZXJ0eUZldGNoZXI+IGluc3RhbmNlID0gc3RkOjptYWtlX3VuaXF1ZTxQcm9wZXJ0eUZldGNoZXI+KCk7CisgICAgcmV0dXJuICZpbnN0YW5jZTsKK30KKworSVByb3BlcnR5RmV0Y2hlciogSVByb3BlcnR5RmV0Y2hlcjo6R2V0SW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIEdldEluc3RhbmNlQWxsb2NhdGlvbigpLT5nZXQoKTsKK30KKwordm9pZCBJUHJvcGVydHlGZXRjaGVyOjpPdmVycmlkZUZvclRlc3Rpbmcoc3RkOjp1bmlxdWVfcHRyPElQcm9wZXJ0eUZldGNoZXI+JiYgZmV0Y2hlcikgeworICAgIEdldEluc3RhbmNlQWxsb2NhdGlvbigpLT5zd2FwKGZldGNoZXIpOworICAgIGZldGNoZXIucmVzZXQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZzX21ncgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9yZWFkZXIuY3BwIGIvZnNfbWdyL2xpYmxwL3JlYWRlci5jcHAKaW5kZXggZGNlZTZkMmQuLjhkYmU5NTUgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJscC9yZWFkZXIuY3BwCisrKyBiL2ZzX21nci9saWJscC9yZWFkZXIuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlibHAvd3JpdGVyLmNwcCBiL2ZzX21nci9saWJscC93cml0ZXIuY3BwCmluZGV4IGJmZmNiN2UuLjhhOTgzYWQgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJscC93cml0ZXIuY3BwCisrKyBiL2ZzX21nci9saWJscC93cml0ZXIuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAid3JpdGVyLmgiCiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8c3RyaW5nPgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L0FuZHJvaWQuYnAgYi9mc19tZ3IvbGlic25hcHNob3QvQW5kcm9pZC5icAppbmRleCAzYTA4MDQ5Li41MmFhZDEyIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvQW5kcm9pZC5icAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvQW5kcm9pZC5icApAQCAtMTQsMTUgKzE0LDEzIEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJzbmFwc2hvdCIsCi0gICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJzbmFwc2hvdF9kZWZhdWx0cyIsCiAgICAgZGVmYXVsdHM6IFsiZnNfbWdyX2RlZmF1bHRzIl0sCi0gICAgY3BwZmxhZ3M6IFsKKyAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAotICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAic25hcHNob3QuY3BwIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLApAQCAtMzAsNyArMjgsNTMgQEAKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJkbSIsCisgICAgXSwKKyAgICB3aG9sZV9zdGF0aWNfbGliczogWwogICAgICAgICAibGliZXh0Ml91dWlkIiwKKyAgICAgICAgImxpYmV4dDRfdXRpbHMiLAorICAgICAgICAibGliZmllbWFwIiwKICAgICBdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJsaWJzbmFwc2hvdF9zb3VyY2VzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzbmFwc2hvdC5jcHAiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic25hcHNob3QiLAorICAgIGRlZmF1bHRzOiBbImxpYnNuYXBzaG90X2RlZmF1bHRzIl0sCisgICAgc3JjczogWyI6bGlic25hcHNob3Rfc291cmNlcyJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJmaWVtYXBfYmluZGVyIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnNuYXBzaG90X25vYmluZGVyIiwKKyAgICBkZWZhdWx0czogWyJsaWJzbmFwc2hvdF9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiOmxpYnNuYXBzaG90X3NvdXJjZXMiXSwKKyAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJzbmFwc2hvdF90ZXN0IiwKKyAgICBkZWZhdWx0czogWyJsaWJzbmFwc2hvdF9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNuYXBzaG90X3Rlc3QuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliZnNfbWdyIiwKKyAgICAgICAgImxpYmxwIiwKKyAgICAgICAgImxpYnNuYXBzaG90IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3Qvc25hcHNob3QuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L3NuYXBzaG90LmgKaW5kZXggNWNmZDdmYS4uZjc2MDhkYyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3Qvc25hcHNob3QuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9zbmFwc2hvdC5oCkBAIC0xOSw1MSArMTksNzkgQEAKICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8bGliZG0vZG0uaD4KKyNpbmNsdWRlIDxsaWJmaWVtYXAvaW1hZ2VfbWFuYWdlci5oPgorCisjaWZuZGVmIEZSSUVORF9URVNUCisjZGVmaW5lIEZSSUVORF9URVNUKHRlc3Rfc2V0X25hbWUsIGluZGl2aWR1YWxfdGVzdCkgXAorICAgIGZyaWVuZCBjbGFzcyB0ZXN0X3NldF9uYW1lIyNfIyNpbmRpdmlkdWFsX3Rlc3QjI19UZXN0CisjZGVmaW5lIERFRklORURfRlJJRU5EX1RFU1QKKyNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBmaWVtYXAgeworY2xhc3MgSUltYWdlTWFuYWdlcjsKK30gIC8vIG5hbWVzcGFjZSBmaWVtYXAKKwogbmFtZXNwYWNlIHNuYXBzaG90IHsKIAotZW51bSBjbGFzcyBVcGRhdGVTdGF0dXMgeworZW51bSBjbGFzcyBVcGRhdGVTdGF0ZSA6IHVuc2lnbmVkIGludCB7CiAgICAgLy8gTm8gdXBkYXRlIG9yIG1lcmdlIGlzIGluIHByb2dyZXNzLgogICAgIE5vbmUsCiAKKyAgICAvLyBBbiB1cGRhdGUgaXMgYXBwbHlpbmc7IHNuYXBzaG90cyBtYXkgYWxyZWFkeSBleGlzdC4KKyAgICBJbml0aWF0ZWQsCisKICAgICAvLyBBbiB1cGRhdGUgaXMgcGVuZGluZywgYnV0IGhhcyBub3QgYmVlbiBzdWNjZXNzZnVsbHkgYm9vdGVkIHlldC4KICAgICBVbnZlcmlmaWVkLAogCiAgICAgLy8gVGhlIGtlcm5lbCBpcyBtZXJnaW5nIGluIHRoZSBiYWNrZ3JvdW5kLgogICAgIE1lcmdpbmcsCiAKKyAgICAvLyBQb3N0LW1lcmdlIGNsZWFudXAgc3RlcHMgY291bGQgbm90IGJlIGNvbXBsZXRlZCBkdWUgdG8gYSB0cmFuc2llbnQKKyAgICAvLyBlcnJvciwgYnV0IHRoZSBuZXh0IHJlYm9vdCB3aWxsIGZpbmlzaCBhbnkgcGVuZGluZyBvcGVyYXRpb25zLgorICAgIE1lcmdlTmVlZHNSZWJvb3QsCisKICAgICAvLyBNZXJnaW5nIGlzIGNvbXBsZXRlLCBhbmQgbmVlZHMgdG8gYmUgYWNrbm93bGVkZ2VkLgotICAgIE1lcmdlQ29tcGxldGVkCisgICAgTWVyZ2VDb21wbGV0ZWQsCisKKyAgICAvLyBNZXJnaW5nIGZhaWxlZCBkdWUgdG8gYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICBNZXJnZUZhaWxlZAogfTsKIAogY2xhc3MgU25hcHNob3RNYW5hZ2VyIGZpbmFsIHsKICAgcHVibGljOgotICAgIC8vIFJldHVybiBhIG5ldyBTbmFwc2hvdE1hbmFnZXIgaW5zdGFuY2UsIG9yIG51bGwgb24gZXJyb3IuCi0gICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdE1hbmFnZXI+IE5ldygpOworICAgIC8vIERlcGVuZGVuY3kgaW5qZWN0aW9uIGZvciB0ZXN0aW5nLgorICAgIGNsYXNzIElEZXZpY2VJbmZvIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+SURldmljZUluZm8oKSB7fQorICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIEdldEdzaWREaXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0TWV0YWRhdGFEaXIoKSBjb25zdCA9IDA7CiAKLSAgICAvLyBDcmVhdGUgYSBuZXcgc25hcHNob3QgZGV2aWNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGJhc2UgZGV2aWNlLCBhbmQgQ09XIGRldmljZQotICAgIC8vIHNpemUuIFRoZSBuZXcgZGV2aWNlIHBhdGggd2lsbCBiZSByZXR1cm5lZCBpbiB8ZGV2X3BhdGh8LiBJZiB0aW1lb3V0X21zIGlzCi0gICAgLy8gZ3JlYXRlciB0aGFuIHplcm8sIHRoaXMgZnVuY3Rpb24gd2lsbCB3YWl0IHRoZSBnaXZlbiBhbW91bnQgb2YgdGltZSBmb3IKLSAgICAvLyB8ZGV2X3BhdGh8IHRvIGJlY29tZSBhdmFpbGFibGUsIGFuZCBmYWlsIG90aGVyd2lzZS4gSWYgdGltZW91dF9tcyBpcyAwLCB0aGVuCi0gICAgLy8gbm8gd2FpdCB3aWxsIG9jY3VyIGFuZCB8ZGV2X3BhdGh8IG1heSBub3QgeWV0IGV4aXN0IG9uIHJldHVybi4KLSAgICBib29sIENyZWF0ZVNuYXBzaG90KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9kZXZpY2UsIHVpbnQ2NF90IGNvd19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGRldl9wYXRoLCBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzJiB0aW1lb3V0X21zKTsKKyAgICAgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgcnVubmluZyBvZmYgc25hcHNob3QgZGV2aWNlcywKKyAgICAgICAgLy8gaW5kaWNhdGluZyB0aGF0IHdlIGhhdmUgYm9vdGVkIGFmdGVyIGFwcGx5aW5nIChidXQgbm90IG1lcmdpbmcpIGFuCisgICAgICAgIC8vIE9UQS4KKyAgICAgICAgdmlydHVhbCBib29sIElzUnVubmluZ1NuYXBzaG90KCkgY29uc3QgPSAwOworICAgIH07CiAKLSAgICAvLyBNYXAgYSBzbmFwc2hvdCBkZXZpY2UgdGhhdCB3YXMgcHJldmlvdXNseSBjcmVhdGVkIHdpdGggQ3JlYXRlU25hcHNob3QuCi0gICAgLy8gSWYgYSBtZXJnZSB3YXMgcHJldmlvdXNseSBpbml0aWF0ZWQsIHRoZSBkZXZpY2UtbWFwcGVyIHRhYmxlIHdpbGwgaGF2ZSBhCi0gICAgLy8gc25hcHNob3QtbWVyZ2UgdGFyZ2V0IGluc3RlYWQgb2YgYSBzbmFwc2hvdCB0YXJnZXQuIFRoZSB0aW1lb3V0IHBhcmFtZXRlcgotICAgIC8vIGlzIHRoZSBzYW1lIGFzIGluIENyZWF0ZVNuYXBzaG90RGV2aWNlLgotICAgIGJvb2wgTWFwU25hcHNob3REZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMmIHRpbWVvdXRfbXMsIHN0ZDo6c3RyaW5nKiBkZXZfcGF0aCk7CisgICAgflNuYXBzaG90TWFuYWdlcigpOwogCi0gICAgLy8gVW5tYXAgYSBzbmFwc2hvdCBkZXZpY2UgcHJldmlvdXNseSBtYXBwZWQgd2l0aCBNYXBTbmFwc2hvdERldmljZSgpLgotICAgIGJvb2wgVW5tYXBTbmFwc2hvdERldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisgICAgLy8gUmV0dXJuIGEgbmV3IFNuYXBzaG90TWFuYWdlciBpbnN0YW5jZSwgb3IgbnVsbCBvbiBlcnJvci4gVGhlIGRldmljZQorICAgIC8vIHBvaW50ZXIgaXMgb3duZWQgZm9yIHRoZSBsaWZldGltZSBvZiBTbmFwc2hvdE1hbmFnZXIuIElmIG51bGwsIGEgZGVmYXVsdAorICAgIC8vIGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZC4KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90TWFuYWdlcj4gTmV3KElEZXZpY2VJbmZvKiBkZXZpY2UgPSBudWxscHRyKTsKIAotICAgIC8vIFJlbW92ZSB0aGUgYmFja2luZyBjb3B5LW9uLXdyaXRlIGltYWdlIGZvciB0aGUgbmFtZWQgc25hcHNob3QuIElmIHRoZQotICAgIC8vIGRldmljZSBpcyBzdGlsbCBtYXBwZWQsIHRoaXMgd2lsbCBhdHRlbXB0IGFuIFVubWFwLCBhbmQgZmFpbCBpZiB0aGUKLSAgICAvLyB1bm1hcCBmYWlscy4KLSAgICBib29sIERlbGV0ZVNuYXBzaG90KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKyAgICAvLyBCZWdpbiBhbiB1cGRhdGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNyZWF0aW5nIGFueSBzbmFwc2hvdHMuIEl0CisgICAgLy8gd2lsbCBmYWlsIGlmIEdldFVwZGF0ZVN0YXRlKCkgIT0gTm9uZS4KKyAgICBib29sIEJlZ2luVXBkYXRlKCk7CisKKyAgICAvLyBDYW5jZWwgYW4gdXBkYXRlOyBhbnkgc25hcHNob3RzIHdpbGwgYmUgZGVsZXRlZC4gVGhpcyB3aWxsIGZhaWwgaWYgdGhlCisgICAgLy8gc3RhdGUgIT0gSW5pdGlhdGVkIG9yIE5vbmUuCisgICAgYm9vbCBDYW5jZWxVcGRhdGUoKTsKIAogICAgIC8vIEluaXRpYXRlIGEgbWVyZ2Ugb24gYWxsIHNuYXBzaG90IGRldmljZXMuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBhZnRlciBhbgogICAgIC8vIHVwZGF0ZSBoYXMgYmVlbiBtYXJrZWQgc3VjY2Vzc2Z1bCBhZnRlciBib290aW5nLgpAQCAtNzEsMTggKzk5LDE4NCBAQAogCiAgICAgLy8gV2FpdCBmb3IgdGhlIGN1cnJlbnQgbWVyZ2UgdG8gZmluaXNoLCB0aGVuIHBlcmZvcm0gY2xlYW51cCB3aGVuIGl0CiAgICAgLy8gY29tcGxldGVzLiBJdCBpcyBuZWNlc3NhcnkgdG8gY2FsbCB0aGlzIGFmdGVyIEluaXRpYXRlTWVyZ2UoKSwgb3Igd2hlbgotICAgIC8vIGEgbWVyZ2UgaXMgZGV0ZWN0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFmdGVyIGJvb3QuCi0gICAgYm9vbCBXYWl0Rm9yTWVyZ2UoKTsKKyAgICAvLyBhIG1lcmdlIHN0YXRlIGlzIGRldGVjdGVkIGR1cmluZyBib290LgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IGFmdGVyIGNhbGxpbmcgV2FpdEZvck1lcmdlKCksIEdldFVwZGF0ZVN0YXRlKCkgbWF5IHN0aWxsIHJldHVybgorICAgIC8vIHRoYXQgYSBtZXJnZSBpcyBpbiBwcm9ncmVzczoKKyAgICAvLyAgIE1lcmdlRmFpbGVkIGluZGljYXRlcyB0aGF0IGEgZmF0YWwgZXJyb3Igb2NjdXJyZWQuIFdhaXRGb3JNZXJnZSgpIG1heQorICAgIC8vICAgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMgYWdhaW4gdG8gYXR0ZW1wdCB0byBtYWtlIG1vcmUgcHJvZ3Jlc3MsIGJ1dAorICAgIC8vICAgd2UgZG8gbm90IGV4cGVjdCBpdCB0byBzdWNjZWVkIGlmIGEgY2F0YXN0cm9waGljIGVycm9yIG9jY3VycmVkLgorICAgIC8vCisgICAgLy8gICBNZXJnZU5lZWRzUmVib290IGluZGljYXRlcyB0aGF0IHRoZSBtZXJnZSBoYXMgY29tcGxldGVkLCBidXQgY2xlYW51cAorICAgIC8vICAgZmFpbGVkLiBUaGlzIGNhbiBoYXBwZW4gaWYgZm9yIHNvbWUgcmVhc29uIHJlc291cmNlcyB3ZXJlIG5vdCBjbG9zZWQKKyAgICAvLyAgIHByb3Blcmx5LiBJbiB0aGlzIGNhc2UgYW5vdGhlciByZWJvb3QgaXMgbmVlZGVkIGJlZm9yZSB3ZSBjYW4gdGFrZQorICAgIC8vICAgYW5vdGhlciBPVEEuIEhvd2V2ZXIsIFdhaXRGb3JNZXJnZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aG91dAorICAgIC8vICAgcmVib290aW5nLCB0byBhdHRlbXB0IHRvIGZpbmlzaCBjbGVhbnVwIGFueXdheS4KKyAgICAvLworICAgIC8vICAgTWVyZ2VDb21wbGV0ZWQgaW5kaWNhdGVzIHRoYXQgdGhlIHVwZGF0ZSBoYXMgZnVsbHkgY29tcGxldGVkLgorICAgIC8vICAgR2V0VXBkYXRlU3RhdGUgd2lsbCByZXR1cm4gTm9uZSwgYW5kIGEgbmV3IHVwZGF0ZSBjYW4gYmVnaW4uCisgICAgVXBkYXRlU3RhdGUgV2FpdEZvck1lcmdlKCk7CiAKICAgICAvLyBGaW5kIHRoZSBzdGF0dXMgb2YgdGhlIGN1cnJlbnQgdXBkYXRlLCBpZiBhbnkuCiAgICAgLy8KICAgICAvLyB8cHJvZ3Jlc3N8IGRlcGVuZHMgb24gdGhlIHJldHVybmVkIHN0YXR1czoKLSAgICAvLyAgIE5vbmU6IDAKLSAgICAvLyAgIFVudmVyaWZpZWQ6IDAKLSAgICAvLyAgIE1lcmdpbmc6IFZhbHVlIGluIHRoZSByYW5nZSBbMCwgMTAwKQorICAgIC8vICAgTWVyZ2luZzogVmFsdWUgaW4gdGhlIHJhbmdlIFswLCAxMDBdCiAgICAgLy8gICBNZXJnZUNvbXBsZXRlZDogMTAwCi0gICAgVXBkYXRlU3RhdHVzIEdldFVwZGF0ZVN0YXR1cyhkb3VibGUqIHByb2dyZXNzKTsKKyAgICAvLyAgIE90aGVyOiAwCisgICAgVXBkYXRlU3RhdGUgR2V0VXBkYXRlU3RhdGUoZG91YmxlKiBwcm9ncmVzcyA9IG51bGxwdHIpOworCisgIHByaXZhdGU6CisgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBDcmVhdGVTbmFwc2hvdCk7CisgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBNYXBTbmFwc2hvdCk7CisgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBNYXBQYXJ0aWFsU25hcHNob3QpOworICAgIEZSSUVORF9URVNUKFNuYXBzaG90VGVzdCwgTm9NZXJnZUJlZm9yZVJlYm9vdCk7CisgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBNZXJnZSk7CisgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBNZXJnZUNhbm5vdFJlbW92ZUNvdyk7CisgICAgZnJpZW5kIGNsYXNzIFNuYXBzaG90VGVzdDsKKworICAgIHVzaW5nIERtVGFyZ2V0U25hcHNob3QgPSBhbmRyb2lkOjpkbTo6RG1UYXJnZXRTbmFwc2hvdDsKKyAgICB1c2luZyBJSW1hZ2VNYW5hZ2VyID0gYW5kcm9pZDo6ZmllbWFwOjpJSW1hZ2VNYW5hZ2VyOworICAgIHVzaW5nIFRhcmdldEluZm8gPSBhbmRyb2lkOjpkbTo6RGV2aWNlTWFwcGVyOjpUYXJnZXRJbmZvOworCisgICAgZXhwbGljaXQgU25hcHNob3RNYW5hZ2VyKElEZXZpY2VJbmZvKiBpbmZvKTsKKworICAgIC8vIFRoaXMgaXMgY3JlYXRlZCBsYXppbHkgc2luY2UgaXQgY29ubmVjdHMgdmlhIGJpbmRlci4KKyAgICBib29sIEVuc3VyZUltYWdlTWFuYWdlcigpOworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciB0ZXN0cy4KKyAgICBJSW1hZ2VNYW5hZ2VyKiBpbWFnZV9tYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gaW1hZ2VzXy5nZXQoKTsgfQorCisgICAgLy8gU2luY2UgbGlic25hcHNob3QgaXMgaW5jbHVkZWQgaW50byBtdWx0aXBsZSBwcm9jZXNzZXMsIHdlIGZsb2NrKCkgb3VyCisgICAgLy8gZmlsZXMgZm9yIHNpbXBsZSBzeW5jaHJvbml6YXRpb24uIExvY2tlZEZpbGUgaXMgYSBoZWxwZXIgdG8gYXNzaXN0IHdpdGgKKyAgICAvLyB0aGlzLiBJdCBhbHNvIHNlcnZlcyBhcyBhIHByb29mLW9mLWxvY2sgZm9yIHNvbWUgZnVuY3Rpb25zLgorICAgIGNsYXNzIExvY2tlZEZpbGUgZmluYWwgeworICAgICAgcHVibGljOgorICAgICAgICBMb2NrZWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBmZCwgaW50IGxvY2tfbW9kZSkKKyAgICAgICAgICAgIDogcGF0aF8ocGF0aCksIGZkXyhzdGQ6Om1vdmUoZmQpKSwgbG9ja19tb2RlXyhsb2NrX21vZGUpIHt9CisgICAgICAgIH5Mb2NrZWRGaWxlKCk7CisKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgoKSBjb25zdCB7IHJldHVybiBwYXRoXzsgfQorICAgICAgICBpbnQgZmQoKSBjb25zdCB7IHJldHVybiBmZF87IH0KKyAgICAgICAgaW50IGxvY2tfbW9kZSgpIGNvbnN0IHsgcmV0dXJuIGxvY2tfbW9kZV87IH0KKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgcGF0aF87CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZF87CisgICAgICAgIGludCBsb2NrX21vZGVfOworICAgIH07CisgICAgc3RkOjp1bmlxdWVfcHRyPExvY2tlZEZpbGU+IE9wZW5GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlLCBpbnQgb3Blbl9mbGFncywgaW50IGxvY2tfZmxhZ3MpOworICAgIGJvb2wgVHJ1bmNhdGUoTG9ja2VkRmlsZSogZmlsZSk7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgc25hcHNob3QgcmVjb3JkLiBUaGlzIGNyZWF0ZXMgdGhlIGJhY2tpbmcgQ09XIHN0b3JlIGFuZAorICAgIC8vIHBlcnNpc3RzIGluZm9ybWF0aW9uIG5lZWRlZCB0byBtYXAgdGhlIGRldmljZS4gVGhlIGRldmljZSBjYW4gYmUgbWFwcGVkCisgICAgLy8gd2l0aCBNYXBTbmFwc2hvdCgpLgorICAgIC8vCisgICAgLy8gfGRldmljZV9zaXplfCBzaG91bGQgYmUgdGhlIHNpemUgb2YgdGhlIGJhc2VfZGV2aWNlIHRoYXQgd2lsbCBiZSBwYXNzZWQKKyAgICAvLyB2aWEgTWFwRGV2aWNlKCkuIHxzbmFwc2hvdF9zaXplfCBzaG91bGQgYmUgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgICAvLyBiYXNlIGRldmljZSwgc3RhcnRpbmcgZnJvbSAwLCB0aGF0IHdpbGwgYmUgc25hcHNob3R0ZWQuIFRoZSBjb3dfc2l6ZQorICAgIC8vIHNob3VsZCBiZSB0aGUgYW1vdW50IG9mIHNwYWNlIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgdG8gc3RvcmUgc25hcHNob3QKKyAgICAvLyBkZWx0YXMuCisgICAgLy8KKyAgICAvLyBJZiB8c25hcHNob3Rfc2l6ZXwgPCBkZXZpY2Vfc2l6ZSwgdGhlbiB0aGUgZGV2aWNlIHdpbGwgYWx3YXlzCisgICAgLy8gYmUgbWFwcGVkIHdpdGggdHdvIHRhYmxlIGVudHJpZXM6IGEgZG0tc25hcHNob3QgcmFuZ2UgY292ZXJpbmcKKyAgICAvLyBzbmFwc2hvdF9zaXplLCBhbmQgYSBkbS1saW5lYXIgcmFuZ2UgY292ZXJpbmcgdGhlIHJlbWFpbmRlci4KKyAgICAvLworICAgIC8vIEFsbCBzaXplcyBhcmUgc3BlY2lmaWVkIGluIGJ5dGVzLCBhbmQgdGhlIGRldmljZSBhbmQgc25hcHNob3Qgc2l6ZXMKKyAgICAvLyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIHNlY3RvciBzaXplICg1MTIgYnl0ZXMpLiB8Y293X3NpemV8IHdpbGwKKyAgICAvLyBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IHNlY3Rvci4KKyAgICBib29sIENyZWF0ZVNuYXBzaG90KExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1aW50NjRfdCBkZXZpY2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNuYXBzaG90X3NpemUsIHVpbnQ2NF90IGNvd19zaXplKTsKKworICAgIC8vIE1hcCBhIHNuYXBzaG90IGRldmljZSB0aGF0IHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgd2l0aCBDcmVhdGVTbmFwc2hvdC4KKyAgICAvLyBJZiBhIG1lcmdlIHdhcyBwcmV2aW91c2x5IGluaXRpYXRlZCwgdGhlIGRldmljZS1tYXBwZXIgdGFibGUgd2lsbCBoYXZlIGEKKyAgICAvLyBzbmFwc2hvdC1tZXJnZSB0YXJnZXQgaW5zdGVhZCBvZiBhIHNuYXBzaG90IHRhcmdldC4gSWYgdGhlIHRpbWVvdXQKKyAgICAvLyBwYXJhbWV0ZXIgZ3JlYXRlciB0aGFuIHplcm8sIHRoaXMgZnVuY3Rpb24gd2lsbCB3YWl0IHRoZSBnaXZlbiBhbW91bnQKKyAgICAvLyBvZiB0aW1lIGZvciB8ZGV2X3BhdGh8IHRvIGJlY29tZSBhdmFpbGFibGUsIGFuZCBmYWlsIG90aGVyd2lzZS4gSWYKKyAgICAvLyB0aW1lb3V0X21zIGlzIDAsIHRoZW4gbm8gd2FpdCB3aWxsIG9jY3VyIGFuZCB8ZGV2X3BhdGh8IG1heSBub3QgeWV0CisgICAgLy8gZXhpc3Qgb24gcmV0dXJuLgorICAgIGJvb2wgTWFwU25hcHNob3QoTG9ja2VkRmlsZSogbG9jaywgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMmIHRpbWVvdXRfbXMsIHN0ZDo6c3RyaW5nKiBkZXZfcGF0aCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGJhY2tpbmcgY29weS1vbi13cml0ZSBpbWFnZSBmb3IgdGhlIG5hbWVkIHNuYXBzaG90LiBUaGUKKyAgICAvLyBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIHNuYXBzaG90IGlzIHVubWFwcGVkLgorICAgIGJvb2wgRGVsZXRlU25hcHNob3QoTG9ja2VkRmlsZSogbG9jaywgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworCisgICAgLy8gVW5tYXAgYSBzbmFwc2hvdCBkZXZpY2UgcHJldmlvdXNseSBtYXBwZWQgd2l0aCBNYXBTbmFwc2hvdERldmljZSgpLgorICAgIGJvb2wgVW5tYXBTbmFwc2hvdChMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisKKyAgICAvLyBVbm1hcCBhbmQgcmVtb3ZlIGFsbCBrbm93biBzbmFwc2hvdHMuCisgICAgYm9vbCBSZW1vdmVBbGxTbmFwc2hvdHMoTG9ja2VkRmlsZSogbG9jayk7CisKKyAgICAvLyBMaXN0IHRoZSBrbm93biBzbmFwc2hvdCBuYW1lcy4KKyAgICBib29sIExpc3RTbmFwc2hvdHMoTG9ja2VkRmlsZSogbG9jaywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBzbmFwc2hvdHMpOworCisgICAgLy8gSW50ZXJhY3Qgd2l0aCAvbWV0YWRhdGEvb3RhL3N0YXRlLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxMb2NrZWRGaWxlPiBPcGVuU3RhdGVGaWxlKGludCBvcGVuX2ZsYWdzLCBpbnQgbG9ja19mbGFncyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPExvY2tlZEZpbGU+IExvY2tTaGFyZWQoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TG9ja2VkRmlsZT4gTG9ja0V4Y2x1c2l2ZSgpOworICAgIFVwZGF0ZVN0YXRlIFJlYWRVcGRhdGVTdGF0ZShMb2NrZWRGaWxlKiBmaWxlKTsKKyAgICBib29sIFdyaXRlVXBkYXRlU3RhdGUoTG9ja2VkRmlsZSogZmlsZSwgVXBkYXRlU3RhdGUgc3RhdGUpOworICAgIHN0ZDo6c3RyaW5nIEdldFN0YXRlRmlsZVBhdGgoKSBjb25zdDsKKworICAgIC8vIFRoaXMgc3RhdGUgaXMgcGVyc2lzdGVkIHBlci1zbmFwc2hvdCBpbiAvbWV0YWRhdGEvb3RhL3NuYXBzaG90cy8uCisgICAgc3RydWN0IFNuYXBzaG90U3RhdHVzIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RhdGU7CisgICAgICAgIHVpbnQ2NF90IGRldmljZV9zaXplOworICAgICAgICB1aW50NjRfdCBzbmFwc2hvdF9zaXplOworICAgICAgICAvLyBUaGVzZSBhcmUgbm9uLXplcm8gd2hlbiBtZXJnaW5nLgorICAgICAgICB1aW50NjRfdCBzZWN0b3JzX2FsbG9jYXRlZCA9IDA7CisgICAgICAgIHVpbnQ2NF90IG1ldGFkYXRhX3NlY3RvcnMgPSAwOworICAgIH07CisKKyAgICAvLyBIZWxwZXJzIGZvciBtZXJnaW5nLgorICAgIGJvb2wgU3dpdGNoU25hcHNob3RUb01lcmdlKExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKyAgICBib29sIFJld3JpdGVTbmFwc2hvdERldmljZVRhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV9uYW1lKTsKKyAgICBib29sIE1hcmtTbmFwc2hvdE1lcmdlQ29tcGxldGVkKExvY2tlZEZpbGUqIHNuYXBzaG90X2xvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBzbmFwc2hvdF9uYW1lKTsKKyAgICB2b2lkIEFja25vd2xlZGdlTWVyZ2VTdWNjZXNzKExvY2tlZEZpbGUqIGxvY2spOworICAgIHZvaWQgQWNrbm93bGVkZ2VNZXJnZUZhaWx1cmUoKTsKKworICAgIC8vIE5vdGUgdGhhdCB0aGVzZSByZXF1aXJlIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgY29udGFpbmluZyB0aGUgc25hcHNob3QsCisgICAgLy8gd2hpY2ggbWF5IGJlIHRoZSAiaW5uZXIiIGRldmljZS4gVXNlIEdldHNuYXBzaG90RGV2aWVjTmFtZSgpLgorICAgIGJvb2wgUXVlcnlTbmFwc2hvdFN0YXR1cyhjb25zdCBzdGQ6OnN0cmluZyYgZG1fbmFtZSwgc3RkOjpzdHJpbmcqIHRhcmdldF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEbVRhcmdldFNuYXBzaG90OjpTdGF0dXMqIHN0YXR1cyk7CisgICAgYm9vbCBJc1NuYXBzaG90RGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV9uYW1lLCBUYXJnZXRJbmZvKiB0YXJnZXQgPSBudWxscHRyKTsKKworICAgIC8vIEludGVybmFsIGNhbGxiYWNrIGZvciB3aGVuIG1lcmdpbmcgaXMgY29tcGxldGUuCisgICAgYm9vbCBPblNuYXBzaG90TWVyZ2VDb21wbGV0ZShMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMpOworICAgIGJvb2wgQ29sbGFwc2VTbmFwc2hvdERldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgU25hcHNob3RTdGF0dXMmIHN0YXR1cyk7CisKKyAgICAvLyBPbmx5IHRoZSBmb2xsb3dpbmcgVXBkYXRlU3RhdGVzIGFyZSB1c2VkIGhlcmU6CisgICAgLy8gICBVcGRhdGVTdGF0ZTo6TWVyZ2luZworICAgIC8vICAgVXBkYXRlU3RhdGU6Ok1lcmdlQ29tcGxldGVkCisgICAgLy8gICBVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQKKyAgICAvLyAgIFVwZGF0ZVN0YXRlOjpNZXJnZU5lZWRzUmVib290CisgICAgVXBkYXRlU3RhdGUgQ2hlY2tNZXJnZVN0YXRlKCk7CisgICAgVXBkYXRlU3RhdGUgQ2hlY2tNZXJnZVN0YXRlKExvY2tlZEZpbGUqIGxvY2spOworICAgIFVwZGF0ZVN0YXRlIENoZWNrVGFyZ2V0TWVyZ2VTdGF0ZShMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisKKyAgICAvLyBJbnRlcmFjdCB3aXRoIHN0YXR1cyBmaWxlcyB1bmRlciAvbWV0YWRhdGEvb3RhL3NuYXBzaG90cy4KKyAgICBib29sIFdyaXRlU25hcHNob3RTdGF0dXMoTG9ja2VkRmlsZSogbG9jaywgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMpOworICAgIGJvb2wgUmVhZFNuYXBzaG90U3RhdHVzKExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBTbmFwc2hvdFN0YXR1cyogc3RhdHVzKTsKKyAgICBzdGQ6OnN0cmluZyBHZXRTbmFwc2hvdFN0YXR1c0ZpbGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICAgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIGhvbGRpbmcgdGhlICJzbmFwc2hvdCIgb3IgInNuYXBzaG90LW1lcmdlIgorICAgIC8vIHRhcmdldC4gVGhpcyBtYXkgbm90IGJlIHRoZSBmaW5hbCBkZXZpY2UgcHJlc2VudGVkIHZpYSBNYXBTbmFwc2hvdCgpLCBpZgorICAgIC8vIGZvciBleGFtcGxlIHRoZXJlIGlzIGEgbGluZWFyIHNlZ21lbnQuCisgICAgc3RkOjpzdHJpbmcgR2V0U25hcHNob3REZXZpY2VOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzbmFwc2hvdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbmFwc2hvdFN0YXR1cyYgc3RhdHVzKTsKKworICAgIHN0ZDo6c3RyaW5nIGdzaWRfZGlyXzsKKyAgICBzdGQ6OnN0cmluZyBtZXRhZGF0YV9kaXJfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJRGV2aWNlSW5mbz4gZGV2aWNlXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUltYWdlTWFuYWdlcj4gaW1hZ2VzXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2lmZGVmIERFRklORURfRlJJRU5EX1RFU1QKKyN1bmRlZiBERUZJTkVEX0ZSSUVORF9URVNUCisjdW5kZWYgRlJJRU5EX1RFU1QKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdC5jcHAKaW5kZXggM2U4MDIzOS4uNjNhMDFmMyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90LmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3QuY3BwCkBAIC0xNCw1OCArMTQsMTA5NiBAQAogCiAjaW5jbHVkZSA8bGlic25hcHNob3Qvc25hcHNob3QuaD4KIAorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3VuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgorI2luY2x1ZGUgPGxpYmRtL2RtLmg+CisjaW5jbHVkZSA8bGliZmllbWFwL2ltYWdlX21hbmFnZXIuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKIAotc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90TWFuYWdlcj4gU25hcHNob3RNYW5hZ2VyOjpOZXcoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8U25hcHNob3RNYW5hZ2VyPigpOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwordXNpbmcgYW5kcm9pZDo6ZG06OkRldmljZU1hcHBlcjsKK3VzaW5nIGFuZHJvaWQ6OmRtOjpEbURldmljZVN0YXRlOwordXNpbmcgYW5kcm9pZDo6ZG06OkRtVGFibGU7Cit1c2luZyBhbmRyb2lkOjpkbTo6RG1UYXJnZXRMaW5lYXI7Cit1c2luZyBhbmRyb2lkOjpkbTo6RG1UYXJnZXRTbmFwc2hvdDsKK3VzaW5nIGFuZHJvaWQ6OmRtOjprU2VjdG9yU2l6ZTsKK3VzaW5nIGFuZHJvaWQ6OmRtOjpTbmFwc2hvdFN0b3JhZ2VNb2RlOwordXNpbmcgYW5kcm9pZDo6ZmllbWFwOjpJSW1hZ2VNYW5hZ2VyOwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6c3RyaW5nX2xpdGVyYWxzOworCisvLyBVbml0IGlzIHNlY3RvcnMsIHRoaXMgaXMgYSA0SyBjaHVuay4KK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1NuYXBzaG90Q2h1bmtTaXplID0gODsKKworY2xhc3MgRGV2aWNlSW5mbyBmaW5hbCA6IHB1YmxpYyBTbmFwc2hvdE1hbmFnZXI6OklEZXZpY2VJbmZvIHsKKyAgcHVibGljOgorICAgIHN0ZDo6c3RyaW5nIEdldEdzaWREaXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAib3RhInM7IH0KKyAgICBzdGQ6OnN0cmluZyBHZXRNZXRhZGF0YURpcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICIvbWV0YWRhdGEvb3RhInM7IH0KKyAgICBib29sIElzUnVubmluZ1NuYXBzaG90KCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitib29sIERldmljZUluZm86OklzUnVubmluZ1NuYXBzaG90KCkgY29uc3QgeworICAgIC8vIDpUT0RPOiBpbXBsZW1lbnQgdGhpcyBjaGVjay4KKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBTbmFwc2hvdE1hbmFnZXI6OkNyZWF0ZVNuYXBzaG90KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY293X3NpemUsIHN0ZDo6c3RyaW5nKiBkZXZfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzJiB0aW1lb3V0X21zKSB7Ci0gICAgLy8gKDEpIENyZWF0ZSBDT1cgZGV2aWNlIHVzaW5nIGxpYmdzaV9pbWFnZS4KLSAgICAvLyAoMikgQ3JlYXRlIHNuYXBzaG90IGRldmljZSB1c2luZyBsaWJkbSArIERtVGFyZ2V0U25hcHNob3QuCi0gICAgLy8gKDMpIFJlY29yZCBwYXJ0aXRpb24gaW4gL21ldGFkYXRhL290YS4KLSAgICAodm9pZCluYW1lOwotICAgICh2b2lkKWJhc2VfZGV2aWNlOwotICAgICh2b2lkKWNvd19zaXplOwotICAgICh2b2lkKWRldl9wYXRoOwotICAgICh2b2lkKXRpbWVvdXRfbXM7Ci0gICAgcmV0dXJuIGZhbHNlOworLy8gTm90ZTogSUlNYWdlTWFuYWdlciBpcyBhbiBpbmNvbXBsZXRlIHR5cGUgaW4gdGhlIGhlYWRlciwgc28gdGhlIGRlZmF1bHQKKy8vIGRlc3RydWN0b3IgZG9lc24ndCB3b3JrLgorU25hcHNob3RNYW5hZ2VyOjp+U25hcHNob3RNYW5hZ2VyKCkge30KKworc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90TWFuYWdlcj4gU25hcHNob3RNYW5hZ2VyOjpOZXcoSURldmljZUluZm8qIGluZm8pIHsKKyAgICBpZiAoIWluZm8pIHsKKyAgICAgICAgaW5mbyA9IG5ldyBEZXZpY2VJbmZvKCk7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3RNYW5hZ2VyPihuZXcgU25hcHNob3RNYW5hZ2VyKGluZm8pKTsKIH0KIAotYm9vbCBTbmFwc2hvdE1hbmFnZXI6Ok1hcFNuYXBzaG90RGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyYgdGltZW91dF9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZGV2X3BhdGgpIHsKLSAgICAodm9pZCluYW1lOwotICAgICh2b2lkKWJhc2VfZGV2aWNlOwotICAgICh2b2lkKWRldl9wYXRoOwotICAgICh2b2lkKXRpbWVvdXRfbXM7Ci0gICAgcmV0dXJuIGZhbHNlOworU25hcHNob3RNYW5hZ2VyOjpTbmFwc2hvdE1hbmFnZXIoSURldmljZUluZm8qIGRldmljZSkgOiBkZXZpY2VfKGRldmljZSkgeworICAgIGdzaWRfZGlyXyA9IGRldmljZV8tPkdldEdzaWREaXIoKTsKKyAgICBtZXRhZGF0YV9kaXJfID0gZGV2aWNlXy0+R2V0TWV0YWRhdGFEaXIoKTsKIH0KIAotYm9vbCBTbmFwc2hvdE1hbmFnZXI6OlVubWFwU25hcHNob3REZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICAodm9pZCluYW1lOwotICAgIHJldHVybiBmYWxzZTsKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZXRDb3dOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzbmFwc2hvdF9uYW1lKSB7CisgICAgcmV0dXJuIHNuYXBzaG90X25hbWUgKyAiLWNvdyI7CiB9CiAKLWJvb2wgU25hcHNob3RNYW5hZ2VyOjpEZWxldGVTbmFwc2hvdChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgICh2b2lkKW5hbWU7Ci0gICAgcmV0dXJuIGZhbHNlOworYm9vbCBTbmFwc2hvdE1hbmFnZXI6OkJlZ2luVXBkYXRlKCkgeworICAgIGF1dG8gZmlsZSA9IExvY2tFeGNsdXNpdmUoKTsKKyAgICBpZiAoIWZpbGUpIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8gc3RhdGUgPSBSZWFkVXBkYXRlU3RhdGUoZmlsZS5nZXQoKSk7CisgICAgaWYgKHN0YXRlICE9IFVwZGF0ZVN0YXRlOjpOb25lKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkFuIHVwZGF0ZSBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBjYW5ub3QgYmVnaW4gYSBuZXcgdXBkYXRlIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gV3JpdGVVcGRhdGVTdGF0ZShmaWxlLmdldCgpLCBVcGRhdGVTdGF0ZTo6SW5pdGlhdGVkKTsKK30KKworYm9vbCBTbmFwc2hvdE1hbmFnZXI6OkNhbmNlbFVwZGF0ZSgpIHsKKyAgICBhdXRvIGZpbGUgPSBMb2NrRXhjbHVzaXZlKCk7CisgICAgaWYgKCFmaWxlKSByZXR1cm4gZmFsc2U7CisKKyAgICBVcGRhdGVTdGF0ZSBzdGF0ZSA9IFJlYWRVcGRhdGVTdGF0ZShmaWxlLmdldCgpKTsKKyAgICBpZiAoc3RhdGUgPT0gVXBkYXRlU3RhdGU6Ok5vbmUpIHJldHVybiB0cnVlOworICAgIGlmIChzdGF0ZSAhPSBVcGRhdGVTdGF0ZTo6SW5pdGlhdGVkKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjYW5jZWwgdXBkYXRlIGFmdGVyIGl0IGhhcyBjb21wbGV0ZWQgb3Igc3RhcnRlZCBtZXJnaW5nIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghUmVtb3ZlQWxsU25hcHNob3RzKGZpbGUuZ2V0KCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCByZW1vdmUgYWxsIHNuYXBzaG90cyI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVdyaXRlVXBkYXRlU3RhdGUoZmlsZS5nZXQoKSwgVXBkYXRlU3RhdGU6Ok5vbmUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCB3cml0ZSBuZXcgdXBkYXRlIHN0YXRlIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTbmFwc2hvdE1hbmFnZXI6OkNyZWF0ZVNuYXBzaG90KExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGRldmljZV9zaXplLCB1aW50NjRfdCBzbmFwc2hvdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNvd19zaXplKSB7CisgICAgQ0hFQ0sobG9jayk7CisgICAgaWYgKCFFbnN1cmVJbWFnZU1hbmFnZXIoKSkgcmV0dXJuIGZhbHNlOworCisgICAgLy8gU2FuaXR5IGNoZWNrIHRoZXNlIHNpemVzLiBMaWtlIGxpYmxwLCB3ZSBndWFyYW50ZWUgdGhlIHBhcnRpdGlvbiBzaXplCisgICAgLy8gaXMgcmVzcGVjdGVkLCB3aGljaCBtZWFucyBpdCBoYXMgdG8gYmUgc2VjdG9yLWFsaWduZWQuIChUaGlzIGd1YXJhbnRlZQorICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG9jYXRpbmcgYXZiIGZvb3RlcnMgY29ycmVjdGx5KS4gVGhlIENPVyBzaXplLCBob3dldmVyLAorICAgIC8vIGNhbiBiZSBhcmJpdHJhcmlseSBsYXJnZXIgdGhhbiBzcGVjaWZpZWQsIHNvIHdlIGNhbiBzYWZlbHkgcm91bmQgaXQgdXAuCisgICAgaWYgKGRldmljZV9zaXplICUga1NlY3RvclNpemUgIT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJTbmFwc2hvdCAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiIGRldmljZSBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBzZWN0b3Igc2l6ZTogIiA8PCBkZXZpY2Vfc2l6ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc25hcHNob3Rfc2l6ZSAlIGtTZWN0b3JTaXplICE9IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiU25hcHNob3QgIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIiBzbmFwc2hvdCBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBzZWN0b3Igc2l6ZTogIiA8PCBzbmFwc2hvdF9zaXplOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUm91bmQgdGhlIENPVyBzaXplIHVwIHRvIHRoZSBuZWFyZXN0IHNlY3Rvci4KKyAgICBjb3dfc2l6ZSArPSBrU2VjdG9yU2l6ZSAtIDE7CisgICAgY293X3NpemUgJj0gfihrU2VjdG9yU2l6ZSAtIDEpOworCisgICAgTE9HKElORk8pIDw8ICJTbmFwc2hvdCAiIDw8IG5hbWUgPDwgIiB3aWxsIGhhdmUgQ09XIHNpemUgIiA8PCBjb3dfc2l6ZTsKKworICAgIC8vIE5vdGUsIHdlIGxlYXZlIHRoZSBzdGF0dXMgZmlsZSBoYW5naW5nIGFyb3VuZCBpZiB3ZSBmYWlsIHRvIGNyZWF0ZSB0aGUKKyAgICAvLyBhY3R1YWwgYmFja2luZyBpbWFnZS4gVGhpcyBpcyBoYXJtbGVzcywgc2luY2UgaXQnbGwgZ2V0IHJlbW92ZWQgd2hlbgorICAgIC8vIENhbmNlbFVwZGF0ZSBpcyBjYWxsZWQuCisgICAgU25hcHNob3RTdGF0dXMgc3RhdHVzID0geworICAgICAgICAgICAgLnN0YXRlID0gImNyZWF0ZWQiLAorICAgICAgICAgICAgLmRldmljZV9zaXplID0gZGV2aWNlX3NpemUsCisgICAgICAgICAgICAuc25hcHNob3Rfc2l6ZSA9IHNuYXBzaG90X3NpemUsCisgICAgfTsKKyAgICBpZiAoIVdyaXRlU25hcHNob3RTdGF0dXMobG9jaywgbmFtZSwgc3RhdHVzKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHdyaXRlIHNuYXBzaG90IHN0YXR1czogIiA8PCBuYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byBjb3dfbmFtZSA9IEdldENvd05hbWUobmFtZSk7CisgICAgaW50IGNvd19mbGFncyA9IElJbWFnZU1hbmFnZXI6OkNSRUFURV9JTUFHRV9aRVJPX0ZJTEw7CisgICAgcmV0dXJuIGltYWdlc18tPkNyZWF0ZUJhY2tpbmdJbWFnZShjb3dfbmFtZSwgY293X3NpemUsIGNvd19mbGFncyk7Cit9CisKK2Jvb2wgU25hcHNob3RNYW5hZ2VyOjpNYXBTbmFwc2hvdChMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyYgdGltZW91dF9tcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZGV2X3BhdGgpIHsKKyAgICBDSEVDSyhsb2NrKTsKKyAgICBpZiAoIUVuc3VyZUltYWdlTWFuYWdlcigpKSByZXR1cm4gZmFsc2U7CisKKyAgICBTbmFwc2hvdFN0YXR1cyBzdGF0dXM7CisgICAgaWYgKCFSZWFkU25hcHNob3RTdGF0dXMobG9jaywgbmFtZSwgJnN0YXR1cykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3RhdHVzLnN0YXRlID09ICJtZXJnZS1jb21wbGV0ZWQiKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlNob3VsZCBub3QgY3JlYXRlIGEgc25hcHNob3QgZGV2aWNlIGZvciAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiIGFmdGVyIG1lcmdpbmcgaGFzIGNvbXBsZXRlZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhlIGJsb2NrIGRldmljZSBzaXplLCBhcyB3ZWxsIGFzIHRoZSByZXF1ZXN0ZWQgc25hcHNob3Qgc2l6ZS4KKyAgICAvLyBEdXJpbmcgdGhpcyB3ZSBhbHNvIGNvbXB1dGUgdGhlIGxpbmVhciBzZWN0b3IgcmVnaW9uIGlmIGFueS4KKyAgICB7CisgICAgICAgIHVuaXF1ZV9mZCBmZChvcGVuKGJhc2VfZGV2aWNlLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuIGZhaWxlZDogIiA8PCBiYXNlX2RldmljZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGRldl9zaXplID0gZ2V0X2Jsb2NrX2RldmljZV9zaXplKGZkKTsKKyAgICAgICAgaWYgKCFkZXZfc2l6ZSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBkZXRlcm1pbmUgYmxvY2sgZGV2aWNlIHNpemU6ICIgPDwgYmFzZV9kZXZpY2U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cy5kZXZpY2Vfc2l6ZSAhPSBkZXZfc2l6ZSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQmxvY2sgZGV2aWNlIHNpemUgZm9yICIgPDwgYmFzZV9kZXZpY2UgPDwgIiBkb2VzIG5vdCBtYXRjaCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihleHBlY3RlZCAiIDw8IHN0YXR1cy5kZXZpY2Vfc2l6ZSA8PCAiLCBnb3QgIiA8PCBkZXZfc2l6ZSA8PCAiKSI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXR1cy5kZXZpY2Vfc2l6ZSAlIGtTZWN0b3JTaXplICE9IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiaW52YWxpZCBibG9ja2RldiBzaXplIGZvciAiIDw8IGJhc2VfZGV2aWNlIDw8ICI6ICIgPDwgc3RhdHVzLmRldmljZV9zaXplOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzdGF0dXMuc25hcHNob3Rfc2l6ZSAlIGtTZWN0b3JTaXplICE9IDAgfHwgc3RhdHVzLnNuYXBzaG90X3NpemUgPiBzdGF0dXMuZGV2aWNlX3NpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBzbmFwc2hvdCBzaXplIGZvciAiIDw8IGJhc2VfZGV2aWNlIDw8ICI6ICIgPDwgc3RhdHVzLnNuYXBzaG90X3NpemU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdWludDY0X3Qgc25hcHNob3Rfc2VjdG9ycyA9IHN0YXR1cy5zbmFwc2hvdF9zaXplIC8ga1NlY3RvclNpemU7CisgICAgdWludDY0X3QgbGluZWFyX3NlY3RvcnMgPSAoc3RhdHVzLmRldmljZV9zaXplIC0gc3RhdHVzLnNuYXBzaG90X3NpemUpIC8ga1NlY3RvclNpemU7CisKKyAgICBhdXRvIGNvd19uYW1lID0gR2V0Q293TmFtZShuYW1lKTsKKworICAgIHN0ZDo6c3RyaW5nIGNvd19kZXY7CisgICAgaWYgKCFpbWFnZXNfLT5NYXBJbWFnZURldmljZShjb3dfbmFtZSwgdGltZW91dF9tcywgJmNvd19kZXYpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBtYXAgaW1hZ2UgZGV2aWNlOiAiIDw8IGNvd19uYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisKKyAgICAvLyBOb3RlIHRoYXQgbWVyZ2luZyBpcyBhIGdsb2JhbCBzdGF0ZS4gV2UgZG8gdHJhY2sgd2hldGhlciBpbmRpdmlkdWFsIGRldmljZXMKKyAgICAvLyBoYXZlIGNvbXBsZXRlZCBtZXJnaW5nLCBidXQgdGhlIHN0YXJ0IG9mIHRoZSBtZXJnZSBwcm9jZXNzIGlzIGNvbnNpZGVyZWQKKyAgICAvLyBhdG9taWMuCisgICAgU25hcHNob3RTdG9yYWdlTW9kZSBtb2RlOworICAgIHN3aXRjaCAoUmVhZFVwZGF0ZVN0YXRlKGxvY2spKSB7CisgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdlQ29tcGxldGVkOgorICAgICAgICBjYXNlIFVwZGF0ZVN0YXRlOjpNZXJnZU5lZWRzUmVib290OgorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2hvdWxkIG5vdCBjcmVhdGUgYSBzbmFwc2hvdCBkZXZpY2UgZm9yICIgPDwgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFmdGVyIGdsb2JhbCBtZXJnaW5nIGhhcyBjb21wbGV0ZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6TWVyZ2luZzoKKyAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQ6CisgICAgICAgICAgICAvLyBOb3RlOiBNZXJnZUZhaWxlZCBpbmRpY2F0ZXMgdGhhdCBhIG1lcmdlIGlzIGluIHByb2dyZXNzLCBidXQKKyAgICAgICAgICAgIC8vIGlzIHBvc3NpYmx5IHN0YWxsZWQuIFdlIHN0aWxsIGhhdmUgdG8gaG9ub3IgdGhlIG1lcmdlLgorICAgICAgICAgICAgbW9kZSA9IFNuYXBzaG90U3RvcmFnZU1vZGU6Ok1lcmdlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtb2RlID0gU25hcHNob3RTdG9yYWdlTW9kZTo6UGVyc2lzdGVudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFRoZSBrZXJuZWwgKHRlc3RlZCBvbiA0LjE5KSBjcmFzaGVzIGhvcnJpYmx5IGlmIGEgZGV2aWNlIGhhcyBib3RoIGEgc25hcHNob3QKKyAgICAvLyBhbmQgYSBsaW5lYXIgdGFyZ2V0IGluIHRoZSBzYW1lIHRhYmxlLiBJbnN0ZWFkLCB3ZSBzdGFjayB0aGVtLCBhbmQgZ2l2ZSB0aGUKKyAgICAvLyBzbmFwc2hvdCBkZXZpY2UgYSBkaWZmZXJlbnQgbmFtZS4gSXQgaXMgbm90IGV4cG9zZWQgdG8gdGhlIGNhbGxlciBpbiB0aGlzCisgICAgLy8gY2FzZS4KKyAgICBhdXRvIHNuYXBfbmFtZSA9IChsaW5lYXJfc2VjdG9ycyA+IDApID8gbmFtZSArICItaW5uZXIiIDogbmFtZTsKKworICAgIERtVGFibGUgdGFibGU7CisgICAgdGFibGUuRW1wbGFjZTxEbVRhcmdldFNuYXBzaG90PigwLCBzbmFwc2hvdF9zZWN0b3JzLCBiYXNlX2RldmljZSwgY293X2RldiwgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTbmFwc2hvdENodW5rU2l6ZSk7CisgICAgaWYgKCFkbS5DcmVhdGVEZXZpY2Uoc25hcF9uYW1lLCB0YWJsZSwgZGV2X3BhdGgsIHRpbWVvdXRfbXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBjcmVhdGUgc25hcHNob3QgZGV2aWNlOiAiIDw8IHNuYXBfbmFtZTsKKyAgICAgICAgaW1hZ2VzXy0+VW5tYXBJbWFnZURldmljZShjb3dfbmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobGluZWFyX3NlY3RvcnMpIHsKKyAgICAgICAgLy8gT3VyIHN0YWNraW5nIHdpbGwgbG9va3MgbGlrZSB0aGlzOgorICAgICAgICAvLyAgICAgW2xpbmVhciwgbGluZWFyXSA7IHRvIHNuYXBzaG90LCBhbmQgbm9uLXNuYXBzaG90IHJlZ2lvbiBvZiBiYXNlIGRldmljZQorICAgICAgICAvLyAgICAgW3NuYXBzaG90LWlubmVyXQorICAgICAgICAvLyAgICAgW2Jhc2UgZGV2aWNlXSAgIFtjb3ddCisgICAgICAgIERtVGFibGUgdGFibGU7CisgICAgICAgIHRhYmxlLkVtcGxhY2U8RG1UYXJnZXRMaW5lYXI+KDAsIHNuYXBzaG90X3NlY3RvcnMsICpkZXZfcGF0aCwgMCk7CisgICAgICAgIHRhYmxlLkVtcGxhY2U8RG1UYXJnZXRMaW5lYXI+KHNuYXBzaG90X3NlY3RvcnMsIGxpbmVhcl9zZWN0b3JzLCBiYXNlX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3Rfc2VjdG9ycyk7CisgICAgICAgIGlmICghZG0uQ3JlYXRlRGV2aWNlKG5hbWUsIHRhYmxlLCBkZXZfcGF0aCwgdGltZW91dF9tcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBjcmVhdGUgb3V0ZXIgc25hcHNob3QgZGV2aWNlOiAiIDw8IG5hbWU7CisgICAgICAgICAgICBkbS5EZWxldGVEZXZpY2Uoc25hcF9uYW1lKTsKKyAgICAgICAgICAgIGltYWdlc18tPlVubWFwSW1hZ2VEZXZpY2UoY293X25hbWUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gOlRPRE86IHdoZW4gbWVyZ2luZyBpcyBpbXBsZW1lbnRlZCwgd2UgbmVlZCB0byBhZGQgYW4gYXJndW1lbnQgdG8gdGhlCisgICAgLy8gc3RhdHVzIGluZGljYXRpbmcgaG93IG11Y2ggcHJvZ3Jlc3MgaXMgbGVmdCB0byBtZXJnZS4gKGRldmljZS1tYXBwZXIKKyAgICAvLyBkb2VzIG5vdCByZXRhaW4gdGhlIGluaXRpYWwgdmFsdWVzLCBzbyB3ZSBjYW4ndCBkZXJpdmUgdGhlbS4pCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU25hcHNob3RNYW5hZ2VyOjpVbm1hcFNuYXBzaG90KExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgQ0hFQ0sobG9jayk7CisgICAgaWYgKCFFbnN1cmVJbWFnZU1hbmFnZXIoKSkgcmV0dXJuIGZhbHNlOworCisgICAgU25hcHNob3RTdGF0dXMgc3RhdHVzOworICAgIGlmICghUmVhZFNuYXBzaG90U3RhdHVzKGxvY2ssIG5hbWUsICZzdGF0dXMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBpZiAoZG0uR2V0U3RhdGUobmFtZSkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJiAhZG0uRGVsZXRlRGV2aWNlKG5hbWUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBkZWxldGUgc25hcHNob3QgZGV2aWNlOiAiIDw8IG5hbWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGVyZSBtYXkgYmUgYW4gZXh0cmEgZGV2aWNlLCBzaW5jZSB0aGUga2VybmVsIGRvZXNuJ3QgbGV0IHVzIGhhdmUgYQorICAgIC8vIHNuYXBzaG90IGFuZCBsaW5lYXIgdGFyZ2V0IGluIHRoZSBzYW1lIHRhYmxlLgorICAgIGF1dG8gZG1fbmFtZSA9IEdldFNuYXBzaG90RGV2aWNlTmFtZShuYW1lLCBzdGF0dXMpOworICAgIGlmIChuYW1lICE9IGRtX25hbWUgJiYgIWRtLkRlbGV0ZURldmljZShkbV9uYW1lKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZGVsZXRlIGlubmVyIHNuYXBzaG90IGRldmljZTogIiA8PCBkbV9uYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byBjb3dfbmFtZSA9IEdldENvd05hbWUobmFtZSk7CisgICAgaWYgKGltYWdlc18tPklzSW1hZ2VNYXBwZWQoY293X25hbWUpICYmICFpbWFnZXNfLT5Vbm1hcEltYWdlRGV2aWNlKGNvd19uYW1lKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNuYXBzaG90TWFuYWdlcjo6RGVsZXRlU25hcHNob3QoTG9ja2VkRmlsZSogbG9jaywgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBDSEVDSyhsb2NrKTsKKyAgICBpZiAoIUVuc3VyZUltYWdlTWFuYWdlcigpKSByZXR1cm4gZmFsc2U7CisKKyAgICBhdXRvIGNvd19uYW1lID0gR2V0Q293TmFtZShuYW1lKTsKKyAgICBpZiAoIWltYWdlc18tPkJhY2tpbmdJbWFnZUV4aXN0cyhjb3dfbmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChpbWFnZXNfLT5Jc0ltYWdlTWFwcGVkKGNvd19uYW1lKSAmJiAhaW1hZ2VzXy0+VW5tYXBJbWFnZURldmljZShjb3dfbmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWltYWdlc18tPkRlbGV0ZUJhY2tpbmdJbWFnZShjb3dfbmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIGF1dG8gZmlsZV9wYXRoID0gR2V0U25hcHNob3RTdGF0dXNGaWxlUGF0aChuYW1lKTsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlbW92ZUZpbGVJZkV4aXN0cyhmaWxlX3BhdGgsICZlcnJvcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlbW92ZSBzdGF0dXMgZmlsZSAiIDw8IGZpbGVfcGF0aCA8PCAiOiAiIDw8IGVycm9yOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOwogfQogCiBib29sIFNuYXBzaG90TWFuYWdlcjo6SW5pdGlhdGVNZXJnZSgpIHsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgYXV0byBsb2NrID0gTG9ja0V4Y2x1c2l2ZSgpOworICAgIGlmICghbG9jaykgcmV0dXJuIGZhbHNlOworCisgICAgVXBkYXRlU3RhdGUgc3RhdGUgPSBSZWFkVXBkYXRlU3RhdGUobG9jay5nZXQoKSk7CisgICAgaWYgKHN0YXRlICE9IFVwZGF0ZVN0YXRlOjpVbnZlcmlmaWVkKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBiZWdpbiBhIG1lcmdlIGlmIGFuIHVwZGF0ZSBoYXMgbm90IGJlZW4gdmVyaWZpZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZGV2aWNlXy0+SXNSdW5uaW5nU25hcHNob3QoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgYmVnaW4gYSBtZXJnZSBpZiB0aGUgZGV2aWNlIGlzIG5vdCBib290ZWQgb2ZmIGEgc25hcHNob3QiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNuYXBzaG90czsKKyAgICBpZiAoIUxpc3RTbmFwc2hvdHMobG9jay5nZXQoKSwgJnNuYXBzaG90cykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGxpc3Qgc25hcHNob3RzIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIGZvciAoY29uc3QgYXV0byYgc25hcHNob3QgOiBzbmFwc2hvdHMpIHsKKyAgICAgICAgLy8gVGhlIGRldmljZSBoYXMgdG8gYmUgbWFwcGVkLCBzaW5jZSBldmVyeXRoaW5nIHNob3VsZCBiZSBtZXJnZWQgYXQKKyAgICAgICAgLy8gdGhlIHNhbWUgdGltZS4gVGhpcyBpcyBhIGZhaXJseSBzZXJpb3VzIGVycm9yLiBXZSBjb3VsZCBmb3JjZWZ1bGx5CisgICAgICAgIC8vIG1hcCBldmVyeXRoaW5nIGhlcmUsIGJ1dCBpdCBzaG91bGQgaGF2ZSBiZWVuIG1hcHBlZCBkdXJpbmcgZmlyc3QtCisgICAgICAgIC8vIHN0YWdlIGluaXQuCisgICAgICAgIGlmIChkbS5HZXRTdGF0ZShzbmFwc2hvdCkgPT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGJlZ2luIG1lcmdlOyBkZXZpY2UgIiA8PCBzbmFwc2hvdCA8PCAiIGlzIG5vdCBtYXBwZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFBvaW50IG9mIG5vIHJldHVybiAtIG1hcmsgdGhhdCB3ZSdyZSBzdGFydGluZyBhIG1lcmdlLiBGcm9tIG5vdyBvbiBldmVyeQorICAgIC8vIHNuYXBzaG90IG11c3QgYmUgYSBtZXJnZSB0YXJnZXQuCisgICAgaWYgKCFXcml0ZVVwZGF0ZVN0YXRlKGxvY2suZ2V0KCksIFVwZGF0ZVN0YXRlOjpNZXJnaW5nKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCByZXdyb3RlX2FsbCA9IHRydWU7CisgICAgZm9yIChjb25zdCBhdXRvJiBzbmFwc2hvdCA6IHNuYXBzaG90cykgeworICAgICAgICAvLyBJZiB0aGlzIGZhaWxzLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gY29udGludWUuIEV2ZXJ5dGhpbmcgbXVzdAorICAgICAgICAvLyBiZSBtZXJnZWQuIFRoaXMgaXMgbm90IGFuIGlkZWFsIHN0YXRlIHRvIGJlIGluLCBidXQgaXQgaXMgc2FmZSwKKyAgICAgICAgLy8gYmVjYXVzZSB3ZSB0aGUgbmV4dCBib290IHdpbGwgdHJ5IGFnYWluLgorICAgICAgICBpZiAoIVN3aXRjaFNuYXBzaG90VG9NZXJnZShsb2NrLmdldCgpLCBzbmFwc2hvdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzd2l0Y2ggc25hcHNob3QgdG8gYSBtZXJnZSB0YXJnZXQ6ICIgPDwgc25hcHNob3Q7CisgICAgICAgICAgICByZXdyb3RlX2FsbCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgd2UgY291bGRuJ3Qgc3dpdGNoIGV2ZXJ5dGhpbmcgdG8gYSBtZXJnZSB0YXJnZXQsIHByZS1lbXB0aXZlbHkgbWFyaworICAgIC8vIHRoaXMgbWVyZ2UgYXMgZmFpbGVkLiBJdCB3aWxsIGdldCBhY2tub3dsZWRnZWQgd2hlbiBXYWl0Rm9yTWVyZ2UoKSBpcworICAgIC8vIGNhbGxlZC4KKyAgICBpZiAoIXJld3JvdGVfYWxsKSB7CisgICAgICAgIFdyaXRlVXBkYXRlU3RhdGUobG9jay5nZXQoKSwgVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBubyBtYXR0ZXIgd2hhdCwgYmVjYXVzZSBhIG1lcmdlIHdhcyBpbml0aWF0ZWQuCisgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgU25hcHNob3RNYW5hZ2VyOjpXYWl0Rm9yTWVyZ2UoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOworYm9vbCBTbmFwc2hvdE1hbmFnZXI6OlN3aXRjaFNuYXBzaG90VG9NZXJnZShMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIFNuYXBzaG90U3RhdHVzIHN0YXR1czsKKyAgICBpZiAoIVJlYWRTbmFwc2hvdFN0YXR1cyhsb2NrLCBuYW1lLCAmc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzdGF0dXMuc3RhdGUgIT0gImNyZWF0ZWQiKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiU25hcHNob3QgIiA8PCBuYW1lIDw8ICIgaGFzIHVuZXhwZWN0ZWQgc3RhdGU6ICIgPDwgc3RhdHVzLnN0YXRlOworICAgIH0KKworICAgIC8vIEFmdGVyIHRoaXMsIHdlIHJldHVybiB0cnVlIGJlY2F1c2Ugd2UgdGVjaG5pY2FsbHkgZGlkIHN3aXRjaCB0byBhIG1lcmdlCisgICAgLy8gdGFyZ2V0LiBFdmVyeXRoaW5nIGVsc2Ugd2UgZG8gaGVyZSBpcyBqdXN0IGluZm9ybWF0aW9uYWwuCisgICAgYXV0byBkbV9uYW1lID0gR2V0U25hcHNob3REZXZpY2VOYW1lKG5hbWUsIHN0YXR1cyk7CisgICAgaWYgKCFSZXdyaXRlU25hcHNob3REZXZpY2VUYWJsZShkbV9uYW1lKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdHVzLnN0YXRlID0gIm1lcmdpbmciOworCisgICAgRG1UYXJnZXRTbmFwc2hvdDo6U3RhdHVzIGRtX3N0YXR1czsKKyAgICBpZiAoIVF1ZXJ5U25hcHNob3RTdGF0dXMoZG1fbmFtZSwgbnVsbHB0ciwgJmRtX3N0YXR1cykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHF1ZXJ5IG1lcmdlIHN0YXR1cyBmb3Igc25hcHNob3Q6ICIgPDwgZG1fbmFtZTsKKyAgICB9CisgICAgc3RhdHVzLnNlY3RvcnNfYWxsb2NhdGVkID0gZG1fc3RhdHVzLnNlY3RvcnNfYWxsb2NhdGVkOworICAgIHN0YXR1cy5tZXRhZGF0YV9zZWN0b3JzID0gZG1fc3RhdHVzLm1ldGFkYXRhX3NlY3RvcnM7CisgICAgaWYgKCFXcml0ZVNuYXBzaG90U3RhdHVzKGxvY2ssIG5hbWUsIHN0YXR1cykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHVwZGF0ZSBzdGF0dXMgZmlsZSBmb3Igc25hcHNob3Q6ICIgPDwgbmFtZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLVVwZGF0ZVN0YXR1cyBTbmFwc2hvdE1hbmFnZXI6OkdldFVwZGF0ZVN0YXR1cyhkb3VibGUqIHByb2dyZXNzKSB7Ci0gICAgKnByb2dyZXNzID0gMC4wZjsKLSAgICByZXR1cm4gVXBkYXRlU3RhdHVzOjpOb25lOworYm9vbCBTbmFwc2hvdE1hbmFnZXI6OlJld3JpdGVTbmFwc2hvdERldmljZVRhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV9uYW1lKSB7CisgICAgYXV0byYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxEZXZpY2VNYXBwZXI6OlRhcmdldEluZm8+IG9sZF90YXJnZXRzOworICAgIGlmICghZG0uR2V0VGFibGVJbmZvKGRtX25hbWUsICZvbGRfdGFyZ2V0cykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHJlYWQgc25hcHNob3QgZGV2aWNlIHRhYmxlOiAiIDw8IGRtX25hbWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG9sZF90YXJnZXRzLnNpemUoKSAhPSAxIHx8IERldmljZU1hcHBlcjo6R2V0VGFyZ2V0VHlwZShvbGRfdGFyZ2V0c1swXS5zcGVjKSAhPSAic25hcHNob3QiKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuZXhwZWN0ZWQgZGV2aWNlLW1hcHBlciB0YWJsZSBmb3Igc25hcHNob3Q6ICIgPDwgZG1fbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGJhc2VfZGV2aWNlLCBjb3dfZGV2aWNlOworICAgIGlmICghRG1UYXJnZXRTbmFwc2hvdDo6R2V0RGV2aWNlc0Zyb21QYXJhbXMob2xkX3RhcmdldHNbMF0uZGF0YSwgJmJhc2VfZGV2aWNlLCAmY293X2RldmljZSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGRlcml2ZSB1bmRlcmx5aW5nIGRldmljZXMgZm9yIHNuYXBzaG90OiAiIDw8IGRtX25hbWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBEbVRhYmxlIHRhYmxlOworICAgIHRhYmxlLkVtcGxhY2U8RG1UYXJnZXRTbmFwc2hvdD4oMCwgb2xkX3RhcmdldHNbMF0uc3BlYy5sZW5ndGgsIGJhc2VfZGV2aWNlLCBjb3dfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU25hcHNob3RTdG9yYWdlTW9kZTo6TWVyZ2UsIGtTbmFwc2hvdENodW5rU2l6ZSk7CisgICAgaWYgKCFkbS5Mb2FkVGFibGVBbmRBY3RpdmF0ZShkbV9uYW1lLCB0YWJsZSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHN3YXAgZGV2aWNlLW1hcHBlciB0YWJsZXMgb24gc25hcHNob3QgZGV2aWNlICIgPDwgZG1fbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBMT0coSU5GTykgPDwgIlN1Y2Nlc3NmdWxseSBzd2l0Y2hlZCBzbmFwc2hvdCBkZXZpY2UgdG8gYSBtZXJnZSB0YXJnZXQ6ICIgPDwgZG1fbmFtZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworZW51bSBjbGFzcyBUYWJsZVF1ZXJ5IHsKKyAgICBUYWJsZSwKKyAgICBTdGF0dXMsCit9OworCitzdGF0aWMgYm9vbCBHZXRTaW5nbGVUYXJnZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGRtX25hbWUsIFRhYmxlUXVlcnkgcXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlTWFwcGVyOjpUYXJnZXRJbmZvKiB0YXJnZXQpIHsKKyAgICBhdXRvJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBpZiAoZG0uR2V0U3RhdGUoZG1fbmFtZSkgPT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8RGV2aWNlTWFwcGVyOjpUYXJnZXRJbmZvPiB0YXJnZXRzOworICAgIGJvb2wgcmVzdWx0OworICAgIGlmIChxdWVyeSA9PSBUYWJsZVF1ZXJ5OjpTdGF0dXMpIHsKKyAgICAgICAgcmVzdWx0ID0gZG0uR2V0VGFibGVTdGF0dXMoZG1fbmFtZSwgJnRhcmdldHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGRtLkdldFRhYmxlSW5mbyhkbV9uYW1lLCAmdGFyZ2V0cyk7CisgICAgfQorICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBxdWVyeSBkZXZpY2U6ICIgPDwgZG1fbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodGFyZ2V0cy5zaXplKCkgIT0gMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnRhcmdldCA9IHN0ZDo6bW92ZSh0YXJnZXRzWzBdKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTbmFwc2hvdE1hbmFnZXI6OklzU25hcHNob3REZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRtX25hbWUsIFRhcmdldEluZm8qIHRhcmdldCkgeworICAgIERldmljZU1hcHBlcjo6VGFyZ2V0SW5mbyBzbmFwX3RhcmdldDsKKyAgICBpZiAoIUdldFNpbmdsZVRhcmdldChkbV9uYW1lLCBUYWJsZVF1ZXJ5OjpTdGF0dXMsICZzbmFwX3RhcmdldCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIHR5cGUgPSBEZXZpY2VNYXBwZXI6OkdldFRhcmdldFR5cGUoc25hcF90YXJnZXQuc3BlYyk7CisgICAgaWYgKHR5cGUgIT0gInNuYXBzaG90IiAmJiB0eXBlICE9ICJzbmFwc2hvdC1tZXJnZSIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodGFyZ2V0KSB7CisgICAgICAgICp0YXJnZXQgPSBzdGQ6Om1vdmUoc25hcF90YXJnZXQpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTbmFwc2hvdE1hbmFnZXI6OlF1ZXJ5U25hcHNob3RTdGF0dXMoY29uc3Qgc3RkOjpzdHJpbmcmIGRtX25hbWUsIHN0ZDo6c3RyaW5nKiB0YXJnZXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERtVGFyZ2V0U25hcHNob3Q6OlN0YXR1cyogc3RhdHVzKSB7CisgICAgRGV2aWNlTWFwcGVyOjpUYXJnZXRJbmZvIHRhcmdldDsKKyAgICBpZiAoIUlzU25hcHNob3REZXZpY2UoZG1fbmFtZSwgJnRhcmdldCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGV2aWNlICIgPDwgZG1fbmFtZSA8PCAiIGlzIG5vdCBhIHNuYXBzaG90IG9yIHNuYXBzaG90LW1lcmdlIGRldmljZSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFEbVRhcmdldFNuYXBzaG90OjpQYXJzZVN0YXR1c1RleHQodGFyZ2V0LmRhdGEsIHN0YXR1cykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHBhcnNlIHNuYXBzaG90IHN0YXR1cyB0ZXh0OiAiIDw8IGRtX25hbWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHRhcmdldF90eXBlKSB7CisgICAgICAgICp0YXJnZXRfdHlwZSA9IERldmljZU1hcHBlcjo6R2V0VGFyZ2V0VHlwZSh0YXJnZXQuc3BlYyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBOb3RlIHRoYXQgd2hlbiBhIG1lcmdlIGZhaWxzLCB3ZSB3aWxsICphbHdheXMqIHRyeSBhZ2FpbiB0byBjb21wbGV0ZSB0aGUKKy8vIG1lcmdlIGVhY2ggdGltZSB0aGUgZGV2aWNlIGJvb3RzLiBUaGVyZSBpcyBubyBoYXJtIGluIGRvaW5nIHNvLCBhbmQgaWYKKy8vIHRoZSBwcm9ibGVtIHdhcyB0cmFuc2llbnQsIHdlIG1pZ2h0IG1hbmFnZSB0byBnZXQgYSBuZXcgb3V0Y29tZS4KK1VwZGF0ZVN0YXRlIFNuYXBzaG90TWFuYWdlcjo6V2FpdEZvck1lcmdlKCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIFVwZGF0ZVN0YXRlIHN0YXRlID0gQ2hlY2tNZXJnZVN0YXRlKCk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBVcGRhdGVTdGF0ZTo6TWVyZ2luZykgeworICAgICAgICAgICAgLy8gRWl0aGVyIHRoZXJlIGlzIG5vIG1lcmdlLCBvciB0aGUgbWVyZ2Ugd2FzIGZpbmlzaGVkLCBzbyBubyBuZWVkCisgICAgICAgICAgICAvLyB0byBrZWVwIHdhaXRpbmcuCisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIHdhaXQgaXMgbm90IHN1cGVyIHRpbWUgc2Vuc2l0aXZlLCBzbyB3ZSBoYXZlIGEgcmVsYXRpdmVseQorICAgICAgICAvLyBsb3cgcG9sbGluZyBmcmVxdWVuY3kuCisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcigycyk7CisgICAgfQorfQorCitVcGRhdGVTdGF0ZSBTbmFwc2hvdE1hbmFnZXI6OkNoZWNrTWVyZ2VTdGF0ZSgpIHsKKyAgICBhdXRvIGxvY2sgPSBMb2NrRXhjbHVzaXZlKCk7CisgICAgaWYgKCFsb2NrKSB7CisgICAgICAgIEFja25vd2xlZGdlTWVyZ2VGYWlsdXJlKCk7CisgICAgICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQ7CisgICAgfQorCisgICAgYXV0byBzdGF0ZSA9IENoZWNrTWVyZ2VTdGF0ZShsb2NrLmdldCgpKTsKKyAgICBpZiAoc3RhdGUgPT0gVXBkYXRlU3RhdGU6Ok1lcmdlQ29tcGxldGVkKSB7CisgICAgICAgIEFja25vd2xlZGdlTWVyZ2VTdWNjZXNzKGxvY2suZ2V0KCkpOworICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkKSB7CisgICAgICAgIEFja25vd2xlZGdlTWVyZ2VGYWlsdXJlKCk7CisgICAgfQorICAgIHJldHVybiBzdGF0ZTsKK30KKworVXBkYXRlU3RhdGUgU25hcHNob3RNYW5hZ2VyOjpDaGVja01lcmdlU3RhdGUoTG9ja2VkRmlsZSogbG9jaykgeworICAgIFVwZGF0ZVN0YXRlIHN0YXRlID0gUmVhZFVwZGF0ZVN0YXRlKGxvY2spOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6Tm9uZToKKyAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6TWVyZ2VDb21wbGV0ZWQ6CisgICAgICAgICAgICAvLyBIYXJtbGVzcyByYWNlcyBhcmUgYWxsb3dlZCBiZXR3ZWVuIHR3byBjYWxsZXJzIG9mIFdhaXRGb3JNZXJnZSwKKyAgICAgICAgICAgIC8vIHNvIGluIGJvdGggb2YgdGhlc2UgY2FzZXMgd2UganVzdCBwcm9wYWdhdGUgdGhlIHN0YXRlLgorICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworCisgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdpbmc6CisgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdlTmVlZHNSZWJvb3Q6CisgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkOgorICAgICAgICAgICAgLy8gV2UnbGwgcG9sbCBlYWNoIHNuYXBzaG90IGJlbG93LiBOb3RlIHRoYXQgZm9yIHRoZSBOZWVkc1JlYm9vdAorICAgICAgICAgICAgLy8gY2FzZSwgd2UgYWx3YXlzIHBvbGwgb25jZSB0byBnaXZlIGNsZWFudXAgYW5vdGhlciBvcHBvcnR1bml0eSB0bworICAgICAgICAgICAgLy8gcnVuLgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIG1lcmdlIGV4aXN0cywgY2Fubm90IHdhaXQuIFVwZGF0ZSBzdGF0ZTogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpOb25lOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzbmFwc2hvdHM7CisgICAgaWYgKCFMaXN0U25hcHNob3RzKGxvY2ssICZzbmFwc2hvdHMpKSB7CisgICAgICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQ7CisgICAgfQorCisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBib29sIG1lcmdpbmcgPSBmYWxzZTsKKyAgICBib29sIG5lZWRzX3JlYm9vdCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgc25hcHNob3QgOiBzbmFwc2hvdHMpIHsKKyAgICAgICAgVXBkYXRlU3RhdGUgc25hcHNob3Rfc3RhdGUgPSBDaGVja1RhcmdldE1lcmdlU3RhdGUobG9jaywgc25hcHNob3QpOworICAgICAgICBzd2l0Y2ggKHNuYXBzaG90X3N0YXRlKSB7CisgICAgICAgICAgICBjYXNlIFVwZGF0ZVN0YXRlOjpNZXJnZUZhaWxlZDoKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6TWVyZ2luZzoKKyAgICAgICAgICAgICAgICBtZXJnaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdlTmVlZHNSZWJvb3Q6CisgICAgICAgICAgICAgICAgbmVlZHNfcmVib290ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdlQ29tcGxldGVkOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIG1lcmdlIHN0YXR1czogIiA8PCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc25hcHNob3Rfc3RhdGUpOworICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWVyZ2luZykgeworICAgICAgICAvLyBOb3RlIHRoYXQgd2UgaGFuZGxlICJNZXJnaW5nIiBiZWZvcmUgd2UgaGFuZGxlIGFueXRoaW5nIGVsc2UuIFdlCisgICAgICAgIC8vIHdhbnQgdG8gcG9sbCB1bnRpbCAqbm90aGluZyogaXMgbWVyZ2luZyBpZiB3ZSBjYW4sIHNvIGV2ZXJ5dGhpbmcgaGFzCisgICAgICAgIC8vIGEgY2hhbmNlIHRvIGdldCBtYXJrZWQgYXMgY29tcGxldGVkIG9yIGZhaWxlZC4KKyAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpNZXJnaW5nOworICAgIH0KKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIC8vIE5vdGU6IHNpbmNlIHRoZXJlIGFyZSBtYW55IGRyb3Atb3V0IGNhc2VzIGZvciBmYWlsdXJlLCB3ZSBhY2tub3dsZWRnZQorICAgICAgICAvLyBpdCBpbiBXYWl0Rm9yTWVyZ2UgcmF0aGVyIHRoYW4gaGVyZSBhbmQgZWxzZXdoZXJlLgorICAgICAgICByZXR1cm4gVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkOworICAgIH0KKyAgICBpZiAobmVlZHNfcmVib290KSB7CisgICAgICAgIFdyaXRlVXBkYXRlU3RhdGUobG9jaywgVXBkYXRlU3RhdGU6Ok1lcmdlTmVlZHNSZWJvb3QpOworICAgICAgICByZXR1cm4gVXBkYXRlU3RhdGU6Ok1lcmdlTmVlZHNSZWJvb3Q7CisgICAgfQorICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6TWVyZ2VDb21wbGV0ZWQ7Cit9CisKK1VwZGF0ZVN0YXRlIFNuYXBzaG90TWFuYWdlcjo6Q2hlY2tUYXJnZXRNZXJnZVN0YXRlKExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgU25hcHNob3RTdGF0dXMgc25hcHNob3Rfc3RhdHVzOworICAgIGlmICghUmVhZFNuYXBzaG90U3RhdHVzKGxvY2ssIG5hbWUsICZzbmFwc2hvdF9zdGF0dXMpKSB7CisgICAgICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQ7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZG1fbmFtZSA9IEdldFNuYXBzaG90RGV2aWNlTmFtZShuYW1lLCBzbmFwc2hvdF9zdGF0dXMpOworCisgICAgLy8gRHVyaW5nIGEgY2hlY2ssIHdlIGRlY2lkZWQgdGhlIG1lcmdlIHdhcyBjb21wbGV0ZSwgYnV0IHdlIHdlcmUgdW5hYmxlIHRvCisgICAgLy8gY29sbGFwc2UgdGhlIGRldmljZS1tYXBwZXIgc3RhY2sgYW5kIHBlcmZvcm0gQ09XIGNsZWFudXAuIElmIHdlIGhhdmVuJ3QKKyAgICAvLyByZWJvb3RlZCBhZnRlciB0aGlzIGNoZWNrLCB0aGUgZGV2aWNlIHdpbGwgc3RpbGwgYmUgYSBzbmFwc2hvdC1tZXJnZQorICAgIC8vIHRhcmdldC4gSWYgdGhlIGhhdmUgcmVib290ZWQsIHRoZSBkZXZpY2Ugd2lsbCBub3cgYmUgYSBsaW5lYXIgdGFyZ2V0LAorICAgIC8vIGFuZCB3ZSBjYW4gdHJ5IGNsZWFudXAgYWdhaW4uCisgICAgaWYgKHNuYXBzaG90X3N0YXR1cy5zdGF0ZSA9PSAibWVyZ2UtY29tcGxldGUiICYmICFJc1NuYXBzaG90RGV2aWNlKGRtX25hbWUpKSB7CisgICAgICAgIC8vIE5COiBJdCdzIG9rYXkgaWYgdGhpcyBmYWlscyBub3csIHdlIGdhdmUgY2xlYW51cCBvdXIgYmVzdCBlZmZvcnQuCisgICAgICAgIE9uU25hcHNob3RNZXJnZUNvbXBsZXRlKGxvY2ssIG5hbWUsIHNuYXBzaG90X3N0YXR1cyk7CisgICAgICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6TWVyZ2VDb21wbGV0ZWQ7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgdGFyZ2V0X3R5cGU7CisgICAgRG1UYXJnZXRTbmFwc2hvdDo6U3RhdHVzIHN0YXR1czsKKyAgICBpZiAoIVF1ZXJ5U25hcHNob3RTdGF0dXMoZG1fbmFtZSwgJnRhcmdldF90eXBlLCAmc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkOworICAgIH0KKyAgICBpZiAodGFyZ2V0X3R5cGUgIT0gInNuYXBzaG90LW1lcmdlIikgeworICAgICAgICAvLyBXZSBjYW4gZ2V0IGhlcmUgaWYgd2UgZmFpbGVkIHRvIHJld3JpdGUgdGhlIHRhcmdldCB0eXBlIGluCisgICAgICAgIC8vIEluaXRpYXRlTWVyZ2UoKS4gSWYgd2UgZmFpbGVkIHRvIGNyZWF0ZSB0aGUgdGFyZ2V0IGluIGZpcnN0LXN0YWdlCisgICAgICAgIC8vIGluaXQsIGJvb3Qgd291bGQgbm90IHN1Y2NlZWQuCisgICAgICAgIExPRyhFUlJPUikgPDwgIlNuYXBzaG90ICIgPDwgbmFtZSA8PCAiIGhhcyBpbmNvcnJlY3QgdGFyZ2V0IHR5cGU6ICIgPDwgdGFyZ2V0X3R5cGU7CisgICAgICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQ7CisgICAgfQorCisgICAgLy8gVGhlc2UgdHdvIHZhbHVlcyBhcmUgZXF1YWwgd2hlbiBtZXJnaW5nIGlzIGNvbXBsZXRlLgorICAgIGlmIChzdGF0dXMuc2VjdG9yc19hbGxvY2F0ZWQgIT0gc3RhdHVzLm1ldGFkYXRhX3NlY3RvcnMpIHsKKyAgICAgICAgaWYgKHNuYXBzaG90X3N0YXR1cy5zdGF0ZSA9PSAibWVyZ2UtY29tcGxldGUiKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTbmFwc2hvdCAiIDw8IG5hbWUgPDwgIiBpcyBtZXJnaW5nIGFmdGVyIGJlaW5nIG1hcmtlZCBtZXJnZS1jb21wbGV0ZS4iOworICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpNZXJnZUZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVXBkYXRlU3RhdGU6Ok1lcmdpbmc7CisgICAgfQorCisgICAgLy8gTWVyZ2luZyBpcyBkb25lLiBGaXJzdCwgdXBkYXRlIHRoZSBzdGF0dXMgZmlsZSB0byBpbmRpY2F0ZSB0aGUgbWVyZ2UKKyAgICAvLyBpcyBjb21wbGV0ZS4gV2UgZG8gdGhpcyBiZWZvcmUgY2FsbGluZyBPblNuYXBzaG90TWVyZ2VDb21wbGV0ZSwgZXZlbgorICAgIC8vIHRob3VnaCB0aGlzIG1lYW5zIHRoZSB3cml0ZSBpcyBwb3RlbnRpYWxseSB3YXN0ZWQgd29yayAoc2luY2UgaW4gdGhlCisgICAgLy8gaWRlYWwgY2FzZSB3ZSdsbCBpbW1lZGlhdGVseSBkZWxldGUgdGhlIGZpbGUpLgorICAgIC8vCisgICAgLy8gVGhpcyBtYWtlcyBpdCBzaW1wbGVyIHRvIHJlYXNvbiBhYm91dCB0aGUgbmV4dCByZWJvb3Q6IG5vIG1hdHRlciB3aGF0CisgICAgLy8gcGFydCBvZiBjbGVhbnVwIGZhaWxlZCwgZmlyc3Qtc3RhZ2UgaW5pdCB3b24ndCB0cnkgdG8gY3JlYXRlIGFub3RoZXIKKyAgICAvLyBzbmFwc2hvdCBkZXZpY2UgZm9yIHRoaXMgcGFydGl0aW9uLgorICAgIHNuYXBzaG90X3N0YXR1cy5zdGF0ZSA9ICJtZXJnZS1jb21wbGV0ZSI7CisgICAgaWYgKCFXcml0ZVNuYXBzaG90U3RhdHVzKGxvY2ssIG5hbWUsIHNuYXBzaG90X3N0YXR1cykpIHsKKyAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpNZXJnZUZhaWxlZDsKKyAgICB9CisgICAgaWYgKCFPblNuYXBzaG90TWVyZ2VDb21wbGV0ZShsb2NrLCBuYW1lLCBzbmFwc2hvdF9zdGF0dXMpKSB7CisgICAgICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6TWVyZ2VOZWVkc1JlYm9vdDsKKyAgICB9CisgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpNZXJnZUNvbXBsZXRlZDsKK30KKwordm9pZCBTbmFwc2hvdE1hbmFnZXI6OkFja25vd2xlZGdlTWVyZ2VTdWNjZXNzKExvY2tlZEZpbGUqIGxvY2spIHsKKyAgICBpZiAoIVdyaXRlVXBkYXRlU3RhdGUobG9jaywgVXBkYXRlU3RhdGU6Ok5vbmUpKSB7CisgICAgICAgIC8vIFdlJ2xsIHRyeSBhZ2FpbiBuZXh0IHJlYm9vdCwgYWQgaW5maW5pdHVtLgorICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2b2lkIFNuYXBzaG90TWFuYWdlcjo6QWNrbm93bGVkZ2VNZXJnZUZhaWx1cmUoKSB7CisgICAgLy8gTG9nIGZpcnN0LCBzbyB3b3JzdCBjYXNlLCB3ZSBhbHdheXMgaGF2ZSBhIHJlY29yZCBvZiB3aHkgdGhlIGNhbGxzIGJlbG93CisgICAgLy8gd2VyZSBiZWluZyBtYWRlLgorICAgIExPRyhFUlJPUikgPDwgIk1lcmdlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgYW5kIHdpbGwgYmUgbWFya2VkIGFzIGZhaWxlZC4iOworCisgICAgYXV0byBsb2NrID0gTG9ja0V4Y2x1c2l2ZSgpOworICAgIGlmICghbG9jaykgcmV0dXJuOworCisgICAgLy8gU2luY2Ugd2UgcmVsZWFzZWQgdGhlIGxvY2sgaW4gYmV0d2VlbiBXYWl0Rm9yTWVyZ2UgYW5kIGhlcmUsIGl0J3MKKyAgICAvLyBwb3NzaWJsZSAoMSkgdGhlIG1lcmdlIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgb3IgKDIpIHdhcyBhbHJlYWR5CisgICAgLy8gbWFya2VkIGFzIGEgZmFpbHVyZS4gU28gbWFrZSBzdXJlIHRvIGNoZWNrIHRoZSBzdGF0ZSBhZ2FpbiwgYW5kCisgICAgLy8gb25seSBtYXJrIGFzIGEgZmFpbHVyZSBpZiBhcHByb3ByaWF0ZS4KKyAgICBVcGRhdGVTdGF0ZSBzdGF0ZSA9IFJlYWRVcGRhdGVTdGF0ZShsb2NrLmdldCgpKTsKKyAgICBpZiAoc3RhdGUgIT0gVXBkYXRlU3RhdGU6Ok1lcmdpbmcgJiYgc3RhdGUgIT0gVXBkYXRlU3RhdGU6Ok1lcmdlTmVlZHNSZWJvb3QpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFdyaXRlVXBkYXRlU3RhdGUobG9jay5nZXQoKSwgVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkKTsKK30KKworYm9vbCBTbmFwc2hvdE1hbmFnZXI6Ok9uU25hcHNob3RNZXJnZUNvbXBsZXRlKExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMpIHsKKyAgICBhdXRvIGRtX25hbWUgPSBHZXRTbmFwc2hvdERldmljZU5hbWUobmFtZSwgc3RhdHVzKTsKKyAgICBpZiAoSXNTbmFwc2hvdERldmljZShkbV9uYW1lKSkgeworICAgICAgICAvLyBXZSBhcmUgZXh0cmEtY2F1dGlvdXMgaGVyZSwgdG8gYXZvaWQgZGVsZXRpbmcgdGhlIHdyb25nIHRhYmxlLgorICAgICAgICBzdGQ6OnN0cmluZyB0YXJnZXRfdHlwZTsKKyAgICAgICAgRG1UYXJnZXRTbmFwc2hvdDo6U3RhdHVzIGRtX3N0YXR1czsKKyAgICAgICAgaWYgKCFRdWVyeVNuYXBzaG90U3RhdHVzKGRtX25hbWUsICZ0YXJnZXRfdHlwZSwgJmRtX3N0YXR1cykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFyZ2V0X3R5cGUgIT0gInNuYXBzaG90LW1lcmdlIikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5leHBlY3RlZCB0YXJnZXQgdHlwZSAiIDw8IHRhcmdldF90eXBlCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIHNuYXBzaG90IGRldmljZTogIiA8PCBkbV9uYW1lOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChkbV9zdGF0dXMuc2VjdG9yc19hbGxvY2F0ZWQgIT0gZG1fc3RhdHVzLm1ldGFkYXRhX3NlY3RvcnMpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk1lcmdlIGlzIHVuZXhwZWN0ZWRseSBpbmNvbXBsZXRlIGZvciBkZXZpY2UgIiA8PCBkbV9uYW1lOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghQ29sbGFwc2VTbmFwc2hvdERldmljZShuYW1lLCBzdGF0dXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gY29sbGFwc2Ugc25hcHNob3Q6ICIgPDwgbmFtZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb3RlIHRoYXQgY29sbGFwc2luZyBpcyBpbXBsaWNpdGx5IGFuIFVubWFwLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisgICAgICAgIC8vIHVubWFwIHRoZSBzbmFwc2hvdC4KKyAgICB9CisKKyAgICBpZiAoIURlbGV0ZVNuYXBzaG90KGxvY2ssIG5hbWUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBkZWxldGUgc25hcHNob3Q6ICIgPDwgbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTbmFwc2hvdE1hbmFnZXI6OkNvbGxhcHNlU25hcHNob3REZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbmFwc2hvdFN0YXR1cyYgc3RhdHVzKSB7CisgICAgLy8gSWRlYWxseSwgd2Ugd291bGQgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBjb2xsYXBzZSB0aGUgZGV2aWNlOgorICAgIC8vICAoMSkgUmV3cml0ZSB0aGUgc25hcHNob3QgdGFibGUgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBiYXNlIGRldmljZSB0YWJsZS4KKyAgICAvLyAgKDIpIFJld3JpdGUgdGhlIHZlcml0eSB0YWJsZSB0byB1c2UgdGhlICJzbmFwc2hvdCIgKG5vdyBsaW5lYXIpIGRldmljZS4KKyAgICAvLyAgKDMpIERlbGV0ZSB0aGUgYmFzZSBkZXZpY2UuCisgICAgLy8KKyAgICAvLyBUaGlzIHNob3VsZCBiZSBwb3NzaWJsZSBvbmNlIGxpYnNuYXBzaG90IHVuZGVyc3RhbmRzIExwTWV0YWRhdGEuIEluIHRoZQorICAgIC8vIG1lYW50aW1lLCB3ZSBpbXBsZW1lbnQgYSBzaW1wbGVyIHNvbHV0aW9uOiByZXdyaXRpbmcgdGhlIHNuYXBzaG90IHRhYmxlCisgICAgLy8gdG8gYmUgYSBzaW5nbGUgZG0tbGluZWFyIHNlZ21lbnQgYWdhaW5zdCB0aGUgYmFzZSBkZXZpY2UuIFdoaWxlIG5vdCBhcworICAgIC8vIGlkZWFsLCBpdCBzdGlsbCBsZXRzIHVzIHJlbW92ZSB0aGUgQ09XIGRldmljZS4gV2UgY2FuIHJlbW92ZSB0aGlzCisgICAgLy8gaW1wbGVtZW50YXRpb24gb25jZSB0aGUgbmV3IG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQuCisgICAgYXV0byYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisgICAgYXV0byBkbV9uYW1lID0gR2V0U25hcHNob3REZXZpY2VOYW1lKG5hbWUsIHN0YXR1cyk7CisKKyAgICBEZXZpY2VNYXBwZXI6OlRhcmdldEluZm8gdGFyZ2V0OworICAgIGlmICghR2V0U2luZ2xlVGFyZ2V0KGRtX25hbWUsIFRhYmxlUXVlcnk6OlRhYmxlLCAmdGFyZ2V0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChEZXZpY2VNYXBwZXI6OkdldFRhcmdldFR5cGUodGFyZ2V0LnNwZWMpICE9ICJzbmFwc2hvdC1tZXJnZSIpIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZSwgaXQgd2FzIGNoZWNrZWQgYWJvdmUuCisgICAgICAgIExPRyhFUlJPUikgPDwgIlNuYXBzaG90IGRldmljZSBoYXMgaW52YWxpZCB0YXJnZXQgdHlwZTogIiA8PCBkbV9uYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgYmFzZV9kZXZpY2UsIGNvd19kZXZpY2U7CisgICAgaWYgKCFEbVRhcmdldFNuYXBzaG90OjpHZXREZXZpY2VzRnJvbVBhcmFtcyh0YXJnZXQuZGF0YSwgJmJhc2VfZGV2aWNlLCAmY293X2RldmljZSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHBhcnNlIHNuYXBzaG90IGRldmljZSAiIDw8IGRtX25hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiIHBhcmFtZXRlcnM6ICIgPDwgdGFyZ2V0LmRhdGE7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBudW1fc2VjdG9ycyA9IHN0YXR1cy5zbmFwc2hvdF9zaXplIC8ga1NlY3RvclNpemU7CisgICAgaWYgKG51bV9zZWN0b3JzICoga1NlY3RvclNpemUgIT0gc3RhdHVzLnNuYXBzaG90X3NpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiU25hcHNob3QgIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIiBzaXplIGlzIG5vdCBzZWN0b3IgYWxpZ25lZDogIiA8PCBzdGF0dXMuc25hcHNob3Rfc2l6ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChkbV9uYW1lICE9IG5hbWUpIHsKKyAgICAgICAgLy8gV2UndmUgZGVyaXZlZCB0aGUgYmFzZSBkZXZpY2UsIGJ1dCB3ZSBhY3R1YWxseSBuZWVkIHRvIHJlcGxhY2UgdGhlCisgICAgICAgIC8vIHRhYmxlIG9mIHRoZSBvdXRlcm1vc3QgZGV2aWNlLiBEbyBhIHF1aWNrIHZlcmlmaWNhdGlvbiB0aGF0IHRoaXMKKyAgICAgICAgLy8gZGV2aWNlIGxvb2tzIGxpa2Ugd2UgZXhwZWN0IGl0IHRvLgorICAgICAgICBzdGQ6OnZlY3RvcjxEZXZpY2VNYXBwZXI6OlRhcmdldEluZm8+IG91dGVyX3RhYmxlOworICAgICAgICBpZiAoIWRtLkdldFRhYmxlSW5mbyhuYW1lLCAmb3V0ZXJfdGFibGUpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgdmFsaWRhdGUgb3V0ZXIgc25hcHNob3QgdGFibGU6ICIgPDwgbmFtZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0ZXJfdGFibGUuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkV4cGVjdGVkIDIgZG0tbGluZWFyIHRhcmdldHMgZm9yIHRhYmJsZSAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZ290OiAiIDw8IG91dGVyX3RhYmxlLnNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRhcmdldCA6IG91dGVyX3RhYmxlKSB7CisgICAgICAgICAgICBhdXRvIHRhcmdldF90eXBlID0gRGV2aWNlTWFwcGVyOjpHZXRUYXJnZXRUeXBlKHRhcmdldC5zcGVjKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXRfdHlwZSAhPSAibGluZWFyIikgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk91dGVyIHNuYXBzaG90IHRhYmxlIG1heSBvbmx5IGNvbnRhaW4gbGluZWFyIHRhcmdldHMsIGJ1dCAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaGFzIHRhcmdldDogIiA8PCB0YXJnZXRfdHlwZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdWludDY0X3Qgc2VjdG9ycyA9IG91dGVyX3RhYmxlWzBdLnNwZWMubGVuZ3RoICsgb3V0ZXJfdGFibGVbMV0uc3BlYy5sZW5ndGg7CisgICAgICAgIGlmIChzZWN0b3JzICE9IG51bV9zZWN0b3JzKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJPdXRlciBzbmFwc2hvdCAiIDw8IG5hbWUgPDwgIiBzaG91bGQgaGF2ZSAiIDw8IG51bV9zZWN0b3JzCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGdvdDogIiA8PCBzZWN0b3JzOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90ZTogd2UgYXJlIHJlcGxhY2luZyB0aGUgT1VURVIgdGFibGUgaGVyZSwgc28gd2UgZG8gbm90IHVzZSBkbV9uYW1lLgorICAgIERtVGFyZ2V0TGluZWFyIG5ld190YXJnZXQoMCwgbnVtX3NlY3RvcnMsIGJhc2VfZGV2aWNlLCAwKTsKKyAgICBMT0coSU5GTykgPDwgIlJlcGxhY2luZyBzbmFwc2hvdCBkZXZpY2UgIiA8PCBuYW1lCisgICAgICAgICAgICAgIDw8ICIgdGFibGUgd2l0aDogIiA8PCBuZXdfdGFyZ2V0LkdldFBhcmFtZXRlclN0cmluZygpOworCisgICAgRG1UYWJsZSB0YWJsZTsKKyAgICB0YWJsZS5FbXBsYWNlPERtVGFyZ2V0TGluZWFyPihuZXdfdGFyZ2V0KTsKKyAgICBpZiAoIWRtLkxvYWRUYWJsZUFuZEFjdGl2YXRlKG5hbWUsIHRhYmxlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGRtX25hbWUgIT0gbmFtZSkgeworICAgICAgICAvLyBBdHRlbXB0IHRvIGRlbGV0ZSB0aGUgc25hcHNob3QgZGV2aWNlLiBOb3RoaW5nIHNob3VsZCBiZSBkZXBlbmRpbmcgb24KKyAgICAgICAgLy8gdGhlIGRldmljZSwgYW5kIGRldmljZS1tYXBwZXIgc2hvdWxkIGhhdmUgZmx1c2hlZCByZW1haW5pbmcgSS9PLiBXZQorICAgICAgICAvLyBjb3VsZCBpbiB0aGVvcnkgcmVwbGFjZSB3aXRoIGRtLXplcm8gKG9yIHJlLXVzZSB0aGUgdGFibGUgYWJvdmUpLCBidXQKKyAgICAgICAgLy8gZm9yIG5vdyBpdCdzIGJldHRlciB0byBrbm93IHdoeSB0aGlzIHdvdWxkIGZhaWwuCisgICAgICAgIGlmICghZG0uRGVsZXRlRGV2aWNlKGRtX25hbWUpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZGVsZXRlIHNuYXBzaG90IGRldmljZSAiIDw8IGRtX25hbWUgPDwgIiwgQ09XIGNhbm5vdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJyZWNsYWltZWQgdW50aWwgYWZ0ZXIgcmVib290LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU25hcHNob3RNYW5hZ2VyOjpSZW1vdmVBbGxTbmFwc2hvdHMoTG9ja2VkRmlsZSogbG9jaykgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzbmFwc2hvdHM7CisgICAgaWYgKCFMaXN0U25hcHNob3RzKGxvY2ssICZzbmFwc2hvdHMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBsaXN0IHNuYXBzaG90cyI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG9rID0gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBzbmFwc2hvdHMpIHsKKyAgICAgICAgb2sgJj0gRGVsZXRlU25hcHNob3QobG9jaywgbmFtZSk7CisgICAgfQorICAgIHJldHVybiBvazsKK30KKworVXBkYXRlU3RhdGUgU25hcHNob3RNYW5hZ2VyOjpHZXRVcGRhdGVTdGF0ZShkb3VibGUqIHByb2dyZXNzKSB7CisgICAgLy8gSWYgd2UndmUgbmV2ZXIgc3RhcnRlZCBhbiB1cGRhdGUsIHRoZSBzdGF0ZSBmaWxlIHdvbid0IGV4aXN0LgorICAgIGF1dG8gc3RhdGVfZmlsZSA9IEdldFN0YXRlRmlsZVBhdGgoKTsKKyAgICBpZiAoYWNjZXNzKHN0YXRlX2ZpbGUuY19zdHIoKSwgRl9PSykgIT0gMCAmJiBlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpOb25lOworICAgIH0KKworICAgIGF1dG8gZmlsZSA9IExvY2tTaGFyZWQoKTsKKyAgICBpZiAoIWZpbGUpIHsKKyAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpOb25lOworICAgIH0KKworICAgIGF1dG8gc3RhdGUgPSBSZWFkVXBkYXRlU3RhdGUoZmlsZS5nZXQoKSk7CisgICAgaWYgKHByb2dyZXNzKSB7CisgICAgICAgICpwcm9ncmVzcyA9IDAuMDsKKyAgICAgICAgaWYgKHN0YXRlID09IFVwZGF0ZVN0YXRlOjpNZXJnaW5nKSB7CisgICAgICAgICAgICAvLyA6VE9ETzogV2hlbiBtZXJnaW5nIGlzIGltcGxlbWVudGVkLCBzZXQgcHJvZ3Jlc3NfdmFsLgorICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFVwZGF0ZVN0YXRlOjpNZXJnZUNvbXBsZXRlZCkgeworICAgICAgICAgICAgKnByb2dyZXNzID0gMTAwLjA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXRlOworfQorCitib29sIFNuYXBzaG90TWFuYWdlcjo6TGlzdFNuYXBzaG90cyhMb2NrZWRGaWxlKiBsb2NrLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHNuYXBzaG90cykgeworICAgIENIRUNLKGxvY2spOworCisgICAgYXV0byBkaXJfcGF0aCA9IG1ldGFkYXRhX2Rpcl8gKyAiL3NuYXBzaG90cyJzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxESVIsIGRlY2x0eXBlKCZjbG9zZWRpcik+IGRpcihvcGVuZGlyKGRpcl9wYXRoLmNfc3RyKCkpLCBjbG9zZWRpcik7CisgICAgaWYgKCFkaXIpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIm9wZW5kaXIgZmFpbGVkOiAiIDw8IGRpcl9wYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RydWN0IGRpcmVudCogZHA7CisgICAgd2hpbGUgKChkcCA9IHJlYWRkaXIoZGlyLmdldCgpKSkgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoZHAtPmRfdHlwZSAhPSBEVF9SRUcpIGNvbnRpbnVlOworICAgICAgICBzbmFwc2hvdHMtPmVtcGxhY2VfYmFjayhkcC0+ZF9uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2F1dG8gU25hcHNob3RNYW5hZ2VyOjpPcGVuRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwgaW50IG9wZW5fZmxhZ3MsIGludCBsb2NrX2ZsYWdzKQorICAgICAgICAtPiBzdGQ6OnVuaXF1ZV9wdHI8TG9ja2VkRmlsZT4geworICAgIHVuaXF1ZV9mZCBmZChvcGVuKGZpbGUuY19zdHIoKSwgb3Blbl9mbGFncyB8IE9fQ0xPRVhFQyB8IE9fTk9GT0xMT1cgfCBPX1NZTkMsIDA2NjApKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJPcGVuIGZhaWxlZDogIiA8PCBmaWxlOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGZsb2NrKGZkLCBsb2NrX2ZsYWdzKSA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkFjcXVpcmUgZmxvY2sgZmFpbGVkOiAiIDw8IGZpbGU7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBGb3Igc2ltcGxpY2l0eSwgd2Ugd2FudCB0byBDSEVDSyB0aGF0IGxvY2tfbW9kZSA9PSBMT0NLX0VYLCBpbiBzb21lCisgICAgLy8gY2FsbHMsIHNvIHN0cmlwIGV4dHJhIGZsYWdzLgorICAgIGludCBsb2NrX21vZGUgPSBsb2NrX2ZsYWdzICYgKExPQ0tfRVggfCBMT0NLX1NIKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxMb2NrZWRGaWxlPihmaWxlLCBzdGQ6Om1vdmUoZmQpLCBsb2NrX21vZGUpOworfQorCitTbmFwc2hvdE1hbmFnZXI6OkxvY2tlZEZpbGU6On5Mb2NrZWRGaWxlKCkgeworICAgIGlmIChmbG9jayhmZF8sIExPQ0tfVU4pIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHVubG9jayBmaWxlOiAiIDw8IHBhdGhfOworICAgIH0KK30KKworc3RkOjpzdHJpbmcgU25hcHNob3RNYW5hZ2VyOjpHZXRTdGF0ZUZpbGVQYXRoKCkgY29uc3QgeworICAgIHJldHVybiBtZXRhZGF0YV9kaXJfICsgIi9zdGF0ZSJzOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3RNYW5hZ2VyOjpMb2NrZWRGaWxlPiBTbmFwc2hvdE1hbmFnZXI6Ok9wZW5TdGF0ZUZpbGUoaW50IG9wZW5fZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2tfZmxhZ3MpIHsKKyAgICBhdXRvIHN0YXRlX2ZpbGUgPSBHZXRTdGF0ZUZpbGVQYXRoKCk7CisgICAgcmV0dXJuIE9wZW5GaWxlKHN0YXRlX2ZpbGUsIG9wZW5fZmxhZ3MsIGxvY2tfZmxhZ3MpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3RNYW5hZ2VyOjpMb2NrZWRGaWxlPiBTbmFwc2hvdE1hbmFnZXI6OkxvY2tTaGFyZWQoKSB7CisgICAgcmV0dXJuIE9wZW5TdGF0ZUZpbGUoT19SRE9OTFksIExPQ0tfU0gpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3RNYW5hZ2VyOjpMb2NrZWRGaWxlPiBTbmFwc2hvdE1hbmFnZXI6OkxvY2tFeGNsdXNpdmUoKSB7CisgICAgcmV0dXJuIE9wZW5TdGF0ZUZpbGUoT19SRFdSIHwgT19DUkVBVCwgTE9DS19FWCk7Cit9CisKK1VwZGF0ZVN0YXRlIFNuYXBzaG90TWFuYWdlcjo6UmVhZFVwZGF0ZVN0YXRlKExvY2tlZEZpbGUqIGZpbGUpIHsKKyAgICAvLyBSZXNldCBwb3NpdGlvbiBzaW5jZSBzb21lIGNhbGxzIHJlYWQrd3JpdGUuCisgICAgaWYgKGxzZWVrKGZpbGUtPmZkKCksIDAsIFNFRUtfU0VUKSA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIHN0YXRlIGZpbGUgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpOb25lOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZkVG9TdHJpbmcoZmlsZS0+ZmQoKSwgJmNvbnRlbnRzKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiUmVhZCBzdGF0ZSBmaWxlIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6Tm9uZTsKKyAgICB9CisKKyAgICBpZiAoY29udGVudHMuZW1wdHkoKSB8fCBjb250ZW50cyA9PSAibm9uZSIpIHsKKyAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpOb25lOworICAgIH0gZWxzZSBpZiAoY29udGVudHMgPT0gImluaXRpYXRlZCIpIHsKKyAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpJbml0aWF0ZWQ7CisgICAgfSBlbHNlIGlmIChjb250ZW50cyA9PSAidW52ZXJpZmllZCIpIHsKKyAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpVbnZlcmlmaWVkOworICAgIH0gZWxzZSBpZiAoY29udGVudHMgPT0gIm1lcmdpbmciKSB7CisgICAgICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6TWVyZ2luZzsKKyAgICB9IGVsc2UgaWYgKGNvbnRlbnRzID09ICJtZXJnZS1jb21wbGV0ZWQiKSB7CisgICAgICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6TWVyZ2VDb21wbGV0ZWQ7CisgICAgfSBlbHNlIGlmIChjb250ZW50cyA9PSAibWVyZ2UtbmVlZHMtcmVib290IikgeworICAgICAgICByZXR1cm4gVXBkYXRlU3RhdGU6Ok1lcmdlTmVlZHNSZWJvb3Q7CisgICAgfSBlbHNlIGlmIChjb250ZW50cyA9PSAibWVyZ2UtZmFpbGVkIikgeworICAgICAgICByZXR1cm4gVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gbWVyZ2Ugc3RhdGUgaW4gdXBkYXRlIHN0YXRlIGZpbGUiOworICAgICAgICByZXR1cm4gVXBkYXRlU3RhdGU6Ok5vbmU7CisgICAgfQorfQorCitib29sIFNuYXBzaG90TWFuYWdlcjo6V3JpdGVVcGRhdGVTdGF0ZShMb2NrZWRGaWxlKiBmaWxlLCBVcGRhdGVTdGF0ZSBzdGF0ZSkgeworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6Tm9uZToKKyAgICAgICAgICAgIGNvbnRlbnRzID0gIm5vbmUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6OkluaXRpYXRlZDoKKyAgICAgICAgICAgIGNvbnRlbnRzID0gImluaXRpYXRlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6VW52ZXJpZmllZDoKKyAgICAgICAgICAgIGNvbnRlbnRzID0gInVudmVyaWZpZWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdpbmc6CisgICAgICAgICAgICBjb250ZW50cyA9ICJtZXJnaW5nIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVwZGF0ZVN0YXRlOjpNZXJnZUNvbXBsZXRlZDoKKyAgICAgICAgICAgIGNvbnRlbnRzID0gIm1lcmdlLWNvbXBsZXRlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6TWVyZ2VOZWVkc1JlYm9vdDoKKyAgICAgICAgICAgIGNvbnRlbnRzID0gIm1lcmdlLW5lZWRzLXJlYm9vdCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQ6CisgICAgICAgICAgICBjb250ZW50cyA9ICJtZXJnZS1mYWlsZWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIHVwZGF0ZSBzdGF0ZSI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFUcnVuY2F0ZShmaWxlKSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZkKGNvbnRlbnRzLCBmaWxlLT5mZCgpKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHdyaXRlIHRvIHN0YXRlIGZpbGUiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnN0cmluZyBTbmFwc2hvdE1hbmFnZXI6OkdldFNuYXBzaG90U3RhdHVzRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBhdXRvIGZpbGUgPSBtZXRhZGF0YV9kaXJfICsgIi9zbmFwc2hvdHMvInMgKyBuYW1lOworICAgIHJldHVybiBmaWxlOworfQorCitib29sIFNuYXBzaG90TWFuYWdlcjo6UmVhZFNuYXBzaG90U3RhdHVzKExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbmFwc2hvdFN0YXR1cyogc3RhdHVzKSB7CisgICAgQ0hFQ0sobG9jayk7CisgICAgYXV0byBwYXRoID0gR2V0U25hcHNob3RTdGF0dXNGaWxlUGF0aChuYW1lKTsKKworICAgIHVuaXF1ZV9mZCBmZChvcGVuKHBhdGguY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMgfCBPX05PRk9MTE9XKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiT3BlbiBmYWlsZWQ6ICIgPDwgcGF0aDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZkVG9TdHJpbmcoZmQsICZjb250ZW50cykpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgInJlYWQgZmFpbGVkOiAiIDw8IHBhdGg7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBwaWVjZXMgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChjb250ZW50cywgIiAiKTsKKyAgICBpZiAocGllY2VzLnNpemUoKSAhPSA1KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgc3RhdHVzIGxpbmUgZm9yIHNuYXBzaG90OiAiIDw8IHBhdGg7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0dXMtPnN0YXRlID0gcGllY2VzWzBdOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50KHBpZWNlc1sxXSwgJnN0YXR1cy0+ZGV2aWNlX3NpemUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgZGV2aWNlIHNpemUgaW4gc3RhdHVzIGxpbmUgZm9yOiAiIDw8IHBhdGg7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQocGllY2VzWzJdLCAmc3RhdHVzLT5zbmFwc2hvdF9zaXplKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHNuYXBzaG90IHNpemUgaW4gc3RhdHVzIGxpbmUgZm9yOiAiIDw8IHBhdGg7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQocGllY2VzWzNdLCAmc3RhdHVzLT5zZWN0b3JzX2FsbG9jYXRlZCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBzbmFwc2hvdCBzaXplIGluIHN0YXR1cyBsaW5lIGZvcjogIiA8PCBwYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50KHBpZWNlc1s0XSwgJnN0YXR1cy0+bWV0YWRhdGFfc2VjdG9ycykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBzbmFwc2hvdCBzaXplIGluIHN0YXR1cyBsaW5lIGZvcjogIiA8PCBwYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNuYXBzaG90TWFuYWdlcjo6V3JpdGVTbmFwc2hvdFN0YXR1cyhMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMpIHsKKyAgICAvLyBUaGUgY2FsbGVyIG11c3QgdGFrZSBhbiBleGNsdXNpdmUgbG9jayB0byBtb2RpZnkgc25hcHNob3RzLgorICAgIENIRUNLKGxvY2spOworICAgIENIRUNLKGxvY2stPmxvY2tfbW9kZSgpID09IExPQ0tfRVgpOworCisgICAgYXV0byBwYXRoID0gR2V0U25hcHNob3RTdGF0dXNGaWxlUGF0aChuYW1lKTsKKyAgICB1bmlxdWVfZmQgZmQob3BlbihwYXRoLmNfc3RyKCksIE9fUkRXUiB8IE9fQ0xPRVhFQyB8IE9fTk9GT0xMT1cgfCBPX0NSRUFUIHwgT19TWU5DLCAwNjYwKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiT3BlbiBmYWlsZWQ6ICIgPDwgcGF0aDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaWVjZXMgPSB7CisgICAgICAgICAgICBzdGF0dXMuc3RhdGUsCisgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhzdGF0dXMuZGV2aWNlX3NpemUpLAorICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoc3RhdHVzLnNuYXBzaG90X3NpemUpLAorICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoc3RhdHVzLnNlY3RvcnNfYWxsb2NhdGVkKSwKKyAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHN0YXR1cy5tZXRhZGF0YV9zZWN0b3JzKSwKKyAgICB9OworICAgIGF1dG8gY29udGVudHMgPSBhbmRyb2lkOjpiYXNlOjpKb2luKHBpZWNlcywgIiAiKTsKKworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZkKGNvbnRlbnRzLCBmZCkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIndyaXRlIGZhaWxlZDogIiA8PCBwYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNuYXBzaG90TWFuYWdlcjo6VHJ1bmNhdGUoTG9ja2VkRmlsZSogZmlsZSkgeworICAgIGlmIChsc2VlayhmaWxlLT5mZCgpLCAwLCBTRUVLX1NFVCkgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBmaWxlIGZhaWxlZDogIiA8PCBmaWxlLT5wYXRoKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGZ0cnVuY2F0ZShmaWxlLT5mZCgpLCAwKSA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgInRydW5jYXRlIGZhaWxlZDogIiA8PCBmaWxlLT5wYXRoKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6c3RyaW5nIFNuYXBzaG90TWFuYWdlcjo6R2V0U25hcHNob3REZXZpY2VOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzbmFwc2hvdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU25hcHNob3RTdGF0dXMmIHN0YXR1cykgeworICAgIGlmIChzdGF0dXMuZGV2aWNlX3NpemUgIT0gc3RhdHVzLnNuYXBzaG90X3NpemUpIHsKKyAgICAgICAgcmV0dXJuIHNuYXBzaG90X25hbWUgKyAiLWlubmVyIjsKKyAgICB9CisgICAgcmV0dXJuIHNuYXBzaG90X25hbWU7Cit9CisKK2Jvb2wgU25hcHNob3RNYW5hZ2VyOjpFbnN1cmVJbWFnZU1hbmFnZXIoKSB7CisgICAgaWYgKGltYWdlc18pIHJldHVybiB0cnVlOworCisgICAgLy8gRm9yIG5vdywgdXNlIGEgcHJlc2V0IHRpbWVvdXQuCisgICAgaW1hZ2VzXyA9IGFuZHJvaWQ6OmZpZW1hcDo6SUltYWdlTWFuYWdlcjo6T3Blbihnc2lkX2Rpcl8sIDE1MDAwbXMpOworICAgIGlmICghaW1hZ2VzXykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3Qgb3BlbiBJbWFnZU1hbmFnZXIiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOwogfQogCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF90ZXN0LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTAzMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzM5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPGxpYnNuYXBzaG90L3NuYXBzaG90Lmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGxpYmRtL2RtLmg+CisjaW5jbHVkZSA8bGliZmllbWFwL2ltYWdlX21hbmFnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwordXNpbmcgYW5kcm9pZDo6ZG06OkRldmljZU1hcHBlcjsKK3VzaW5nIGFuZHJvaWQ6OmRtOjpEbURldmljZVN0YXRlOwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6c3RyaW5nX2xpdGVyYWxzOworCitjbGFzcyBUZXN0RGV2aWNlSW5mbyA6IHB1YmxpYyBTbmFwc2hvdE1hbmFnZXI6OklEZXZpY2VJbmZvIHsKKyAgcHVibGljOgorICAgIHN0ZDo6c3RyaW5nIEdldEdzaWREaXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAib3RhL3Rlc3QiczsgfQorICAgIHN0ZDo6c3RyaW5nIEdldE1ldGFkYXRhRGlyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIi9tZXRhZGF0YS9vdGEvdGVzdCJzOyB9CisgICAgYm9vbCBJc1J1bm5pbmdTbmFwc2hvdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGlzX3J1bm5pbmdfc25hcHNob3RfOyB9CisKKyAgICB2b2lkIHNldF9pc19ydW5uaW5nX3NuYXBzaG90KGJvb2wgdmFsdWUpIHsgaXNfcnVubmluZ19zbmFwc2hvdF8gPSB2YWx1ZTsgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBpc19ydW5uaW5nX3NuYXBzaG90XzsKK307CisKK3N0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdE1hbmFnZXI+IHNtOworVGVzdERldmljZUluZm8qIHRlc3RfZGV2aWNlID0gbnVsbHB0cjsKKworY2xhc3MgU25hcHNob3RUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHB1YmxpYzoKKyAgICBTbmFwc2hvdFRlc3QoKSA6IGRtXyhEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCkpIHt9CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHRlc3RfZGV2aWNlLT5zZXRfaXNfcnVubmluZ19zbmFwc2hvdChmYWxzZSk7CisKKyAgICAgICAgaWYgKHNtLT5HZXRVcGRhdGVTdGF0ZSgpICE9IFVwZGF0ZVN0YXRlOjpOb25lKSB7CisgICAgICAgICAgICBDbGVhbnVwVGVzdEFydGlmYWN0cygpOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9UUlVFKHNtLT5CZWdpblVwZGF0ZSgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoc20tPkVuc3VyZUltYWdlTWFuYWdlcigpKTsKKworICAgICAgICBpbWFnZV9tYW5hZ2VyXyA9IHNtLT5pbWFnZV9tYW5hZ2VyKCk7CisgICAgICAgIEFTU0VSVF9ORShpbWFnZV9tYW5hZ2VyXywgbnVsbHB0cik7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgbG9ja18gPSBudWxscHRyOworCisgICAgICAgIENsZWFudXBUZXN0QXJ0aWZhY3RzKCk7CisgICAgfQorCisgICAgdm9pZCBDbGVhbnVwVGVzdEFydGlmYWN0cygpIHsKKyAgICAgICAgLy8gTm9ybWFsbHkgY2FuY2VsbGluZyBpbnNpZGUgYSBtZXJnZSBpcyBub3QgYWxsb3dlZC4gU2luY2UgdGhlc2UKKyAgICAgICAgLy8gYXJlIHRlc3RzLCB3ZSBkb24ndCBjYXJlLCBkZXN0cm95IGV2ZXJ5dGhpbmcgdGhhdCBtaWdodCBleGlzdC4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNuYXBzaG90cyA9IHsidGVzdC1zbmFwc2hvdCJ9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNuYXBzaG90IDogc25hcHNob3RzKSB7CisgICAgICAgICAgICBEZWxldGVTbmFwc2hvdERldmljZShzbmFwc2hvdCk7CisgICAgICAgICAgICB0ZW1wX2ltYWdlc18uZW1wbGFjZV9iYWNrKHNuYXBzaG90ICsgIi1jb3ciKTsKKworICAgICAgICAgICAgYXV0byBzdGF0dXNfZmlsZSA9IHNtLT5HZXRTbmFwc2hvdFN0YXR1c0ZpbGVQYXRoKHNuYXBzaG90KTsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlJlbW92ZUZpbGVJZkV4aXN0cyhzdGF0dXNfZmlsZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgYWxsIGltYWdlcy4KKyAgICAgICAgdGVtcF9pbWFnZXNfLmVtcGxhY2VfYmFjaygidGVzdC1zbmFwc2hvdC1jb3ciKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0ZW1wX2ltYWdlIDogdGVtcF9pbWFnZXNfKSB7CisgICAgICAgICAgICBpbWFnZV9tYW5hZ2VyXy0+VW5tYXBJbWFnZURldmljZSh0ZW1wX2ltYWdlKTsKKyAgICAgICAgICAgIGltYWdlX21hbmFnZXJfLT5EZWxldGVCYWNraW5nSW1hZ2UodGVtcF9pbWFnZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc20tPkdldFVwZGF0ZVN0YXRlKCkgIT0gVXBkYXRlU3RhdGU6Ok5vbmUpIHsKKyAgICAgICAgICAgIGF1dG8gc3RhdGVfZmlsZSA9IHNtLT5HZXRTdGF0ZUZpbGVQYXRoKCk7CisgICAgICAgICAgICB1bmxpbmsoc3RhdGVfZmlsZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgQWNxdWlyZUxvY2soKSB7CisgICAgICAgIGxvY2tfID0gc20tPk9wZW5TdGF0ZUZpbGUoT19SRFdSLCBMT0NLX0VYKTsKKyAgICAgICAgcmV0dXJuICEhbG9ja187CisgICAgfQorCisgICAgYm9vbCBDcmVhdGVUZW1wRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1aW50NjRfdCBzaXplLCBzdGQ6OnN0cmluZyogcGF0aCkgeworICAgICAgICBpZiAoIWltYWdlX21hbmFnZXJfLT5DcmVhdGVCYWNraW5nSW1hZ2UobmFtZSwgc2l6ZSwgZmFsc2UpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGVtcF9pbWFnZXNfLmVtcGxhY2VfYmFjayhuYW1lKTsKKyAgICAgICAgcmV0dXJuIGltYWdlX21hbmFnZXJfLT5NYXBJbWFnZURldmljZShuYW1lLCAxMHMsIHBhdGgpOworICAgIH0KKworICAgIGJvb2wgRGVsZXRlU25hcHNob3REZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNuYXBzaG90KSB7CisgICAgICAgIGlmIChkbV8uR2V0U3RhdGUoc25hcHNob3QpICE9IERtRGV2aWNlU3RhdGU6OklOVkFMSUQpIHsKKyAgICAgICAgICAgIGlmICghZG1fLkRlbGV0ZURldmljZShzbmFwc2hvdCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG1fLkdldFN0YXRlKHNuYXBzaG90ICsgIi1pbm5lciIpICE9IERtRGV2aWNlU3RhdGU6OklOVkFMSUQpIHsKKyAgICAgICAgICAgIGlmICghZG1fLkRlbGV0ZURldmljZShzbmFwc2hvdCArICItaW5uZXIiKSkgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIERldmljZU1hcHBlciYgZG1fOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdE1hbmFnZXI6OkxvY2tlZEZpbGU+IGxvY2tfOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZW1wX2ltYWdlc187CisgICAgYW5kcm9pZDo6ZmllbWFwOjpJSW1hZ2VNYW5hZ2VyKiBpbWFnZV9tYW5hZ2VyXyA9IG51bGxwdHI7Cit9OworCitURVNUX0YoU25hcHNob3RUZXN0LCBDcmVhdGVTbmFwc2hvdCkgeworICAgIEFTU0VSVF9UUlVFKEFjcXVpcmVMb2NrKCkpOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtEZXZpY2VTaXplID0gMTAyNCAqIDEwMjQ7CisgICAgQVNTRVJUX1RSVUUoc20tPkNyZWF0ZVNuYXBzaG90KGxvY2tfLmdldCgpLCAidGVzdC1zbmFwc2hvdCIsIGtEZXZpY2VTaXplLCBrRGV2aWNlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RldmljZVNpemUpKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzbmFwc2hvdHM7CisgICAgQVNTRVJUX1RSVUUoc20tPkxpc3RTbmFwc2hvdHMobG9ja18uZ2V0KCksICZzbmFwc2hvdHMpKTsKKyAgICBBU1NFUlRfRVEoc25hcHNob3RzLnNpemUoKSwgMSk7CisgICAgQVNTRVJUX0VRKHNuYXBzaG90c1swXSwgInRlc3Qtc25hcHNob3QiKTsKKworICAgIC8vIFNjb3BlIHNvIGRlbGV0ZSBjYW4gcmUtYWNxdWlyZSB0aGUgc25hcHNob3QgZmlsZSBsb2NrLgorICAgIHsKKyAgICAgICAgU25hcHNob3RNYW5hZ2VyOjpTbmFwc2hvdFN0YXR1cyBzdGF0dXM7CisgICAgICAgIEFTU0VSVF9UUlVFKHNtLT5SZWFkU25hcHNob3RTdGF0dXMobG9ja18uZ2V0KCksICJ0ZXN0LXNuYXBzaG90IiwgJnN0YXR1cykpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLnN0YXRlLCAiY3JlYXRlZCIpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLmRldmljZV9zaXplLCBrRGV2aWNlU2l6ZSk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMuc25hcHNob3Rfc2l6ZSwga0RldmljZVNpemUpOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKHNtLT5Vbm1hcFNuYXBzaG90KGxvY2tfLmdldCgpLCAidGVzdC1zbmFwc2hvdCIpKTsKKyAgICBBU1NFUlRfVFJVRShzbS0+RGVsZXRlU25hcHNob3QobG9ja18uZ2V0KCksICJ0ZXN0LXNuYXBzaG90IikpOworfQorCitURVNUX0YoU25hcHNob3RUZXN0LCBNYXBTbmFwc2hvdCkgeworICAgIEFTU0VSVF9UUlVFKEFjcXVpcmVMb2NrKCkpOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtEZXZpY2VTaXplID0gMTAyNCAqIDEwMjQ7CisgICAgQVNTRVJUX1RSVUUoc20tPkNyZWF0ZVNuYXBzaG90KGxvY2tfLmdldCgpLCAidGVzdC1zbmFwc2hvdCIsIGtEZXZpY2VTaXplLCBrRGV2aWNlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RldmljZVNpemUpKTsKKworICAgIHN0ZDo6c3RyaW5nIGJhc2VfZGV2aWNlOworICAgIEFTU0VSVF9UUlVFKENyZWF0ZVRlbXBEZXZpY2UoImJhc2UtZGV2aWNlIiwga0RldmljZVNpemUsICZiYXNlX2RldmljZSkpOworCisgICAgc3RkOjpzdHJpbmcgc25hcF9kZXZpY2U7CisgICAgQVNTRVJUX1RSVUUoc20tPk1hcFNuYXBzaG90KGxvY2tfLmdldCgpLCAidGVzdC1zbmFwc2hvdCIsIGJhc2VfZGV2aWNlLCAxMHMsICZzbmFwX2RldmljZSkpOworICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoc25hcF9kZXZpY2UsICIvZGV2L2Jsb2NrL2RtLSIpKTsKK30KKworVEVTVF9GKFNuYXBzaG90VGVzdCwgTWFwUGFydGlhbFNuYXBzaG90KSB7CisgICAgQVNTRVJUX1RSVUUoQWNxdWlyZUxvY2soKSk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1NuYXBzaG90U2l6ZSA9IDEwMjQgKiAxMDI0OworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrRGV2aWNlU2l6ZSA9IDEwMjQgKiAxMDI0ICogMjsKKyAgICBBU1NFUlRfVFJVRShzbS0+Q3JlYXRlU25hcHNob3QobG9ja18uZ2V0KCksICJ0ZXN0LXNuYXBzaG90Iiwga0RldmljZVNpemUsIGtTbmFwc2hvdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTbmFwc2hvdFNpemUpKTsKKworICAgIHN0ZDo6c3RyaW5nIGJhc2VfZGV2aWNlOworICAgIEFTU0VSVF9UUlVFKENyZWF0ZVRlbXBEZXZpY2UoImJhc2UtZGV2aWNlIiwga0RldmljZVNpemUsICZiYXNlX2RldmljZSkpOworCisgICAgc3RkOjpzdHJpbmcgc25hcF9kZXZpY2U7CisgICAgQVNTRVJUX1RSVUUoc20tPk1hcFNuYXBzaG90KGxvY2tfLmdldCgpLCAidGVzdC1zbmFwc2hvdCIsIGJhc2VfZGV2aWNlLCAxMHMsICZzbmFwX2RldmljZSkpOworICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoc25hcF9kZXZpY2UsICIvZGV2L2Jsb2NrL2RtLSIpKTsKK30KKworVEVTVF9GKFNuYXBzaG90VGVzdCwgTm9NZXJnZUJlZm9yZVJlYm9vdCkgeworICAgIEFTU0VSVF9UUlVFKEFjcXVpcmVMb2NrKCkpOworCisgICAgLy8gU2V0IHRoZSBzdGF0ZSB0byBVbnZlcmlmaWVkLCBhcyBpZiB3ZSBmaW5pc2hlZCBhbiB1cGRhdGUuCisgICAgQVNTRVJUX1RSVUUoc20tPldyaXRlVXBkYXRlU3RhdGUobG9ja18uZ2V0KCksIFVwZGF0ZVN0YXRlOjpVbnZlcmlmaWVkKSk7CisKKyAgICAvLyBSZWxlYXNlIHRoZSBsb2NrLgorICAgIGxvY2tfID0gbnVsbHB0cjsKKworICAgIC8vIE1lcmdlIHNob3VsZCBmYWlsLCBzaW5jZSB3ZSBkaWRuJ3QgbWFyayB0aGUgZGV2aWNlIGFzIHJlYm9vdGVkLgorICAgIEFTU0VSVF9GQUxTRShzbS0+SW5pdGlhdGVNZXJnZSgpKTsKK30KKworVEVTVF9GKFNuYXBzaG90VGVzdCwgTWVyZ2UpIHsKKyAgICBBU1NFUlRfVFJVRShBY3F1aXJlTG9jaygpKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrRGV2aWNlU2l6ZSA9IDEwMjQgKiAxMDI0OworICAgIEFTU0VSVF9UUlVFKHNtLT5DcmVhdGVTbmFwc2hvdChsb2NrXy5nZXQoKSwgInRlc3Qtc25hcHNob3QiLCBrRGV2aWNlU2l6ZSwga0RldmljZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZXZpY2VTaXplKSk7CisKKyAgICBzdGQ6OnN0cmluZyBiYXNlX2RldmljZSwgc25hcF9kZXZpY2U7CisgICAgQVNTRVJUX1RSVUUoQ3JlYXRlVGVtcERldmljZSgiYmFzZS1kZXZpY2UiLCBrRGV2aWNlU2l6ZSwgJmJhc2VfZGV2aWNlKSk7CisgICAgQVNTRVJUX1RSVUUoc20tPk1hcFNuYXBzaG90KGxvY2tfLmdldCgpLCAidGVzdC1zbmFwc2hvdCIsIGJhc2VfZGV2aWNlLCAxMHMsICZzbmFwX2RldmljZSkpOworCisgICAgc3RkOjpzdHJpbmcgdGVzdF9zdHJpbmcgPSAiVGhpcyBpcyBhIHRlc3Qgc3RyaW5nLiI7CisgICAgeworICAgICAgICB1bmlxdWVfZmQgZmQob3BlbihzbmFwX2RldmljZS5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMgfCBPX1NZTkMpKTsKKyAgICAgICAgQVNTRVJUX0dFKGZkLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShmZCwgdGVzdF9zdHJpbmcuZGF0YSgpLCB0ZXN0X3N0cmluZy5zaXplKCkpKTsKKyAgICB9CisKKyAgICAvLyBOb3RlOiB3ZSBrbm93IHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgaXMgdGVzdC1zbmFwc2hvdCBiZWNhdXNlIHdlIGRpZG4ndAorICAgIC8vIHJlcXVlc3QgYSBsaW5lYXIgc2VnbWVudC4KKyAgICBEZXZpY2VNYXBwZXI6OlRhcmdldEluZm8gdGFyZ2V0OworICAgIEFTU0VSVF9UUlVFKHNtLT5Jc1NuYXBzaG90RGV2aWNlKCJ0ZXN0LXNuYXBzaG90IiwgJnRhcmdldCkpOworICAgIEFTU0VSVF9FUShEZXZpY2VNYXBwZXI6OkdldFRhcmdldFR5cGUodGFyZ2V0LnNwZWMpLCAic25hcHNob3QiKTsKKworICAgIC8vIFNldCB0aGUgc3RhdGUgdG8gVW52ZXJpZmllZCwgYXMgaWYgd2UgZmluaXNoZWQgYW4gdXBkYXRlLgorICAgIEFTU0VSVF9UUlVFKHNtLT5Xcml0ZVVwZGF0ZVN0YXRlKGxvY2tfLmdldCgpLCBVcGRhdGVTdGF0ZTo6VW52ZXJpZmllZCkpOworCisgICAgLy8gUmVsZWFzZSB0aGUgbG9jay4KKyAgICBsb2NrXyA9IG51bGxwdHI7CisKKyAgICB0ZXN0X2RldmljZS0+c2V0X2lzX3J1bm5pbmdfc25hcHNob3QodHJ1ZSk7CisgICAgQVNTRVJUX1RSVUUoc20tPkluaXRpYXRlTWVyZ2UoKSk7CisKKyAgICAvLyBUaGUgZGV2aWNlIHNob3VsZCBoYXZlIGJlZW4gc3dpdGNoZWQgdG8gYSBzbmFwc2hvdC1tZXJnZSB0YXJnZXQuCisgICAgQVNTRVJUX1RSVUUoc20tPklzU25hcHNob3REZXZpY2UoInRlc3Qtc25hcHNob3QiLCAmdGFyZ2V0KSk7CisgICAgQVNTRVJUX0VRKERldmljZU1hcHBlcjo6R2V0VGFyZ2V0VHlwZSh0YXJnZXQuc3BlYyksICJzbmFwc2hvdC1tZXJnZSIpOworCisgICAgLy8gV2Ugc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGNhbmNlbCBhbiB1cGRhdGUgbm93LgorICAgIEFTU0VSVF9GQUxTRShzbS0+Q2FuY2VsVXBkYXRlKCkpOworCisgICAgQVNTRVJUX0VRKHNtLT5XYWl0Rm9yTWVyZ2UoKSwgVXBkYXRlU3RhdGU6Ok1lcmdlQ29tcGxldGVkKTsKKyAgICBBU1NFUlRfRVEoc20tPkdldFVwZGF0ZVN0YXRlKCksIFVwZGF0ZVN0YXRlOjpOb25lKTsKKworICAgIC8vIFRoZSBkZXZpY2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBhIHNuYXBzaG90IG9yIHNuYXBzaG90LW1lcmdlLgorICAgIEFTU0VSVF9GQUxTRShzbS0+SXNTbmFwc2hvdERldmljZSgidGVzdC1zbmFwc2hvdCIpKTsKKworICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gcmVhZCBiYWNrIHRoZSBzdHJpbmcgd2Ugd3JvdGUgdG8gdGhlIHNuYXBzaG90LgorICAgIHVuaXF1ZV9mZCBmZChvcGVuKGJhc2VfZGV2aWNlLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgQVNTRVJUX0dFKGZkLCAwKTsKKworICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcih0ZXN0X3N0cmluZy5zaXplKCksICdcMCcpOworICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseShmZCwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSkpOworICAgIEFTU0VSVF9FUSh0ZXN0X3N0cmluZywgYnVmZmVyKTsKK30KKworVEVTVF9GKFNuYXBzaG90VGVzdCwgTWVyZ2VDYW5ub3RSZW1vdmVDb3cpIHsKKyAgICBBU1NFUlRfVFJVRShBY3F1aXJlTG9jaygpKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrRGV2aWNlU2l6ZSA9IDEwMjQgKiAxMDI0OworICAgIEFTU0VSVF9UUlVFKHNtLT5DcmVhdGVTbmFwc2hvdChsb2NrXy5nZXQoKSwgInRlc3Qtc25hcHNob3QiLCBrRGV2aWNlU2l6ZSwga0RldmljZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZXZpY2VTaXplKSk7CisKKyAgICBzdGQ6OnN0cmluZyBiYXNlX2RldmljZSwgc25hcF9kZXZpY2U7CisgICAgQVNTRVJUX1RSVUUoQ3JlYXRlVGVtcERldmljZSgiYmFzZS1kZXZpY2UiLCBrRGV2aWNlU2l6ZSwgJmJhc2VfZGV2aWNlKSk7CisgICAgQVNTRVJUX1RSVUUoc20tPk1hcFNuYXBzaG90KGxvY2tfLmdldCgpLCAidGVzdC1zbmFwc2hvdCIsIGJhc2VfZGV2aWNlLCAxMHMsICZzbmFwX2RldmljZSkpOworCisgICAgLy8gS2VlcCBhbiBvcGVuIGhhbmRsZSB0byB0aGUgY293IGRldmljZS4gVGhpcyBzaG91bGQgY2F1c2UgdGhlIG1lcmdlIHRvCisgICAgLy8gYmUgaW5jb21wbGV0ZS4KKyAgICBhdXRvIGNvd19wYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoImdzaWQubWFwcGVkX2ltYWdlLnRlc3Qtc25hcHNob3QtY293IiwgIiIpOworICAgIHVuaXF1ZV9mZCBmZChvcGVuKGNvd19wYXRoLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgQVNTRVJUX0dFKGZkLCAwKTsKKworICAgIC8vIFNldCB0aGUgc3RhdGUgdG8gVW52ZXJpZmllZCwgYXMgaWYgd2UgZmluaXNoZWQgYW4gdXBkYXRlLgorICAgIEFTU0VSVF9UUlVFKHNtLT5Xcml0ZVVwZGF0ZVN0YXRlKGxvY2tfLmdldCgpLCBVcGRhdGVTdGF0ZTo6VW52ZXJpZmllZCkpOworCisgICAgLy8gUmVsZWFzZSB0aGUgbG9jay4KKyAgICBsb2NrXyA9IG51bGxwdHI7CisKKyAgICB0ZXN0X2RldmljZS0+c2V0X2lzX3J1bm5pbmdfc25hcHNob3QodHJ1ZSk7CisgICAgQVNTRVJUX1RSVUUoc20tPkluaXRpYXRlTWVyZ2UoKSk7CisKKyAgICAvLyBDT1cgY2Fubm90IGJlIHJlbW92ZWQgZHVlIHRvIG9wZW4gZmQsIHNvIGV4cGVjdCBhIHNvZnQgZmFpbHVyZS4KKyAgICBBU1NFUlRfRVEoc20tPldhaXRGb3JNZXJnZSgpLCBVcGRhdGVTdGF0ZTo6TWVyZ2VOZWVkc1JlYm9vdCk7CisKKyAgICAvLyBGb3JjZWZ1bGx5IGRlbGV0ZSB0aGUgc25hcHNob3QgZGV2aWNlLCBzbyBpdCBsb29rcyBsaWtlIHdlIGp1c3QgcmVib290ZWQuCisgICAgQVNTRVJUX1RSVUUoRGVsZXRlU25hcHNob3REZXZpY2UoInRlc3Qtc25hcHNob3QiKSk7CisKKyAgICAvLyBNYXAgc25hcHNob3Qgc2hvdWxkIGZhaWwgbm93LCBiZWNhdXNlIHdlJ3JlIGluIGEgbWVyZ2UtY29tcGxldGUgc3RhdGUuCisgICAgQVNTRVJUX1RSVUUoQWNxdWlyZUxvY2soKSk7CisgICAgQVNTRVJUX0ZBTFNFKHNtLT5NYXBTbmFwc2hvdChsb2NrXy5nZXQoKSwgInRlc3Qtc25hcHNob3QiLCBiYXNlX2RldmljZSwgMTBzLCAmc25hcF9kZXZpY2UpKTsKKworICAgIC8vIFJlbGVhc2UgZXZlcnl0aGluZyBhbmQgbm93IHRoZSBtZXJnZSBzaG91bGQgY29tcGxldGUuCisgICAgZmQgPSB7fTsKKyAgICBsb2NrXyA9IG51bGxwdHI7CisKKyAgICBBU1NFUlRfRVEoc20tPldhaXRGb3JNZXJnZSgpLCBVcGRhdGVTdGF0ZTo6TWVyZ2VDb21wbGV0ZWQpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzbmFwc2hvdDsKKworYm9vbCBNa2Rpcihjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgIGlmIChta2RpcihwYXRoLmNfc3RyKCksIDA3MDApICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkNvdWxkIG5vdCBta2RpciAiIDw8IHBhdGggPDwgIjogIiA8PCBzdHJlcnJvcihlcnJubykgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRocyA9IHsKKyAgICAgICAgICAgICIvZGF0YS9nc2kvb3RhL3Rlc3QiLAorICAgICAgICAgICAgIi9tZXRhZGF0YS9nc2kvb3RhL3Rlc3QiLAorICAgICAgICAgICAgIi9tZXRhZGF0YS9vdGEvdGVzdCIsCisgICAgICAgICAgICAiL21ldGFkYXRhL290YS90ZXN0L3NuYXBzaG90cyIsCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGggOiBwYXRocykgeworICAgICAgICBpZiAoIU1rZGlyKHBhdGgpKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSB0aGlzIG9uY2UsIG90aGVyd2lzZSwgZ3NpZCB3aWxsIHN0YXJ0L3N0b3AgYmV0d2VlbiBlYWNoIHRlc3QuCisgICAgdGVzdF9kZXZpY2UgPSBuZXcgVGVzdERldmljZUluZm8oKTsKKyAgICBzbSA9IFNuYXBzaG90TWFuYWdlcjo6TmV3KHRlc3RfZGV2aWNlKTsKKyAgICBpZiAoIXNtKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IGNyZWF0ZSBzbmFwc2hvdCBtYW5hZ2VyIjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL2ZzX21nci90ZXN0cy9hZGItcmVtb3VudC10ZXN0LnNoIGIvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKaW5kZXggYzJhMGYzMy4uMzk3ZDhlNSAxMDA3NTUKLS0tIGEvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKKysrIGIvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKQEAgLTE1LDEwICsxNSwxMyBAQAogCiBhZGIgcmVtb3VudCB0ZXN0cwogCi0tLWhlbHAgICAgICAgIFRoaXMgaGVscAotLS1zZXJpYWwgICAgICBTcGVjaWZ5IGRldmljZSAobXVzdCBpZiBtdWx0aXBsZSBhcmUgcHJlc2VudCkKLS0tY29sb3IgICAgICAgRHJlc3Mgb3V0cHV0IHdpdGggaGlnaGxpZ2h0aW5nIGNvbG9ycwotLS1wcmludC10aW1lICBSZXBvcnQgdGhlIHRlc3QgZHVyYXRpb24KKy0tY29sb3IgICAgICAgICAgICAgICAgICAgICBEcmVzcyBvdXRwdXQgd2l0aCBoaWdobGlnaHRpbmcgY29sb3JzCistLWhlbHAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBoZWxwCistLW5vLXdhaXQtc2NyZWVuICAgICAgICAgICAgRG8gbm90IHdhaXQgZm9yIGRpc3BsYXkgc2NyZWVuIHRvIHNldHRsZQorLS1wcmludC10aW1lICAgICAgICAgICAgICAgIFJlcG9ydCB0aGUgdGVzdCBkdXJhdGlvbgorLS1zZXJpYWwgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgZGV2aWNlIChtdXN0IGlmIG11bHRpcGxlIGFyZSBwcmVzZW50KQorLS13YWl0LWFkYiA8ZHVyYXRpb24+ICAgICAgIGFkYiB3YWl0IHRpbWVvdXQKKy0td2FpdC1mYXN0Ym9vdCA8ZHVyYXRpb24+ICBmYXN0Ym9vdCB3YWl0IHRpbWVvdXQKIAogQ29uZGl0aW9uczoKICAtIE11c3QgYmUgYSB1c2VyZGVidWcgYnVpbGQuCkBAIC01Myw2ICs1Niw3IEBACiAKIEFEQl9XQUlUPTRtCiBGQVNUQk9PVF9XQUlUPTJtCitzY3JlZW5fd2FpdD10cnVlCiAKICMjCiAjIyAgSGVscGVyIEZ1bmN0aW9ucwpAQCAtMTg1LDcgKzE4OSw3IEBACiBbICJVU0FHRTogYWRiX2NhdCA8ZmlsZT4gPnN0ZG91dAogCiBSZXR1cm5zOiBjb250ZW50IG9mIGZpbGUgdG8gc3Rkb3V0IHdpdGggY2FycmlhZ2UgcmV0dXJucyBza2lwcGVkLAotICAgICAgICAgdHJ1ZSBvZiB0aGUgZmlsZSBleGlzdHMiIF0KKyAgICAgICAgIHRydWUgaWYgdGhlIGZpbGUgZXhpc3RzIiBdCiBhZGJfY2F0KCkgewogICAgIGxvY2FsIE9VVFBVVD0iYGFkYl9zaCBjYXQgJHsxfSA8L2Rldi9udWxsIDI+JjFgIgogICAgIGxvY2FsIHJldD0kez99CkBAIC0xOTMsNiArMTk3LDE3IEBACiAgICAgcmV0dXJuICR7cmV0fQogfQogCitbICJVU0FHRTogYWRiX2xzIDxkaXJmaWxlPiA+c3Rkb3V0CisKK1JldHVybnM6IGZpbGVuYW1lIG9yIGRpcmVjdG9ydSBjb250ZW50IHRvIHN0ZG91dCB3aXRoIGNhcnJpYWdlIHJldHVybnMgc2tpcHBlZCwKKyAgICAgICAgIHRydWUgaWYgdGhlIGxzIGhhZCBubyBlcnJvcnMiIF0KK2FkYl9scygpIHsKKyAgICBsb2NhbCBPVVRQVVQ9ImBhZGJfc2ggbHMgJHsxfSA8L2Rldi9udWxsIDI+L2Rldi9udWxsYCIKKyAgICBsb2NhbCByZXQ9JHs/fQorICAgIGVjaG8gIiR7T1VUUFVUfSIgfCB0ciAtZCAnXHInCisgICAgcmV0dXJuICR7cmV0fQorfQorCiBbICJVU0FHRTogYWRiX3JlYm9vdAogCiBSZXR1cm5zOiB0cnVlIGlmIHRoZSByZWJvb3QgY29tbWFuZCBzdWNjZWVkZWQiIF0KQEAgLTQzNiw2ICs0NTEsMTAgQEAKIC1uIC0gZWNobyBuZXdsaW5lIGF0IGV4aXQKIFRJTUVPVVQgLSBkZWZhdWx0IGBmb3JtYXRfZHVyYXRpb24gJHt3YWl0X2Zvcl9zY3JlZW5fdGltZW91dH1gIiBdCiB3YWl0X2Zvcl9zY3JlZW4oKSB7CisgIGlmICEgJHtzY3JlZW5fd2FpdH07IHRoZW4KKyAgICBhZGJfd2FpdAorICAgIHJldHVybgorICBmaQogICBleGl0X2Z1bmN0aW9uPXRydWUKICAgaWYgWyBYIi1uIiA9IFgiJHsxfSIgXTsgdGhlbgogICAgIGV4aXRfZnVuY3Rpb249ZWNobwpAQCAtNzQzLDYgKzc2Miw5IEBACiAKIE9QVElPTlM9YGdldG9wdCAtLWFsdGVybmF0aXZlIC0tdW5xdW90ZWQgXAogICAgICAgICAgICAgICAgIC0tbG9uZ29wdGlvbnMgaGVscCxzZXJpYWw6LGNvbG91cixjb2xvcixuby1jb2xvdXIsbm8tY29sb3IgXAorICAgICAgICAgICAgICAgIC0tbG9uZ29wdGlvbnMgd2FpdC1hZGI6LHdhaXQtZmFzdGJvb3Q6IFwKKyAgICAgICAgICAgICAgICAtLWxvbmdvcHRpb25zIHdhaXQtc2NyZWVuLHdhaXQtZGlzcGxheSBcCisgICAgICAgICAgICAgICAgLS1sb25nb3B0aW9ucyBuby13YWl0LXNjcmVlbixuby13YWl0LWRpc3BsYXkgXAogICAgICAgICAgICAgICAgIC0tbG9uZ29wdGlvbnMgZ3Rlc3RfcHJpbnRfdGltZSxwcmludC10aW1lIFwKICAgICAgICAgICAgICAgICAtLSAiP2hzOiIgJHsqfWAgfHwKICAgKCBlY2hvICIke1VTQUdFfSIgPiYyIDsgZmFsc2UgKSB8fApAQCAtNzY2LDkgKzc4OCwyMyBAQAogICAgIC0tbm8tY29sb3IgfCAtLW5vLWNvbG91cikKICAgICAgIGNvbG9yPWZhbHNlCiAgICAgICA7OworICAgIC0tbm8td2FpdC1kaXNwbGF5IHwgLS1uby13YWl0LXNjcmVlbikKKyAgICAgIHNjcmVlbl93YWl0PWZhbHNlCisgICAgICA7OworICAgIC0td2FpdC1kaXNwbGF5IHwgLS13YWl0LXNjcmVlbikKKyAgICAgIHNjcmVlbl93YWl0PXRydWUKKyAgICAgIDs7CiAgICAgLS1wcmludC10aW1lIHwgLS1ndGVzdF9wcmludF90aW1lKQogICAgICAgcHJpbnRfdGltZT10cnVlCiAgICAgICA7OworICAgIC0td2FpdC1hZGIpCisgICAgICBBREJfV0FJVD0kezJ9CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAtLXdhaXQtZmFzdGJvb3QpCisgICAgICBGQVNUQk9PVF9XQUlUPSR7Mn0KKyAgICAgIHNoaWZ0CisgICAgICA7OwogICAgIC0tKQogICAgICAgc2hpZnQKICAgICAgIGJyZWFrCkBAIC04NTQsMTQgKzg5MCwzNyBAQAogIyBJZiByZWJvb3QgdG9vIHNvb24gYWZ0ZXIgZnJlc2ggZmxhc2gsIGNvdWxkIHRyaXAgZGV2aWNlIHVwZGF0ZSBmYWlsdXJlIGxvZ2ljCiB3YWl0X2Zvcl9zY3JlZW4KICMgQ2FuIHdlIHRlc3QgcmVtb3VudCAtUiBjb21tYW5kPworT1ZFUkxBWUZTX0JBQ0tJTkc9ImNhY2hlIG1udC9zY3JhdGNoIgogb3ZlcmxheWZzX3N1cHBvcnRlZD10cnVlCi1pZiBbICJvcmFuZ2UiID0gImBnZXRfcHJvcGVydHkgcm8uYm9vdC52ZXJpZmllZGJvb3RzdGF0ZWAiIC1hIFwKLSAgICAgIjIiID0gImBnZXRfcHJvcGVydHkgcGFydGl0aW9uLnN5c3RlbS52ZXJpZmllZGAiIF07IHRoZW4KK2lmIFsgIm9yYW5nZSIgIT0gImBnZXRfcHJvcGVydHkgcm8uYm9vdC52ZXJpZmllZGJvb3RzdGF0ZWAiIC1vIFwKKyAgICAgIjIiICE9ICJgZ2V0X3Byb3BlcnR5IHBhcnRpdGlvbi5zeXN0ZW0udmVyaWZpZWRgIiBdOyB0aGVuCiAgIHJlc3RvcmUoKSB7CiAgICAgJHtvdmVybGF5ZnNfc3VwcG9ydGVkfSB8fCByZXR1cm4gMAogICAgIGluRmFzdGJvb3QgJiYKICAgICAgIGZhc3Rib290IHJlYm9vdCAmJgotICAgICAgYWRiX3dhaXQgJHtBREJfV0FJVH0KKyAgICAgIGFkYl93YWl0ICR7QURCX1dBSVR9IHx8CisgICAgICB0cnVlCisgICAgaWYgaW5BZGI7IHRoZW4KKyAgICAgIHJlYm9vdD1mYWxzZQorICAgICAgZm9yIGQgaW4gJHtPVkVSTEFZRlNfQkFDS0lOR307IGRvCisgICAgICAgIGlmIGFkYl9zdSBscyAtZCAvJHtkfS9vdmVybGF5IDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIGFkYl9zdSBybSAtcmYgLyR7ZH0vb3ZlcmxheSA8L2Rldi9udWxsCisgICAgICAgICAgcmVib290PXRydWUKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICAgIGlmICR7cmVib290fTsgdGhlbgorICAgICAgICBhZGJfcmVib290ICYmCisgICAgICAgIGFkYl93YWl0ICR7QURCX1dBSVR9CisgICAgICBmaQorICAgIGZpCisgIH0KK2Vsc2UKKyAgcmVzdG9yZSgpIHsKKyAgICAke292ZXJsYXlmc19zdXBwb3J0ZWR9IHx8IHJldHVybiAwCisgICAgaW5GYXN0Ym9vdCAmJgorICAgICAgZmFzdGJvb3QgcmVib290ICYmCisgICAgICBhZGJfd2FpdCAke0FEQl9XQUlUfSB8fAorICAgICAgdHJ1ZQogICAgIGluQWRiICYmCiAgICAgICBhZGJfcm9vdCAmJgogICAgICAgYWRiIGVuYWJsZS12ZXJpdHkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmJgpAQCAtOTIwLDcgKzk3OSw2IEBACiAjIFNvIGxldHMgZG8gb3VyIGJlc3QgdG8gc3VyZ2ljYWxseSB3aXBlIHRoZSBvdmVybGF5ZnMgc3RhdGUgd2l0aG91dAogIyBoYXZpbmcgdG8gZ28gdGhyb3VnaCBlbmFibGUtdmVyaXR5IHRyYW5zaXRpb24uCiByZWJvb3Q9ZmFsc2UKLU9WRVJMQVlGU19CQUNLSU5HPSJjYWNoZSBtbnQvc2NyYXRjaCIKIGZvciBkIGluICR7T1ZFUkxBWUZTX0JBQ0tJTkd9OyBkbwogICBpZiBhZGJfc2ggbHMgLWQgLyR7ZH0vb3ZlcmxheSA8L2Rldi9udWxsID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KICAgICBlY2hvICIke09SQU5HRX1bICBXQVJOSU5HIF0ke05PUk1BTH0gLyR7ZH0vb3ZlcmxheSBpcyBzZXR1cCwgc3VyZ2ljYWxseSB3aXBpbmciID4mMgpAQCAtMTE0NSwxMCArMTIwMywxNCBAQAogCiBBPSJIZWxsbyBXb3JsZCEgJChkYXRlKSIKIGVjaG8gIiR7QX0iIHwgYWRiX3NoIGNhdCAtICI+L3N5c3RlbS9oZWxsbyIKK2VjaG8gIiR7QX0iIHwgYWRiX3NoIGNhdCAtICI+L3N5c3RlbS9wcml2LWFwcC9oZWxsbyIKIGVjaG8gIiR7QX0iIHwgYWRiX3NoIGNhdCAtICI+L3ZlbmRvci9oZWxsbyIKIEI9ImBhZGJfY2F0IC9zeXN0ZW0vaGVsbG9gIiB8fAotICBkaWUgInN5dGVtIGhlbGxvIgorICBkaWUgInN5c3RlbSBoZWxsbyIKIGNoZWNrX2VxICIke0F9IiAiJHtCfSIgL3N5c3RlbSBiZWZvcmUgcmVib290CitCPSJgYWRiX2NhdCAvc3lzdGVtL3ByaXYtYXBwL2hlbGxvYCIgfHwKKyAgZGllICJzeXN0ZW0gcHJpdi1hcHAgaGVsbG8iCitjaGVja19lcSAiJHtBfSIgIiR7Qn0iIC9zeXN0ZW0vcHJpdi1hcHAgYmVmb3JlIHJlYm9vdAogQj0iYGFkYl9jYXQgL3ZlbmRvci9oZWxsb2AiIHx8CiAgIGRpZSAidmVuZG9yIGhlbGxvIgogY2hlY2tfZXEgIiR7QX0iICIke0J9IiAvdmVuZG9yIGJlZm9yZSByZWJvb3QKQEAgLTEyMzAsNiArMTI5MiwxMyBAQAogZmkKIEI9ImBhZGJfY2F0IC9zeXN0ZW0vaGVsbG9gIgogY2hlY2tfZXEgIiR7QX0iICIke0J9IiAvc3lzdGVtIGFmdGVyIHJlYm9vdAorIyBJZiBvdmVybGF5ZnMgaGFzIGEgbmVzdGVkIHNlY3VyaXR5IHByb2JsZW0sIHRoaXMgd2lsbCBmYWlsLgorQj0iYGFkYl9scyAvc3lzdGVtL2AiIHx8CisgIGRpciAiYWRiIGxzIC9zeXN0ZW0iCitbIFgiJHtCfSIgIT0gWCIke0IjKnByaXYtYXBwfSIgXSB8fAorICBkaXIgImFkYiBscyAvc3lzdGVtL3ByaXYtYXBwIgorQj0iYGFkYl9jYXQgL3N5c3RlbS9wcml2LWFwcC9oZWxsb2AiCitjaGVja19lcSAiJHtBfSIgIiR7Qn0iIC9zeXN0ZW0vcHJpdi1hcHAgYWZ0ZXIgcmVib290CiBlY2hvICIke0dSRUVOfVsgICAgICAgT0sgXSR7Tk9STUFMfSAvc3lzdGVtIGNvbnRlbnQgcmVtYWlucyBhZnRlciByZWJvb3QiID4mMgogIyBPbmx5IHJvb3QgY2FuIHJlYWQgdmVuZG9yIGlmIHNlcG9saWN5IHBlcm1pc3Npb25zIGFyZSBhcyBleHBlY3RlZC4KIGFkYl9yb290IHx8CkBAIC0xMzUxLDYgKzE0MjAsMTIgQEAKICAgZmkKICAgQj0iYGFkYl9jYXQgL3N5c3RlbS9oZWxsb2AiCiAgIGNoZWNrX2VxICIke0F9IiAiJHtCfSIgc3lzdGVtIGFmdGVyIGZsYXNoIHZlbmRvcgorICBCPSJgYWRiX2xzIC9zeXN0ZW0vYCIgfHwKKyAgICBkaXIgImFkYiBscyAvc3lzdGVtIgorICBbIFgiJHtCfSIgIT0gWCIke0IjKnByaXYtYXBwfSIgXSB8fAorICAgIGRpciAiYWRiIGxzIC9zeXN0ZW0vcHJpdi1hcHAiCisgIEI9ImBhZGJfY2F0IC9zeXN0ZW0vcHJpdi1hcHAvaGVsbG9gIgorICBjaGVja19lcSAiJHtBfSIgIiR7Qn0iIHN5c3RlbS9wcml2LWFwcCBhZnRlciBmbGFzaCB2ZW5kb3IKICAgYWRiX3Jvb3QgfHwKICAgICBkaWUgImFkYiByb290IgogICBCPSJgYWRiX2NhdCAvdmVuZG9yL2hlbGxvYCIKQEAgLTEzOTIsMTUgKzE0NjcsMTcgQEAKIGVjaG8gIiR7SH0iCiBbICR7ZXJyfSA9IDAgXSAmJgogICAoIGFkYl9zaCBybSAvdmVuZG9yL2hlbGxvIDwvZGV2L251bGwgMj4vZGV2L251bGwgfHwgdHJ1ZSApICYmCi0gIGFkYl9zaCBybSAvc3lzdGVtL2hlbGxvIDwvZGV2L251bGwgfHwKKyAgYWRiX3NoIHJtIC9zeXN0ZW0vaGVsbG8gL3N5c3RlbS9wcml2LWFwcC9oZWxsbyA8L2Rldi9udWxsIHx8CiAgICggWyAtbiAiJHtMfSIgXSAmJiBlY2hvICIke0x9IiAmJiBmYWxzZSApIHx8CiAgIGRpZSAtdCAke1R9ICJjbGVhbnVwIGhlbGxvIgogQj0iYGFkYl9jYXQgL3N5c3RlbS9oZWxsb2AiCiBjaGVja19lcSAiY2F0OiAvc3lzdGVtL2hlbGxvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiAiJHtCfSIgYWZ0ZXIgcm0KK0I9ImBhZGJfY2F0IC9zeXN0ZW0vcHJpdi1hcHAvaGVsbG9gIgorY2hlY2tfZXEgImNhdDogL3N5c3RlbS9wcml2LWFwcC9oZWxsbzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIgIiR7Qn0iIGFmdGVyIHJtCiBCPSJgYWRiX2NhdCAvdmVuZG9yL2hlbGxvYCIKIGNoZWNrX2VxICJjYXQ6IC92ZW5kb3IvaGVsbG86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiICIke0J9IiBhZnRlciBybQogCi1pZiBbIC1uICIke3NjcmF0Y2hfcGFydGl0aW9ufSIgXTsgdGhlbgoraWYgJHtpc19ib290bG9hZGVyX2Zhc3Rib290fSAmJiBbIC1uICIke3NjcmF0Y2hfcGFydGl0aW9ufSIgXTsgdGhlbgogCiAgIGVjaG8gIiR7R1JFRU59WyBSVU4gICAgICBdJHtOT1JNQUx9IHRlc3QgZmFzdGJvb3QgZmxhc2ggdG8gJHtzY3JhdGNoX3BhcnRpdGlvbn0gcmVjb3ZlcnkiID4mMgogCkBAIC0xNDEzLDcgKzE0OTAsNyBAQAogICB9CiAgIGRkIGlmPS9kZXYvemVybyBvZj0ke2ltZ30gYnM9NDA5NiBjb3VudD0xNiAyPi9kZXYvbnVsbCAmJgogICAgIGZhc3Rib290X3dhaXQgJHtGQVNUQk9PVF9XQUlUfSB8fAotICAgIGRpZSAicmVib290IGludG8gZmFzdGJvb3QgYHVzYl9zdGF0dXNgIgorICAgIGRpZSAicmVib290IGludG8gZmFzdGJvb3QgdG8gZmxhc2ggc2NyYXRjaCBgdXNiX3N0YXR1c2AiCiAgIGZhc3Rib290IGZsYXNoIC0tZm9yY2UgJHtzY3JhdGNoX3BhcnRpdGlvbn0gJHtpbWd9CiAgIGVycj0kez99CiAgIGNsZWFudXAKQEAgLTE1NDIsNyArMTYxOSw5IEBACiAgICAgYWRiX3dhaXQgJHtBREJfV0FJVH0gfHwKICAgICBkaWUgImFkYiByZW1vdW50IC1SIgogICBpZiBbICJvcmFuZ2UiICE9ICJgZ2V0X3Byb3BlcnR5IHJvLmJvb3QudmVyaWZpZWRib290c3RhdGVgIiAtbyBcCi0gICAgICAgIjIiID0gImBnZXRfcHJvcGVydHkgcGFydGl0aW9uLnN5c3RlbS52ZXJpZmllZGAiIF07IHRoZW4KKyAgICAgICAiMiIgPSAiYGdldF9wcm9wZXJ0eSBwYXJ0aXRpb24uc3lzdGVtLnZlcmlmaWVkYCIgXSAmJgorICAgICBbIC1uICJgZ2V0X3Byb3BlcnR5IHJvLmJvb3QudmVyaWZpZWRib290c3RhdGVgIiAtbyBcCisgICAgICAgLW4gImBnZXRfcHJvcGVydHkgcGFydGl0aW9uLnN5c3RlbS52ZXJpZmllZGAiIF07IHRoZW4KICAgICBkaWUgInJlbW91bnQgLVIgY29tbWFuZCBmYWlsZWQgdG8gZGlzYWJsZSB2ZXJpdHkiCiAgIGZpCiAKZGlmZiAtLWdpdCBhL2ZzX21nci90b29scy9kbWN0bC5jcHAgYi9mc19tZ3IvdG9vbHMvZG1jdGwuY3BwCmluZGV4IDdlNmFkNWIuLjI3Mzg0NTcgMTAwNjQ0Ci0tLSBhL2ZzX21nci90b29scy9kbWN0bC5jcHAKKysrIGIvZnNfbWdyL3Rvb2xzL2RtY3RsLmNwcApAQCAtNDksNyArNDksMTAgQEAKICAgICBzdGQ6OmNlcnIgPDwgIiAgZGVsZXRlIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICBsaXN0IDxkZXZpY2VzIHwgdGFyZ2V0cz4gWy12XSIgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICBnZXRwYXRoIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiICBpbmZvIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICBzdGF0dXMgPGRtLW5hbWU+IiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICIgIHJlc3VtZSA8ZG0tbmFtZT4iIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgc3VzcGVuZCA8ZG0tbmFtZT4iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgdGFibGUgPGRtLW5hbWU+IiA8PCBzdGQ6OmVuZGw7CiAgICAgc3RkOjpjZXJyIDw8ICIgIGhlbHAiIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOwpAQCAtMTk0LDE5ICsxOTcsMTIgQEAKICAgICBjaGFyKiogYXJndl87CiB9OwogCi1zdGF0aWMgaW50IERtQ3JlYXRlQ21kSGFuZGxlcihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgICBpZiAoYXJnYyA8IDEpIHsKLSAgICAgICAgc3RkOjpjZXJyIDw8ICJVc2FnZTogZG1jdGwgY3JlYXRlIDxkbS1uYW1lPiBbLXJvXSA8dGFyZ2V0cy4uLj4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBhcmd2WzBdOwotCitzdGF0aWMgYm9vbCBwYXJzZV90YWJsZV9hcmdzKERtVGFibGUqIHRhYmxlLCBpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKICAgICAvLyBQYXJzZSBleHRlbmRlZCBvcHRpb25zIGZpcnN0LgotICAgIERtVGFibGUgdGFibGU7CiAgICAgaW50IGFyZ19pbmRleCA9IDE7CiAgICAgd2hpbGUgKGFyZ19pbmRleCA8IGFyZ2MgJiYgYXJndlthcmdfaW5kZXhdWzBdID09ICctJykgewogICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbYXJnX2luZGV4XSwgIi1ybyIpID09IDApIHsKLSAgICAgICAgICAgIHRhYmxlLnNldF9yZWFkb25seSh0cnVlKTsKKyAgICAgICAgICAgIHRhYmxlLT5zZXRfcmVhZG9ubHkodHJ1ZSk7CiAgICAgICAgICAgICBhcmdfaW5kZXgrKzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5yZWNvZ25pemVkIG9wdGlvbjogIiA8PCBhcmd2W2FyZ19pbmRleF0gPDwgc3RkOjplbmRsOwpAQCAtMjE4LDE1ICsyMTQsMzAgQEAKICAgICBUYXJnZXRQYXJzZXIgcGFyc2VyKGFyZ2MgLSBhcmdfaW5kZXgsIGFyZ3YgKyBhcmdfaW5kZXgpOwogICAgIHdoaWxlIChwYXJzZXIuTW9yZSgpKSB7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxEbVRhcmdldD4gdGFyZ2V0ID0gcGFyc2VyLk5leHQoKTsKLSAgICAgICAgaWYgKCF0YXJnZXQgfHwgIXRhYmxlLkFkZFRhcmdldChzdGQ6Om1vdmUodGFyZ2V0KSkpIHsKKyAgICAgICAgaWYgKCF0YXJnZXQgfHwgIXRhYmxlLT5BZGRUYXJnZXQoc3RkOjptb3ZlKHRhcmdldCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICh0YWJsZS5udW1fdGFyZ2V0cygpID09IDApIHsKKyAgICBpZiAodGFibGUtPm51bV90YXJnZXRzKCkgPT0gMCkgewogICAgICAgICBzdGQ6OmNlcnIgPDwgIk11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSB0YXJnZXQuIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBEbUNyZWF0ZUNtZEhhbmRsZXIoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiVXNhZ2U6IGRtY3RsIGNyZWF0ZSA8ZG0tbmFtZT4gWy1yb10gPHRhcmdldHMuLi4+IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gYXJndlswXTsKKworICAgIERtVGFibGUgdGFibGU7CisgICAgaW50IHJldCA9IHBhcnNlX3RhYmxlX2FyZ3MoJnRhYmxlLCBhcmdjLCBhcmd2KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogCiAgICAgRGV2aWNlTWFwcGVyJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKICAgICBpZiAoIWRtLkNyZWF0ZURldmljZShuYW1lLCB0YWJsZSkpIHsKQEAgLTI1Miw2ICsyNjMsMjcgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBEbVJlcGxhY2VDbWRIYW5kbGVyKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlVzYWdlOiBkbWN0bCByZXBsYWNlIDxkbS1uYW1lPiA8dGFyZ2V0cy4uLj4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBhcmd2WzBdOworCisgICAgRG1UYWJsZSB0YWJsZTsKKyAgICBpbnQgcmV0ID0gcGFyc2VfdGFibGVfYXJncygmdGFibGUsIGFyZ2MsIGFyZ3YpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBEZXZpY2VNYXBwZXImIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIGlmICghZG0uTG9hZFRhYmxlQW5kQWN0aXZhdGUobmFtZSwgdGFibGUpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIHJlcGxhY2UgZGV2aWNlLW1hcHBlciB0YWJsZSB0bzogIiA8PCBuYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IERtTGlzdFRhcmdldHMoRGV2aWNlTWFwcGVyJiBkbSwgW1ttYXliZV91bnVzZWRdXSBpbnQgYXJnYywKICAgICAgICAgICAgICAgICAgICAgICAgICBbW21heWJlX3VudXNlZF1dIGNoYXIqKiBhcmd2KSB7CiAgICAgc3RkOjp2ZWN0b3I8RG1UYXJnZXRUeXBlSW5mbz4gdGFyZ2V0czsKQEAgLTM1Nyw2ICszODksNDEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBJbmZvQ21kSGFuZGxlcihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiSW52YWxpZCBhcmd1bWVudHMsIHNlZSBcJ2RtY3RsIGhlbHBcJyIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBEZXZpY2VNYXBwZXImIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIGF1dG8gaW5mbyA9IGRtLkdldERldGFpbGVkSW5mbyhhcmd2WzBdKTsKKyAgICBpZiAoIWluZm8pIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJJbnZhbGlkIGRldmljZSBcIiIgPDwgYXJndlswXSA8PCAiXCIuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGNvbnN0ZXhwciBpbnQgc3BhY2luZyA9IDE0OworICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmxlZnQgPDwgc3RkOjpzZXR3KHNwYWNpbmcpIDw8ICJkZXZpY2UiCisgICAgICAgICAgICAgIDw8ICI6ICIgPDwgYXJndlswXSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoc3BhY2luZykgPDwgImFjdGl2ZSIKKyAgICAgICAgICAgICAgPDwgIjogIiA8PCBzdGQ6OmJvb2xhbHBoYSA8PCAhaW5mby0+SXNTdXNwZW5kZWQoKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoc3BhY2luZykgPDwgImFjY2VzcyIKKyAgICAgICAgICAgICAgPDwgIjogIjsKKyAgICBpZiAoaW5mby0+SXNSZWFkT25seSgpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAicm8gIjsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OmNvdXQgPDwgInJ3ICI7CisgICAgfQorICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoc3BhY2luZykgPDwgImFjdGl2ZVRhYmxlIgorICAgICAgICAgICAgICA8PCAiOiAiIDw8IHN0ZDo6Ym9vbGFscGhhIDw8IGluZm8tPklzQWN0aXZlVGFibGVQcmVzZW50KCkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmxlZnQgPDwgc3RkOjpzZXR3KHNwYWNpbmcpIDw8ICJpbmFjdGl2ZVRhYmxlIgorICAgICAgICAgICAgICA8PCAiOiAiIDw8IHN0ZDo6Ym9vbGFscGhhIDw8IGluZm8tPklzSW5hY3RpdmVUYWJsZVByZXNlbnQoKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoc3BhY2luZykgPDwgImJ1ZmZlckZ1bGwiCisgICAgICAgICAgICAgIDw8ICI6ICIgPDwgc3RkOjpib29sYWxwaGEgPDwgaW5mby0+SXNCdWZmZXJGdWxsKCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IER1bXBUYWJsZShjb25zdCBzdGQ6OnN0cmluZyYgbW9kZSwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgaWYgKGFyZ2MgIT0gMSkgewogICAgICAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgYXJndW1lbnRzLCBzZWUgXCdkbWN0bCBoZWxwXCciIDw8IHN0ZDo6ZW5kbDsKQEAgLTM5OSwxNSArNDY2LDQ3IEBACiAgICAgcmV0dXJuIER1bXBUYWJsZSgic3RhdHVzIiwgYXJnYywgYXJndik7CiB9CiAKK3N0YXRpYyBpbnQgUmVzdW1lQ21kSGFuZGxlcihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiSW52YWxpZCBhcmd1bWVudHMsIHNlZSBcJ2RtY3RsIGhlbHBcJyIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBEZXZpY2VNYXBwZXImIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIGlmICghZG0uQ2hhbmdlU3RhdGUoYXJndlswXSwgRG1EZXZpY2VTdGF0ZTo6QUNUSVZFKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkNvdWxkIG5vdCByZXN1bWUgZGV2aWNlIFwiIiA8PCBhcmd2WzBdIDw8ICJcIi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IFN1c3BlbmRDbWRIYW5kbGVyKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGlmIChhcmdjICE9IDEpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJJbnZhbGlkIGFyZ3VtZW50cywgc2VlIFwnZG1jdGwgaGVscFwnIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIERldmljZU1hcHBlciYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisgICAgaWYgKCFkbS5DaGFuZ2VTdGF0ZShhcmd2WzBdLCBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IHN1c3BlbmQgZGV2aWNlIFwiIiA8PCBhcmd2WzBdIDw8ICJcIi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6ZnVuY3Rpb248aW50KGludCwgY2hhcioqKT4+IGNtZG1hcCA9IHsKICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgICAgICB7ImNyZWF0ZSIsIERtQ3JlYXRlQ21kSGFuZGxlcn0sCiAgICAgICAgIHsiZGVsZXRlIiwgRG1EZWxldGVDbWRIYW5kbGVyfSwKKyAgICAgICAgeyJyZXBsYWNlIiwgRG1SZXBsYWNlQ21kSGFuZGxlcn0sCiAgICAgICAgIHsibGlzdCIsIERtTGlzdENtZEhhbmRsZXJ9LAogICAgICAgICB7ImhlbHAiLCBIZWxwQ21kSGFuZGxlcn0sCiAgICAgICAgIHsiZ2V0cGF0aCIsIEdldFBhdGhDbWRIYW5kbGVyfSwKKyAgICAgICAgeyJpbmZvIiwgSW5mb0NtZEhhbmRsZXJ9LAogICAgICAgICB7InRhYmxlIiwgVGFibGVDbWRIYW5kbGVyfSwKICAgICAgICAgeyJzdGF0dXMiLCBTdGF0dXNDbWRIYW5kbGVyfSwKKyAgICAgICAgeyJyZXN1bWUiLCBSZXN1bWVDbWRIYW5kbGVyfSwKKyAgICAgICAgeyJzdXNwZW5kIiwgU3VzcGVuZENtZEhhbmRsZXJ9LAogICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KIH07CiAKZGlmZiAtLWdpdCBhL2luaXQvQW5kcm9pZC5icCBiL2luaXQvQW5kcm9pZC5icAppbmRleCBiYTYwMDg1Li4zMjMzY2MzIDEwMDY0NAotLS0gYS9pbml0L0FuZHJvaWQuYnAKKysrIGIvaW5pdC9BbmRyb2lkLmJwCkBAIC04Myw2ICs4Myw3IEBACiAgICAgICAgICJsaWJmc2NyeXB0IiwKICAgICAgICAgImxpYmdzaSIsCiAgICAgICAgICJsaWJoaWRsLWdlbi11dGlscyIsCisgICAgICAgICJsaWJqc29uY3BwIiwKICAgICAgICAgImxpYmtleXV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJsb2d3cmFwIiwKQEAgLTkzLDEyICs5NCwxNiBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAgICAgYm9vdHN0cmFwOiB0cnVlLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYmluaXQiLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBkZWZhdWx0czogWyJpbml0X2RlZmF1bHRzIiwgInNlbGludXhfcG9saWN5X3ZlcnNpb24iXSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiaW5pdF9kZWZhdWx0cyIsCisgICAgICAgICJzZWxpbnV4X3BvbGljeV92ZXJzaW9uIiwKKyAgICBdLAogICAgIHNyY3M6IFsKICAgICAgICAgImFjdGlvbi5jcHAiLAogICAgICAgICAiYWN0aW9uX21hbmFnZXIuY3BwIiwKQEAgLTExNCw2ICsxMTksNyBAQAogICAgICAgICAiZmlyc3Rfc3RhZ2VfbW91bnQuY3BwIiwKICAgICAgICAgImltcG9ydF9wYXJzZXIuY3BwIiwKICAgICAgICAgImluaXQuY3BwIiwKKyAgICAgICAgImludGVyZmFjZV91dGlscy5jcHAiLAogICAgICAgICAia2V5Y2hvcmRzLmNwcCIsCiAgICAgICAgICJtb2RhbGlhc19oYW5kbGVyLmNwcCIsCiAgICAgICAgICJtb3VudF9oYW5kbGVyLmNwcCIsCkBAIC0xNDMsNyArMTQ5LDEwIEBACiAgICAgICAgICJ1ZXZlbnRkX3BhcnNlci5jcHAiLAogICAgICAgICAidXRpbC5jcHAiLAogICAgIF0sCi0gICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliY2FwIiwgImNvbS5hbmRyb2lkLnN5c3Byb3AuYXBleCJdLAorICAgIHdob2xlX3N0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjYXAiLAorICAgICAgICAiY29tLmFuZHJvaWQuc3lzcHJvcC5hcGV4IiwKKyAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbImJvb3RpbWdfaGVhZGVycyJdLAogICAgIHByb3RvOiB7CiAgICAgICAgIHR5cGU6ICJsaXRlIiwKQEAgLTE1Myw3ICsxNjIsMTAgQEAKICAgICB0YXJnZXQ6IHsKICAgICAgICAgcmVjb3Zlcnk6IHsKICAgICAgICAgICAgIGNmbGFnczogWyItRFJFQ09WRVJZIl0sCi0gICAgICAgICAgICBleGNsdWRlX3NoYXJlZF9saWJzOiBbImxpYmJpbmRlciIsICJsaWJ1dGlscyJdLAorICAgICAgICAgICAgZXhjbHVkZV9zaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICAgICBdLAogICAgICAgICB9LAogICAgIH0sCiB9CkBAIC0xODIsNyArMTk0LDEwIEBACiAgICAgdGFyZ2V0OiB7CiAgICAgICAgIHJlY292ZXJ5OiB7CiAgICAgICAgICAgICBjZmxhZ3M6IFsiLURSRUNPVkVSWSJdLAotICAgICAgICAgICAgZXhjbHVkZV9zaGFyZWRfbGliczogWyJsaWJiaW5kZXIiLCAibGlidXRpbHMiXSwKKyAgICAgICAgICAgIGV4Y2x1ZGVfc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAgICAgXSwKICAgICAgICAgfSwKICAgICB9LAogfQpAQCAtMjI3LDkgKzI0MiwxMyBAQAogCiBnZW5ydWxlIHsKICAgICBuYW1lOiAiZ2VuZXJhdGVkX3N0dWJfYnVpbHRpbl9mdW5jdGlvbl9tYXAiLAorICAgIHRvb2xfZmlsZXM6IFsiaG9zdF9idWlsdGluX21hcC5weSJdLAogICAgIG91dDogWyJnZW5lcmF0ZWRfc3R1Yl9idWlsdGluX2Z1bmN0aW9uX21hcC5oIl0sCi0gICAgc3JjczogWyJidWlsdGlucy5jcHAiXSwKLSAgICBjbWQ6ICJzZWQgLW4gJy9CdWlsdGluLWZ1bmN0aW9uLW1hcCBzdGFydC97OmE7bjsvQnVpbHRpbi1mdW5jdGlvbi1tYXAgZW5kL3E7cDtiYX0nICQoaW4pIHwgc2VkIC1lICdzL2RvX1tefV0qL2RvX3N0dWIvZycgPiAkKG91dCkiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImJ1aWx0aW5zLmNwcCIsCisgICAgICAgICJjaGVja19idWlsdGlucy5jcHAiLAorICAgIF0sCisgICAgY21kOiAiJChsb2NhdGlvbiBob3N0X2J1aWx0aW5fbWFwLnB5KSAtLWJ1aWx0aW5zICQobG9jYXRpb24gYnVpbHRpbnMuY3BwKSAtLWNoZWNrX2J1aWx0aW5zICQobG9jYXRpb24gY2hlY2tfYnVpbHRpbnMuY3BwKSA+ICQob3V0KSIsCiB9CiAKIGNjX2JpbmFyeSB7CkBAIC0yNjAsOSArMjc5LDExIEBACiAgICAgICAgICJhY3Rpb25fbWFuYWdlci5jcHAiLAogICAgICAgICAiYWN0aW9uX3BhcnNlci5jcHAiLAogICAgICAgICAiY2FwYWJpbGl0aWVzLmNwcCIsCisgICAgICAgICJjaGVja19idWlsdGlucy5jcHAiLAogICAgICAgICAiZXBvbGwuY3BwIiwKICAgICAgICAgImtleWNob3Jkcy5jcHAiLAogICAgICAgICAiaW1wb3J0X3BhcnNlci5jcHAiLAorICAgICAgICAiaW50ZXJmYWNlX3V0aWxzLmNwcCIsCiAgICAgICAgICJob3N0X2ltcG9ydF9wYXJzZXIuY3BwIiwKICAgICAgICAgImhvc3RfaW5pdF92ZXJpZmllci5jcHAiLAogICAgICAgICAicGFyc2VyLmNwcCIsCkBAIC0yODEsNyArMzAyLDcgQEAKICAgICB9LAogICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCiAgICAgICAgICJnZW5lcmF0ZWRfc3R1Yl9idWlsdGluX2Z1bmN0aW9uX21hcCIsCi0gICAgICAgICJnZW5lcmF0ZWRfYW5kcm9pZF9pZHMiCisgICAgICAgICJnZW5lcmF0ZWRfYW5kcm9pZF9pZHMiLAogICAgIF0sCiAgICAgdGFyZ2V0OiB7CiAgICAgICAgIGFuZHJvaWQ6IHsKZGlmZiAtLWdpdCBhL2luaXQvYWN0aW9uLmNwcCBiL2luaXQvYWN0aW9uLmNwcAppbmRleCAwYzQ3NmRmLi42OWU0MGQwIDEwMDY0NAotLS0gYS9pbml0L2FjdGlvbi5jcHAKKysrIGIvaW5pdC9hY3Rpb24uY3BwCkBAIC0zNSw5ICszNSwxMSBAQAogICAgIGJ1aWx0aW5fYXJndW1lbnRzLmFyZ3MucmVzaXplKGFyZ3Muc2l6ZSgpKTsKICAgICBidWlsdGluX2FyZ3VtZW50cy5hcmdzWzBdID0gYXJnc1swXTsKICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDwgYXJncy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoIWV4cGFuZF9wcm9wcyhhcmdzW2ldLCAmYnVpbHRpbl9hcmd1bWVudHMuYXJnc1tpXSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJjYW5ub3QgZXhwYW5kICciIDw8IGFyZ3NbaV0gPDwgIiciOworICAgICAgICBhdXRvIGV4cGFuZGVkX2FyZyA9IEV4cGFuZFByb3BzKGFyZ3NbaV0pOworICAgICAgICBpZiAoIWV4cGFuZGVkX2FyZykgeworICAgICAgICAgICAgcmV0dXJuIGV4cGFuZGVkX2FyZy5lcnJvcigpOwogICAgICAgICB9CisgICAgICAgIGJ1aWx0aW5fYXJndW1lbnRzLmFyZ3NbaV0gPSBzdGQ6Om1vdmUoKmV4cGFuZGVkX2FyZyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGZ1bmN0aW9uKGJ1aWx0aW5fYXJndW1lbnRzKTsKQEAgLTY2LDYgKzY4LDMwIEBACiAgICAgcmV0dXJuIFJ1bkJ1aWx0aW5GdW5jdGlvbihmdW5jXywgYXJnc18sIGtJbml0Q29udGV4dCk7CiB9CiAKK1Jlc3VsdDx2b2lkPiBDb21tYW5kOjpDaGVja0NvbW1hbmQoKSBjb25zdCB7CisgICAgYXV0byBidWlsdGluX2FyZ3VtZW50cyA9IEJ1aWx0aW5Bcmd1bWVudHMoImhvc3RfaW5pdF92ZXJpZmllciIpOworCisgICAgYnVpbHRpbl9hcmd1bWVudHMuYXJncy5yZXNpemUoYXJnc18uc2l6ZSgpKTsKKyAgICBidWlsdGluX2FyZ3VtZW50cy5hcmdzWzBdID0gYXJnc19bMF07CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBhcmdzXy5zaXplKCk7ICsraSkgeworICAgICAgICBhdXRvIGV4cGFuZGVkX2FyZyA9IEV4cGFuZFByb3BzKGFyZ3NfW2ldKTsKKyAgICAgICAgaWYgKCFleHBhbmRlZF9hcmcpIHsKKyAgICAgICAgICAgIGlmIChleHBhbmRlZF9hcmcuZXJyb3IoKS5tZXNzYWdlKCkuZmluZCgiZG9lc24ndCBleGlzdCB3aGlsZSBleHBhbmRpbmciKSAhPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgZmFpbGVkIGJlY2F1c2Ugd2Ugd29uJ3QgaGF2ZSBhIHByb3BlcnR5LCB1c2UgYW4gZW1wdHkgc3RyaW5nLCB3aGljaCBpcworICAgICAgICAgICAgICAgIC8vIG5ldmVyIHJldHVybmVkIGZyb20gdGhlIHBhcnNlciwgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGZpZWxkIGNhbm5vdCBiZSBjaGVja2VkLgorICAgICAgICAgICAgICAgIGJ1aWx0aW5fYXJndW1lbnRzLmFyZ3NbaV0gPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4cGFuZGVkX2FyZy5lcnJvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVpbHRpbl9hcmd1bWVudHMuYXJnc1tpXSA9IHN0ZDo6bW92ZSgqZXhwYW5kZWRfYXJnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmdW5jXyhidWlsdGluX2FyZ3VtZW50cyk7Cit9CisKIHN0ZDo6c3RyaW5nIENvbW1hbmQ6OkJ1aWxkQ29tbWFuZFN0cmluZygpIGNvbnN0IHsKICAgICByZXR1cm4gSm9pbihhcmdzXywgJyAnKTsKIH0KQEAgLTEwNSw2ICsxMzEsMTggQEAKICAgICByZXR1cm4gY29tbWFuZHNfLnNpemUoKTsKIH0KIAorc2l6ZV90IEFjdGlvbjo6Q2hlY2tBbGxDb21tYW5kcygpIGNvbnN0IHsKKyAgICBzaXplX3QgZmFpbHVyZXMgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgY29tbWFuZCA6IGNvbW1hbmRzXykgeworICAgICAgICBpZiAoYXV0byByZXN1bHQgPSBjb21tYW5kLkNoZWNrQ29tbWFuZCgpOyAhcmVzdWx0KSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21tYW5kICciIDw8IGNvbW1hbmQuQnVpbGRDb21tYW5kU3RyaW5nKCkgPDwgIicgKCIgPDwgZmlsZW5hbWVfIDw8ICI6IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBjb21tYW5kLmxpbmUoKSA8PCAiKSBmYWlsZWQ6ICIgPDwgcmVzdWx0LmVycm9yKCk7CisgICAgICAgICAgICArK2ZhaWx1cmVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWlsdXJlczsKK30KKwogdm9pZCBBY3Rpb246OkV4ZWN1dGVPbmVDb21tYW5kKHN0ZDo6c2l6ZV90IGNvbW1hbmQpIGNvbnN0IHsKICAgICAvLyBXZSBuZWVkIGEgY29weSBoZXJlIHNpbmNlIHNvbWUgQ29tbWFuZCBleGVjdXRpb24gbWF5IHJlc3VsdCBpbgogICAgIC8vIGNoYW5naW5nIGNvbW1hbmRzXyB2ZWN0b3IgYnkgaW1wb3J0aW5nIC5yYyBmaWxlcyB0aHJvdWdoIHBhcnNlcgpAQCAtMTIzLDE4ICsxNjEsOCBAQAogICAgIGF1dG8gcmVzdWx0ID0gY29tbWFuZC5JbnZva2VGdW5jKHN1YmNvbnRleHRfKTsKICAgICBhdXRvIGR1cmF0aW9uID0gdC5kdXJhdGlvbigpOwogCi0gICAgLy8gVGhlcmUgYXJlIG1hbnkgbGVnYWN5IHBhdGhzIGluIHJvb3RkaXIvaW5pdC5yYyB0aGF0IHdpbGwgdmlydHVhbGx5IG5ldmVyIGV4aXN0IG9uIGEgbmV3Ci0gICAgLy8gZGV2aWNlLCBzdWNoIGFzICcvc3lzL2NsYXNzL2xlZHMvam9nYmFsbC1iYWNrbGlnaHQvYnJpZ2h0bmVzcycuICBBcyBvZiB0aGlzIHdyaXRpbmcsIHRoZXJlCi0gICAgLy8gYXJlIDE5OCBzdWNoIGZhaWx1cmVzIG9uIGJ1bGxoZWFkLiAgSW5zdGVhZCBvZiBzcGFtbWluZyB0aGUgbG9nIHJlcG9ydGluZyB0aGVtLCB3ZSBkbyBub3QKLSAgICAvLyByZXBvcnQgc3VjaCBmYWlsdXJlcyB1bmxlc3Mgd2UncmUgcnVubmluZyBhdCB0aGUgREVCVUcgbG9nIGxldmVsLgotICAgIGJvb2wgcmVwb3J0X2ZhaWx1cmUgPSAhcmVzdWx0Lmhhc192YWx1ZSgpOwotICAgIGlmIChyZXBvcnRfZmFpbHVyZSAmJiBhbmRyb2lkOjpiYXNlOjpHZXRNaW5pbXVtTG9nU2V2ZXJpdHkoKSA+IGFuZHJvaWQ6OmJhc2U6OkRFQlVHICYmCi0gICAgICAgIHJlc3VsdC5lcnJvcigpLmNvZGUoKSA9PSBFTk9FTlQpIHsKLSAgICAgICAgcmVwb3J0X2ZhaWx1cmUgPSBmYWxzZTsKLSAgICB9Ci0KICAgICAvLyBBbnkgYWN0aW9uIGxvbmdlciB0aGFuIDUwbXMgd2lsbCBiZSB3YXJuZWQgdG8gdXNlciBhcyBzbG93IG9wZXJhdGlvbgotICAgIGlmIChyZXBvcnRfZmFpbHVyZSB8fCBkdXJhdGlvbiA+IDUwbXMgfHwKKyAgICBpZiAoIXJlc3VsdC5oYXNfdmFsdWUoKSB8fCBkdXJhdGlvbiA+IDUwbXMgfHwKICAgICAgICAgYW5kcm9pZDo6YmFzZTo6R2V0TWluaW11bUxvZ1NldmVyaXR5KCkgPD0gYW5kcm9pZDo6YmFzZTo6REVCVUcpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgdHJpZ2dlcl9uYW1lID0gQnVpbGRUcmlnZ2Vyc1N0cmluZygpOwogICAgICAgICBzdGQ6OnN0cmluZyBjbWRfc3RyID0gY29tbWFuZC5CdWlsZENvbW1hbmRTdHJpbmcoKTsKQEAgLTE2NywxMCArMTk1LDExIEBACiAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJvcF92YWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSh0cmlnZ2VyX25hbWUsICIiKTsKLSAgICAgICAgICAgIGlmIChwcm9wX3ZhbC5lbXB0eSgpIHx8ICh0cmlnZ2VyX3ZhbHVlICE9ICIqIiAmJiB0cmlnZ2VyX3ZhbHVlICE9IHByb3BfdmFsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByb3BfdmFsdWUgPSBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSh0cmlnZ2VyX25hbWUsICIiKTsKKyAgICAgICAgICAgIGlmICh0cmlnZ2VyX3ZhbHVlID09ICIqIiAmJiAhcHJvcF92YWx1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHJpZ2dlcl92YWx1ZSAhPSBwcm9wX3ZhbHVlKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZvdW5kOwpkaWZmIC0tZ2l0IGEvaW5pdC9hY3Rpb24uaCBiL2luaXQvYWN0aW9uLmgKaW5kZXggODBjMWRhNC4uMTUzNGJmOSAxMDA2NDQKLS0tIGEvaW5pdC9hY3Rpb24uaAorKysgYi9pbml0L2FjdGlvbi5oCkBAIC0xNCw4ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIF9JTklUX0FDVElPTl9ICi0jZGVmaW5lIF9JTklUX0FDVElPTl9ICisjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxxdWV1ZT4KQEAgLTQxLDYgKzQwLDcgQEAKIAogICAgIFJlc3VsdDx2b2lkPiBJbnZva2VGdW5jKFN1YmNvbnRleHQqIHN1YmNvbnRleHQpIGNvbnN0OwogICAgIHN0ZDo6c3RyaW5nIEJ1aWxkQ29tbWFuZFN0cmluZygpIGNvbnN0OworICAgIFJlc3VsdDx2b2lkPiBDaGVja0NvbW1hbmQoKSBjb25zdDsKIAogICAgIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0KIApAQCAtNjMsNyArNjMsNyBAQAogCiAgICAgUmVzdWx0PHZvaWQ+IEFkZENvbW1hbmQoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiYgYXJncywgaW50IGxpbmUpOwogICAgIHZvaWQgQWRkQ29tbWFuZChCdWlsdGluRnVuY3Rpb24gZiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiYgYXJncywgaW50IGxpbmUpOwotICAgIHN0ZDo6c2l6ZV90IE51bUNvbW1hbmRzKCkgY29uc3Q7CisgICAgc2l6ZV90IE51bUNvbW1hbmRzKCkgY29uc3Q7CiAgICAgdm9pZCBFeGVjdXRlT25lQ29tbWFuZChzdGQ6OnNpemVfdCBjb21tYW5kKSBjb25zdDsKICAgICB2b2lkIEV4ZWN1dGVBbGxDb21tYW5kcygpIGNvbnN0OwogICAgIGJvb2wgQ2hlY2tFdmVudChjb25zdCBFdmVudFRyaWdnZXImIGV2ZW50X3RyaWdnZXIpIGNvbnN0OwpAQCAtNzEsNiArNzEsNyBAQAogICAgIGJvb2wgQ2hlY2tFdmVudChjb25zdCBCdWlsdGluQWN0aW9uJiBidWlsdGluX2FjdGlvbikgY29uc3Q7CiAgICAgc3RkOjpzdHJpbmcgQnVpbGRUcmlnZ2Vyc1N0cmluZygpIGNvbnN0OwogICAgIHZvaWQgRHVtcFN0YXRlKCkgY29uc3Q7CisgICAgc2l6ZV90IENoZWNrQWxsQ29tbWFuZHMoKSBjb25zdDsKIAogICAgIGJvb2wgb25lc2hvdCgpIGNvbnN0IHsgcmV0dXJuIG9uZXNob3RfOyB9CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKCkgY29uc3QgeyByZXR1cm4gZmlsZW5hbWVfOyB9CkBAIC05Niw1ICs5NywzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBpbml0CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luaXQvYWN0aW9uX21hbmFnZXIuY3BwIGIvaW5pdC9hY3Rpb25fbWFuYWdlci5jcHAKaW5kZXggNTQxYzhmMi4uZWJjYTc2MiAxMDA2NDQKLS0tIGEvaW5pdC9hY3Rpb25fbWFuYWdlci5jcHAKKysrIGIvaW5pdC9hY3Rpb25fbWFuYWdlci5jcHAKQEAgLTIzLDYgKzIzLDE0IEBACiAKIEFjdGlvbk1hbmFnZXI6OkFjdGlvbk1hbmFnZXIoKSA6IGN1cnJlbnRfY29tbWFuZF8oMCkge30KIAorc2l6ZV90IEFjdGlvbk1hbmFnZXI6OkNoZWNrQWxsQ29tbWFuZHMoKSB7CisgICAgc2l6ZV90IGZhaWx1cmVzID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGlvbiA6IGFjdGlvbnNfKSB7CisgICAgICAgIGZhaWx1cmVzICs9IGFjdGlvbi0+Q2hlY2tBbGxDb21tYW5kcygpOworICAgIH0KKyAgICByZXR1cm4gZmFpbHVyZXM7Cit9CisKIEFjdGlvbk1hbmFnZXImIEFjdGlvbk1hbmFnZXI6OkdldEluc3RhbmNlKCkgewogICAgIHN0YXRpYyBBY3Rpb25NYW5hZ2VyIGluc3RhbmNlOwogICAgIHJldHVybiBpbnN0YW5jZTsKZGlmZiAtLWdpdCBhL2luaXQvYWN0aW9uX21hbmFnZXIuaCBiL2luaXQvYWN0aW9uX21hbmFnZXIuaAppbmRleCA1ZjQ3YTZkLi5hMmI5NWFjIDEwMDY0NAotLS0gYS9pbml0L2FjdGlvbl9tYW5hZ2VyLmgKKysrIGIvaW5pdC9hY3Rpb25fbWFuYWdlci5oCkBAIC0xNCw4ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIF9JTklUX0FDVElPTl9NQU5BR0VSX0gKLSNkZWZpbmUgX0lOSVRfQUNUSU9OX01BTkFHRVJfSAorI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgpAQCAtMzIsNiArMzEsNyBAQAogCiAgICAgLy8gRXhwb3NlZCBmb3IgdGVzdGluZwogICAgIEFjdGlvbk1hbmFnZXIoKTsKKyAgICBzaXplX3QgQ2hlY2tBbGxDb21tYW5kcygpOwogCiAgICAgdm9pZCBBZGRBY3Rpb24oc3RkOjp1bmlxdWVfcHRyPEFjdGlvbj4gYWN0aW9uKTsKICAgICB2b2lkIFF1ZXVlRXZlbnRUcmlnZ2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmlnZ2VyKTsKQEAgLTU1LDUgKzU1LDMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGluaXQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5pdC9idWlsdGlucy5jcHAgYi9pbml0L2J1aWx0aW5zLmNwcAppbmRleCBiNmUyNmExLi5hMmQ3ODJiIDEwMDY0NAotLS0gYS9pbml0L2J1aWx0aW5zLmNwcAorKysgYi9pbml0L2J1aWx0aW5zLmNwcApAQCAtODksNiArODksNDMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBpbml0IHsKIAorLy8gVGhlcmUgYXJlIG1hbnkgbGVnYWN5IHBhdGhzIGluIHJvb3RkaXIvaW5pdC5yYyB0aGF0IHdpbGwgdmlydHVhbGx5IG5ldmVyIGV4aXN0IG9uIGEgbmV3CisvLyBkZXZpY2UsIHN1Y2ggYXMgJy9zeXMvY2xhc3MvbGVkcy9qb2diYWxsLWJhY2tsaWdodC9icmlnaHRuZXNzJy4gIEFzIG9mIHRoaXMgd3JpdGluZywgdGhlcmUKKy8vIGFyZSA4MSBzdWNoIGZhaWx1cmVzIG9uIGN1dHRsZWZpc2guICBJbnN0ZWFkIG9mIHNwYW1taW5nIHRoZSBsb2cgcmVwb3J0aW5nIHRoZW0sIHdlIGRvIG5vdAorLy8gcmVwb3J0IHN1Y2ggZmFpbHVyZXMgdW5sZXNzIHdlJ3JlIHJ1bm5pbmcgYXQgdGhlIERFQlVHIGxvZyBsZXZlbC4KK2NsYXNzIEVycm9ySWdub3JlRW5vZW50IHsKKyAgcHVibGljOgorICAgIEVycm9ySWdub3JlRW5vZW50KCkKKyAgICAgICAgOiBpZ25vcmVfZXJyb3JfKGVycm5vID09IEVOT0VOVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6R2V0TWluaW11bUxvZ1NldmVyaXR5KCkgPiBhbmRyb2lkOjpiYXNlOjpERUJVRykge30KKyAgICBleHBsaWNpdCBFcnJvcklnbm9yZUVub2VudChpbnQgZXJybm9fdG9fYXBwZW5kKQorICAgICAgICA6IGVycm9yXyhlcnJub190b19hcHBlbmQpLAorICAgICAgICAgIGlnbm9yZV9lcnJvcl8oZXJybm9fdG9fYXBwZW5kID09IEVOT0VOVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6R2V0TWluaW11bUxvZ1NldmVyaXR5KCkgPiBhbmRyb2lkOjpiYXNlOjpERUJVRykge30KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIG9wZXJhdG9yIGFuZHJvaWQ6OmJhc2U6OmV4cGVjdGVkPFQsIFJlc3VsdEVycm9yPigpIHsKKyAgICAgICAgaWYgKGlnbm9yZV9lcnJvcl8pIHsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyb3JfOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIEVycm9ySWdub3JlRW5vZW50JiBvcGVyYXRvcjw8KFQmJiB0KSB7CisgICAgICAgIGVycm9yXyA8PCB0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgRXJyb3IgZXJyb3JfOworICAgIGJvb2wgaWdub3JlX2Vycm9yXzsKK307CisKK2lubGluZSBFcnJvcklnbm9yZUVub2VudCBFcnJub0Vycm9ySWdub3JlRW5vZW50KCkgeworICAgIHJldHVybiBFcnJvcklnbm9yZUVub2VudChlcnJubyk7Cit9CisKIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsYXRlX2ltcG9ydF9wYXRoczsKIAogc3RhdGljIGNvbnN0ZXhwciBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMga0NvbW1hbmRSZXRyeVRpbWVvdXQgPSA1czsKQEAgLTIwMSwyNiArMjM4LDI2IEBACiBzdGF0aWMgUmVzdWx0PHZvaWQ+IGRvX2V4ZWMoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgewogICAgIGF1dG8gc2VydmljZSA9IFNlcnZpY2U6Ok1ha2VUZW1wb3JhcnlPbmVzaG90U2VydmljZShhcmdzLmFyZ3MpOwogICAgIGlmICghc2VydmljZSkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBleGVjIHNlcnZpY2UiOworICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBleGVjIHNlcnZpY2U6ICIgPDwgc2VydmljZS5lcnJvcigpOwogICAgIH0KLSAgICBpZiAoYXV0byByZXN1bHQgPSBzZXJ2aWNlLT5FeGVjU3RhcnQoKTsgIXJlc3VsdCkgeworICAgIGlmIChhdXRvIHJlc3VsdCA9ICgqc2VydmljZSktPkV4ZWNTdGFydCgpOyAhcmVzdWx0KSB7CiAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJDb3VsZCBub3Qgc3RhcnQgZXhlYyBzZXJ2aWNlOiAiIDw8IHJlc3VsdC5lcnJvcigpOwogICAgIH0KIAotICAgIFNlcnZpY2VMaXN0OjpHZXRJbnN0YW5jZSgpLkFkZFNlcnZpY2Uoc3RkOjptb3ZlKHNlcnZpY2UpKTsKKyAgICBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5BZGRTZXJ2aWNlKHN0ZDo6bW92ZSgqc2VydmljZSkpOwogICAgIHJldHVybiB7fTsKIH0KIAogc3RhdGljIFJlc3VsdDx2b2lkPiBkb19leGVjX2JhY2tncm91bmQoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgewogICAgIGF1dG8gc2VydmljZSA9IFNlcnZpY2U6Ok1ha2VUZW1wb3JhcnlPbmVzaG90U2VydmljZShhcmdzLmFyZ3MpOwogICAgIGlmICghc2VydmljZSkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBleGVjIGJhY2tncm91bmQgc2VydmljZSI7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJDb3VsZCBub3QgY3JlYXRlIGV4ZWMgYmFja2dyb3VuZCBzZXJ2aWNlOiAiIDw8IHNlcnZpY2UuZXJyb3IoKTsKICAgICB9Ci0gICAgaWYgKGF1dG8gcmVzdWx0ID0gc2VydmljZS0+U3RhcnQoKTsgIXJlc3VsdCkgeworICAgIGlmIChhdXRvIHJlc3VsdCA9ICgqc2VydmljZSktPlN0YXJ0KCk7ICFyZXN1bHQpIHsKICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkNvdWxkIG5vdCBzdGFydCBleGVjIGJhY2tncm91bmQgc2VydmljZTogIiA8PCByZXN1bHQuZXJyb3IoKTsKICAgICB9CiAKLSAgICBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5BZGRTZXJ2aWNlKHN0ZDo6bW92ZShzZXJ2aWNlKSk7CisgICAgU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkuQWRkU2VydmljZShzdGQ6Om1vdmUoKnNlcnZpY2UpKTsKICAgICByZXR1cm4ge307CiB9CiAKQEAgLTMzMCw3ICszNjcsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgImZjaG1vZGF0KCkgZmFpbGVkIjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgIm1rZGlyKCkgZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBFcnJub0Vycm9ySWdub3JlRW5vZW50KCkgPDwgIm1rZGlyKCkgZmFpbGVkIjsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzQ0LDcgKzM4MSw3IEBACiAgICAgICAgIGlmIChhcmdzLnNpemUoKSA9PSA1KSB7CiAgICAgICAgICAgICBnaWQgPSBEZWNvZGVVaWQoYXJnc1s0XSk7CiAgICAgICAgICAgICBpZiAoIWdpZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmFibGUgdG8gZGVjb2RlIEdJRCBmb3IgJyIgPDwgYXJnc1szXSA8PCAiJzogIiA8PCBnaWQuZXJyb3IoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiVW5hYmxlIHRvIGRlY29kZSBHSUQgZm9yICciIDw8IGFyZ3NbNF0gPDwgIic6ICIgPDwgZ2lkLmVycm9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDU5LDcgKzQ5Niw3IEBACiAgICAgICAgIGlmICh3YWl0KQogICAgICAgICAgICAgd2FpdF9mb3JfZmlsZShzb3VyY2UsIGtDb21tYW5kUmV0cnlUaW1lb3V0KTsKICAgICAgICAgaWYgKG1vdW50KHNvdXJjZSwgdGFyZ2V0LCBzeXN0ZW0sIGZsYWdzLCBvcHRpb25zKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgIm1vdW50KCkgZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBFcnJub0Vycm9ySWdub3JlRW5vZW50KCkgPDwgIm1vdW50KCkgZmFpbGVkIjsKICAgICAgICAgfQogCiAgICAgfQpAQCAtNjgzLDcgKzcyMCw3IEBACiAgICAgU2VydmljZSogc3ZjID0gU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkuRmluZFNlcnZpY2UoYXJnc1sxXSk7CiAgICAgaWYgKCFzdmMpIHJldHVybiBFcnJvcigpIDw8ICJzZXJ2aWNlICIgPDwgYXJnc1sxXSA8PCAiIG5vdCBmb3VuZCI7CiAgICAgaWYgKGF1dG8gcmVzdWx0ID0gc3ZjLT5TdGFydCgpOyAhcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJDb3VsZCBub3Qgc3RhcnQgc2VydmljZTogIiA8PCByZXN1bHQuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIEVycm9ySWdub3JlRW5vZW50KCkgPDwgIkNvdWxkIG5vdCBzdGFydCBzZXJ2aWNlOiAiIDw8IHJlc3VsdC5lcnJvcigpOwogICAgIH0KICAgICByZXR1cm4ge307CiB9CkBAIC03MjksMTAgKzc2Niw3IEBACiAgICAgaWYgKE1ha2VTeW1saW5rKGFyZ3NbMV0sIGFyZ3NbMl0pIDwgMCkgewogICAgICAgICAvLyBUaGUgc3ltbGluayBidWlsdGluIGlzIG9mdGVuIHVzZWQgdG8gY3JlYXRlIHN5bWxpbmtzIGZvciBvbGRlciBkZXZpY2VzIHRvIGJlIGJhY2t3YXJkcwogICAgICAgICAvLyBjb21wYXRpYmxlIHdpdGggbmV3IHBhdGhzLCB0aGVyZWZvcmUgd2Ugc2tpcCByZXBvcnRpbmcgdGhpcyBlcnJvci4KLSAgICAgICAgaWYgKGVycm5vID09IEVFWElTVCAmJiBhbmRyb2lkOjpiYXNlOjpHZXRNaW5pbXVtTG9nU2V2ZXJpdHkoKSA+IGFuZHJvaWQ6OmJhc2U6OkRFQlVHKSB7Ci0gICAgICAgICAgICByZXR1cm4ge307Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAic3ltbGluaygpIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBFcnJub0Vycm9ySWdub3JlRW5vZW50KCkgPDwgInN5bWxpbmsoKSBmYWlsZWQiOwogICAgIH0KICAgICByZXR1cm4ge307CiB9CkBAIC03OTAsNyArODI0LDggQEAKIAogc3RhdGljIFJlc3VsdDx2b2lkPiBkb193cml0ZShjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CiAgICAgaWYgKGF1dG8gcmVzdWx0ID0gV3JpdGVGaWxlKGFyZ3NbMV0sIGFyZ3NbMl0pOyAhcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmFibGUgdG8gd3JpdGUgdG8gZmlsZSAnIiA8PCBhcmdzWzFdIDw8ICInOiAiIDw8IHJlc3VsdC5lcnJvcigpOworICAgICAgICByZXR1cm4gRXJyb3JJZ25vcmVFbm9lbnQoKQorICAgICAgICAgICAgICAgPDwgIlVuYWJsZSB0byB3cml0ZSB0byBmaWxlICciIDw8IGFyZ3NbMV0gPDwgIic6ICIgPDwgcmVzdWx0LmVycm9yKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHt9OwpAQCAtOTA4LDcgKzk0Myw3IEBACiAgICAgfQogCiAgICAgaWYgKGxjaG93bihwYXRoLmNfc3RyKCksICp1aWQsICpnaWQpID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgImxjaG93bigpIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBFcnJub0Vycm9ySWdub3JlRW5vZW50KCkgPDwgImxjaG93bigpIGZhaWxlZCI7CiAgICAgfQogCiAgICAgcmV0dXJuIHt9OwpAQCAtOTMwLDUwICs5NjUsMjcgQEAKIHN0YXRpYyBSZXN1bHQ8dm9pZD4gZG9fY2htb2QoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgewogICAgIG1vZGVfdCBtb2RlID0gZ2V0X21vZGUoYXJnc1sxXS5jX3N0cigpKTsKICAgICBpZiAoZmNobW9kYXQoQVRfRkRDV0QsIGFyZ3NbMl0uY19zdHIoKSwgbW9kZSwgQVRfU1lNTElOS19OT0ZPTExPVykgPCAwKSB7Ci0gICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgImZjaG1vZGF0KCkgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIEVycm5vRXJyb3JJZ25vcmVFbm9lbnQoKSA8PCAiZmNobW9kYXQoKSBmYWlsZWQiOwogICAgIH0KICAgICByZXR1cm4ge307CiB9CiAKIHN0YXRpYyBSZXN1bHQ8dm9pZD4gZG9fcmVzdG9yZWNvbihjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CisgICAgYXV0byByZXN0b3JlY29uX2luZm8gPSBQYXJzZVJlc3RvcmVjb24oYXJncy5hcmdzKTsKKyAgICBpZiAoIXJlc3RvcmVjb25faW5mbykgeworICAgICAgICByZXR1cm4gcmVzdG9yZWNvbl9pbmZvLmVycm9yKCk7CisgICAgfQorCisgICAgY29uc3QgYXV0byYgW2ZsYWcsIHBhdGhzXSA9ICpyZXN0b3JlY29uX2luZm87CisKICAgICBpbnQgcmV0ID0gMDsKLQotICAgIHN0cnVjdCBmbGFnX3R5cGUge2NvbnN0IGNoYXIqIG5hbWU7IGludCB2YWx1ZTt9OwotICAgIHN0YXRpYyBjb25zdCBmbGFnX3R5cGUgZmxhZ3NbXSA9IHsKLSAgICAgICAgeyItLXJlY3Vyc2l2ZSIsIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1JFQ1VSU0V9LAotICAgICAgICB7Ii0tc2tpcC1jZSIsIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1NLSVBDRX0sCi0gICAgICAgIHsiLS1jcm9zcy1maWxlc3lzdGVtcyIsIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX0NST1NTX0ZJTEVTWVNURU1TfSwKLSAgICAgICAgezAsIDB9Ci0gICAgfTsKLQotICAgIGludCBmbGFnID0gMDsKLQotICAgIGJvb2wgaW5fZmxhZ3MgPSB0cnVlOwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgYXJncy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChhcmdzW2ldLCAiLS0iKSkgewotICAgICAgICAgICAgaWYgKCFpbl9mbGFncykgewotICAgICAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJmbGFncyBtdXN0IHByZWNlZGUgcGF0aHMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGZsYWdzW2pdLm5hbWU7ICsraikgewotICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09IGZsYWdzW2pdLm5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhZyB8PSBmbGFnc1tqXS52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImJhZCBmbGFnICIgPDwgYXJnc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluX2ZsYWdzID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24oYXJnc1tpXS5jX3N0cigpLCBmbGFnKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXQgPSBlcnJubzsKLSAgICAgICAgICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGggOiBwYXRocykgeworICAgICAgICBpZiAoc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24ocGF0aC5jX3N0cigpLCBmbGFnKSA8IDApIHsKKyAgICAgICAgICAgIHJldCA9IGVycm5vOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHJldCkgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAic2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24oKSBmYWlsZWQiOworICAgIGlmIChyZXQpIHJldHVybiBFcnJub0Vycm9ySWdub3JlRW5vZW50KCkgPDwgInNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKCkgZmFpbGVkIjsKICAgICByZXR1cm4ge307CiB9CiAKQEAgLTEwNTYsOSArMTA2OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpIHsKICAgICBhdXRvIHNlcnZpY2UgPSBTZXJ2aWNlOjpNYWtlVGVtcG9yYXJ5T25lc2hvdFNlcnZpY2UoYXJncy5hcmdzKTsKICAgICBpZiAoIXNlcnZpY2UpIHsKLSAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkNvdWxkIG5vdCBjcmVhdGUgZXhlYyBzZXJ2aWNlIjsKKyAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkNvdWxkIG5vdCBjcmVhdGUgZXhlYyBzZXJ2aWNlOiAiIDw8IHNlcnZpY2UuZXJyb3IoKTsKICAgICB9Ci0gICAgc2VydmljZS0+QWRkUmVhcENhbGxiYWNrKFtyZWJvb3RfcmVhc29uXShjb25zdCBzaWdpbmZvX3QmIHNpZ2luZm8pIHsKKyAgICAoKnNlcnZpY2UpLT5BZGRSZWFwQ2FsbGJhY2soW3JlYm9vdF9yZWFzb25dKGNvbnN0IHNpZ2luZm9fdCYgc2lnaW5mbykgewogICAgICAgICBpZiAoc2lnaW5mby5zaV9jb2RlICE9IENMRF9FWElURUQgfHwgc2lnaW5mby5zaV9zdGF0dXMgIT0gMCkgewogICAgICAgICAgICAgLy8gVE9ETyAoYi8xMjI4NTAxMjIpOiBzdXBwb3J0IHRoaXMgaW4gZ3NpCiAgICAgICAgICAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSAmJiAhYW5kcm9pZDo6Z3NpOjpJc0dzaVJ1bm5pbmcoKSkgewpAQCAtMTA3MywxMCArMTA4NSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSk7Ci0gICAgaWYgKGF1dG8gcmVzdWx0ID0gc2VydmljZS0+RXhlY1N0YXJ0KCk7ICFyZXN1bHQpIHsKKyAgICBpZiAoYXV0byByZXN1bHQgPSAoKnNlcnZpY2UpLT5FeGVjU3RhcnQoKTsgIXJlc3VsdCkgewogICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiQ291bGQgbm90IHN0YXJ0IGV4ZWMgc2VydmljZTogIiA8PCByZXN1bHQuZXJyb3IoKTsKICAgICB9Ci0gICAgU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkuQWRkU2VydmljZShzdGQ6Om1vdmUoc2VydmljZSkpOworICAgIFNlcnZpY2VMaXN0OjpHZXRJbnN0YW5jZSgpLkFkZFNlcnZpY2Uoc3RkOjptb3ZlKCpzZXJ2aWNlKSk7CiAgICAgcmV0dXJuIHt9OwogfQogCmRpZmYgLS1naXQgYS9pbml0L2NoZWNrX2J1aWx0aW5zLmNwcCBiL2luaXQvY2hlY2tfYnVpbHRpbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MWYxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbml0L2NoZWNrX2J1aWx0aW5zLmNwcApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIE5vdGUgdGhhdCB0aGVzZSBjaGVjayBmdW5jdGlvbnMgY2Fubm90IGNoZWNrIGV4cGFuZGVkIGFyZ3VtZW50cyBmcm9tIHByb3BlcnRpZXMsIHNpbmNlIHRoZXkgd2lsbAorLy8gbm90IGtub3cgd2hhdCB0aG9zZSBwcm9wZXJ0aWVzIHdvdWxkIGJlIGF0IHJ1bnRpbWUuICBUaGV5IHdpbGwgYmUgcGFzc2VkIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUKKy8vIHNpdHVhdGlvbiB0aGF0IHRoZSBpbnB1dCBsaW5lIGhhZCBhIHByb3BlcnR5IGV4cGFuc2lvbiB3aXRob3V0IGEgZGVmYXVsdCB2YWx1ZSwgc2luY2UgYW4gZW1wdHkKKy8vIHN0cmluZyBpcyBvdGhlcndpc2UgYW4gaW1wb3NzaWJsZSB2YWx1ZS4gIFRoZXkgc2hvdWxkIHRoZXJlZm9yZSBkaXNyZWdhcmQgY2hlY2tpbmcgZW1wdHkKKy8vIGFyZ3VtZW50cy4KKworI2luY2x1ZGUgImNoZWNrX2J1aWx0aW5zLmgiCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorCisjaW5jbHVkZSAiYnVpbHRpbl9hcmd1bWVudHMuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2VfdXRpbHMuaCIKKyNpbmNsdWRlICJybGltaXRfcGFyc2VyLmgiCisjaW5jbHVkZSAic2VydmljZS5oIgorI2luY2x1ZGUgInV0aWwuaCIKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UGFyc2VJbnQ7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoOworCisjZGVmaW5lIFJldHVybklmQW55QXJnc0VtcHR5KCkgICAgIFwKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IGFyZ3MpIHsgXAorICAgICAgICBpZiAoYXJnLmVtcHR5KCkpIHsgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4ge307ICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGluaXQgeworCitSZXN1bHQ8dm9pZD4gY2hlY2tfY2hvd24oY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgeworICAgIGlmICghYXJnc1sxXS5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gdWlkID0gRGVjb2RlVWlkKGFyZ3NbMV0pOworICAgICAgICBpZiAoIXVpZCkgeworICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIlVuYWJsZSB0byBkZWNvZGUgVUlEIGZvciAnIiA8PCBhcmdzWzFdIDw8ICInOiAiIDw8IHVpZC5lcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gR0lEIGlzIG9wdGlvbmFsIGFuZCBwdXNoZXMgdGhlIGluZGV4IG9mIHBhdGggb3V0IGJ5IG9uZSBpZiBzcGVjaWZpZWQuCisgICAgaWYgKGFyZ3Muc2l6ZSgpID09IDQgJiYgIWFyZ3NbMl0uZW1wdHkoKSkgeworICAgICAgICBhdXRvIGdpZCA9IERlY29kZVVpZChhcmdzWzJdKTsKKyAgICAgICAgaWYgKCFnaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmFibGUgdG8gZGVjb2RlIEdJRCBmb3IgJyIgPDwgYXJnc1syXSA8PCAiJzogIiA8PCBnaWQuZXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB7fTsKK30KKworUmVzdWx0PHZvaWQ+IGNoZWNrX2V4ZWMoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgeworICAgIFJldHVybklmQW55QXJnc0VtcHR5KCk7CisKKyAgICBhdXRvIHJlc3VsdCA9IFNlcnZpY2U6Ok1ha2VUZW1wb3JhcnlPbmVzaG90U2VydmljZShhcmdzLmFyZ3MpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIHJldHVybiByZXN1bHQuZXJyb3IoKTsKKyAgICB9CisKKyAgICByZXR1cm4ge307Cit9CisKK1Jlc3VsdDx2b2lkPiBjaGVja19leGVjX2JhY2tncm91bmQoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgeworICAgIHJldHVybiBjaGVja19leGVjKHN0ZDo6bW92ZShhcmdzKSk7Cit9CisKK1Jlc3VsdDx2b2lkPiBjaGVja19pbnRlcmZhY2VfcmVzdGFydChjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CisgICAgaWYgKGF1dG8gcmVzdWx0ID0gSXNLbm93bkludGVyZmFjZShhcmdzWzFdKTsgIXJlc3VsdCkgeworICAgICAgICByZXR1cm4gcmVzdWx0LmVycm9yKCk7CisgICAgfQorICAgIHJldHVybiB7fTsKK30KKworUmVzdWx0PHZvaWQ+IGNoZWNrX2ludGVyZmFjZV9zdGFydChjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CisgICAgcmV0dXJuIGNoZWNrX2ludGVyZmFjZV9yZXN0YXJ0KHN0ZDo6bW92ZShhcmdzKSk7Cit9CisKK1Jlc3VsdDx2b2lkPiBjaGVja19pbnRlcmZhY2Vfc3RvcChjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CisgICAgcmV0dXJuIGNoZWNrX2ludGVyZmFjZV9yZXN0YXJ0KHN0ZDo6bW92ZShhcmdzKSk7Cit9CisKK1Jlc3VsdDx2b2lkPiBjaGVja19sb2FkX3N5c3RlbV9wcm9wcyhjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CisgICAgcmV0dXJuIEVycm9yKCkgPDwgIidsb2FkX3N5c3RlbV9wcm9wcycgaXMgZGVwcmVjYXRlZCI7Cit9CisKK1Jlc3VsdDx2b2lkPiBjaGVja19sb2dsZXZlbChjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CisgICAgUmV0dXJuSWZBbnlBcmdzRW1wdHkoKTsKKworICAgIGludCBsb2dfbGV2ZWwgPSAtMTsKKyAgICBQYXJzZUludChhcmdzWzFdLCAmbG9nX2xldmVsKTsKKyAgICBpZiAobG9nX2xldmVsIDwgMCB8fCBsb2dfbGV2ZWwgPiA3KSB7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJsb2dsZXZlbCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiAwLTciOworICAgIH0KKyAgICByZXR1cm4ge307Cit9CisKK1Jlc3VsdDx2b2lkPiBjaGVja19ta2Rpcihjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDQpIHsKKyAgICAgICAgaWYgKCFhcmdzWzNdLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGF1dG8gdWlkID0gRGVjb2RlVWlkKGFyZ3NbM10pOworICAgICAgICAgICAgaWYgKCF1aWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiVW5hYmxlIHRvIGRlY29kZSBVSUQgZm9yICciIDw8IGFyZ3NbM10gPDwgIic6ICIgPDwgdWlkLmVycm9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXJncy5zaXplKCkgPT0gNSAmJiAhYXJnc1s0XS5lbXB0eSgpKSB7CisgICAgICAgICAgICBhdXRvIGdpZCA9IERlY29kZVVpZChhcmdzWzRdKTsKKyAgICAgICAgICAgIGlmICghZ2lkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIlVuYWJsZSB0byBkZWNvZGUgR0lEIGZvciAnIiA8PCBhcmdzWzRdIDw8ICInOiAiIDw8IGdpZC5lcnJvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHt9OworfQorCitSZXN1bHQ8dm9pZD4gY2hlY2tfcmVzdG9yZWNvbihjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CisgICAgUmV0dXJuSWZBbnlBcmdzRW1wdHkoKTsKKworICAgIGF1dG8gcmVzdG9yZWNvbl9pbmZvID0gUGFyc2VSZXN0b3JlY29uKGFyZ3MuYXJncyk7CisgICAgaWYgKCFyZXN0b3JlY29uX2luZm8pIHsKKyAgICAgICAgcmV0dXJuIHJlc3RvcmVjb25faW5mby5lcnJvcigpOworICAgIH0KKworICAgIHJldHVybiB7fTsKK30KKworUmVzdWx0PHZvaWQ+IGNoZWNrX3Jlc3RvcmVjb25fcmVjdXJzaXZlKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgICByZXR1cm4gY2hlY2tfcmVzdG9yZWNvbihzdGQ6Om1vdmUoYXJncykpOworfQorCitSZXN1bHQ8dm9pZD4gY2hlY2tfc2V0cHJvcChjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgPSBhcmdzWzFdOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgPSBhcmdzWzJdOworCisgICAgaWYgKCFJc0xlZ2FsUHJvcGVydHlOYW1lKG5hbWUpKSB7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICInIiA8PCBuYW1lIDw8ICInIGlzIG5vdCBhIGxlZ2FsIHByb3BlcnR5IG5hbWUiOworICAgIH0KKworICAgIGlmICghdmFsdWUuZW1wdHkoKSkgeworICAgICAgICBpZiAoYXV0byByZXN1bHQgPSBJc0xlZ2FsUHJvcGVydHlWYWx1ZShuYW1lLCB2YWx1ZSk7ICFyZXN1bHQpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuZXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChTdGFydHNXaXRoKG5hbWUsICJjdGwuIikpIHsKKyAgICAgICAgcmV0dXJuIEVycm9yKCkKKyAgICAgICAgICAgICAgIDw8ICJEbyBub3Qgc2V0IGN0bC4gcHJvcGVydGllcyBmcm9tIGluaXQ7IGNhbGwgdGhlIFNlcnZpY2UgZnVuY3Rpb25zIGRpcmVjdGx5IjsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIga1Jlc3RvcmVjb25Qcm9wZXJ0eVtdID0gInNlbGludXgucmVzdG9yZWNvbl9yZWN1cnNpdmUiOworICAgIGlmIChuYW1lID09IGtSZXN0b3JlY29uUHJvcGVydHkpIHsKKyAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkRvIG5vdCBzZXQgJyIgPDwga1Jlc3RvcmVjb25Qcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJyBmcm9tIGluaXQ7IHVzZSB0aGUgcmVzdG9yZWNvbiBidWlsdGluIGRpcmVjdGx5IjsKKyAgICB9CisKKyAgICByZXR1cm4ge307Cit9CisKK1Jlc3VsdDx2b2lkPiBjaGVja19zZXRybGltaXQoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgeworICAgIFJldHVybklmQW55QXJnc0VtcHR5KCk7CisKKyAgICBhdXRvIHJsaW1pdCA9IFBhcnNlUmxpbWl0KGFyZ3MuYXJncyk7CisgICAgaWYgKCFybGltaXQpIHJldHVybiBybGltaXQuZXJyb3IoKTsKKyAgICByZXR1cm4ge307Cit9CisKK1Jlc3VsdDx2b2lkPiBjaGVja19zeXNjbGt0eihjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CisgICAgUmV0dXJuSWZBbnlBcmdzRW1wdHkoKTsKKworICAgIHN0cnVjdCB0aW1lem9uZSB0eiA9IHt9OworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VJbnQoYXJnc1sxXSwgJnR6LnR6X21pbnV0ZXN3ZXN0KSkgeworICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiVW5hYmxlIHRvIHBhcnNlIG1pbnNfd2VzdF9vZl9nbXQiOworICAgIH0KKyAgICByZXR1cm4ge307Cit9CisKK1Jlc3VsdDx2b2lkPiBjaGVja193YWl0KGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgICBpZiAoYXJncy5zaXplKCkgPT0gMyAmJiAhYXJnc1syXS5lbXB0eSgpKSB7CisgICAgICAgIGludCB0aW1lb3V0X2ludDsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludChhcmdzWzJdLCAmdGltZW91dF9pbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiZmFpbGVkIHRvIHBhcnNlIHRpbWVvdXQiOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB7fTsKK30KKworUmVzdWx0PHZvaWQ+IGNoZWNrX3dhaXRfZm9yX3Byb3AoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgeworICAgIHJldHVybiBjaGVja19zZXRwcm9wKHN0ZDo6bW92ZShhcmdzKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbml0Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5pdC9jaGVja19idWlsdGlucy5oIGIvaW5pdC9jaGVja19idWlsdGlucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjBkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbml0L2NoZWNrX2J1aWx0aW5zLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYnVpbHRpbl9hcmd1bWVudHMuaCIKKyNpbmNsdWRlICJyZXN1bHQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGluaXQgeworCitSZXN1bHQ8dm9pZD4gY2hlY2tfY2hvd24oY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncyk7CitSZXN1bHQ8dm9pZD4gY2hlY2tfZXhlYyhjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKTsKK1Jlc3VsdDx2b2lkPiBjaGVja19leGVjX2JhY2tncm91bmQoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncyk7CitSZXN1bHQ8dm9pZD4gY2hlY2tfaW50ZXJmYWNlX3Jlc3RhcnQoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncyk7CitSZXN1bHQ8dm9pZD4gY2hlY2tfaW50ZXJmYWNlX3N0YXJ0KGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpOworUmVzdWx0PHZvaWQ+IGNoZWNrX2ludGVyZmFjZV9zdG9wKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpOworUmVzdWx0PHZvaWQ+IGNoZWNrX2xvYWRfc3lzdGVtX3Byb3BzKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpOworUmVzdWx0PHZvaWQ+IGNoZWNrX2xvZ2xldmVsKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpOworUmVzdWx0PHZvaWQ+IGNoZWNrX21rZGlyKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpOworUmVzdWx0PHZvaWQ+IGNoZWNrX3Jlc3RvcmVjb24oY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncyk7CitSZXN1bHQ8dm9pZD4gY2hlY2tfcmVzdG9yZWNvbl9yZWN1cnNpdmUoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncyk7CitSZXN1bHQ8dm9pZD4gY2hlY2tfc2V0cHJvcChjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKTsKK1Jlc3VsdDx2b2lkPiBjaGVja19zZXRybGltaXQoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncyk7CitSZXN1bHQ8dm9pZD4gY2hlY2tfc3lzY2xrdHooY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncyk7CitSZXN1bHQ8dm9pZD4gY2hlY2tfd2FpdChjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKTsKK1Jlc3VsdDx2b2lkPiBjaGVja193YWl0X2Zvcl9wcm9wKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpOworCit9ICAvLyBuYW1lc3BhY2UgaW5pdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luaXQvaG9zdF9idWlsdGluX21hcC5weSBiL2luaXQvaG9zdF9idWlsdGluX21hcC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YWZjYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5pdC9ob3N0X2J1aWx0aW5fbWFwLnB5CkBAIC0wLDAgKzEsNDYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiR2VuZXJhdGVzIHRoZSBidWlsdGlucyBtYXAgdG8gYmUgdXNlZCBieSBob3N0X2luaXRfdmVyaWZpZXIuCisKK0l0IGNvcGllcyB0aGUgYnVpbHRpbiBmdW5jdGlvbiBtYXAgZnJvbSBidWlsdGlucy5jcHAsIHRoZW4gcmVwbGFjZXMgZG9feHh4KCkgZnVuY3Rpb25zIHdpdGggdGhlCitlcXVpdmFsZW50IGNoZWNrX3h4eCgpIGlmIGZvdW5kIGluIGNoZWNrX2J1aWx0aW5zLmNwcC4KKworIiIiCisKK2ltcG9ydCByZQoraW1wb3J0IGFyZ3BhcnNlCisKK3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCdob3N0X2J1aWx0aW5fbWFwLnB5JykKK3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYnVpbHRpbnMnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdQYXRoIHRvIGJ1aWx0aW5zLmNwcCcpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNoZWNrX2J1aWx0aW5zJywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nUGF0aCB0byBjaGVja19idWlsdGlucy5jcHAnKQorYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworQ0hFQ0tfUkVHRVggPSByZS5jb21waWxlKHInLitjaGVja18oXFMrKVwoLisnKQorY2hlY2tfZnVuY3Rpb25zID0gW10KK3dpdGggb3BlbihhcmdzLmNoZWNrX2J1aWx0aW5zKSBhcyBjaGVja19maWxlOgorICBmb3IgbGluZSBpbiBjaGVja19maWxlOgorICAgIG1hdGNoID0gQ0hFQ0tfUkVHRVgubWF0Y2gobGluZSkKKyAgICBpZiBtYXRjaDoKKyAgICAgIGNoZWNrX2Z1bmN0aW9ucy5hcHBlbmQobWF0Y2guZ3JvdXAoMSkpCisKK2Z1bmN0aW9uX21hcCA9IFtdCit3aXRoIG9wZW4oYXJncy5idWlsdGlucykgYXMgYnVpbHRpbnNfZmlsZToKKyAgaW5fZnVuY3Rpb25fbWFwID0gRmFsc2UKKyAgZm9yIGxpbmUgaW4gYnVpbHRpbnNfZmlsZToKKyAgICBpZiAnLy8gQnVpbHRpbi1mdW5jdGlvbi1tYXAgc3RhcnQnIGluIGxpbmU6CisgICAgICBpbl9mdW5jdGlvbl9tYXAgPSBUcnVlCisgICAgZWxpZiAnLy8gQnVpbHRpbi1mdW5jdGlvbi1tYXAgZW5kJyBpbiBsaW5lOgorICAgICAgaW5fZnVuY3Rpb25fbWFwID0gRmFsc2UKKyAgICBlbGlmIGluX2Z1bmN0aW9uX21hcDoKKyAgICAgIGZ1bmN0aW9uX21hcC5hcHBlbmQobGluZSkKKworRE9fUkVHRVggPSByZS5jb21waWxlKHInLitkb18oW15cfV0rKS4rJykKK0ZVTkNUSU9OX1JFR0VYID0gcmUuY29tcGlsZShyJyhkb19bXlx9XSspJykKK2ZvciBsaW5lIGluIGZ1bmN0aW9uX21hcDoKKyAgbWF0Y2ggPSBET19SRUdFWC5tYXRjaChsaW5lKQorICBpZiBtYXRjaDoKKyAgICBpZiBtYXRjaC5ncm91cCgxKSBpbiBjaGVja19mdW5jdGlvbnM6CisgICAgICBwcmludCBsaW5lLnJlcGxhY2UoJ2RvXycsICdjaGVja18nKSwKKyAgICBlbHNlOgorICAgICAgcHJpbnQgRlVOQ1RJT05fUkVHRVguc3ViKCdjaGVja19zdHViJywgbGluZSksCisgIGVsc2U6CisgICAgcHJpbnQgbGluZSwKZGlmZiAtLWdpdCBhL2luaXQvaG9zdF9pbml0X3N0dWJzLmggYi9pbml0L2hvc3RfaW5pdF9zdHVicy5oCmluZGV4IDdjMDU0NGEuLmY5YTA4YTUgMTAwNjQ0Ci0tLSBhL2luaXQvaG9zdF9pbml0X3N0dWJzLmgKKysrIGIvaW5pdC9ob3N0X2luaXRfc3R1YnMuaApAQCAtMjYsNiArMjYsNyBAQAogCiAvLyBhbmRyb2lkL2FwaS1sZXZlbC5oCiAjZGVmaW5lIF9fQU5EUk9JRF9BUElfUF9fIDI4CisjZGVmaW5lIF9fQU5EUk9JRF9BUElfUl9fIDMwCiAKIC8vIHN5cy9zeXN0ZW1fcHJvcGVydGllcy5oCiAjZGVmaW5lIFBST1BfVkFMVUVfTUFYIDkyCmRpZmYgLS1naXQgYS9pbml0L2hvc3RfaW5pdF92ZXJpZmllci5jcHAgYi9pbml0L2hvc3RfaW5pdF92ZXJpZmllci5jcHAKaW5kZXggZGZkZTUxYi4uYjI0MDJiMyAxMDA2NDQKLS0tIGEvaW5pdC9ob3N0X2luaXRfdmVyaWZpZXIuY3BwCisrKyBiL2luaXQvaG9zdF9pbml0X3ZlcmlmaWVyLmNwcApAQCAtMzAsMTMgKzMwLDE0IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgotI2luY2x1ZGUgPGpzb24vanNvbi5oPgogCiAjaW5jbHVkZSAiYWN0aW9uLmgiCiAjaW5jbHVkZSAiYWN0aW9uX21hbmFnZXIuaCIKICNpbmNsdWRlICJhY3Rpb25fcGFyc2VyLmgiCisjaW5jbHVkZSAiY2hlY2tfYnVpbHRpbnMuaCIKICNpbmNsdWRlICJob3N0X2ltcG9ydF9wYXJzZXIuaCIKICNpbmNsdWRlICJob3N0X2luaXRfc3R1YnMuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2VfdXRpbHMuaCIKICNpbmNsdWRlICJwYXJzZXIuaCIKICNpbmNsdWRlICJyZXN1bHQuaCIKICNpbmNsdWRlICJzZXJ2aWNlLmgiCkBAIC0xMzEsNTEgKzEzMiwyMiBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCi1zdGF0aWMgc3RkOjpvcHRpb25hbDxhbmRyb2lkOjppbml0OjpJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeU1hcD4KLVJlYWRJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeShjb25zdCBzdGQ6OnN0cmluZyYgaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV9maWxlKSB7Ci0gICAgaWYgKGludGVyZmFjZV9pbmhlcml0YW5jZV9oaWVyYXJjaHlfZmlsZS5lbXB0eSgpKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTWlzc2luZyBhbiBpbnRlcmZhY2UgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGZpbGUuIjsKLSAgICAgICAgcmV0dXJuIHt9OwotICAgIH0KLQotICAgIEpzb246OlZhbHVlIHJvb3Q7Ci0gICAgSnNvbjo6UmVhZGVyIHJlYWRlcjsKLSAgICBzdGQ6Omlmc3RyZWFtIHN0cmVhbShpbnRlcmZhY2VfaW5oZXJpdGFuY2VfaGllcmFyY2h5X2ZpbGUpOwotICAgIGlmICghcmVhZGVyLnBhcnNlKHN0cmVhbSwgcm9vdCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgaW50ZXJmYWNlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBmaWxlOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV9maWxlIDw8ICJcbiIKLSAgICAgICAgICAgICAgICAgICA8PCByZWFkZXIuZ2V0Rm9ybWF0dGVkRXJyb3JNZXNzYWdlcygpOwotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotCi0gICAgYW5kcm9pZDo6aW5pdDo6SW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHlNYXAgcmVzdWx0OwotICAgIGZvciAoY29uc3QgSnNvbjo6VmFsdWUmIGVudHJ5IDogcm9vdCkgewotICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gaW5oZXJpdGVkX2ludGVyZmFjZXM7Ci0gICAgICAgIGZvciAoY29uc3QgSnNvbjo6VmFsdWUmIGludGYgOiBlbnRyeVsiaW5oZXJpdGVkSW50ZXJmYWNlcyJdKSB7Ci0gICAgICAgICAgICBpbmhlcml0ZWRfaW50ZXJmYWNlcy5pbnNlcnQoaW50Zi5hc1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHRbZW50cnlbImludGVyZmFjZSJdLmFzU3RyaW5nKCldID0gaW5oZXJpdGVkX2ludGVyZmFjZXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewogCi1zdGF0aWMgUmVzdWx0PHZvaWQ+IGRvX3N0dWIoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgeworc3RhdGljIFJlc3VsdDx2b2lkPiBjaGVja19zdHViKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpIHsKICAgICByZXR1cm4ge307CiB9CiAKICNpbmNsdWRlICJnZW5lcmF0ZWRfc3R1Yl9idWlsdGluX2Z1bmN0aW9uX21hcC5oIgogCiB2b2lkIFByaW50VXNhZ2UoKSB7Ci0gICAgc3RkOjpjb3V0IDw8ICJ1c2FnZTogaG9zdF9pbml0X3ZlcmlmaWVyIFstcCBGSUxFXSAtayBGSUxFIDxpbml0IHJjIGZpbGU+XG4iCisgICAgc3RkOjpjb3V0IDw8ICJ1c2FnZTogaG9zdF9pbml0X3ZlcmlmaWVyIFstcCBGSUxFXSAtaSBGSUxFIDxpbml0IHJjIGZpbGU+XG4iCiAgICAgICAgICAgICAgICAgICJcbiIKICAgICAgICAgICAgICAgICAgIlRlc3RzIGFuIGluaXQgc2NyaXB0IGZvciBjb3JyZWN0bmVzc1xuIgogICAgICAgICAgICAgICAgICAiXG4iCiAgICAgICAgICAgICAgICAgICItcCBGSUxFXHRTZWFyY2ggdGhpcyBwYXNzd2QgZmlsZSBmb3IgdXNlcnMgYW5kIGdyb3Vwc1xuIgotICAgICAgICAgICAgICAgICAiLWsgRklMRVx0VXNlIHRoaXMgZmlsZSBhcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGtub3duIGludGVyZmFjZXNcbiIKKyAgICAgICAgICAgICAgICAgIi1pIEZJTEVcdFBhcnNlIHRoaXMgSlNPTiBmaWxlIGZvciB0aGUgSElETCBpbnRlcmZhY2UgaW5oZXJpdGFuY2UgaGllcmFyY2h5XG4iCiAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKIH0KIApAQCAtMjE2LDIxICsxODgsMjYgQEAKICAgICBhcmdjIC09IG9wdGluZDsKICAgICBhcmd2ICs9IG9wdGluZDsKIAotICAgIGlmIChhcmdjICE9IDEpIHsKKyAgICBpZiAoYXJnYyAhPSAxIHx8IGludGVyZmFjZV9pbmhlcml0YW5jZV9oaWVyYXJjaHlfZmlsZS5lbXB0eSgpKSB7CiAgICAgICAgIFByaW50VXNhZ2UoKTsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9CiAKKyAgICBhdXRvIGludGVyZmFjZV9pbmhlcml0YW5jZV9oaWVyYXJjaHlfbWFwID0KKyAgICAgICAgICAgIFJlYWRJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeShpbnRlcmZhY2VfaW5oZXJpdGFuY2VfaGllcmFyY2h5X2ZpbGUpOworICAgIGlmICghaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV9tYXApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCBpbnRlcmZhY2VfaW5oZXJpdGFuY2VfaGllcmFyY2h5X21hcC5lcnJvcigpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBTZXRLbm93bkludGVyZmFjZXMoKmludGVyZmFjZV9pbmhlcml0YW5jZV9oaWVyYXJjaHlfbWFwKTsKKwogICAgIGNvbnN0IEJ1aWx0aW5GdW5jdGlvbk1hcCYgZnVuY3Rpb25fbWFwID0gR2V0QnVpbHRpbkZ1bmN0aW9uTWFwKCk7CiAgICAgQWN0aW9uOjpzZXRfZnVuY3Rpb25fbWFwKCZmdW5jdGlvbl9tYXApOwogICAgIEFjdGlvbk1hbmFnZXImIGFtID0gQWN0aW9uTWFuYWdlcjo6R2V0SW5zdGFuY2UoKTsKICAgICBTZXJ2aWNlTGlzdCYgc2wgPSBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKTsKICAgICBQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5BZGRTZWN0aW9uUGFyc2VyKAotICAgICAgICAgICAgInNlcnZpY2UiLAotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxTZXJ2aWNlUGFyc2VyPigKLSAgICAgICAgICAgICAgICAgICAgJnNsLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICBSZWFkSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHkoaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV9maWxlKSkpOworICAgIHBhcnNlci5BZGRTZWN0aW9uUGFyc2VyKCJzZXJ2aWNlIiwgc3RkOjptYWtlX3VuaXF1ZTxTZXJ2aWNlUGFyc2VyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsLCBudWxscHRyLCAqaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV9tYXApKTsKICAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigib24iLCBzdGQ6Om1ha2VfdW5pcXVlPEFjdGlvblBhcnNlcj4oJmFtLCBudWxscHRyKSk7CiAgICAgcGFyc2VyLkFkZFNlY3Rpb25QYXJzZXIoImltcG9ydCIsIHN0ZDo6bWFrZV91bmlxdWU8SG9zdEltcG9ydFBhcnNlcj4oKSk7CiAKQEAgLTIzOCw5ICsyMTUsMTAgQEAKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gaW5pdCByYyBzY3JpcHQgJyIgPDwgKmFyZ3YgPDwgIiciOwogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0KLSAgICBpZiAocGFyc2VyLnBhcnNlX2Vycm9yX2NvdW50KCkgPiAwKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBwYXJzZSBpbml0IHNjcmlwdCAnIiA8PCAqYXJndiA8PCAiJyB3aXRoICIKLSAgICAgICAgICAgICAgICAgICA8PCBwYXJzZXIucGFyc2VfZXJyb3JfY291bnQoKSA8PCAiIGVycm9ycyI7CisgICAgc2l6ZV90IGZhaWx1cmVzID0gcGFyc2VyLnBhcnNlX2Vycm9yX2NvdW50KCkgKyBhbS5DaGVja0FsbENvbW1hbmRzKCkgKyBzbC5DaGVja0FsbENvbW1hbmRzKCk7CisgICAgaWYgKGZhaWx1cmVzID4gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcGFyc2UgaW5pdCBzY3JpcHQgJyIgPDwgKmFyZ3YgPDwgIicgd2l0aCAiIDw8IGZhaWx1cmVzCisgICAgICAgICAgICAgICAgICAgPDwgIiBlcnJvcnMiOwogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0KICAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvaW5pdC9pbXBvcnRfcGFyc2VyLmNwcCBiL2luaXQvaW1wb3J0X3BhcnNlci5jcHAKaW5kZXggYzcyYjdkNi4uMWE0MzUwOCAxMDA2NDQKLS0tIGEvaW5pdC9pbXBvcnRfcGFyc2VyLmNwcAorKysgYi9pbml0L2ltcG9ydF9wYXJzZXIuY3BwCkBAIC0yOSwxNSArMjksMTQgQEAKICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgInNpbmdsZSBhcmd1bWVudCBuZWVkZWQgZm9yIGltcG9ydFxuIjsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBjb25mX2ZpbGU7Ci0gICAgYm9vbCByZXQgPSBleHBhbmRfcHJvcHMoYXJnc1sxXSwgJmNvbmZfZmlsZSk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImVycm9yIHdoaWxlIGV4cGFuZGluZyBpbXBvcnQiOworICAgIGF1dG8gY29uZl9maWxlID0gRXhwYW5kUHJvcHMoYXJnc1sxXSk7CisgICAgaWYgKCFjb25mX2ZpbGUpIHsKKyAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkNvdWxkIG5vdCBleHBhbmQgaW1wb3J0OiAiIDw8IGNvbmZfZmlsZS5lcnJvcigpOwogICAgIH0KIAotICAgIExPRyhJTkZPKSA8PCAiQWRkZWQgJyIgPDwgY29uZl9maWxlIDw8ICInIHRvIGltcG9ydCBsaXN0IjsKKyAgICBMT0coSU5GTykgPDwgIkFkZGVkICciIDw8ICpjb25mX2ZpbGUgPDwgIicgdG8gaW1wb3J0IGxpc3QiOwogICAgIGlmIChmaWxlbmFtZV8uZW1wdHkoKSkgZmlsZW5hbWVfID0gZmlsZW5hbWU7Ci0gICAgaW1wb3J0c18uZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjb25mX2ZpbGUpLCBsaW5lKTsKKyAgICBpbXBvcnRzXy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKCpjb25mX2ZpbGUpLCBsaW5lKTsKICAgICByZXR1cm4ge307CiB9CiAKZGlmZiAtLWdpdCBhL2luaXQvaW50ZXJmYWNlX3V0aWxzLmNwcCBiL2luaXQvaW50ZXJmYWNlX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQ4NjBmCi0tLSAvZGV2L251bGwKKysrIGIvaW5pdC9pbnRlcmZhY2VfdXRpbHMuY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImludGVyZmFjZV91dGlscy5oIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxoaWRsLXV0aWwvRnFJbnN0YW5jZS5oPgorI2luY2x1ZGUgPGpzb24vanNvbi5oPgorCit1c2luZyBhbmRyb2lkOjpGcUluc3RhbmNlOwordXNpbmcgYW5kcm9pZDo6RlFOYW1lOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6RXJyb3I7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbml0IHsKKworbmFtZXNwYWNlIHsKKworc3RkOjpzdHJpbmcgRlFOYW1lc1RvU3RyaW5nKGNvbnN0IHN0ZDo6c2V0PEZRTmFtZT4mIGZxbmFtZXMpIHsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gZnFuYW1lX3N0cmluZ3M7CisgICAgZm9yIChjb25zdCBGUU5hbWUmIGZxbmFtZSA6IGZxbmFtZXMpIHsKKyAgICAgICAgZnFuYW1lX3N0cmluZ3MuaW5zZXJ0KGZxbmFtZS5zdHJpbmcoKSk7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpKb2luKGZxbmFtZV9zdHJpbmdzLCAiICIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworUmVzdWx0PEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwPiBSZWFkSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHkoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgSnNvbjo6VmFsdWUgcm9vdDsKKyAgICBKc29uOjpSZWFkZXIgcmVhZGVyOworICAgIHN0ZDo6aWZzdHJlYW0gc3RyZWFtKHBhdGgpOworICAgIGlmICghcmVhZGVyLnBhcnNlKHN0cmVhbSwgcm9vdCkpIHsKKyAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkZhaWxlZCB0byByZWFkIGludGVyZmFjZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgZmlsZTogIiA8PCBwYXRoIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcmVhZGVyLmdldEZvcm1hdHRlZEVycm9yTWVzc2FnZXMoKTsKKyAgICB9CisKKyAgICBJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeU1hcCByZXN1bHQ7CisgICAgZm9yIChjb25zdCBKc29uOjpWYWx1ZSYgZW50cnkgOiByb290KSB7CisgICAgICAgIHN0ZDo6c2V0PEZRTmFtZT4gaW5oZXJpdGVkX2ludGVyZmFjZXM7CisgICAgICAgIGZvciAoY29uc3QgSnNvbjo6VmFsdWUmIGludGYgOiBlbnRyeVsiaW5oZXJpdGVkSW50ZXJmYWNlcyJdKSB7CisgICAgICAgICAgICBGUU5hbWUgZnFuYW1lOworICAgICAgICAgICAgaWYgKCFmcW5hbWUuc2V0VG8oaW50Zi5hc1N0cmluZygpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmFibGUgdG8gcGFyc2UgaW50ZXJmYWNlICciIDw8IGludGYuYXNTdHJpbmcoKSA8PCAiJyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmhlcml0ZWRfaW50ZXJmYWNlcy5pbnNlcnQoZnFuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBpbnRmX3N0cmluZyA9IGVudHJ5WyJpbnRlcmZhY2UiXS5hc1N0cmluZygpOworICAgICAgICBGUU5hbWUgZnFuYW1lOworICAgICAgICBpZiAoIWZxbmFtZS5zZXRUbyhpbnRmX3N0cmluZykpIHsKKyAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmFibGUgdG8gcGFyc2UgaW50ZXJmYWNlICciIDw8IGludGZfc3RyaW5nIDw8ICInIjsKKyAgICAgICAgfQorICAgICAgICByZXN1bHRbZnFuYW1lXSA9IGluaGVyaXRlZF9pbnRlcmZhY2VzOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1Jlc3VsdDx2b2lkPiBDaGVja0ludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5KGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHlNYXAmIGhpZXJhcmNoeSkgeworICAgIHN0ZDo6c2V0PEZRTmFtZT4gaW50ZXJmYWNlX2ZxbmFtZXM7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgaW5zdGFuY2UgOiBpbnN0YW5jZXMpIHsKKyAgICAgICAgRnFJbnN0YW5jZSBmcWluc3RhbmNlOworICAgICAgICBpZiAoIWZxaW5zdGFuY2Uuc2V0VG8oaW5zdGFuY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiVW5hYmxlIHRvIHBhcnNlIGludGVyZmFjZSBpbnN0YW5jZSAnIiA8PCBpbnN0YW5jZSA8PCAiJyI7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJmYWNlX2ZxbmFtZXMuaW5zZXJ0KGZxaW5zdGFuY2UuZ2V0RnFOYW1lKCkpOworICAgIH0KKyAgICByZXR1cm4gQ2hlY2tJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeShpbnRlcmZhY2VfZnFuYW1lcywgaGllcmFyY2h5KTsKK30KKworUmVzdWx0PHZvaWQ+IENoZWNrSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHkoY29uc3Qgc3RkOjpzZXQ8RlFOYW1lPiYgaW50ZXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwJiBoaWVyYXJjaHkpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gZXJyb3Jfc3RyZWFtOworICAgIGZvciAoY29uc3QgRlFOYW1lJiBpbnRmIDogaW50ZXJmYWNlcykgeworICAgICAgICBpZiAoaGllcmFyY2h5LmNvdW50KGludGYpID09IDApIHsKKyAgICAgICAgICAgIGVycm9yX3N0cmVhbSA8PCAiXG5JbnRlcmZhY2UgaXMgbm90IGluIHRoZSBrbm93biBzZXQgb2YgaGlkbF9pbnRlcmZhY2VzOiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGludGYuc3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJy4gUGxlYXNlIGVuc3VyZSB0aGUgaW50ZXJmYWNlIGlzIHNwZWxsZWQgY29ycmVjdGx5IGFuZCBidWlsdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImJ5IGEgaGlkbF9pbnRlcmZhY2UgdGFyZ2V0LiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzdGQ6OnNldDxGUU5hbWU+JiByZXF1aXJlZF9pbnRlcmZhY2VzID0gaGllcmFyY2h5LmF0KGludGYpOworICAgICAgICBzdGQ6OnNldDxGUU5hbWU+IGRpZmY7CisgICAgICAgIHN0ZDo6c2V0X2RpZmZlcmVuY2UocmVxdWlyZWRfaW50ZXJmYWNlcy5iZWdpbigpLCByZXF1aXJlZF9pbnRlcmZhY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZXMuYmVnaW4oKSwgaW50ZXJmYWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omluc2VydGVyKGRpZmYsIGRpZmYuYmVnaW4oKSkpOworICAgICAgICBpZiAoIWRpZmYuZW1wdHkoKSkgeworICAgICAgICAgICAgZXJyb3Jfc3RyZWFtIDw8ICJcbkludGVyZmFjZSAnIiA8PCBpbnRmLnN0cmluZygpIDw8ICInIHJlcXVpcmVzIGl0cyBmdWxsIGluaGVyaXRhbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGllcmFyY2h5IHRvIGJlIGxpc3RlZCBpbiB0aGlzIGluaXRfcmMgZmlsZS4gTWlzc2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImludGVyZmFjZXM6IFsiIDw8IEZRTmFtZXNUb1N0cmluZyhkaWZmKSA8PCAiXSI7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9ycyA9IGVycm9yX3N0cmVhbS5zdHIoKTsKKyAgICBpZiAoIWVycm9ycy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8IGVycm9yczsKKyAgICB9CisKKyAgICByZXR1cm4ge307Cit9CisKK3N0ZDo6b3B0aW9uYWw8c3RkOjpzZXQ8RlFOYW1lPj4ga25vd25faW50ZXJmYWNlczsKKwordm9pZCBTZXRLbm93bkludGVyZmFjZXMoY29uc3QgSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHlNYXAmIGhpZXJhcmNoeSkgeworICAgIGtub3duX2ludGVyZmFjZXMgPSBzdGQ6OnNldDxGUU5hbWU+KCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBbaW50ZiwgaW5oZXJpdGVkX2ludGVyZmFjZXNdIDogaGllcmFyY2h5KSB7CisgICAgICAgIGtub3duX2ludGVyZmFjZXMtPmluc2VydChpbnRmKTsKKyAgICB9Cit9CisKK1Jlc3VsdDx2b2lkPiBJc0tub3duSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnN0YW5jZSkgeworICAgIEZxSW5zdGFuY2UgZnFpbnN0YW5jZTsKKyAgICBpZiAoIWZxaW5zdGFuY2Uuc2V0VG8oaW5zdGFuY2UpKSB7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmFibGUgdG8gcGFyc2UgaW50ZXJmYWNlIGluc3RhbmNlICciIDw8IGluc3RhbmNlIDw8ICInIjsKKyAgICB9CisgICAgcmV0dXJuIElzS25vd25JbnRlcmZhY2UoZnFpbnN0YW5jZS5nZXRGcU5hbWUoKSk7Cit9CisKK1Jlc3VsdDx2b2lkPiBJc0tub3duSW50ZXJmYWNlKGNvbnN0IEZRTmFtZSYgaW50ZikgeworICAgIGlmICgha25vd25faW50ZXJmYWNlcykgeworICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiTm8ga25vd24gaW50ZXJmYWNlcyBoYXZlIGJlZW4gbG9hZGVkLiI7CisgICAgfQorICAgIGlmIChrbm93bl9pbnRlcmZhY2VzLT5jb3VudChpbnRmKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJJbnRlcmZhY2UgaXMgbm90IGluIHRoZSBrbm93biBzZXQgb2YgaGlkbF9pbnRlcmZhY2VzOiAnIiA8PCBpbnRmLnN0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLiBQbGVhc2UgZW5zdXJlIHRoZSBpbnRlcmZhY2UgaXMgc3BlbGxlZCBjb3JyZWN0bHkgYW5kIGJ1aWx0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgImJ5IGEgaGlkbF9pbnRlcmZhY2UgdGFyZ2V0LiI7CisgICAgfQorICAgIHJldHVybiB7fTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGluaXQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbml0L2ludGVyZmFjZV91dGlscy5oIGIvaW5pdC9pbnRlcmZhY2VfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDBjMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5pdC9pbnRlcmZhY2VfdXRpbHMuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGhpZGwtdXRpbC9GUU5hbWUuaD4KKworI2luY2x1ZGUgInJlc3VsdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW5pdCB7CisKK3VzaW5nIEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwID0gc3RkOjptYXA8YW5kcm9pZDo6RlFOYW1lLCBzdGQ6OnNldDxhbmRyb2lkOjpGUU5hbWU+PjsKKworLy8gUmVhZHMgdGhlIEhJREwgaW50ZXJmYWNlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBKU09OIGZpbGUgYXQgdGhlIGdpdmVuIHBhdGguCitSZXN1bHQ8SW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHlNYXA+IFJlYWRJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKy8vIEZvciB0aGUgZ2l2ZW4gc2V0IG9mIGludGVyZmFjZXMgLyBpbnRlcmZhY2UgaW5zdGFuY2VzLCBjaGVja3MgdGhhdCBlYWNoCisvLyBpbnRlcmZhY2UncyBoaWVyYXJjaHkgb2YgaW5oZXJpdGVkIGludGVyZmFjZXMgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4KKy8vIGludGVyZmFjZSBzZXQuIFVzZXMgdGhlIHByb3ZpZGVkIGhpZXJhcmNoeSBkYXRhLgorUmVzdWx0PHZvaWQ+IENoZWNrSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHkoY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBpbnN0YW5jZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeU1hcCYgaGllcmFyY2h5KTsKK1Jlc3VsdDx2b2lkPiBDaGVja0ludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5KGNvbnN0IHN0ZDo6c2V0PGFuZHJvaWQ6OkZRTmFtZT4mIGludGVyZmFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeU1hcCYgaGllcmFyY2h5KTsKKworLy8gU2F2ZXMgdGhlIHNldCBvZiBrbm93biBpbnRlcmZhY2VzIHVzaW5nIHRoZSBwcm92aWRlZCBISURMIGludGVyZmFjZQorLy8gaW5oZXJpdGFuY2UgaGllcmFyY2h5Lgordm9pZCBTZXRLbm93bkludGVyZmFjZXMoY29uc3QgSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHlNYXAmIGhpZXJhcmNoeSk7CisKKy8vIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgaW50ZXJmYWNlIGlzIGluIHRoZSBzZXQgb2Yga25vd24gaW50ZXJmYWNlcy4gUmV0dXJucworLy8gYW4gZW1wdHkgUmVzdWx0IGlmIHByZXNlbnQsIG90aGVyd2lzZSBhbiBFcnJvci4KK1Jlc3VsdDx2b2lkPiBJc0tub3duSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnN0YW5jZSk7CitSZXN1bHQ8dm9pZD4gSXNLbm93bkludGVyZmFjZShjb25zdCBGUU5hbWUmIGludGYpOworCit9ICAvLyBuYW1lc3BhY2UgaW5pdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luaXQvcHJvcGVydHlfc2VydmljZS5jcHAgYi9pbml0L3Byb3BlcnR5X3NlcnZpY2UuY3BwCmluZGV4IDM3NjE3NTAuLjE3NjIyYTMgMTAwNjQ0Ci0tLSBhL2luaXQvcHJvcGVydHlfc2VydmljZS5jcHAKKysrIGIvaW5pdC9wcm9wZXJ0eV9zZXJ2aWNlLmNwcApAQCAtMTc0LDEzICsxNzQsOCBAQAogICAgICAgICByZXR1cm4gUFJPUF9FUlJPUl9JTlZBTElEX05BTUU7CiAgICAgfQogCi0gICAgaWYgKHZhbHVlbGVuID49IFBST1BfVkFMVUVfTUFYICYmICFTdGFydHNXaXRoKG5hbWUsICJyby4iKSkgewotICAgICAgICAqZXJyb3IgPSAiUHJvcGVydHkgdmFsdWUgdG9vIGxvbmciOwotICAgICAgICByZXR1cm4gUFJPUF9FUlJPUl9JTlZBTElEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChtYnN0b3djcyhudWxscHRyLCB2YWx1ZS5kYXRhKCksIDApID09IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PigtMSkpIHsKLSAgICAgICAgKmVycm9yID0gIlZhbHVlIGlzIG5vdCBhIFVURjggZW5jb2RlZCBzdHJpbmciOworICAgIGlmIChhdXRvIHJlc3VsdCA9IElzTGVnYWxQcm9wZXJ0eVZhbHVlKG5hbWUsIHZhbHVlKTsgIXJlc3VsdCkgeworICAgICAgICAqZXJyb3IgPSByZXN1bHQuZXJyb3IoKS5tZXNzYWdlKCk7CiAgICAgICAgIHJldHVybiBQUk9QX0VSUk9SX0lOVkFMSURfVkFMVUU7CiAgICAgfQogCkBAIC02NDgsMTMgKzY0MywxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGQ6OnN0cmluZyByYXdfZmlsZW5hbWUoZm4pOwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXhwYW5kZWRfZmlsZW5hbWU7Ci0gICAgICAgICAgICBpZiAoIWV4cGFuZF9wcm9wcyhyYXdfZmlsZW5hbWUsICZleHBhbmRlZF9maWxlbmFtZSkpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZXhwYW5kIGZpbGVuYW1lICciIDw8IHJhd19maWxlbmFtZSA8PCAiJyI7CisgICAgICAgICAgICBhdXRvIGV4cGFuZGVkX2ZpbGVuYW1lID0gRXhwYW5kUHJvcHMocmF3X2ZpbGVuYW1lKTsKKworICAgICAgICAgICAgaWYgKCFleHBhbmRlZF9maWxlbmFtZSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBleHBhbmQgZmlsZW5hbWUgJzogIiA8PCBleHBhbmRlZF9maWxlbmFtZS5lcnJvcigpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBsb2FkX3Byb3BlcnRpZXNfZnJvbV9maWxlKGV4cGFuZGVkX2ZpbGVuYW1lLmNfc3RyKCksIGtleSwgcHJvcGVydGllcyk7CisgICAgICAgICAgICBsb2FkX3Byb3BlcnRpZXNfZnJvbV9maWxlKGV4cGFuZGVkX2ZpbGVuYW1lLT5jX3N0cigpLCBrZXksIHByb3BlcnRpZXMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoa2V5LCAnPScpOwogICAgICAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7CmRpZmYgLS1naXQgYS9pbml0L3NlbGludXguY3BwIGIvaW5pdC9zZWxpbnV4LmNwcAppbmRleCAzMDlmY2MxLi5mZDQyMjU2IDEwMDY0NAotLS0gYS9pbml0L3NlbGludXguY3BwCisrKyBiL2luaXQvc2VsaW51eC5jcHAKQEAgLTQ5NywyNCArNDk3LDI4IEBACiAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIEFuZHJvaWQgdmVyc2lvbiB3aXRoIHdoaWNoIHRoZSB2ZW5kb3IgU0VQb2xpY3kgd2FzIGNvbXBpbGVkLgogLy8gSXQgaXMgdXNlZCBmb3IgdmVyc2lvbiBjaGVja3Mgc3VjaCBhcyB3aGV0aGVyIG9yIG5vdCB2ZW5kb3JfaW5pdCBzaG91bGQgYmUgdXNlZAogaW50IFNlbGludXhHZXRWZW5kb3JBbmRyb2lkVmVyc2lvbigpIHsKLSAgICBpZiAoIUlzU3BsaXRQb2xpY3lEZXZpY2UoKSkgewotICAgICAgICAvLyBJZiB0aGlzIGRldmljZSBkb2VzIG5vdCBzcGxpdCBzZXBvbGljeSBmaWxlcywgaXQncyBub3QgYSBUcmVibGUgZGV2aWNlIGFuZCB0aGVyZWZvcmUsCi0gICAgICAgIC8vIHdlIGFzc3VtZSBpdCdzIGFsd2F5cyBvbiB0aGUgbGF0ZXN0IHBsYXRmb3JtLgotICAgICAgICByZXR1cm4gX19BTkRST0lEX0FQSV9GVVRVUkVfXzsKLSAgICB9CisgICAgc3RhdGljIGludCB2ZW5kb3JfYW5kcm9pZF92ZXJzaW9uID0gW10geworICAgICAgICBpZiAoIUlzU3BsaXRQb2xpY3lEZXZpY2UoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBkZXZpY2UgZG9lcyBub3Qgc3BsaXQgc2Vwb2xpY3kgZmlsZXMsIGl0J3Mgbm90IGEgVHJlYmxlIGRldmljZSBhbmQgdGhlcmVmb3JlLAorICAgICAgICAgICAgLy8gd2UgYXNzdW1lIGl0J3MgYWx3YXlzIG9uIHRoZSBsYXRlc3QgcGxhdGZvcm0uCisgICAgICAgICAgICByZXR1cm4gX19BTkRST0lEX0FQSV9GVVRVUkVfXzsKKyAgICAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgdmVyc2lvbjsKLSAgICBpZiAoIUdldFZlbmRvck1hcHBpbmdWZXJzaW9uKCZ2ZXJzaW9uKSkgewotICAgICAgICBMT0coRkFUQUwpIDw8ICJDb3VsZCBub3QgcmVhZCB2ZW5kb3IgU0VMaW51eCB2ZXJzaW9uIjsKLSAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHZlcnNpb247CisgICAgICAgIGlmICghR2V0VmVuZG9yTWFwcGluZ1ZlcnNpb24oJnZlcnNpb24pKSB7CisgICAgICAgICAgICBMT0coRkFUQUwpIDw8ICJDb3VsZCBub3QgcmVhZCB2ZW5kb3IgU0VMaW51eCB2ZXJzaW9uIjsKKyAgICAgICAgfQogCi0gICAgaW50IG1ham9yX3ZlcnNpb247Ci0gICAgc3RkOjpzdHJpbmcgbWFqb3JfdmVyc2lvbl9zdHIodmVyc2lvbiwgMCwgdmVyc2lvbi5maW5kKCcuJykpOwotICAgIGlmICghUGFyc2VJbnQobWFqb3JfdmVyc2lvbl9zdHIsICZtYWpvcl92ZXJzaW9uKSkgewotICAgICAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIHBhcnNlIHRoZSB2ZW5kb3Igc2Vwb2xpY3kgbWFqb3IgdmVyc2lvbiAiIDw8IG1ham9yX3ZlcnNpb25fc3RyOwotICAgIH0KKyAgICAgICAgaW50IG1ham9yX3ZlcnNpb247CisgICAgICAgIHN0ZDo6c3RyaW5nIG1ham9yX3ZlcnNpb25fc3RyKHZlcnNpb24sIDAsIHZlcnNpb24uZmluZCgnLicpKTsKKyAgICAgICAgaWYgKCFQYXJzZUludChtYWpvcl92ZXJzaW9uX3N0ciwgJm1ham9yX3ZlcnNpb24pKSB7CisgICAgICAgICAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIHBhcnNlIHRoZSB2ZW5kb3Igc2Vwb2xpY3kgbWFqb3IgdmVyc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBtYWpvcl92ZXJzaW9uX3N0cjsKKyAgICAgICAgfQogCi0gICAgcmV0dXJuIG1ham9yX3ZlcnNpb247CisgICAgICAgIHJldHVybiBtYWpvcl92ZXJzaW9uOworICAgIH0oKTsKKyAgICByZXR1cm4gdmVuZG9yX2FuZHJvaWRfdmVyc2lvbjsKIH0KIAogLy8gVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBTRUxpbnV4IHRoZW4gZXhlY3MgaW5pdCB0byBydW4gaW4gdGhlIGluaXQgU0VMaW51eCBjb250ZXh0LgpkaWZmIC0tZ2l0IGEvaW5pdC9zZXJ2aWNlLmNwcCBiL2luaXQvc2VydmljZS5jcHAKaW5kZXggNDdmNGRiOS4uOTUzNzg0MyAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlLmNwcAorKysgYi9pbml0L3NlcnZpY2UuY3BwCkBAIC0xMDAsOSArMTAwLDExIEBACiAgICAgZXhwYW5kZWRfYXJncy5yZXNpemUoYXJncy5zaXplKCkpOwogICAgIGNfc3RyaW5ncy5wdXNoX2JhY2soY29uc3RfY2FzdDxjaGFyKj4oYXJnc1swXS5kYXRhKCkpKTsKICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAxOyBpIDwgYXJncy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoIWV4cGFuZF9wcm9wcyhhcmdzW2ldLCAmZXhwYW5kZWRfYXJnc1tpXSkpIHsKLSAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgYXJnc1swXSA8PCAiOiBjYW5ub3QgZXhwYW5kICciIDw8IGFyZ3NbaV0gPDwgIiciOworICAgICAgICBhdXRvIGV4cGFuZGVkX2FyZyA9IEV4cGFuZFByb3BzKGFyZ3NbaV0pOworICAgICAgICBpZiAoIWV4cGFuZGVkX2FyZykgeworICAgICAgICAgICAgTE9HKEZBVEFMKSA8PCBhcmdzWzBdIDw8ICI6IGNhbm5vdCBleHBhbmQgYXJndW1lbnRzJzogIiA8PCBleHBhbmRlZF9hcmcuZXJyb3IoKTsKICAgICAgICAgfQorICAgICAgICBleHBhbmRlZF9hcmdzW2ldID0gKmV4cGFuZGVkX2FyZzsKICAgICAgICAgY19zdHJpbmdzLnB1c2hfYmFjayhleHBhbmRlZF9hcmdzW2ldLmRhdGEoKSk7CiAgICAgfQogICAgIGNfc3RyaW5ncy5wdXNoX2JhY2sobnVsbHB0cik7CkBAIC0xNjUsNiArMTY3LDE1IEBACiAgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoYm9vdHRpbWVfcHJvcGVydHksIHN0ZDo6dG9fc3RyaW5nKHN0YXJ0X25zKSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvLyBpbml0LnN2Y19kZWJ1Z19waWQuKiBwcm9wZXJ0aWVzIGFyZSBvbmx5IGZvciB0ZXN0cywgYW5kIHNob3VsZCBub3QgYmUgdXNlZAorICAgIC8vIG9uIGRldmljZSBmb3Igc2VjdXJpdHkgY2hlY2tzLgorICAgIHN0ZDo6c3RyaW5nIHBpZF9wcm9wZXJ0eSA9ICJpbml0LnN2Y19kZWJ1Z19waWQuIiArIG5hbWVfOworICAgIGlmIChuZXdfc3RhdGUgPT0gInJ1bm5pbmciKSB7CisgICAgICAgIHByb3BlcnR5X3NldChwaWRfcHJvcGVydHksIHN0ZDo6dG9fc3RyaW5nKHBpZF8pKTsKKyAgICB9IGVsc2UgaWYgKG5ld19zdGF0ZSA9PSAic3RvcHBlZCIpIHsKKyAgICAgICAgcHJvcGVydHlfc2V0KHBpZF9wcm9wZXJ0eSwgIiIpOworICAgIH0KIH0KIAogdm9pZCBTZXJ2aWNlOjpLaWxsUHJvY2Vzc0dyb3VwKGludCBzaWduYWwpIHsKQEAgLTYzMyw3ICs2NDQsOCBAQAogICAgIH0KIH0KIAotc3RkOjp1bmlxdWVfcHRyPFNlcnZpY2U+IFNlcnZpY2U6Ok1ha2VUZW1wb3JhcnlPbmVzaG90U2VydmljZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKK1Jlc3VsdDxzdGQ6OnVuaXF1ZV9wdHI8U2VydmljZT4+IFNlcnZpY2U6Ok1ha2VUZW1wb3JhcnlPbmVzaG90U2VydmljZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7CiAgICAgLy8gUGFyc2UgdGhlIGFyZ3VtZW50czogZXhlYyBbU0VDTEFCRUwgW1VJRCBbR0lEXSpdIC0tXSBDT01NQU5EIEFSR1MuLi4KICAgICAvLyBTRUNMQUJFTCBjYW4gYmUgYSAtIHRvIGRlbm90ZSBkZWZhdWx0CiAgICAgc3RkOjpzaXplX3QgY29tbWFuZF9hcmcgPSAxOwpAQCAtNjQ0LDEzICs2NTYsMTEgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoY29tbWFuZF9hcmcgPiA0ICsgTlJfU1ZDX1NVUFBfR0lEUykgewotICAgICAgICBMT0coRVJST1IpIDw8ICJleGVjIGNhbGxlZCB3aXRoIHRvbyBtYW55IHN1cHBsZW1lbnRhcnkgZ3JvdXAgaWRzIjsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJleGVjIGNhbGxlZCB3aXRoIHRvbyBtYW55IHN1cHBsZW1lbnRhcnkgZ3JvdXAgaWRzIjsKICAgICB9CiAKICAgICBpZiAoY29tbWFuZF9hcmcgPj0gYXJncy5zaXplKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiZXhlYyBjYWxsZWQgd2l0aG91dCBjb21tYW5kIjsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJleGVjIGNhbGxlZCB3aXRob3V0IGNvbW1hbmQiOwogICAgIH0KICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyX2FyZ3MoYXJncy5iZWdpbigpICsgY29tbWFuZF9hcmcsIGFyZ3MuZW5kKCkpOwogCkBAIC02NjksOCArNjc5LDcgQEAKICAgICBpZiAoY29tbWFuZF9hcmcgPiAzKSB7CiAgICAgICAgIHVpZCA9IERlY29kZVVpZChhcmdzWzJdKTsKICAgICAgICAgaWYgKCF1aWQpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBkZWNvZGUgVUlEIGZvciAnIiA8PCBhcmdzWzJdIDw8ICInOiAiIDw8IHVpZC5lcnJvcigpOwotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiVW5hYmxlIHRvIGRlY29kZSBVSUQgZm9yICciIDw8IGFyZ3NbMl0gPDwgIic6ICIgPDwgdWlkLmVycm9yKCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgUmVzdWx0PGdpZF90PiBnaWQgPSAwOwpAQCAtNjc4LDE2ICs2ODcsMTQgQEAKICAgICBpZiAoY29tbWFuZF9hcmcgPiA0KSB7CiAgICAgICAgIGdpZCA9IERlY29kZVVpZChhcmdzWzNdKTsKICAgICAgICAgaWYgKCFnaWQpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBkZWNvZGUgR0lEIGZvciAnIiA8PCBhcmdzWzNdIDw8ICInOiAiIDw8IGdpZC5lcnJvcigpOwotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiVW5hYmxlIHRvIGRlY29kZSBHSUQgZm9yICciIDw8IGFyZ3NbM10gPDwgIic6ICIgPDwgZ2lkLmVycm9yKCk7CiAgICAgICAgIH0KICAgICAgICAgc3RkOjpzaXplX3QgbnJfc3VwcF9naWRzID0gY29tbWFuZF9hcmcgLSAxIC8qIC0tICovIC0gNCAvKiBleGVjIFNFQ0xBQkVMIFVJRCBHSUQgKi87CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnJfc3VwcF9naWRzOyArK2kpIHsKICAgICAgICAgICAgIGF1dG8gc3VwcF9naWQgPSBEZWNvZGVVaWQoYXJnc1s0ICsgaV0pOwogICAgICAgICAgICAgaWYgKCFzdXBwX2dpZCkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBkZWNvZGUgR0lEIGZvciAnIiA8PCBhcmdzWzQgKyBpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIic6ICIgPDwgc3VwcF9naWQuZXJyb3IoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiVW5hYmxlIHRvIGRlY29kZSBHSUQgZm9yICciIDw8IGFyZ3NbNCArIGldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIic6ICIgPDwgc3VwcF9naWQuZXJyb3IoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN1cHBfZ2lkcy5wdXNoX2JhY2soKnN1cHBfZ2lkKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvaW5pdC9zZXJ2aWNlLmggYi9pbml0L3NlcnZpY2UuaAppbmRleCBjZGYzMWJiLi5jY2VmYzhlIDEwMDY0NAotLS0gYS9pbml0L3NlcnZpY2UuaAorKysgYi9pbml0L3NlcnZpY2UuaApAQCAtNzEsNyArNzEsOCBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Z2lkX3Q+JiBzdXBwX2dpZHMsIGludCBuYW1lc3BhY2VfZmxhZ3MsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNsYWJlbCwKICAgICAgICAgICAgIFN1YmNvbnRleHQqIHN1YmNvbnRleHRfZm9yX3Jlc3RhcnRfY29tbWFuZHMsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncyk7CiAKLSAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNlcnZpY2U+IE1ha2VUZW1wb3JhcnlPbmVzaG90U2VydmljZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOworICAgIHN0YXRpYyBSZXN1bHQ8c3RkOjp1bmlxdWVfcHRyPFNlcnZpY2U+PiBNYWtlVGVtcG9yYXJ5T25lc2hvdFNlcnZpY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwogCiAgICAgYm9vbCBJc1J1bm5pbmcoKSB7IHJldHVybiAoZmxhZ3NfICYgU1ZDX1JVTk5JTkcpICE9IDA7IH0KICAgICBSZXN1bHQ8dm9pZD4gRXhlY1N0YXJ0KCk7CkBAIC05Niw2ICs5Nyw3IEBACiAgICAgdm9pZCBBZGRSZWFwQ2FsbGJhY2soc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHNpZ2luZm9fdCYgc2lnaW5mbyk+IGNhbGxiYWNrKSB7CiAgICAgICAgIHJlYXBfY2FsbGJhY2tzXy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNhbGxiYWNrKSk7CiAgICAgfQorICAgIHNpemVfdCBDaGVja0FsbENvbW1hbmRzKCkgY29uc3QgeyByZXR1cm4gb25yZXN0YXJ0Xy5DaGVja0FsbENvbW1hbmRzKCk7IH0KIAogICAgIHN0YXRpYyBib29sIGlzX2V4ZWNfc2VydmljZV9ydW5uaW5nKCkgeyByZXR1cm4gaXNfZXhlY19zZXJ2aWNlX3J1bm5pbmdfOyB9CiAKZGlmZiAtLWdpdCBhL2luaXQvc2VydmljZV9saXN0LmNwcCBiL2luaXQvc2VydmljZV9saXN0LmNwcAppbmRleCAzYTQ4MTgzLi5jNTFhOWNmIDEwMDY0NAotLS0gYS9pbml0L3NlcnZpY2VfbGlzdC5jcHAKKysrIGIvaW5pdC9zZXJ2aWNlX2xpc3QuY3BwCkBAIC0yOCw2ICsyOCwxNCBAQAogICAgIHJldHVybiBpbnN0YW5jZTsKIH0KIAorc2l6ZV90IFNlcnZpY2VMaXN0OjpDaGVja0FsbENvbW1hbmRzKCkgeworICAgIHNpemVfdCBmYWlsdXJlcyA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvJiBzZXJ2aWNlIDogc2VydmljZXNfKSB7CisgICAgICAgIGZhaWx1cmVzICs9IHNlcnZpY2UtPkNoZWNrQWxsQ29tbWFuZHMoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhaWx1cmVzOworfQorCiB2b2lkIFNlcnZpY2VMaXN0OjpBZGRTZXJ2aWNlKHN0ZDo6dW5pcXVlX3B0cjxTZXJ2aWNlPiBzZXJ2aWNlKSB7CiAgICAgc2VydmljZXNfLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoc2VydmljZSkpOwogfQpkaWZmIC0tZ2l0IGEvaW5pdC9zZXJ2aWNlX2xpc3QuaCBiL2luaXQvc2VydmljZV9saXN0LmgKaW5kZXggMjEzNmEyMS4uZWUyYzcwMiAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlX2xpc3QuaAorKysgYi9pbml0L3NlcnZpY2VfbGlzdC5oCkBAIC0zMCw2ICszMCw3IEBACiAKICAgICAvLyBFeHBvc2VkIGZvciB0ZXN0aW5nCiAgICAgU2VydmljZUxpc3QoKTsKKyAgICBzaXplX3QgQ2hlY2tBbGxDb21tYW5kcygpOwogCiAgICAgdm9pZCBBZGRTZXJ2aWNlKHN0ZDo6dW5pcXVlX3B0cjxTZXJ2aWNlPiBzZXJ2aWNlKTsKICAgICB2b2lkIFJlbW92ZVNlcnZpY2UoY29uc3QgU2VydmljZSYgc3ZjKTsKZGlmZiAtLWdpdCBhL2luaXQvc2VydmljZV9wYXJzZXIuY3BwIGIvaW5pdC9zZXJ2aWNlX3BhcnNlci5jcHAKaW5kZXggNjVkOTZjNi4uZGQ1NTJmYiAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlX3BhcnNlci5jcHAKKysrIGIvaW5pdC9zZXJ2aWNlX3BhcnNlci5jcHAKQEAgLTE5Myw5ICsxOTMsOSBAQAogUmVzdWx0PHZvaWQ+IFNlcnZpY2VQYXJzZXI6OlBhcnNlS2V5Y29kZXMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiYgYXJncykgewogICAgIGF1dG8gaXQgPSBhcmdzLmJlZ2luKCkgKyAxOwogICAgIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIFN0YXJ0c1dpdGgoYXJnc1sxXSwgIiQiKSkgewotICAgICAgICBzdGQ6OnN0cmluZyBleHBhbmRlZDsKLSAgICAgICAgaWYgKCFleHBhbmRfcHJvcHMoYXJnc1sxXSwgJmV4cGFuZGVkKSkgewotICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkNvdWxkIG5vdCBleHBhbmQgcHJvcGVydHkgJyIgPDwgYXJnc1sxXSA8PCAiJyI7CisgICAgICAgIGF1dG8gZXhwYW5kZWQgPSBFeHBhbmRQcm9wcyhhcmdzWzFdKTsKKyAgICAgICAgaWYgKCFleHBhbmRlZCkgeworICAgICAgICAgICAgcmV0dXJuIGV4cGFuZGVkLmVycm9yKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCwgaXQgZGVmYXVsdHMgdG8gbm9uZSwgaW4gd2hpY2ggY2FzZSB0aGVyZSBhcmUgbm8ga2V5Y29kZXMKQEAgLTIwNCw3ICsyMDQsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICB9CiAKLSAgICAgICAgYXJncyA9IFNwbGl0KGV4cGFuZGVkLCAiLCIpOworICAgICAgICBhcmdzID0gU3BsaXQoKmV4cGFuZGVkLCAiLCIpOwogICAgICAgICBpdCA9IGFyZ3MuYmVnaW4oKTsKICAgICB9CiAKQEAgLTQyMiw5ICs0MjIsMTEgQEAKICAgICBGaWxlRGVzY3JpcHRvciBmaWxlOwogICAgIGZpbGUudHlwZSA9IGFyZ3NbMl07CiAKLSAgICBpZiAoIWV4cGFuZF9wcm9wcyhhcmdzWzFdLCAmZmlsZS5uYW1lKSkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiQ291bGQgbm90IGV4cGFuZCBwcm9wZXJ0eSBpbiBmaWxlIHBhdGggJyIgPDwgYXJnc1sxXSA8PCAiJyI7CisgICAgYXV0byBmaWxlX25hbWUgPSBFeHBhbmRQcm9wcyhhcmdzWzFdKTsKKyAgICBpZiAoIWZpbGVfbmFtZSkgeworICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiQ291bGQgbm90IGV4cGFuZCBmaWxlIHBhdGggJzogIiA8PCBmaWxlX25hbWUuZXJyb3IoKTsKICAgICB9CisgICAgZmlsZS5uYW1lID0gKmZpbGVfbmFtZTsKICAgICBpZiAoZmlsZS5uYW1lWzBdICE9ICcvJyB8fCBmaWxlLm5hbWUuZmluZCgiLi4vIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZpbGUgbmFtZSBtdXN0IG5vdCBiZSByZWxhdGl2ZSI7CiAgICAgfQpAQCAtNTY2LDMzICs1NjgsMTAgQEAKICAgICB9CiAKICAgICBpZiAoaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV8pIHsKLSAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGludGVyZmFjZV9uYW1lczsKLSAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgaW50ZiA6IHNlcnZpY2VfLT5pbnRlcmZhY2VzKCkpIHsKLSAgICAgICAgICAgIGludGVyZmFjZV9uYW1lcy5pbnNlcnQoU3BsaXQoaW50ZiwgIi8iKVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGVycm9yX3N0cmVhbTsKLSAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgaW50ZiA6IGludGVyZmFjZV9uYW1lcykgewotICAgICAgICAgICAgaWYgKGludGVyZmFjZV9pbmhlcml0YW5jZV9oaWVyYXJjaHlfLT5jb3VudChpbnRmKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3Jfc3RyZWFtIDw8ICJcbkludGVyZmFjZSBpcyBub3QgaW4gdGhlIGtub3duIHNldCBvZiBoaWRsX2ludGVyZmFjZXM6ICciIDw8IGludGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIicuIFBsZWFzZSBlbnN1cmUgdGhlIGludGVyZmFjZSBpcyBzcGVsbGVkIGNvcnJlY3RseSBhbmQgYnVpbHQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiYnkgYSBoaWRsX2ludGVyZmFjZSB0YXJnZXQuIjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgcmVxdWlyZWRfaW50ZXJmYWNlcyA9Ci0gICAgICAgICAgICAgICAgICAgICgqaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV8pW2ludGZdOwotICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGRpZmY7Ci0gICAgICAgICAgICBzdGQ6OnNldF9kaWZmZXJlbmNlKHJlcXVpcmVkX2ludGVyZmFjZXMuYmVnaW4oKSwgcmVxdWlyZWRfaW50ZXJmYWNlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX25hbWVzLmJlZ2luKCksIGludGVyZmFjZV9uYW1lcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbnNlcnRlcihkaWZmLCBkaWZmLmJlZ2luKCkpKTsKLSAgICAgICAgICAgIGlmICghZGlmZi5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3Jfc3RyZWFtIDw8ICJcbkludGVyZmFjZSAnIiA8PCBpbnRmIDw8ICInIHJlcXVpcmVzIGl0cyBmdWxsIGluaGVyaXRhbmNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhpZXJhcmNoeSB0byBiZSBsaXN0ZWQgaW4gdGhpcyBpbml0X3JjIGZpbGUuIE1pc3NpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW50ZXJmYWNlczogWyIgPDwgYmFzZTo6Sm9pbihkaWZmLCAiICIpIDw8ICJdIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JzID0gZXJyb3Jfc3RyZWFtLnN0cigpOwotICAgICAgICBpZiAoIWVycm9ycy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCBlcnJvcnM7CisgICAgICAgIGlmIChjb25zdCBhdXRvJiBjaGVja19oaWVyYXJjaHlfcmVzdWx0ID0gQ2hlY2tJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeSgKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZV8tPmludGVyZmFjZXMoKSwgKmludGVyZmFjZV9pbmhlcml0YW5jZV9oaWVyYXJjaHlfKTsKKyAgICAgICAgICAgICFjaGVja19oaWVyYXJjaHlfcmVzdWx0KSB7CisgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCBjaGVja19oaWVyYXJjaHlfcmVzdWx0LmVycm9yKCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2luaXQvc2VydmljZV9wYXJzZXIuaCBiL2luaXQvc2VydmljZV9wYXJzZXIuaAppbmRleCA5OGFiMTVhLi40NzI5ODc0IDEwMDY0NAotLS0gYS9pbml0L3NlcnZpY2VfcGFyc2VyLmgKKysrIGIvaW5pdC9zZXJ2aWNlX3BhcnNlci5oCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJpbnRlcmZhY2VfdXRpbHMuaCIKICNpbmNsdWRlICJwYXJzZXIuaCIKICNpbmNsdWRlICJzZXJ2aWNlLmgiCiAjaW5jbHVkZSAic2VydmljZV9saXN0LmgiCkBAIC0yNiw4ICsyNyw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaW5pdCB7CiAKLXVzaW5nIEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwID0gc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj47Ci0KIGNsYXNzIFNlcnZpY2VQYXJzZXIgOiBwdWJsaWMgU2VjdGlvblBhcnNlciB7CiAgIHB1YmxpYzoKICAgICBTZXJ2aWNlUGFyc2VyKApkaWZmIC0tZ2l0IGEvaW5pdC9zZXJ2aWNlX3Rlc3QuY3BwIGIvaW5pdC9zZXJ2aWNlX3Rlc3QuY3BwCmluZGV4IDZhMzRhY2MuLmM5Y2M3YmQgMTAwNjQ0Ci0tLSBhL2luaXQvc2VydmljZV90ZXN0LmNwcAorKysgYi9pbml0L3NlcnZpY2VfdGVzdC5jcHAKQEAgLTc1LDE1ICs3NSwxNSBAQAogVEVTVChzZXJ2aWNlLCBtYWtlX3RlbXBvcmFyeV9vbmVzaG90X3NlcnZpY2VfaW52YWxpZF9zeW50YXgpIHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJnczsKICAgICAvLyBOb3RoaW5nLgotICAgIEFTU0VSVF9FUShudWxscHRyLCBTZXJ2aWNlOjpNYWtlVGVtcG9yYXJ5T25lc2hvdFNlcnZpY2UoYXJncykpOworICAgIEFTU0VSVF9GQUxTRShTZXJ2aWNlOjpNYWtlVGVtcG9yYXJ5T25lc2hvdFNlcnZpY2UoYXJncykpOwogCiAgICAgLy8gTm8gYXJndW1lbnRzIHRvICdleGVjJy4KICAgICBhcmdzLnB1c2hfYmFjaygiZXhlYyIpOwotICAgIEFTU0VSVF9FUShudWxscHRyLCBTZXJ2aWNlOjpNYWtlVGVtcG9yYXJ5T25lc2hvdFNlcnZpY2UoYXJncykpOworICAgIEFTU0VSVF9GQUxTRShTZXJ2aWNlOjpNYWtlVGVtcG9yYXJ5T25lc2hvdFNlcnZpY2UoYXJncykpOwogCiAgICAgLy8gTm8gY29tbWFuZCBpbiAiZXhlYyAtLSIuCiAgICAgYXJncy5wdXNoX2JhY2soIi0tIik7Ci0gICAgQVNTRVJUX0VRKG51bGxwdHIsIFNlcnZpY2U6Ok1ha2VUZW1wb3JhcnlPbmVzaG90U2VydmljZShhcmdzKSk7CisgICAgQVNTRVJUX0ZBTFNFKFNlcnZpY2U6Ok1ha2VUZW1wb3JhcnlPbmVzaG90U2VydmljZShhcmdzKSk7CiB9CiAKIFRFU1Qoc2VydmljZSwgbWFrZV90ZW1wb3Jhcnlfb25lc2hvdF9zZXJ2aWNlX3Rvb19tYW55X3N1cHBsZW1lbnRhcnlfZ2lkcykgewpAQCAtOTcsNyArOTcsNyBAQAogICAgIH0KICAgICBhcmdzLnB1c2hfYmFjaygiLS0iKTsKICAgICBhcmdzLnB1c2hfYmFjaygiL3N5c3RlbS9iaW4vaWQiKTsKLSAgICBBU1NFUlRfRVEobnVsbHB0ciwgU2VydmljZTo6TWFrZVRlbXBvcmFyeU9uZXNob3RTZXJ2aWNlKGFyZ3MpKTsKKyAgICBBU1NFUlRfRkFMU0UoU2VydmljZTo6TWFrZVRlbXBvcmFyeU9uZXNob3RTZXJ2aWNlKGFyZ3MpKTsKIH0KIAogc3RhdGljIHZvaWQgVGVzdF9tYWtlX3RlbXBvcmFyeV9vbmVzaG90X3NlcnZpY2UoYm9vbCBkYXNoX2Rhc2gsIGJvb2wgc2VjbGFiZWwsIGJvb2wgdWlkLCBib29sIGdpZCwKQEAgLTEyMiw4ICsxMjIsOSBAQAogICAgIH0KICAgICBhcmdzLnB1c2hfYmFjaygiL3N5c3RlbS9iaW4vdG95Ym94Iik7CiAgICAgYXJncy5wdXNoX2JhY2soImlkIik7Ci0gICAgYXV0byBzdmMgPSBTZXJ2aWNlOjpNYWtlVGVtcG9yYXJ5T25lc2hvdFNlcnZpY2UoYXJncyk7Ci0gICAgQVNTRVJUX05FKG51bGxwdHIsIHN2Yyk7CisgICAgYXV0byBzZXJ2aWNlX3JldCA9IFNlcnZpY2U6Ok1ha2VUZW1wb3JhcnlPbmVzaG90U2VydmljZShhcmdzKTsKKyAgICBBU1NFUlRfVFJVRShzZXJ2aWNlX3JldCk7CisgICAgYXV0byBzdmMgPSBzdGQ6Om1vdmUoKnNlcnZpY2VfcmV0KTsKIAogICAgIGlmIChzZWNsYWJlbCkgewogICAgICAgICBBU1NFUlRfRVEoInU6cjpzdTpzMCIsIHN2Yy0+c2VjbGFiZWwoKSk7CmRpZmYgLS1naXQgYS9pbml0L3NpZ2NobGRfaGFuZGxlci5jcHAgYi9pbml0L3NpZ2NobGRfaGFuZGxlci5jcHAKaW5kZXggYzlhMDljZC4uOTg0MjM1ZCAxMDA2NDQKLS0tIGEvaW5pdC9zaWdjaGxkX2hhbmRsZXIuY3BwCisrKyBiL2luaXQvc2lnY2hsZF9oYW5kbGVyLmNwcApAQCAtNzMsNiArNzMsMTMgQEAKICAgICAgICAgICAgICAgICBhdXRvIGV4ZWNfZHVyYXRpb25fbXMgPQogICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihleGVjX2R1cmF0aW9uKS5jb3VudCgpOwogICAgICAgICAgICAgICAgIHdhaXRfc3RyaW5nID0gU3RyaW5nUHJpbnRmKCIgd2FpdGluZyB0b29rICVmIHNlY29uZHMiLCBleGVjX2R1cmF0aW9uX21zIC8gMTAwMC4wZik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2UtPmZsYWdzKCkgJiBTVkNfT05FU0hPVCkgeworICAgICAgICAgICAgICAgIGF1dG8gZXhlY19kdXJhdGlvbiA9IGJvb3RfY2xvY2s6Om5vdygpIC0gc2VydmljZS0+dGltZV9zdGFydGVkKCk7CisgICAgICAgICAgICAgICAgYXV0byBleGVjX2R1cmF0aW9uX21zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KGV4ZWNfZHVyYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb3VudCgpOworICAgICAgICAgICAgICAgIHdhaXRfc3RyaW5nID0gU3RyaW5nUHJpbnRmKCIgb25lc2hvdCBzZXJ2aWNlIHRvb2sgJWYgc2Vjb25kcyBpbiBiYWNrZ3JvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjX2R1cmF0aW9uX21zIC8gMTAwMC4wZik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuYW1lID0gU3RyaW5nUHJpbnRmKCJVbnRyYWNrZWQgcGlkICVkIiwgcGlkKTsKZGlmZiAtLWdpdCBhL2luaXQvc3ViY29udGV4dC5jcHAgYi9pbml0L3N1YmNvbnRleHQuY3BwCmluZGV4IGExM2YwYzcuLjAwZjkxZDggMTAwNjQ0Ci0tLSBhL2luaXQvc3ViY29udGV4dC5jcHAKKysrIGIvaW5pdC9zdWJjb250ZXh0LmNwcApAQCAtMTUxLDE1ICsxNTEsMTUgQEAKIHZvaWQgU3ViY29udGV4dFByb2Nlc3M6OkV4cGFuZEFyZ3MoY29uc3QgU3ViY29udGV4dENvbW1hbmQ6OkV4cGFuZEFyZ3NDb21tYW5kJiBleHBhbmRfYXJnc19jb21tYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJjb250ZXh0UmVwbHkqIHJlcGx5KSBjb25zdCB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBhcmcgOiBleHBhbmRfYXJnc19jb21tYW5kLmFyZ3MoKSkgewotICAgICAgICBhdXRvIGV4cGFuZGVkX3Byb3AgPSBzdGQ6OnN0cmluZ3t9OwotICAgICAgICBpZiAoIWV4cGFuZF9wcm9wcyhhcmcsICZleHBhbmRlZF9wcm9wKSkgeworICAgICAgICBhdXRvIGV4cGFuZGVkX2FyZyA9IEV4cGFuZFByb3BzKGFyZyk7CisgICAgICAgIGlmICghZXhwYW5kZWRfYXJnKSB7CiAgICAgICAgICAgICBhdXRvKiBmYWlsdXJlID0gcmVwbHktPm11dGFibGVfZmFpbHVyZSgpOwotICAgICAgICAgICAgZmFpbHVyZS0+c2V0X2Vycm9yX3N0cmluZygiRmFpbGVkIHRvIGV4cGFuZCAnIiArIGFyZyArICInIik7CisgICAgICAgICAgICBmYWlsdXJlLT5zZXRfZXJyb3Jfc3RyaW5nKGV4cGFuZGVkX2FyZy5lcnJvcigpLm1lc3NhZ2UoKSk7CiAgICAgICAgICAgICBmYWlsdXJlLT5zZXRfZXJyb3JfZXJybm8oMCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhdXRvKiBleHBhbmRfYXJnc19yZXBseSA9IHJlcGx5LT5tdXRhYmxlX2V4cGFuZF9hcmdzX3JlcGx5KCk7Ci0gICAgICAgICAgICBleHBhbmRfYXJnc19yZXBseS0+YWRkX2V4cGFuZGVkX2FyZ3MoZXhwYW5kZWRfcHJvcCk7CisgICAgICAgICAgICBleHBhbmRfYXJnc19yZXBseS0+YWRkX2V4cGFuZGVkX2FyZ3MoKmV4cGFuZGVkX2FyZyk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9pbml0L3N1YmNvbnRleHRfdGVzdC5jcHAgYi9pbml0L3N1YmNvbnRleHRfdGVzdC5jcHAKaW5kZXggZTEyMGE2Mi4uYWU4OWMzOCAxMDA2NDQKLS0tIGEvaW5pdC9zdWJjb250ZXh0X3Rlc3QuY3BwCisrKyBiL2luaXQvc3ViY29udGV4dF90ZXN0LmNwcApAQCAtMTY2LDcgKzE2Niw4IEBACiAgICAgICAgIH07CiAgICAgICAgIGF1dG8gcmVzdWx0ID0gc3ViY29udGV4dC5FeHBhbmRBcmdzKGFyZ3MpOwogICAgICAgICBBU1NFUlRfRkFMU0UocmVzdWx0KTsKLSAgICAgICAgRVhQRUNUX0VRKCJGYWlsZWQgdG8gZXhwYW5kICciICsgYXJnc1sxXSArICInIiwgcmVzdWx0LmVycm9yKCkubWVzc2FnZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKCJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJpbmcgaW4gJyIgKyBhcmdzWzFdICsgIicsIGxvb2tpbmcgZm9yIH0iLAorICAgICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yKCkubWVzc2FnZSgpKTsKICAgICB9KTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5pdC90ZXN0X3V0aWxzL0FuZHJvaWQuYnAgYi9pbml0L3Rlc3RfdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2IwNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5pdC90ZXN0X3V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNyBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJpbml0X3Rlc3RfdXRpbHMiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJzZXJ2aWNlX3V0aWxzLmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYmhpZGwtZ2VuLXV0aWxzIiwKKyAgICBdLAorICAgIHdob2xlX3N0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJpbml0IiwKKyAgICAgICAgImxpYnByb3BlcnR5aW5mb3BhcnNlciIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwgLy8gZm9yIHRlc3RzCit9CmRpZmYgLS1naXQgYS9pbml0L3Rlc3RfdXRpbHMvaW5jbHVkZS9pbml0LXRlc3QtdXRpbHMvc2VydmljZV91dGlscy5oIGIvaW5pdC90ZXN0X3V0aWxzL2luY2x1ZGUvaW5pdC10ZXN0LXV0aWxzL3NlcnZpY2VfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWM2MWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5pdC90ZXN0X3V0aWxzL2luY2x1ZGUvaW5pdC10ZXN0LXV0aWxzL3NlcnZpY2VfdXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CisjaW5jbHVkZSA8aGlkbC11dGlsL0ZxSW5zdGFuY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGluaXQgeworCit1c2luZyBTZXJ2aWNlSW50ZXJmYWNlc01hcCA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNldDxhbmRyb2lkOjpGcUluc3RhbmNlPj47CithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8U2VydmljZUludGVyZmFjZXNNYXA+IEdldE9uRGV2aWNlU2VydmljZUludGVyZmFjZXNNYXAoKTsKKworfSAgLy8gbmFtZXNwYWNlIGluaXQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbml0L3Rlc3RfdXRpbHMvc2VydmljZV91dGlscy5jcHAgYi9pbml0L3Rlc3RfdXRpbHMvc2VydmljZV91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwMDcwMgotLS0gL2Rldi9udWxsCisrKyBiL2luaXQvdGVzdF91dGlscy9zZXJ2aWNlX3V0aWxzLmNwcApAQCAtMCwwICsxLDYzIEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgIi4uL3BhcnNlci5oIgorI2luY2x1ZGUgIi4uL3NlcnZpY2UuaCIKKyNpbmNsdWRlICIuLi9zZXJ2aWNlX2xpc3QuaCIKKyNpbmNsdWRlICIuLi9zZXJ2aWNlX3BhcnNlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvaW5pdC10ZXN0LXV0aWxzL3NlcnZpY2VfdXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGluaXQgeworCithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8U2VydmljZUludGVyZmFjZXNNYXA+IEdldE9uRGV2aWNlU2VydmljZUludGVyZmFjZXNNYXAoKSB7CisgICAgU2VydmljZUxpc3QmIHNlcnZpY2VfbGlzdCA9IFNlcnZpY2VMaXN0OjpHZXRJbnN0YW5jZSgpOworICAgIFBhcnNlciBwYXJzZXI7CisgICAgcGFyc2VyLkFkZFNlY3Rpb25QYXJzZXIoInNlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8U2VydmljZVBhcnNlcj4oJnNlcnZpY2VfbGlzdCwgbnVsbHB0ciwgc3RkOjpudWxsb3B0KSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBsb2NhdGlvbiA6IHsKKyAgICAgICAgICAgICAgICAgIi9pbml0LnJjIiwKKyAgICAgICAgICAgICAgICAgIi9zeXN0ZW0vZXRjL2luaXQiLAorICAgICAgICAgICAgICAgICAiL3N5c3RlbV9leHQvZXRjL2luaXQiLAorICAgICAgICAgICAgICAgICAiL3Byb2R1Y3QvZXRjL2luaXQiLAorICAgICAgICAgICAgICAgICAiL29kbS9ldGMvaW5pdCIsCisgICAgICAgICAgICAgICAgICIvdmVuZG9yL2V0Yy9pbml0IiwKKyAgICAgICAgIH0pIHsKKyAgICAgICAgcGFyc2VyLlBhcnNlQ29uZmlnKGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICBTZXJ2aWNlSW50ZXJmYWNlc01hcCByZXN1bHQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBzZXJ2aWNlIDogc2VydmljZV9saXN0LnNlcnZpY2VzKCkpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGFuIGVudHJ5IGZvciBhbGwgc2VydmljZXMsIGluY2x1ZGluZyBzZXJ2aWNlcyB0aGF0IG1heSBub3QKKyAgICAgICAgLy8gaGF2ZSBhbnkgZGVjbGFyZWQgaW50ZXJmYWNlcy4KKyAgICAgICAgcmVzdWx0W3NlcnZpY2UtPm5hbWUoKV0gPSBzdGQ6OnNldDxhbmRyb2lkOjpGcUluc3RhbmNlPigpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGludGYgOiBzZXJ2aWNlLT5pbnRlcmZhY2VzKCkpIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OkZxSW5zdGFuY2UgZnFJbnN0YW5jZTsKKyAgICAgICAgICAgIGlmICghZnFJbnN0YW5jZS5zZXRUbyhpbnRmKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpFcnJvcigpIDw8ICJVbmFibGUgdG8gcGFyc2UgaW50ZXJmYWNlOiAnIiA8PCBpbnRmIDw8ICInIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFtzZXJ2aWNlLT5uYW1lKCldLmluc2VydChmcUluc3RhbmNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgaW5pdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luaXQvdXRpbC5jcHAgYi9pbml0L3V0aWwuY3BwCmluZGV4IDhiZmI3NTUuLjA1MzIzNzUgMTAwNjQ0Ci0tLSBhL2luaXQvdXRpbC5jcHAKKysrIGIvaW5pdC91dGlsLmNwcApAQCAtNDEsMTMgKzQxLDE4IEBACiAjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CiAKICNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQorI2luY2x1ZGUgPGFuZHJvaWQvYXBpLWxldmVsLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RlbV9wcm9wZXJ0aWVzLmg+CisKICNpbmNsdWRlICJyZWJvb3RfdXRpbHMuaCIKICNpbmNsdWRlICJzZWxhYmVsLmgiCisjaW5jbHVkZSAic2VsaW51eC5oIgogI2Vsc2UKICNpbmNsdWRlICJob3N0X2luaXRfc3R1YnMuaCIKICNlbmRpZgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpib290X2Nsb2NrOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aDsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmxpdGVyYWxzOjpzdHJpbmdfbGl0ZXJhbHM7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTI2NywxMiArMjcyLDEwIEBACiAgICAgcmV0dXJuIFNfSVNESVIoaW5mby5zdF9tb2RlKTsKIH0KIAotYm9vbCBleHBhbmRfcHJvcHMoY29uc3Qgc3RkOjpzdHJpbmcmIHNyYywgc3RkOjpzdHJpbmcqIGRzdCkgeworUmVzdWx0PHN0ZDo6c3RyaW5nPiBFeHBhbmRQcm9wcyhjb25zdCBzdGQ6OnN0cmluZyYgc3JjKSB7CiAgICAgY29uc3QgY2hhciogc3JjX3B0ciA9IHNyYy5jX3N0cigpOwogCi0gICAgaWYgKCFkc3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBzdGQ6OnN0cmluZyBkc3Q7CiAKICAgICAvKiAtIHZhcmlhYmxlcyBjYW4gZWl0aGVyIGJlICR4Lnkgb3IgJHt4Lnl9LCBpbiBjYXNlIHRoZXkgYXJlIG9ubHkgcGFydAogICAgICAqICAgb2YgdGhlIHN0cmluZy4KQEAgLTI4NiwxOSArMjg5LDE5IEBACiAKICAgICAgICAgYyA9IHN0cmNocihzcmNfcHRyLCAnJCcpOwogICAgICAgICBpZiAoIWMpIHsKLSAgICAgICAgICAgIGRzdC0+YXBwZW5kKHNyY19wdHIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBkc3QuYXBwZW5kKHNyY19wdHIpOworICAgICAgICAgICAgcmV0dXJuIGRzdDsKICAgICAgICAgfQogCi0gICAgICAgIGRzdC0+YXBwZW5kKHNyY19wdHIsIGMpOworICAgICAgICBkc3QuYXBwZW5kKHNyY19wdHIsIGMpOwogICAgICAgICBjKys7CiAKICAgICAgICAgaWYgKCpjID09ICckJykgewotICAgICAgICAgICAgZHN0LT5wdXNoX2JhY2soKihjKyspKTsKKyAgICAgICAgICAgIGRzdC5wdXNoX2JhY2soKihjKyspKTsKICAgICAgICAgICAgIHNyY19wdHIgPSBjOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSBpZiAoKmMgPT0gJ1wwJykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gZHN0OwogICAgICAgICB9CiAKICAgICAgICAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lOwpAQCAtMzA4LDggKzMxMSw3IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyKiBlbmQgPSBzdHJjaHIoYywgJ30nKTsKICAgICAgICAgICAgIGlmICghZW5kKSB7CiAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRvIGZpbmQgY2xvc2luZyBicmFjZSwgYWJvcnQuCi0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nIGluICciIDw8IHNyYyA8PCAiJywgbG9va2luZyBmb3IgfSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJpbmcgaW4gJyIgPDwgc3JjIDw8ICInLCBsb29raW5nIGZvciB9IjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByb3BfbmFtZSA9IHN0ZDo6c3RyaW5nKGMsIGVuZCk7CiAgICAgICAgICAgICBjID0gZW5kICsgMTsKQEAgLTMyMCwyOSArMzIyLDM0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwcm9wX25hbWUgPSBjOwotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXNpbmcgZGVwcmVjYXRlZCBzeW50YXggZm9yIHNwZWNpZnlpbmcgcHJvcGVydHkgJyIgPDwgYyA8PCAiJywgdXNlICR7bmFtZX0gaW5zdGVhZCI7CisgICAgICAgICAgICBpZiAoU2VsaW51eEdldFZlbmRvckFuZHJvaWRWZXJzaW9uKCkgPj0gX19BTkRST0lEX0FQSV9SX18pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAidXNpbmcgZGVwcmVjYXRlZCBzeW50YXggZm9yIHNwZWNpZnlpbmcgcHJvcGVydHkgJyIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLCB1c2UgJHtuYW1lfSBpbnN0ZWFkIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXNpbmcgZGVwcmVjYXRlZCBzeW50YXggZm9yIHNwZWNpZnlpbmcgcHJvcGVydHkgJyIgPDwgYworICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIicsIHVzZSAke25hbWV9IGluc3RlYWQiOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYyArPSBwcm9wX25hbWUuc2l6ZSgpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHByb3BfbmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJpbnZhbGlkIHplcm8tbGVuZ3RoIHByb3BlcnR5IG5hbWUgaW4gJyIgPDwgc3JjIDw8ICInIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJpbnZhbGlkIHplcm8tbGVuZ3RoIHByb3BlcnR5IG5hbWUgaW4gJyIgPDwgc3JjIDw8ICInIjsKICAgICAgICAgfQogCiAgICAgICAgIHN0ZDo6c3RyaW5nIHByb3BfdmFsID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkocHJvcF9uYW1lLCAiIik7CiAgICAgICAgIGlmIChwcm9wX3ZhbC5lbXB0eSgpKSB7CiAgICAgICAgICAgICBpZiAoZGVmX3ZhbC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicHJvcGVydHkgJyIgPDwgcHJvcF9uYW1lIDw8ICInIGRvZXNuJ3QgZXhpc3Qgd2hpbGUgZXhwYW5kaW5nICciIDw8IHNyYyA8PCAiJyI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJwcm9wZXJ0eSAnIiA8PCBwcm9wX25hbWUgPDwgIicgZG9lc24ndCBleGlzdCB3aGlsZSBleHBhbmRpbmcgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzcmMgPDwgIiciOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHJvcF92YWwgPSBkZWZfdmFsOwogICAgICAgICB9CiAKLSAgICAgICAgZHN0LT5hcHBlbmQocHJvcF92YWwpOworICAgICAgICBkc3QuYXBwZW5kKHByb3BfdmFsKTsKICAgICAgICAgc3JjX3B0ciA9IGM7CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGRzdDsKIH0KIAogc3RhdGljIHN0ZDo6c3RyaW5nIGluaXRfYW5kcm9pZF9kdF9kaXIoKSB7CkBAIC00MTQsNiArNDIxLDU4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK1Jlc3VsdDx2b2lkPiBJc0xlZ2FsUHJvcGVydHlWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlLnNpemUoKSA+PSBQUk9QX1ZBTFVFX01BWCAmJiAhU3RhcnRzV2l0aChuYW1lLCAicm8uIikpIHsKKyAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIlByb3BlcnR5IHZhbHVlIHRvbyBsb25nIjsKKyAgICB9CisKKyAgICBpZiAobWJzdG93Y3MobnVsbHB0ciwgdmFsdWUuZGF0YSgpLCAwKSA9PSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oLTEpKSB7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJWYWx1ZSBpcyBub3QgYSBVVEY4IGVuY29kZWQgc3RyaW5nIjsKKyAgICB9CisKKyAgICByZXR1cm4ge307Cit9CisKK1Jlc3VsdDxzdGQ6OnBhaXI8aW50LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+PiBQYXJzZVJlc3RvcmVjb24oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgeworICAgIHN0cnVjdCBmbGFnX3R5cGUgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lOworICAgICAgICBpbnQgdmFsdWU7CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxhZ190eXBlIGZsYWdzW10gPSB7CisgICAgICAgICAgICB7Ii0tcmVjdXJzaXZlIiwgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fUkVDVVJTRX0sCisgICAgICAgICAgICB7Ii0tc2tpcC1jZSIsIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1NLSVBDRX0sCisgICAgICAgICAgICB7Ii0tY3Jvc3MtZmlsZXN5c3RlbXMiLCBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9DUk9TU19GSUxFU1lTVEVNU30sCisgICAgICAgICAgICB7MCwgMH19OworCisgICAgaW50IGZsYWcgPSAwOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRoczsKKworICAgIGJvb2wgaW5fZmxhZ3MgPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgYXJncy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChhcmdzW2ldLCAiLS0iKSkgeworICAgICAgICAgICAgaWYgKCFpbl9mbGFncykgeworICAgICAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJmbGFncyBtdXN0IHByZWNlZGUgcGF0aHMiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGZsYWdzW2pdLm5hbWU7ICsraikgeworICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09IGZsYWdzW2pdLm5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZyB8PSBmbGFnc1tqXS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImJhZCBmbGFnICIgPDwgYXJnc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluX2ZsYWdzID0gZmFsc2U7CisgICAgICAgICAgICBwYXRocy5lbXBsYWNlX2JhY2soYXJnc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6cGFpcihmbGFnLCBwYXRocyk7Cit9CisKIHN0YXRpYyB2b2lkIEluaXRBYm9ydGVyKGNvbnN0IGNoYXIqIGFib3J0X21lc3NhZ2UpIHsKICAgICAvLyBXaGVuIGluaXQgZm9ya3MsIGl0IGNvbnRpbnVlcyB0byB1c2UgdGhpcyBhYm9ydGVyIGZvciBMT0coRkFUQUwpLCBidXQgd2Ugd2FudCBjaGlsZHJlbiB0bwogICAgIC8vIHNpbXBseSBhYm9ydCBpbnN0ZWFkIG9mIHRyeWluZyB0byByZWJvb3QgdGhlIHN5c3RlbS4KZGlmZiAtLWdpdCBhL2luaXQvdXRpbC5oIGIvaW5pdC91dGlsLmgKaW5kZXggNmExMmZiNi4uNGNjY2VmZSAxMDA2NDQKLS0tIGEvaW5pdC91dGlsLmgKKysrIGIvaW5pdC91dGlsLmgKQEAgLTE0LDI0ICsxNCwyMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBfSU5JVF9VVElMX0hfCi0jZGVmaW5lIF9JTklUX1VUSUxfSF8KKyNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPG9zdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2Nocm9ub191dGlscy5oPgotI2luY2x1ZGUgPHNlbGludXgvbGFiZWwuaD4KIAogI2luY2x1ZGUgInJlc3VsdC5oIgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpib290X2Nsb2NrOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaW5pdCB7CkBAIC01Miw3ICs0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyYsIGJvb2wpPiYpOwogYm9vbCBtYWtlX2Rpcihjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgbW9kZV90IG1vZGUpOwogYm9vbCBpc19kaXIoY29uc3QgY2hhciogcGF0aG5hbWUpOwotYm9vbCBleHBhbmRfcHJvcHMoY29uc3Qgc3RkOjpzdHJpbmcmIHNyYywgc3RkOjpzdHJpbmcqIGRzdCk7CitSZXN1bHQ8c3RkOjpzdHJpbmc+IEV4cGFuZFByb3BzKGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmMpOwogCiAvLyBSZXR1cm5zIHRoZSBwbGF0Zm9ybSdzIEFuZHJvaWQgRFQgZGlyZWN0b3J5IGFzIHNwZWNpZmllZCBpbiB0aGUga2VybmVsIGNtZGxpbmUuCiAvLyBJZiB0aGUgcGxhdGZvcm0gZG9lcyBub3QgY29uZmlndXJlIGEgY3VzdG9tIERUIHBhdGgsIHJldHVybnMgdGhlIHN0YW5kYXJkIG9uZSAoYmFzZWQgaW4gcHJvY2ZzKS4KQEAgLTYyLDExICs1OCwxMyBAQAogYm9vbCBpc19hbmRyb2lkX2R0X3ZhbHVlX2V4cGVjdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX2NvbnRlbnQpOwogCiBib29sIElzTGVnYWxQcm9wZXJ0eU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworUmVzdWx0PHZvaWQ+IElzTGVnYWxQcm9wZXJ0eVZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworCitSZXN1bHQ8c3RkOjpwYWlyPGludCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Pj4gUGFyc2VSZXN0b3JlY29uKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwogCiB2b2lkIFNldFN0ZGlvVG9EZXZOdWxsKGNoYXIqKiBhcmd2KTsKIHZvaWQgSW5pdEtlcm5lbExvZ2dpbmcoY2hhcioqIGFyZ3YpOwogYm9vbCBJc1JlY292ZXJ5TW9kZSgpOwogfSAgLy8gbmFtZXNwYWNlIGluaXQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL0FuZHJvaWQuYnAgYi9saWJjdXRpbHMvQW5kcm9pZC5icAppbmRleCAzMTlhNzNhLi5iOTQyMGQ0IDEwMDY0NAotLS0gYS9saWJjdXRpbHMvQW5kcm9pZC5icAorKysgYi9saWJjdXRpbHMvQW5kcm9pZC5icApAQCAtNjcsOCArNjcsNiBAQAogICAgICAgICAibmF0aXZlX2hhbmRsZS5jcHAiLAogICAgICAgICAicmVjb3JkX3N0cmVhbS5jcHAiLAogICAgICAgICAic29ja2V0cy5jcHAiLAotICAgICAgICAic3RyZHVwMTZ0bzguY3BwIiwKLSAgICAgICAgInN0cmR1cDh0bzE2LmNwcCIsCiAgICAgICAgICJzdHJsY3B5LmMiLAogICAgICAgICAidGhyZWFkcy5jcHAiLAogICAgIF0sCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvanN0cmluZy5oIGIvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2pzdHJpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM0MjYwOC4uMDAwMDAwMAotLS0gYS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvanN0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19DVVRJTFNfU1RSSU5HMTZfSAotI2RlZmluZSBfX0NVVElMU19TVFJJTkcxNl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgX19TVERDX1ZFUlNJT05fXyA8IDIwMTExMkwgJiYgX19jcGx1c3BsdXMgPCAyMDExMDNMCi0gIHR5cGVkZWYgdWludDE2X3QgY2hhcjE2X3Q7Ci0jZW5kaWYKLSAgLy8gb3RoZXJ3aXNlIGNoYXIxNl90IGlzIGEga2V5d29yZCB3aXRoIHRoZSByaWdodCBzZW1hbnRpY3MKLQotZXh0ZXJuIGNoYXIgKiBzdHJuZHVwMTZ0bzggKGNvbnN0IGNoYXIxNl90KiBzLCBzaXplX3Qgbik7Ci1leHRlcm4gc2l6ZV90IHN0cm5sZW4xNnRvOCAoY29uc3QgY2hhcjE2X3QqIHMsIHNpemVfdCBuKTsKLWV4dGVybiBjaGFyICogc3RybmNweTE2dG84IChjaGFyICpkZXN0LCBjb25zdCBjaGFyMTZfdCpzLCBzaXplX3Qgbik7Ci0KLWV4dGVybiBjaGFyMTZfdCAqIHN0cmR1cDh0bzE2IChjb25zdCBjaGFyKiBzLCBzaXplX3QgKm91dF9sZW4pOwotZXh0ZXJuIHNpemVfdCBzdHJsZW44dG8xNiAoY29uc3QgY2hhciogdXRmOFN0cik7Ci1leHRlcm4gY2hhcjE2X3QgKiBzdHJjcHk4dG8xNiAoY2hhcjE2X3QgKmRlc3QsIGNvbnN0IGNoYXIqcywgc2l6ZV90ICpvdXRfbGVuKTsKLWV4dGVybiBjaGFyMTZfdCAqIHN0cmNweWxlbjh0bzE2IChjaGFyMTZfdCAqZGVzdCwgY29uc3QgY2hhcipzLCBpbnQgbGVuZ3RoLAotICAgIHNpemVfdCAqb3V0X2xlbik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0NVVElMU19TVFJJTkcxNl9IICovCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvaW5jbHVkZV92bmRrL2N1dGlscy9qc3RyaW5nLmggYi9saWJjdXRpbHMvaW5jbHVkZV92bmRrL2N1dGlscy9qc3RyaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGYzZmQ1NDYuLjAwMDAwMDAKLS0tIGEvbGliY3V0aWxzL2luY2x1ZGVfdm5kay9jdXRpbHMvanN0cmluZy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vaW5jbHVkZS9jdXRpbHMvanN0cmluZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL3N0cmR1cDE2dG84LmNwcCBiL2xpYmN1dGlscy9zdHJkdXAxNnRvOC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTE4MWUuLjAwMDAwMDAKLS0tIGEvbGliY3V0aWxzL3N0cmR1cDE2dG84LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKiBsaWJzL2N1dGlscy9zdHJkdXAxNnRvOC5jCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPGN1dGlscy9qc3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4gIC8qIGZvciBTSVpFX01BWCAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0KLS8qKgotICogR2l2ZW4gYSBVVEYtMTYgc3RyaW5nLCBjb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgVVRGLTgKLSAqIHN0cmluZyBpbiBieXRlcy4KLSAqLwotZXh0ZXJuIHNpemVfdCBzdHJubGVuMTZ0bzgoY29uc3QgY2hhcjE2X3QqIHV0ZjE2U3RyLCBzaXplX3QgbGVuKQotewotICAgIHNpemVfdCB1dGY4TGVuID0gMDsKLQotICAgIC8qIEEgc21hbGwgbm90ZSBvbiBpbnRlZ2VyIG92ZXJmbG93LiBUaGUgcmVzdWx0IGNhbgotICAgICAqIHBvdGVudGlhbGx5IGJlIGFzIGJpZyBhcyAzKmxlbiwgd2hpY2ggd2lsbCBvdmVyZmxvdwotICAgICAqIGZvciBsZW4gPiBTSVpFX01BWC8zLgotICAgICAqCi0gICAgICogTW9yZW92ZXIsIHRoZSByZXN1bHQgb2YgYSBzdHJubGVuMTZ0bzggaXMgdHlwaWNhbGx5IHVzZWQKLSAgICAgKiB0byBhbGxvY2F0ZSBhIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byBzdHJuY3B5MTZ0bzggd2hpY2gKLSAgICAgKiByZXF1aXJlcyBvbmUgbW9yZSBieXRlIHRvIHRlcm1pbmF0ZSB0aGUgVVRGLTggY29weSwgYW5kCi0gICAgICogdGhpcyBpcyBnZW5lcmFsbHkgZG9uZSBieSBjYXJlbGVzcyB1c2VycyBieSBpbmNyZW1lbnRpbmcKLSAgICAgKiB0aGUgcmVzdWx0IHdpdGhvdXQgY2hlY2tpbmcgZm9yIGludGVnZXIgb3ZlcmZsb3dzLCBlLmcuOgotICAgICAqCi0gICAgICogICBkc3QgPSBtYWxsb2Moc3RybmxlbjE2dG84KHV0ZjE2LGxlbikrMSkKLSAgICAgKgotICAgICAqIER1ZSB0byB0aGlzLCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCB0cnkgdG8gZGV0ZWN0Ci0gICAgICogb3ZlcmZsb3dzLCBhbmQgbmV2ZXIgcmV0dXJuIG1vcmUgdGhhbiAoU0laRV9NQVgtMSkKLSAgICAgKiB3aGVuIGl0IGRldGVjdHMgb25lLiBBIGNhcmVsZXNzIHVzZXIgd2lsbCB0cnkgdG8gbWFsbG9jCi0gICAgICogU0laRV9NQVggYnl0ZXMsIHdoaWNoIHdpbGwgcmV0dXJuIE5VTEwgd2hpY2ggY2FuIGF0IGxlYXN0Ci0gICAgICogYmUgZGV0ZWN0ZWQgYXBwcm9wcmlhdGVseS4KLSAgICAgKgotICAgICAqIEFzIGZhciBhcyBJIGtub3csIHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGJ5IHN0cm5kdXAxNigpLAotICAgICAqIGJ1dCBiZXR0ZXIgYmUgc2FmZSB0aGFuIHNvcnJ5LgotICAgICAqLwotCi0gICAgLyogRmFzdCBwYXRoIGZvciB0aGUgdXN1YWwgY2FzZSB3aGVyZSAzKmxlbiBpcyA8IFNJWkVfTUFYLTEuCi0gICAgICovCi0gICAgaWYgKGxlbiA8IChTSVpFX01BWC0xKS8zKSB7Ci0gICAgICAgIHdoaWxlIChsZW4gIT0gMCkgewotICAgICAgICAgICAgbGVuLS07Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgdWljID0gKnV0ZjE2U3RyKys7Ci0KLSAgICAgICAgICAgIGlmICh1aWMgPiAweDA3ZmYpCi0gICAgICAgICAgICAgICAgdXRmOExlbiArPSAzOwotICAgICAgICAgICAgZWxzZSBpZiAodWljID4gMHg3ZiB8fCB1aWMgPT0gMCkKLSAgICAgICAgICAgICAgICB1dGY4TGVuICs9IDI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdXRmOExlbisrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1dGY4TGVuOwotICAgIH0KLQotICAgIC8qIFRoZSBzbG93ZXIgYnV0IHBhcmFub2lkIHZlcnNpb24gKi8KLSAgICB3aGlsZSAobGVuICE9IDApIHsKLSAgICAgICAgbGVuLS07Ci0gICAgICAgIHVuc2lnbmVkIGludCAgdWljICAgICA9ICp1dGYxNlN0cisrOwotICAgICAgICBzaXplX3QgICAgICAgIHV0ZjhDdXIgPSB1dGY4TGVuOwotCi0gICAgICAgIGlmICh1aWMgPiAweDA3ZmYpCi0gICAgICAgICAgICB1dGY4TGVuICs9IDM7Ci0gICAgICAgIGVsc2UgaWYgKHVpYyA+IDB4N2YgfHwgdWljID09IDApCi0gICAgICAgICAgICB1dGY4TGVuICs9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHV0ZjhMZW4rKzsKLQotICAgICAgICBpZiAodXRmOExlbiA8IHV0ZjhDdXIpIC8qIG92ZXJmbG93IGRldGVjdGVkICovCi0gICAgICAgICAgICByZXR1cm4gU0laRV9NQVgtMTsKLSAgICB9Ci0KLSAgICAvKiBkb24ndCByZXR1cm4gU0laRV9NQVggdG8gYXZvaWQgY29tbW9uIHVzZXIgYnVnICovCi0gICAgaWYgKHV0ZjhMZW4gPT0gU0laRV9NQVgpCi0gICAgICAgIHV0ZjhMZW4gPSBTSVpFX01BWC0xOwotCi0gICAgcmV0dXJuIHV0ZjhMZW47Ci19Ci0KLQotLyoqCi0gKiBDb252ZXJ0IGEgSmF2YS1TdHlsZSBVVEYtMTYgc3RyaW5nICsgbGVuZ3RoIHRvIGEgSk5JLVN0eWxlIFVURi04IHN0cmluZy4KLSAqCi0gKiBUaGlzIGJhc2ljYWxseSBtZWFuczogZW1iZWRkZWQgXDAncyBpbiB0aGUgVVRGLTE2IHN0cmluZyBhcmUgZW5jb2RlZAotICogYXMgIjB4YzAgMHg4MCIKLSAqCi0gKiBNYWtlIHN1cmUgeW91IGFsbG9jYXRlICJ1dGY4U3RyIiB3aXRoIHRoZSByZXN1bHQgb2Ygc3RybGVuMTZ0bzgoKSArIDEsCi0gKiBub3QganVzdCAibGVuIi4KLSAqCi0gKiBQbGVhc2Ugbm90ZSwgYSB0ZXJtaW5hdGVkIFwwIGlzIGFsd2F5cyBhZGRlZCwgc28geW91ciByZXN1bHQgd2lsbCBhbHdheXMKLSAqIGJlICJzdHJsZW4xNnRvOCgpICsgMSIgYnl0ZXMgbG9uZy4KLSAqLwotZXh0ZXJuIGNoYXIqIHN0cm5jcHkxNnRvOChjaGFyKiB1dGY4U3RyLCBjb25zdCBjaGFyMTZfdCogdXRmMTZTdHIsIHNpemVfdCBsZW4pCi17Ci0gICAgY2hhciogdXRmOGN1ciA9IHV0ZjhTdHI7Ci0KLSAgICAvKiBOb3RlIG9uIG92ZXJmbG93czogV2UgYXNzdW1lIHRoZSB1c2VyIGRpZCBjaGVjayB0aGUgcmVzdWx0IG9mCi0gICAgICogc3RybmxlbjE2dG84KCkgcHJvcGVybHkgb3IgYXQgYSBtaW5pbXVtIGNoZWNrZWQgdGhlIHJlc3VsdCBvZgotICAgICAqIGl0cyBtYWxsb2MoU0laRV9NQVgpIGluIGNhc2Ugb2Ygb3ZlcmZsb3cuCi0gICAgICovCi0gICAgd2hpbGUgKGxlbiAhPSAwKSB7Ci0gICAgICAgIGxlbi0tOwotICAgICAgICB1bnNpZ25lZCBpbnQgdWljID0gKnV0ZjE2U3RyKys7Ci0KLSAgICAgICAgaWYgKHVpYyA+IDB4MDdmZikgewotICAgICAgICAgICAgKnV0ZjhjdXIrKyA9ICh1aWMgPj4gMTIpIHwgMHhlMDsKLSAgICAgICAgICAgICp1dGY4Y3VyKysgPSAoKHVpYyA+PiA2KSAmIDB4M2YpIHwgMHg4MDsKLSAgICAgICAgICAgICp1dGY4Y3VyKysgPSAodWljICYgMHgzZikgfCAweDgwOwotICAgICAgICB9IGVsc2UgaWYgKHVpYyA+IDB4N2YgfHwgdWljID09IDApIHsKLSAgICAgICAgICAgICp1dGY4Y3VyKysgPSAodWljID4+IDYpIHwgMHhjMDsKLSAgICAgICAgICAgICp1dGY4Y3VyKysgPSAodWljICYgMHgzZikgfCAweDgwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKnV0ZjhjdXIrKyA9IHVpYzsKLQotICAgICAgICAgICAgaWYgKHVpYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICp1dGY4Y3VyID0gJ1wwJzsKLQotICAgcmV0dXJuIHV0ZjhTdHI7Ci19Ci0KLS8qKgotICogQ29udmVydCBhIFVURi0xNiBzdHJpbmcgdG8gVVRGLTguCi0gKgotICovCi1jaGFyICogc3RybmR1cDE2dG84IChjb25zdCBjaGFyMTZfdCogcywgc2l6ZV90IG4pCi17Ci0gICAgaWYgKHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzaXplX3QgbGVuID0gc3RybmxlbjE2dG84KHMsIG4pOwotCi0gICAgLyogV2UgYXJlIHBhcmFub2lkLCBhbmQgd2UgY2hlY2sgZm9yIFNJWkVfTUFYLTEKLSAgICAgKiB0b28gc2luY2UgaXQgaXMgYW4gb3ZlcmZsb3cgdmFsdWUgZm9yIG91cgotICAgICAqIHN0cm5sZW4xNnRvOCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICBpZiAobGVuID49IFNJWkVfTUFYLTEpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY2hhciogcmV0ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1hbGxvYyhsZW4gKyAxKSk7Ci0gICAgaWYgKHJldCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHN0cm5jcHkxNnRvOCAocmV0LCBzLCBuKTsKLQotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9saWJjdXRpbHMvc3RyZHVwOHRvMTYuY3BwIGIvbGliY3V0aWxzL3N0cmR1cDh0bzE2LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlNTFiOS4uMDAwMDAwMAotLS0gYS9saWJjdXRpbHMvc3RyZHVwOHRvMTYuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qIGxpYnMvY3V0aWxzL3N0cmR1cDh0bzE2LmMKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8Y3V0aWxzL2pzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0vKiBTZWUgaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMjIvIGZvciBkaXNjdXNzaW9uCi0gKiBvbiBpbnZhbGlkIHNlcXVlbmNlcwotICovCi0KLSNkZWZpbmUgVVRGMTZfUkVQTEFDRU1FTlRfQ0hBUiAweGZmZmQKLQotLyogQ2xldmVyIHRyaWNrIGZyb20gRGlhbm5lIHRoYXQgcmV0dXJucyAxLTQgZGVwZW5kaW5nIG9uIGxlYWRpbmcgYml0IHNlcXVlbmNlKi8KLSNkZWZpbmUgVVRGOF9TRVFfTEVOR1RIKGNoKSAoKCgweGU1MDAwMDAwID4+ICgoKGNoKSA+PiAzKSAmIDB4MWUpKSAmIDMpICsgMSkKLQotLyogbm90ZTogbWFjcm8gZXhwYW5kcyB0byBtdWx0aXBsZSBsaW5lcyAqLwotI2RlZmluZSBVVEY4X1NISUZUX0FORF9NQVNLKHVuaWNvZGUsIGJ5dGUpICBcCi0gICAgICAgICAgICAodW5pY29kZSk8PD02OyAodW5pY29kZSkgfD0gKDB4M2YgJiAoYnl0ZSkpOwotCi0jZGVmaW5lIFVOSUNPREVfVVBQRVJfTElNSVQgMHgxMGZmZmQgICAgCi0KLS8qKgotICogb3V0X2xlbiBpcyBhbiBvdXQgcGFyYW1ldGVyICh3aGljaCBtYXkgbm90IGJlIG51bGwpIGNvbnRhaW5pbmcgdGhlCi0gKiBsZW5ndGggb2YgdGhlIFVURi0xNiBzdHJpbmcgKHdoaWNoIG1heSBjb250YWluIGVtYmVkZGVkIFwwJ3MpCi0gKi8KLQotZXh0ZXJuIGNoYXIxNl90ICogc3RyZHVwOHRvMTYgKGNvbnN0IGNoYXIqIHMsIHNpemVfdCAqb3V0X2xlbikKLXsKLSAgICBjaGFyMTZfdCAqcmV0OwotICAgIHNpemVfdCBsZW47Ci0KLSAgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIGxlbiA9IHN0cmxlbjh0bzE2KHMpOwotCi0gICAgLy8gZmFpbCBvbiBvdmVyZmxvdwotICAgIGlmIChsZW4gJiYgU0laRV9NQVgvbGVuIDwgc2l6ZW9mKGNoYXIxNl90KSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBubyBwbHVzLW9uZSBoZXJlLiBVVEYtMTYgc3RyaW5ncyBhcmUgbm90IG51bGwgdGVybWluYXRlZAotICAgIHJldCA9IChjaGFyMTZfdCAqKSBtYWxsb2MgKHNpemVvZihjaGFyMTZfdCkgKiBsZW4pOwotCi0gICAgcmV0dXJuIHN0cmNweTh0bzE2IChyZXQsIHMsIG91dF9sZW4pOwotfQotCi0vKioKLSAqIExpa2UgInN0cmxlbiIsIGJ1dCBmb3Igc3RyaW5ncyBlbmNvZGVkIHdpdGggSmF2YSdzIG1vZGlmaWVkIFVURi04LgotICoKLSAqIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgbnVtYmVyIG9mIFVURi0xNiBjaGFyYWN0ZXJzIHJlcXVpcmVkCi0gKiB0byByZXByZXNlbnQgdGhpcyBzdHJpbmcuCi0gKi8KLWV4dGVybiBzaXplX3Qgc3RybGVuOHRvMTYgKGNvbnN0IGNoYXIqIHV0ZjhTdHIpCi17Ci0gICAgc2l6ZV90IGxlbiA9IDA7Ci0gICAgaW50IGljOwotICAgIGludCBleHBlY3RlZCA9IDA7Ci0KLSAgICB3aGlsZSAoKGljID0gKnV0ZjhTdHIrKykgIT0gJ1wwJykgewotICAgICAgICAvKiBieXRlcyB0aGF0IHN0YXJ0IDA/IG9yIDExIGFyZSBsZWFkIGJ5dGVzIGFuZCBjb3VudCBhcyBjaGFyYWN0ZXJzLiovCi0gICAgICAgIC8qIGJ5dGVzIHRoYXQgc3RhcnQgMTAgYXJlIGV4dGVudGlvbiBieXRlcyBhbmQgYXJlIG5vdCBjb3VudGVkICovCi0gICAgICAgICAKLSAgICAgICAgaWYgKChpYyAmIDB4YzApID09IDB4ODApIHsKLSAgICAgICAgICAgIC8qIGNvdW50IHRoZSAweDgwIGV4dGVudGlvbiBieXRlcy4gaWYgd2UgaGF2ZSBtb3JlIHRoYW4KLSAgICAgICAgICAgICAqIGV4cGVjdGVkLCB0aGVuIHN0YXJ0IGNvdW50aW5nIHRoZW0gYmVjYXVzZSBzdHJjcHk4dG8xNgotICAgICAgICAgICAgICogd2lsbCBpbnNlcnQgVVRGMTZfUkVQTEFDRU1FTlRfQ0hBUidzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGV4cGVjdGVkLS07Ci0gICAgICAgICAgICBpZiAoZXhwZWN0ZWQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbGVuKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgICAgIGV4cGVjdGVkID0gVVRGOF9TRVFfTEVOR1RIKGljKSAtIDE7Ci0KLSAgICAgICAgICAgIC8qIHRoaXMgd2lsbCByZXN1bHQgaW4gYSBzdXJyb2dhdGUgcGFpciAqLwotICAgICAgICAgICAgaWYgKGV4cGVjdGVkID09IDMpIHsKLSAgICAgICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQotCi0vKgotICogUmV0cmlldmUgdGhlIG5leHQgVVRGLTMyIGNoYXJhY3RlciBmcm9tIGEgVVRGLTggc3RyaW5nLgotICoKLSAqIFN0b3BzIGF0IGlubmVyIFwwJ3MKLSAqCi0gKiBSZXR1cm5zIFVURjE2X1JFUExBQ0VNRU5UX0NIQVIgaWYgYW4gaW52YWxpZCBzZXF1ZW5jZSBpcyBlbmNvdW50ZXJlZAotICoKLSAqIEFkdmFuY2VzICIqcFV0ZjhQdHIiIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgZ2V0VXRmMzJGcm9tVXRmOChjb25zdCBjaGFyKiogcFV0ZjhQdHIpCi17Ci0gICAgdWludDMyX3QgcmV0OwotICAgIGludCBzZXFfbGVuOwotICAgIGludCBpOwotCi0gICAgLyogTWFzayBmb3IgbGVhZGVyIGJ5dGUgZm9yIGxlbmd0aHMgMSwgMiwgMywgYW5kIDQgcmVzcGVjdGl2ZWx5Ki8KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBsZWFkZXJNYXNrWzRdID0gezB4ZmYsIDB4MWYsIDB4MGYsIDB4MDd9OwotCi0gICAgLyogQnl0ZXMgdGhhdCBzdGFydCB3aXRoIGJpdHMgIjEwIiBhcmUgbm90IGxlYWRpbmcgY2hhcmFjdGVycy4gKi8KLSAgICBpZiAoKCgqKnBVdGY4UHRyKSAmIDB4YzApID09IDB4ODApIHsKLSAgICAgICAgKCpwVXRmOFB0cikrKzsKLSAgICAgICAgcmV0dXJuIFVURjE2X1JFUExBQ0VNRU5UX0NIQVI7Ci0gICAgfQotCi0gICAgLyogbm90ZSB3ZSB0b2xlcmF0ZSBpbnZhbGlkIGxlYWRlciAxMTExMXh4eCBoZXJlICovICAgIAotICAgIHNlcV9sZW4gPSBVVEY4X1NFUV9MRU5HVEgoKipwVXRmOFB0cik7Ci0KLSAgICByZXQgPSAoKipwVXRmOFB0cikgJiBsZWFkZXJNYXNrIFtzZXFfbGVuIC0gMV07Ci0KLSAgICBpZiAoKipwVXRmOFB0ciA9PSAnXDAnKSByZXR1cm4gcmV0OwotCi0gICAgKCpwVXRmOFB0cikrKzsKLSAgICBmb3IgKGkgPSAxOyBpIDwgc2VxX2xlbiA7IGkrKywgKCpwVXRmOFB0cikrKykgewotICAgICAgICBpZiAoKCoqcFV0ZjhQdHIpID09ICdcMCcpIHJldHVybiBVVEYxNl9SRVBMQUNFTUVOVF9DSEFSOwotICAgICAgICBpZiAoKCgqKnBVdGY4UHRyKSAmIDB4YzApICE9IDB4ODApIHJldHVybiBVVEYxNl9SRVBMQUNFTUVOVF9DSEFSOwotCi0gICAgICAgIFVURjhfU0hJRlRfQU5EX01BU0socmV0LCAqKnBVdGY4UHRyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0KLS8qKgotICogb3V0X2xlbiBpcyBhbiBvdXQgcGFyYW1ldGVyICh3aGljaCBtYXkgbm90IGJlIG51bGwpIGNvbnRhaW5pbmcgdGhlCi0gKiBsZW5ndGggb2YgdGhlIFVURi0xNiBzdHJpbmcgKHdoaWNoIG1heSBjb250YWluIGVtYmVkZGVkIFwwJ3MpCi0gKi8KLQotZXh0ZXJuIGNoYXIxNl90ICogc3RyY3B5OHRvMTYgKGNoYXIxNl90ICp1dGYxNlN0ciwgY29uc3QgY2hhcip1dGY4U3RyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqb3V0X2xlbikKLXsgICAKLSAgICBjaGFyMTZfdCAqZGVzdCA9IHV0ZjE2U3RyOwotCi0gICAgd2hpbGUgKCp1dGY4U3RyICE9ICdcMCcpIHsKLSAgICAgICAgdWludDMyX3QgcmV0OwotCi0gICAgICAgIHJldCA9IGdldFV0ZjMyRnJvbVV0ZjgoJnV0ZjhTdHIpOwotCi0gICAgICAgIGlmIChyZXQgPD0gMHhmZmZmKSB7Ci0gICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIxNl90KSByZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAocmV0IDw9IFVOSUNPREVfVVBQRVJfTElNSVQpICB7Ci0gICAgICAgICAgICAvKiBDcmVhdGUgc3Vycm9nYXRlIHBhaXJzICovCi0gICAgICAgICAgICAvKiBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYvVUNTLTIjTWV0aG9kX2Zvcl9jb2RlX3BvaW50c19pbl9QbGFuZV8xLjJDX1BsYW5lXzIgKi8KLQotICAgICAgICAgICAgKmRlc3QrKyA9IDB4ZDgwMCB8ICgocmV0IC0gMHgxMDAwMCkgPj4gMTApOwotICAgICAgICAgICAgKmRlc3QrKyA9IDB4ZGMwMCB8ICgocmV0IC0gMHgxMDAwMCkgJiAgMHgzZmYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3QrKyA9IFVURjE2X1JFUExBQ0VNRU5UX0NIQVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqb3V0X2xlbiA9IGRlc3QgLSB1dGYxNlN0cjsKLQotICAgIHJldHVybiB1dGYxNlN0cjsKLX0KLQotLyoqCi0gKiBsZW5ndGggaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBVVEYtOCBzdHJpbmcuCi0gKiBvdXRfbGVuIGlzIGFuIG91dCBwYXJhbWV0ZXIgKHdoaWNoIG1heSBub3QgYmUgbnVsbCkgY29udGFpbmluZyB0aGUKLSAqIGxlbmd0aCBvZiB0aGUgVVRGLTE2IHN0cmluZyAod2hpY2ggbWF5IGNvbnRhaW4gZW1iZWRkZWQgXDAncykKLSAqLwotCi1leHRlcm4gY2hhcjE2X3QgKiBzdHJjcHlsZW44dG8xNiAoY2hhcjE2X3QgKnV0ZjE2U3RyLCBjb25zdCBjaGFyKnV0ZjhTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCBzaXplX3QgKm91dF9sZW4pCi17Ci0gICAgLyogVE9ETzogU2hhcmUgbW9yZSBvZiB0aGlzIGNvZGUgd2l0aCB0aGUgbWV0aG9kIGFib3ZlLiBPbmx5IDIgbGluZXMgY2hhbmdlZC4gKi8KLSAgICAKLSAgICBjaGFyMTZfdCAqZGVzdCA9IHV0ZjE2U3RyOwotCi0gICAgY29uc3QgY2hhciAqZW5kID0gdXRmOFN0ciArIGxlbmd0aDsgLyogVGhpcyBsaW5lICovCi0gICAgd2hpbGUgKHV0ZjhTdHIgPCBlbmQpIHsgICAgICAgICAgICAgLyogYW5kIHRoaXMgbGluZSBjaGFuZ2VkLiAqLwotICAgICAgICB1aW50MzJfdCByZXQ7Ci0KLSAgICAgICAgcmV0ID0gZ2V0VXRmMzJGcm9tVXRmOCgmdXRmOFN0cik7Ci0KLSAgICAgICAgaWYgKHJldCA8PSAweGZmZmYpIHsKLSAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcjE2X3QpIHJldDsKLSAgICAgICAgfSBlbHNlIGlmIChyZXQgPD0gVU5JQ09ERV9VUFBFUl9MSU1JVCkgIHsKLSAgICAgICAgICAgIC8qIENyZWF0ZSBzdXJyb2dhdGUgcGFpcnMgKi8KLSAgICAgICAgICAgIC8qIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNi9VQ1MtMiNNZXRob2RfZm9yX2NvZGVfcG9pbnRzX2luX1BsYW5lXzEuMkNfUGxhbmVfMiAqLwotCi0gICAgICAgICAgICAqZGVzdCsrID0gMHhkODAwIHwgKChyZXQgLSAweDEwMDAwKSA+PiAxMCk7Ci0gICAgICAgICAgICAqZGVzdCsrID0gMHhkYzAwIHwgKChyZXQgLSAweDEwMDAwKSAmICAweDNmZik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdCsrID0gVVRGMTZfUkVQTEFDRU1FTlRfQ0hBUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpvdXRfbGVuID0gZGVzdCAtIHV0ZjE2U3RyOwotCi0gICAgcmV0dXJuIHV0ZjE2U3RyOwotfQpkaWZmIC0tZ2l0IGEvbGliaW9uL09XTkVSUyBiL2xpYmlvbi9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzYWQyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmlvbi9PV05FUlMKQEAgLTAsMCArMSwyIEBACitzc3BhdGlsQGdvb2dsZS5jb20KK2hyaWR5YUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9saWJpb24vaW9uLmMgYi9saWJpb24vaW9uLmMKaW5kZXggYjhkZTVhNC4uMWVjZmM3OCAxMDA2NDQKLS0tIGEvbGliaW9uL2lvbi5jCisrKyBiL2xpYmlvbi9pb24uYwpAQCAtMTUyLDYgKzE1Miw4IEBACiAgICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlOwogICAgIGludCByZXQ7CiAKKyAgICBpZiAoIWhhbmRsZV9mZCkgcmV0dXJuIC1FSU5WQUw7CisKICAgICBpZiAoIWlvbl9pc19sZWdhY3koZmQpKSB7CiAgICAgICAgIHN0cnVjdCBpb25fbmV3X2FsbG9jYXRpb25fZGF0YSBkYXRhID0gewogICAgICAgICAgICAgLmxlbiA9IGxlbiwKQEAgLTIwMSw2ICsyMDMsNyBAQAogICAgIGludCByZXQ7CiAgICAgc3RydWN0IGlvbl9oZWFwX3F1ZXJ5IHF1ZXJ5OwogCisgICAgaWYgKCFjbnQpIHJldHVybiAtRUlOVkFMOwogICAgIG1lbXNldCgmcXVlcnksIDAsIHNpemVvZihxdWVyeSkpOwogCiAgICAgcmV0ID0gaW9uX2lvY3RsKGZkLCBJT05fSU9DX0hFQVBfUVVFUlksICZxdWVyeSk7CmRpZmYgLS1naXQgYS9saWJpb24vdGVzdHMvQW5kcm9pZC5icCBiL2xpYmlvbi90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGIzZmNiM2IuLmQzYjQ2ODggMTAwNjQ0Ci0tLSBhL2xpYmlvbi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL2xpYmlvbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xOCwxOCArMTgsMTUgQEAKICAgICBuYW1lOiAiaW9uLXVuaXQtdGVzdHMiLAogICAgIGNmbGFnczogWwogICAgICAgICAiLWciLAotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmlvbiJdLAogICAgIHNyY3M6IFsKLSAgICAgICAgImlvbl90ZXN0X2ZpeHR1cmUuY3BwIiwKICAgICAgICAgImFsbG9jYXRlX3Rlc3QuY3BwIiwKLSAgICAgICAgImZvcm1lcmx5X3ZhbGlkX2hhbmRsZV90ZXN0LmNwcCIsCi0gICAgICAgICJpbnZhbGlkX3ZhbHVlc190ZXN0LmNwcCIsCi0gICAgICAgICJtYXBfdGVzdC5jcHAiLAotICAgICAgICAiZGV2aWNlX3Rlc3QuY3BwIiwKICAgICAgICAgImV4aXRfdGVzdC5jcHAiLAorICAgIAkiaGVhcF9xdWVyeS5jcHAiLAorICAgICAgICAiaW52YWxpZF92YWx1ZXNfdGVzdC5jcHAiLAorICAgICAgICAiaW9uX3Rlc3RfZml4dHVyZS5jcHAiLAorICAgICAgICAibWFwX3Rlc3QuY3BwIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbGliaW9uL3Rlc3RzL2FsbG9jYXRlX3Rlc3QuY3BwIGIvbGliaW9uL3Rlc3RzL2FsbG9jYXRlX3Rlc3QuY3BwCmluZGV4IDNjNDUyNGUuLjVlZDAxYmIgMTAwNjQ0Ci0tLSBhL2xpYmlvbi90ZXN0cy9hbGxvY2F0ZV90ZXN0LmNwcAorKysgYi9saWJpb24vdGVzdHMvYWxsb2NhdGVfdGVzdC5jcHAKQEAgLTE0LDk1ICsxNCwxMDYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCiAjaW5jbHVkZSA8aW9uL2lvbi5oPgogI2luY2x1ZGUgImlvbl90ZXN0X2ZpeHR1cmUuaCIKIAotY2xhc3MgQWxsb2NhdGUgOiBwdWJsaWMgSW9uQWxsSGVhcHNUZXN0IHsKLX07CitjbGFzcyBBbGxvY2F0ZSA6IHB1YmxpYyBJb25UZXN0IHt9OwogCi1URVNUX0YoQWxsb2NhdGUsIEFsbG9jYXRlKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCoxMDI0LCA2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKK1RFU1RfRihBbGxvY2F0ZSwgQWxsb2NhdGUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQgKiAxMDI0LCA2NCAqIDEwMjQsIDEwMjQgKiAxMDI0LCAyICogMTAyNCAqIDEwMjR9OworICAgIGZvciAoY29uc3QgYXV0byYgaGVhcCA6IGlvbl9oZWFwcykgewogICAgICAgICBmb3IgKHNpemVfdCBzaXplIDogYWxsb2NhdGlvblNpemVzKSB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7CisgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOwogICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICBpb25fdXNlcl9oYW5kbGVfdCBoYW5kbGUgPSAwOwotICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvYyhtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgMCwgJmhhbmRsZSkpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoaGFuZGxlICE9IDApOwotICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9mcmVlKG1faW9uRmQsIGhhbmRsZSkpOworICAgICAgICAgICAgaW50IGZkOworICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJmZkKSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmZCAhPSAwKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjbG9zZShmZCksIDApOyAgLy8gZnJlZSB0aGUgYnVmZmVyCiAgICAgICAgIH0KICAgICB9CiB9CiAKLVRFU1RfRihBbGxvY2F0ZSwgQWxsb2NhdGVDYWNoZWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0KjEwMjQsIDY0KjEwMjQsIDEwMjQqMTAyNCwgMioxMDI0KjEwMjR9OwotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgeworVEVTVF9GKEFsbG9jYXRlLCBBbGxvY2F0ZUNhY2hlZCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKLSAgICAgICAgICAgIGlvbl91c2VyX2hhbmRsZV90IGhhbmRsZSA9IDA7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCBJT05fRkxBR19DQUNIRUQsICZoYW5kbGUpKTsKLSAgICAgICAgICAgIEFTU0VSVF9UUlVFKGhhbmRsZSAhPSAwKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fZnJlZShtX2lvbkZkLCBoYW5kbGUpKTsKKyAgICAgICAgICAgIGludCBmZDsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIElPTl9GTEFHX0NBQ0hFRCwgJmZkKSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmZCAhPSAwKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjbG9zZShmZCksIDApOyAgLy8gZnJlZSB0aGUgYnVmZmVyCiAgICAgICAgIH0KICAgICB9CiB9CiAKLVRFU1RfRihBbGxvY2F0ZSwgQWxsb2NhdGVDYWNoZWROZWVkc1N5bmMpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0KjEwMjQsIDY0KjEwMjQsIDEwMjQqMTAyNCwgMioxMDI0KjEwMjR9OwotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgeworVEVTVF9GKEFsbG9jYXRlLCBBbGxvY2F0ZUNhY2hlZE5lZWRzU3luYykgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKLSAgICAgICAgICAgIGlvbl91c2VyX2hhbmRsZV90IGhhbmRsZSA9IDA7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCBJT05fRkxBR19DQUNIRURfTkVFRFNfU1lOQywgJmhhbmRsZSkpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoaGFuZGxlICE9IDApOwotICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9mcmVlKG1faW9uRmQsIGhhbmRsZSkpOworICAgICAgICAgICAgaW50IGZkOworICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9OX0ZMQUdfQ0FDSEVEX05FRURTX1NZTkMsICZmZCkpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmQgIT0gMCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoY2xvc2UoZmQpLCAwKTsgIC8vIGZyZWUgdGhlIGJ1ZmZlcgogICAgICAgICB9CiAgICAgfQogfQogCi1URVNUX0YoQWxsb2NhdGUsIFJlcGVhdGVkQWxsb2NhdGUpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0KjEwMjQsIDY0KjEwMjQsIDEwMjQqMTAyNCwgMioxMDI0KjEwMjR9OwotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgeworVEVTVF9GKEFsbG9jYXRlLCBSZXBlYXRlZEFsbG9jYXRlKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0ICogMTAyNCwgNjQgKiAxMDI0LCAxMDI0ICogMTAyNCwgMiAqIDEwMjQgKiAxMDI0fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKICAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOworICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOwotICAgICAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlID0gMDsKKyAgICAgICAgICAgIGludCBmZDsKIAogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKICAgICAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIml0ZXJhdGlvbiAiIDw8IGkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2MobV9pb25GZCwgc2l6ZSwgMCwgaGVhcE1hc2ssIDAsICZoYW5kbGUpKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShoYW5kbGUgIT0gMCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9mcmVlKG1faW9uRmQsIGhhbmRsZSkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsICZmZCkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZkICE9IDApOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShjbG9zZShmZCksIDApOyAgLy8gZnJlZSB0aGUgYnVmZmVyCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLVRFU1RfRihBbGxvY2F0ZSwgWmVyb2VkKQoteworVEVTVF9GKEFsbG9jYXRlLCBMYXJnZSkgeworICAgIGZvciAoY29uc3QgYXV0byYgaGVhcCA6IGlvbl9oZWFwcykgeworICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CisgICAgICAgIGludCBmZDsKKyAgICAgICAgQVNTRVJUX0VRKC1FTk9NRU0sCisgICAgICAgICAgICAgICAgICBpb25fYWxsb2NfZmQoaW9uZmQsIDNVTCAqIDEwMjQgKiAxMDI0ICogMTAyNCwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJmZkKSk7CisgICAgfQorfQorCisvLyBNYWtlIHN1cmUgYWxsIGhlYXBzIGFsd2F5cyByZXR1cm4gemVyb2VkIHBhZ2VzCitURVNUX0YoQWxsb2NhdGUsIFplcm9lZCkgewogICAgIGF1dG8gemVyb2VzX3B0ciA9IHN0ZDo6bWFrZV91bmlxdWU8Y2hhcltdPig0MDk2KTsKIAotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CisgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKICAgICAgICAgaW50IGZkc1sxNl07CiAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOwogCi0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCAwLCAmbWFwX2ZkKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCA0MDk2LCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLCAwLCAmbWFwX2ZkKSk7CiAgICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKIAotICAgICAgICAgICAgdm9pZCAqcHRyID0gTlVMTDsKKyAgICAgICAgICAgIHZvaWQqIHB0ciA9IE5VTEw7CiAgICAgICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIDQwOTYsIFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7CiAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7CiAKQEAgLTExNiwxMyArMTI3LDEzIEBACiAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UoZmRzW2ldKSk7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgbmV3SW9uRmQgPSBpb25fb3BlbigpOworICAgICAgICBpbnQgbmV3X2lvbmZkID0gaW9uX29wZW4oKTsKICAgICAgICAgaW50IG1hcF9mZCA9IC0xOwogCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobmV3SW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCAwLCAmbWFwX2ZkKSk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobmV3X2lvbmZkLCA0MDk2LCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLCAwLCAmbWFwX2ZkKSk7CiAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwogCi0gICAgICAgIHZvaWQgKnB0ciA9IE5VTEw7CisgICAgICAgIHZvaWQqIHB0ciA9IE5VTEw7CiAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgNDA5NiwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwogICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7CiAKQEAgLTEzMCwxNCArMTQxLDYgQEAKIAogICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgNDA5NikpOwogICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7Ci0gICAgfQotfQotCi1URVNUX0YoQWxsb2NhdGUsIExhcmdlKQotewotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpb25fdXNlcl9oYW5kbGVfdCBoYW5kbGUgPSAwOwotICAgICAgICBBU1NFUlRfRVEoLUVOT01FTSwgaW9uX2FsbG9jKG1faW9uRmQsIDNVTCoxMDI0KjEwMjQqMTAyNCwgMCwgaGVhcE1hc2ssIDAsICZoYW5kbGUpKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9jbG9zZShuZXdfaW9uZmQpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJpb24vdGVzdHMvZGV2aWNlX3Rlc3QuY3BwIGIvbGliaW9uL3Rlc3RzL2RldmljZV90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzZjdiNi4uMDAwMDAwMAotLS0gYS9saWJpb24vdGVzdHMvZGV2aWNlX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8bGludXgvaW9uX3Rlc3QuaD4KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlIDxpb24vaW9uLmg+Ci0KLSNpbmNsdWRlICJpb25fdGVzdF9maXh0dXJlLmgiCi0KLSNkZWZpbmUgQUxJR04oeCx5KSAoKCh4KSArICgoeSkgLSAxKSkgJiB+KCh5KSAtIDEpKQotCi1jbGFzcyBEZXZpY2UgOiBwdWJsaWMgSW9uQWxsSGVhcHNUZXN0IHsKLSBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCk7Ci0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7Ci0gICAgaW50IG1fZGV2aWNlRmQ7Ci0gICAgdm9pZCByZWFkRE1BKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci0gICAgdm9pZCB3cml0ZURNQShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpOwotICAgIHZvaWQgcmVhZEtlcm5lbChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpOwotICAgIHZvaWQgd3JpdGVLZXJuZWwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBzaXplKTsKLSAgICB2b2lkIGJsb3dDYWNoZSgpOwotICAgIHZvaWQgZGlydHlDYWNoZSh2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKLX07Ci0KLXZvaWQgRGV2aWNlOjpTZXRVcCgpCi17Ci0gICAgSW9uQWxsSGVhcHNUZXN0OjpTZXRVcCgpOwotICAgIG1fZGV2aWNlRmQgPSBvcGVuKCIvZGV2L2lvbi10ZXN0IiwgT19SRE9OTFkpOwotICAgIEFTU0VSVF9HRShtX2RldmljZUZkLCAwKTsKLX0KLQotdm9pZCBEZXZpY2U6OlRlYXJEb3duKCkKLXsKLSAgICBBU1NFUlRfRVEoMCwgY2xvc2UobV9kZXZpY2VGZCkpOwotICAgIElvbkFsbEhlYXBzVGVzdDo6VGVhckRvd24oKTsKLX0KLQotdm9pZCBEZXZpY2U6OnJlYWRETUEoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQotewotICAgIEFTU0VSVF9FUSgwLCBpb2N0bChtX2RldmljZUZkLCBJT05fSU9DX1RFU1RfU0VUX0ZELCBmZCkpOwotICAgIHN0cnVjdCBpb25fdGVzdF9yd19kYXRhIGlvbl90ZXN0X3J3X2RhdGEgPSB7Ci0gICAgICAgICAgICAucHRyID0gKHVpbnQ2NF90KWJ1ZiwKLSAgICAgICAgICAgIC5vZmZzZXQgPSAwLAotICAgICAgICAgICAgLnNpemUgPSBzaXplLAotICAgICAgICAgICAgLndyaXRlID0gMCwKLSAgICB9OwotCi0gICAgQVNTRVJUX0VRKDAsIGlvY3RsKG1fZGV2aWNlRmQsIElPTl9JT0NfVEVTVF9ETUFfTUFQUElORywgJmlvbl90ZXN0X3J3X2RhdGEpKTsKLSAgICBBU1NFUlRfRVEoMCwgaW9jdGwobV9kZXZpY2VGZCwgSU9OX0lPQ19URVNUX1NFVF9GRCwgLTEpKTsKLX0KLQotdm9pZCBEZXZpY2U6OndyaXRlRE1BKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBBU1NFUlRfRVEoMCwgaW9jdGwobV9kZXZpY2VGZCwgSU9OX0lPQ19URVNUX1NFVF9GRCwgZmQpKTsKLSAgICBzdHJ1Y3QgaW9uX3Rlc3RfcndfZGF0YSBpb25fdGVzdF9yd19kYXRhID0gewotICAgICAgICAgICAgLnB0ciA9ICh1aW50NjRfdClidWYsCi0gICAgICAgICAgICAub2Zmc2V0ID0gMCwKLSAgICAgICAgICAgIC5zaXplID0gc2l6ZSwKLSAgICAgICAgICAgIC53cml0ZSA9IDEsCi0gICAgfTsKLQotICAgIEFTU0VSVF9FUSgwLCBpb2N0bChtX2RldmljZUZkLCBJT05fSU9DX1RFU1RfRE1BX01BUFBJTkcsICZpb25fdGVzdF9yd19kYXRhKSk7Ci0gICAgQVNTRVJUX0VRKDAsIGlvY3RsKG1fZGV2aWNlRmQsIElPTl9JT0NfVEVTVF9TRVRfRkQsIC0xKSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpyZWFkS2VybmVsKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBBU1NFUlRfRVEoMCwgaW9jdGwobV9kZXZpY2VGZCwgSU9OX0lPQ19URVNUX1NFVF9GRCwgZmQpKTsKLSAgICBzdHJ1Y3QgaW9uX3Rlc3RfcndfZGF0YSBpb25fdGVzdF9yd19kYXRhID0gewotICAgICAgICAgICAgLnB0ciA9ICh1aW50NjRfdClidWYsCi0gICAgICAgICAgICAub2Zmc2V0ID0gMCwKLSAgICAgICAgICAgIC5zaXplID0gc2l6ZSwKLSAgICAgICAgICAgIC53cml0ZSA9IDAsCi0gICAgfTsKLQotICAgIEFTU0VSVF9FUSgwLCBpb2N0bChtX2RldmljZUZkLCBJT05fSU9DX1RFU1RfS0VSTkVMX01BUFBJTkcsICZpb25fdGVzdF9yd19kYXRhKSk7Ci0gICAgQVNTRVJUX0VRKDAsIGlvY3RsKG1fZGV2aWNlRmQsIElPTl9JT0NfVEVTVF9TRVRfRkQsIC0xKSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjp3cml0ZUtlcm5lbChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCi17Ci0gICAgQVNTRVJUX0VRKDAsIGlvY3RsKG1fZGV2aWNlRmQsIElPTl9JT0NfVEVTVF9TRVRfRkQsIGZkKSk7Ci0gICAgc3RydWN0IGlvbl90ZXN0X3J3X2RhdGEgaW9uX3Rlc3RfcndfZGF0YSA9IHsKLSAgICAgICAgICAgIC5wdHIgPSAodWludDY0X3QpYnVmLAotICAgICAgICAgICAgLm9mZnNldCA9IDAsCi0gICAgICAgICAgICAuc2l6ZSA9IHNpemUsCi0gICAgICAgICAgICAud3JpdGUgPSAxLAotICAgIH07Ci0KLSAgICBBU1NFUlRfRVEoMCwgaW9jdGwobV9kZXZpY2VGZCwgSU9OX0lPQ19URVNUX0tFUk5FTF9NQVBQSU5HLCAmaW9uX3Rlc3RfcndfZGF0YSkpOwotICAgIEFTU0VSVF9FUSgwLCBpb2N0bChtX2RldmljZUZkLCBJT05fSU9DX1RFU1RfU0VUX0ZELCAtMSkpOwotfQotCi12b2lkIERldmljZTo6Ymxvd0NhY2hlKCkKLXsKLSAgICBjb25zdCBzaXplX3QgYmlnZ2VyX3RoYW5fY2FjaGUgPSA4KjEwMjQqMTAyNDsKLSAgICB2b2lkICpidWYxID0gbWFsbG9jKGJpZ2dlcl90aGFuX2NhY2hlKTsKLSAgICB2b2lkICpidWYyID0gbWFsbG9jKGJpZ2dlcl90aGFuX2NhY2hlKTsKLSAgICBtZW1zZXQoYnVmMSwgMHhhYSwgYmlnZ2VyX3RoYW5fY2FjaGUpOwotICAgIG1lbWNweShidWYyLCBidWYxLCBiaWdnZXJfdGhhbl9jYWNoZSk7Ci0gICAgZnJlZShidWYxKTsKLSAgICBmcmVlKGJ1ZjIpOwotfQotCi12b2lkIERldmljZTo6ZGlydHlDYWNoZSh2b2lkICpwdHIsIHNpemVfdCBzaXplKQotewotICAgIC8qIHRyeSB0byBkaXJ0eSBjYWNoZSBsaW5lcyAqLwotICAgIGZvciAoc2l6ZV90IGkgPSBzaXplLTE7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgKCh2b2xhdGlsZSBjaGFyICopcHRyKVtpXTsKLSAgICAgICAgKChjaGFyICopcHRyKVtpXSA9IGk7Ci0gICAgfQotfQotCi1URVNUX0YoRGV2aWNlLCBLZXJuZWxSZWFkQ2FjaGVkKQotewotICAgIGF1dG8gYWxsb2NfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDgxOTIgKyAxMDI0KTsKLSAgICB2b2lkICpidWYgPSAodm9pZCAqKShBTElHTigodW5zaWduZWQgbG9uZylhbGxvY19wdHIuZ2V0KCksIDQwOTYpICsgMTAyNCk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IElPTl9GTEFHX0NBQ0hFRDsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCBmbGFncywgJm1hcF9mZCkpOwotICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKLQotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgKChjaGFyICopcHRyKVtpXSA9IGk7Ci0KLSAgICAgICAgKChjaGFyKilidWYpWzQwOTZdID0gMHgxMjsKLSAgICAgICAgcmVhZEtlcm5lbChtYXBfZmQsIGJ1ZiwgNDA5Nik7Ci0gICAgICAgIEFTU0VSVF9FUSgoKGNoYXIqKWJ1ZilbNDA5Nl0sIDB4MTIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgQVNTRVJUX0VRKChjaGFyKWksICgoY2hhciAqKWJ1ZilbaV0pOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7Ci0gICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihEZXZpY2UsIEtlcm5lbFdyaXRlQ2FjaGVkKQotewotICAgIGF1dG8gYWxsb2NfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDgxOTIgKyAxMDI0KTsKLSAgICB2b2lkICpidWYgPSAodm9pZCAqKShBTElHTigodW5zaWduZWQgbG9uZylhbGxvY19wdHIuZ2V0KCksIDQwOTYpICsgMTAyNCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgKChjaGFyICopYnVmKVtpXSA9IGk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IElPTl9GTEFHX0NBQ0hFRDsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCBmbGFncywgJm1hcF9mZCkpOwotICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKLQotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCi0gICAgICAgIGRpcnR5Q2FjaGUocHRyLCA0MDk2KTsKLQotICAgICAgICB3cml0ZUtlcm5lbChtYXBfZmQsIGJ1ZiwgNDA5Nik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICBBU1NFUlRfRVEoKGNoYXIpaSwgKChjaGFyICopcHRyKVtpXSkgPDwgaTsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgNDA5NikpOwotICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7Ci0gICAgfQotfQotCi1URVNUX0YoRGV2aWNlLCBETUFSZWFkQ2FjaGVkKQotewotICAgIGF1dG8gYWxsb2NfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDgxOTIgKyAxMDI0KTsKLSAgICB2b2lkICpidWYgPSAodm9pZCAqKShBTElHTigodW5zaWduZWQgbG9uZylhbGxvY19wdHIuZ2V0KCksIDQwOTYpICsgMTAyNCk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IElPTl9GTEFHX0NBQ0hFRDsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCBmbGFncywgJm1hcF9mZCkpOwotICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKLQotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgKChjaGFyICopcHRyKVtpXSA9IGk7Ci0KLSAgICAgICAgcmVhZERNQShtYXBfZmQsIGJ1ZiwgNDA5Nik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICBBU1NFUlRfRVEoKGNoYXIpaSwgKChjaGFyICopYnVmKVtpXSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIDQwOTYpKTsKLSAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwotICAgIH0KLX0KLQotVEVTVF9GKERldmljZSwgRE1BV3JpdGVDYWNoZWQpCi17Ci0gICAgYXV0byBhbGxvY19wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGNoYXJbXT4oODE5MiArIDEwMjQpOwotICAgIHZvaWQgKmJ1ZiA9ICh2b2lkICopKEFMSUdOKCh1bnNpZ25lZCBsb25nKWFsbG9jX3B0ci5nZXQoKSwgNDA5NikgKyAxMDI0KTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAoKGNoYXIgKilidWYpW2ldID0gaTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIGludCBtYXBfZmQgPSAtMTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZGlydHlDYWNoZShwdHIsIDQwOTYpOwotCi0gICAgICAgIHdyaXRlRE1BKG1hcF9mZCwgYnVmLCA0MDk2KTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgICAgIEFTU0VSVF9FUSgoY2hhcilpLCAoKGNoYXIgKilwdHIpW2ldKSA8PCBpOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7Ci0gICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihEZXZpY2UsIEtlcm5lbFJlYWRDYWNoZWROZWVkc1N5bmMpCi17Ci0gICAgYXV0byBhbGxvY19wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGNoYXJbXT4oODE5MiArIDEwMjQpOwotICAgIHZvaWQgKmJ1ZiA9ICh2b2lkICopKEFMSUdOKCh1bnNpZ25lZCBsb25nKWFsbG9jX3B0ci5nZXQoKSwgNDA5NikgKyAxMDI0KTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIGludCBtYXBfZmQgPSAtMTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEIHwgSU9OX0ZMQUdfQ0FDSEVEX05FRURTX1NZTkM7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCA0MDk2LCAwLCBoZWFwTWFzaywgZmxhZ3MsICZtYXBfZmQpKTsKLSAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7Ci0KLSAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIDQwOTYsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgICAgICgoY2hhciAqKXB0cilbaV0gPSBpOwotCi0gICAgICAgICgoY2hhciopYnVmKVs0MDk2XSA9IDB4MTI7Ci0gICAgICAgIHJlYWRLZXJuZWwobWFwX2ZkLCBidWYsIDQwOTYpOwotICAgICAgICBBU1NFUlRfRVEoKChjaGFyKilidWYpWzQwOTZdLCAweDEyKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgICAgIEFTU0VSVF9FUSgoY2hhcilpLCAoKGNoYXIgKilidWYpW2ldKTsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgNDA5NikpOwotICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7Ci0gICAgfQotfQotCi1URVNUX0YoRGV2aWNlLCBLZXJuZWxXcml0ZUNhY2hlZE5lZWRzU3luYykKLXsKLSAgICBhdXRvIGFsbG9jX3B0ciA9IHN0ZDo6bWFrZV91bmlxdWU8Y2hhcltdPig4MTkyICsgMTAyNCk7Ci0gICAgdm9pZCAqYnVmID0gKHZvaWQgKikoQUxJR04oKHVuc2lnbmVkIGxvbmcpYWxsb2NfcHRyLmdldCgpLCA0MDk2KSArIDEwMjQpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICgoY2hhciAqKWJ1ZilbaV0gPSBpOwotCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgaW50IG1hcF9mZCA9IC0xOwotICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBJT05fRkxBR19DQUNIRUQgfCBJT05fRkxBR19DQUNIRURfTkVFRFNfU1lOQzsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCBmbGFncywgJm1hcF9mZCkpOwotICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKLQotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCi0gICAgICAgIGRpcnR5Q2FjaGUocHRyLCA0MDk2KTsKLQotICAgICAgICB3cml0ZUtlcm5lbChtYXBfZmQsIGJ1ZiwgNDA5Nik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICBBU1NFUlRfRVEoKGNoYXIpaSwgKChjaGFyICopcHRyKVtpXSkgPDwgaTsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgNDA5NikpOwotICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7Ci0gICAgfQotfQotCi1URVNUX0YoRGV2aWNlLCBETUFSZWFkQ2FjaGVkTmVlZHNTeW5jKQotewotICAgIGF1dG8gYWxsb2NfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDgxOTIgKyAxMDI0KTsKLSAgICB2b2lkICpidWYgPSAodm9pZCAqKShBTElHTigodW5zaWduZWQgbG9uZylhbGxvY19wdHIuZ2V0KCksIDQwOTYpICsgMTAyNCk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IElPTl9GTEFHX0NBQ0hFRCB8IElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICAoKGNoYXIgKilwdHIpW2ldID0gaTsKLQotICAgICAgICBpb25fc3luY19mZChtX2lvbkZkLCBtYXBfZmQpOwotCi0gICAgICAgIHJlYWRETUEobWFwX2ZkLCBidWYsIDQwOTYpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgQVNTRVJUX0VRKChjaGFyKWksICgoY2hhciAqKWJ1ZilbaV0pOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7Ci0gICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihEZXZpY2UsIERNQVdyaXRlQ2FjaGVkTmVlZHNTeW5jKQotewotICAgIGF1dG8gYWxsb2NfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDgxOTIgKyAxMDI0KTsKLSAgICB2b2lkICpidWYgPSAodm9pZCAqKShBTElHTigodW5zaWduZWQgbG9uZylhbGxvY19wdHIuZ2V0KCksIDQwOTYpICsgMTAyNCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgKChjaGFyICopYnVmKVtpXSA9IGk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IElPTl9GTEFHX0NBQ0hFRCB8IElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZGlydHlDYWNoZShwdHIsIDQwOTYpOwotCi0gICAgICAgIHdyaXRlRE1BKG1hcF9mZCwgYnVmLCA0MDk2KTsKLQotICAgICAgICBpb25fc3luY19mZChtX2lvbkZkLCBtYXBfZmQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgQVNTRVJUX0VRKChjaGFyKWksICgoY2hhciAqKXB0cilbaV0pIDw8IGk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIDQwOTYpKTsKLSAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwotICAgIH0KLX0KLVRFU1RfRihEZXZpY2UsIEtlcm5lbFJlYWQpCi17Ci0gICAgYXV0byBhbGxvY19wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGNoYXJbXT4oODE5MiArIDEwMjQpOwotICAgIHZvaWQgKmJ1ZiA9ICh2b2lkICopKEFMSUdOKCh1bnNpZ25lZCBsb25nKWFsbG9jX3B0ci5nZXQoKSwgNDA5NikgKyAxMDI0KTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIGludCBtYXBfZmQgPSAtMTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCBmbGFncywgJm1hcF9mZCkpOwotICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKLQotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgKChjaGFyICopcHRyKVtpXSA9IGk7Ci0KLSAgICAgICAgKChjaGFyKilidWYpWzQwOTZdID0gMHgxMjsKLSAgICAgICAgcmVhZEtlcm5lbChtYXBfZmQsIGJ1ZiwgNDA5Nik7Ci0gICAgICAgIEFTU0VSVF9FUSgoKGNoYXIqKWJ1ZilbNDA5Nl0sIDB4MTIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgQVNTRVJUX0VRKChjaGFyKWksICgoY2hhciAqKWJ1ZilbaV0pOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7Ci0gICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihEZXZpY2UsIEtlcm5lbFdyaXRlKQotewotICAgIGF1dG8gYWxsb2NfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDgxOTIgKyAxMDI0KTsKLSAgICB2b2lkICpidWYgPSAodm9pZCAqKShBTElHTigodW5zaWduZWQgbG9uZylhbGxvY19wdHIuZ2V0KCksIDQwOTYpICsgMTAyNCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgKChjaGFyICopYnVmKVtpXSA9IGk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IDA7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCA0MDk2LCAwLCBoZWFwTWFzaywgZmxhZ3MsICZtYXBfZmQpKTsKLSAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7Ci0KLSAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIDQwOTYsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQotICAgICAgICBkaXJ0eUNhY2hlKHB0ciwgNDA5Nik7Ci0KLSAgICAgICAgd3JpdGVLZXJuZWwobWFwX2ZkLCBidWYsIDQwOTYpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgQVNTRVJUX0VRKChjaGFyKWksICgoY2hhciAqKXB0cilbaV0pIDw8IGk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIDQwOTYpKTsKLSAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwotICAgIH0KLX0KLQotVEVTVF9GKERldmljZSwgRE1BUmVhZCkKLXsKLSAgICBhdXRvIGFsbG9jX3B0ciA9IHN0ZDo6bWFrZV91bmlxdWU8Y2hhcltdPig4MTkyICsgMTAyNCk7Ci0gICAgdm9pZCAqYnVmID0gKHZvaWQgKikoQUxJR04oKHVuc2lnbmVkIGxvbmcpYWxsb2NfcHRyLmdldCgpLCA0MDk2KSArIDEwMjQpOwotCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgaW50IG1hcF9mZCA9IC0xOwotICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICAoKGNoYXIgKilwdHIpW2ldID0gaTsKLQotICAgICAgICByZWFkRE1BKG1hcF9mZCwgYnVmLCA0MDk2KTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgICAgIEFTU0VSVF9FUSgoY2hhcilpLCAoKGNoYXIgKilidWYpW2ldKTsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgNDA5NikpOwotICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7Ci0gICAgfQotfQotCi1URVNUX0YoRGV2aWNlLCBETUFXcml0ZSkKLXsKLSAgICBhdXRvIGFsbG9jX3B0ciA9IHN0ZDo6bWFrZV91bmlxdWU8Y2hhcltdPig4MTkyICsgMTAyNCk7Ci0gICAgdm9pZCAqYnVmID0gKHZvaWQgKikoQUxJR04oKHVuc2lnbmVkIGxvbmcpYWxsb2NfcHRyLmdldCgpLCA0MDk2KSArIDEwMjQpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICgoY2hhciAqKWJ1ZilbaV0gPSBpOwotCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgaW50IG1hcF9mZCA9IC0xOwotICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZGlydHlDYWNoZShwdHIsIDQwOTYpOwotCi0gICAgICAgIHdyaXRlRE1BKG1hcF9mZCwgYnVmLCA0MDk2KTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgICAgIEFTU0VSVF9FUSgoY2hhcilpLCAoKGNoYXIgKilwdHIpW2ldKSA8PCBpOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7Ci0gICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihEZXZpY2UsIElzQ2FjaGVkKQotewotICAgIGF1dG8gYnVmX3B0ciA9IHN0ZDo6bWFrZV91bmlxdWU8Y2hhcltdPig0MDk2KTsKLSAgICB2b2lkICpidWYgPSBidWZfcHRyLmdldCgpOwotCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgaW50IG1hcF9mZCA9IC0xOwotICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBJT05fRkxBR19DQUNIRUQgfCBJT05fRkxBR19DQUNIRURfTkVFRFNfU1lOQzsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCBmbGFncywgJm1hcF9mZCkpOwotICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKLQotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCi0gICAgICAgIGRpcnR5Q2FjaGUocHRyLCA0MDk2KTsKLQotICAgICAgICByZWFkRE1BKG1hcF9mZCwgYnVmLCA0MDk2KTsKLQotICAgICAgICBib29sIHNhbWUgPSB0cnVlOwotICAgICAgICBmb3IgKGludCBpID0gNDA5Ni0xNjsgaSA+PSAwOyBpIC09IDE2KQotICAgICAgICAgICAgaWYgKCgoY2hhciAqKWJ1ZilbaV0gIT0gaSkKLSAgICAgICAgICAgICAgICBzYW1lID0gZmFsc2U7Ci0gICAgICAgIEFTU0VSVF9GQUxTRShzYW1lKTsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgNDA5NikpOwotICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaW9uL3Rlc3RzL2V4aXRfdGVzdC5jcHAgYi9saWJpb24vdGVzdHMvZXhpdF90ZXN0LmNwcAppbmRleCBjZGQzZTI3Li5mMzEyMzg5IDEwMDY0NAotLS0gYS9saWJpb24vdGVzdHMvZXhpdF90ZXN0LmNwcAorKysgYi9saWJpb24vdGVzdHMvZXhpdF90ZXN0LmNwcApAQCAtMjIsMjA2ICsyMiwyMDYgQEAKIAogI2luY2x1ZGUgImlvbl90ZXN0X2ZpeHR1cmUuaCIKIAotY2xhc3MgRXhpdCA6IHB1YmxpYyBJb25BbGxIZWFwc1Rlc3QgewotfTsKK2NsYXNzIEV4aXQgOiBwdWJsaWMgSW9uVGVzdCB7fTsKIAotVEVTVF9GKEV4aXQsIFdpdGhBbGxvYykKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQqMTAyNCwgNjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7CitURVNUX0YoRXhpdCwgV2l0aEFsbG9jRmQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQgKiAxMDI0LCA2NCAqIDEwMjQsIDEwMjQgKiAxMDI0LCAyICogMTAyNCAqIDEwMjR9OworICAgIGZvciAoY29uc3QgYXV0byYgaGVhcCA6IGlvbl9oZWFwcykgewogICAgICAgICBmb3IgKHNpemVfdCBzaXplIDogYWxsb2NhdGlvblNpemVzKSB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7CisgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOwogICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVhJVCh7Ci0gICAgICAgICAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlID0gMDsKKyAgICAgICAgICAgIEVYUEVDVF9FWElUKAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFuZGxlX2ZkID0gLTE7CiAKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCAwLCAmaGFuZGxlKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoaGFuZGxlICE9IDApOwotICAgICAgICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgICB9LCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsICZoYW5kbGVfZmQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9ORSgtMSwgaGFuZGxlX2ZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotVEVTVF9GKEV4aXQsIFdpdGhBbGxvY0ZkKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCoxMDI0LCA2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVhJVCh7Ci0gICAgICAgICAgICAgICAgaW50IGhhbmRsZV9mZCA9IC0xOwotCi0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgMCwgJmhhbmRsZV9mZCkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9ORSgtMSwgaGFuZGxlX2ZkKTsKLSAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgfSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1URVNUX0YoRXhpdCwgV2l0aFJlcGVhdGVkQWxsb2NGZCkKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQqMTAyNCwgNjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7CitURVNUX0YoRXhpdCwgV2l0aFJlcGVhdGVkQWxsb2NGZCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOworICAgICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOwogICAgICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FWElUKHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGhhbmRsZV9mZCA9IC0xOworICAgICAgICAgICAgICAgIEFTU0VSVF9FWElUKAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYW5kbGVfZmQgPSAtMTsKIAotICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCAwLCAmaGFuZGxlX2ZkKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVF9ORSgtMSwgaGFuZGxlX2ZkKTsKLSAgICAgICAgICAgICAgICAgICAgZXhpdCgwKTsKLSAgICAgICAgICAgICAgICB9LCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIikKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJmYWlsZWQgb24gaGVhcCAiIDw8IGhlYXBNYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFuZCBzaXplICIgPDwgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBvbiBpdGVyYXRpb24gIiA8PCBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlX2ZkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05FKC0xLCBoYW5kbGVfZmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZmFpbGVkIG9uIGhlYXAgIiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFuZCBzaXplICIgPDwgc2l6ZSA8PCAiIG9uIGl0ZXJhdGlvbiAiIDw8IGk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLQotVEVTVF9GKEV4aXQsIFdpdGhNYXBwaW5nKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCoxMDI0LCA2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKK1RFU1RfRihFeGl0LCBXaXRoTWFwcGluZykgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKLSAgICAgICAgICAgIEVYUEVDVF9FWElUKHsKLSAgICAgICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CisgICAgICAgICAgICBFWFBFQ1RfRVhJVCgKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOwogCi0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgMCwgJm1hcF9mZCkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJm1hcF9mZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7CiAKLSAgICAgICAgICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgfSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLVRFU1RfRihFeGl0LCBXaXRoUGFydGlhbE1hcHBpbmcpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVhJVCh7Ci0gICAgICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOwotCi0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgMCwgJm1hcF9mZCkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgICAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgc2l6ZSAvIDIpKTsKLSAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgfSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOwogICAgICAgICB9CiAgICAgfQogfQogCi1URVNUX0YoRXhpdCwgV2l0aE1hcHBpbmdDYWNoZWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0KjEwMjQsIDY0KjEwMjQsIDEwMjQqMTAyNCwgMioxMDI0KjEwMjR9OwotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgeworVEVTVF9GKEV4aXQsIFdpdGhQYXJ0aWFsTWFwcGluZykgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NjQgKiAxMDI0LCAxMDI0ICogMTAyNCwgMiAqIDEwMjQgKiAxMDI0fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKICAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOworICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOwotICAgICAgICAgICAgRVhQRUNUX0VYSVQoewotICAgICAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKKyAgICAgICAgICAgIEVYUEVDVF9FWElUKAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CiAKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCBJT05fRkxBR19DQUNIRUQsICZtYXBfZmQpKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsICZtYXBfZmQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwogCi0gICAgICAgICAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgZXhpdCgwKTsKLSAgICAgICAgICAgIH0sIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKTsKLSAgICAgICAgfQotICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKIAotfQotCi1URVNUX0YoRXhpdCwgV2l0aFBhcnRpYWxNYXBwaW5nQ2FjaGVkKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOwotICAgICAgICAgICAgRVhQRUNUX0VYSVQoewotICAgICAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKLQotICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgc2l6ZSwgMCwgaGVhcE1hc2ssIElPTl9GTEFHX0NBQ0hFRCwgJm1hcF9mZCkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgICAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgc2l6ZSAvIDIpKTsKLSAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgfSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIHNpemUgLyAyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDApOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLVRFU1RfRihFeGl0LCBXaXRoTWFwcGluZ05lZWRzU3luYykKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQqMTAyNCwgNjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7CitURVNUX0YoRXhpdCwgV2l0aE1hcHBpbmdDYWNoZWQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQgKiAxMDI0LCA2NCAqIDEwMjQsIDEwMjQgKiAxMDI0LCAyICogMTAyNCAqIDEwMjR9OworICAgIGZvciAoY29uc3QgYXV0byYgaGVhcCA6IGlvbl9oZWFwcykgewogICAgICAgICBmb3IgKHNpemVfdCBzaXplIDogYWxsb2NhdGlvblNpemVzKSB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7CisgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOwogICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVhJVCh7Ci0gICAgICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOworICAgICAgICAgICAgRVhQRUNUX0VYSVQoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKIAotICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgc2l6ZSwgMCwgaGVhcE1hc2ssIElPTl9GTEFHX0NBQ0hFRCB8IElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DLCAmbWFwX2ZkKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCBzaXplLCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT05fRkxBR19DQUNIRUQsICZtYXBfZmQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwogCi0gICAgICAgICAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgZXhpdCgwKTsKLSAgICAgICAgICAgIH0sIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKTsKICAgICAgICAgfQogICAgIH0KLQogfQogCi1URVNUX0YoRXhpdCwgV2l0aFBhcnRpYWxNYXBwaW5nTmVlZHNTeW5jKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7CitURVNUX0YoRXhpdCwgV2l0aFBhcnRpYWxNYXBwaW5nQ2FjaGVkKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs2NCAqIDEwMjQsIDEwMjQgKiAxMDI0LCAyICogMTAyNCAqIDEwMjR9OworICAgIGZvciAoY29uc3QgYXV0byYgaGVhcCA6IGlvbl9oZWFwcykgewogICAgICAgICBmb3IgKHNpemVfdCBzaXplIDogYWxsb2NhdGlvblNpemVzKSB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7CisgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOwogICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVhJVCh7Ci0gICAgICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOworICAgICAgICAgICAgRVhQRUNUX0VYSVQoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKIAotICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgc2l6ZSwgMCwgaGVhcE1hc2ssIElPTl9GTEFHX0NBQ0hFRCB8IElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DLCAmbWFwX2ZkKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCBzaXplLCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT05fRkxBR19DQUNIRUQsICZtYXBfZmQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwogCi0gICAgICAgICAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7CiAKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgc2l6ZSAvIDIpKTsKLSAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgfSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIHNpemUgLyAyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDApOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihFeGl0LCBXaXRoTWFwcGluZ05lZWRzU3luYykgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CisgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CisgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKKyAgICAgICAgICAgIEVYUEVDVF9FWElUKAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTl9GTEFHX0NBQ0hFRCB8IElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX2ZkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoRXhpdCwgV2l0aFBhcnRpYWxNYXBwaW5nTmVlZHNTeW5jKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs2NCAqIDEwMjQsIDEwMjQgKiAxMDI0LCAyICogMTAyNCAqIDEwMjR9OworICAgIGZvciAoY29uc3QgYXV0byYgaGVhcCA6IGlvbl9oZWFwcykgeworICAgICAgICBmb3IgKHNpemVfdCBzaXplIDogYWxsb2NhdGlvblNpemVzKSB7CisgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOworICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7CisgICAgICAgICAgICBFWFBFQ1RfRVhJVCgKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOworCisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCBzaXplLCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT05fRkxBR19DQUNIRUQgfCBJT05fRkxBR19DQUNIRURfTkVFRFNfU1lOQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9mZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIHNpemUgLyAyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDApOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJpb24vdGVzdHMvZm9ybWVybHlfdmFsaWRfaGFuZGxlX3Rlc3QuY3BwIGIvbGliaW9uL3Rlc3RzL2Zvcm1lcmx5X3ZhbGlkX2hhbmRsZV90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhYjhmMy4uMDAwMDAwMAotLS0gYS9saWJpb24vdGVzdHMvZm9ybWVybHlfdmFsaWRfaGFuZGxlX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGlvbi9pb24uaD4KLQotI2luY2x1ZGUgImlvbl90ZXN0X2ZpeHR1cmUuaCIKLQotY2xhc3MgRm9ybWVybHlWYWxpZEhhbmRsZSA6IHB1YmxpYyBJb25UZXN0IHsKLSBwdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCk7Ci0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7Ci0gICAgaW9uX3VzZXJfaGFuZGxlX3QgbV9oYW5kbGU7Ci19OwotCi12b2lkIEZvcm1lcmx5VmFsaWRIYW5kbGU6OlNldFVwKCkKLXsKLSAgICBJb25UZXN0OjpTZXRVcCgpOwotICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2MobV9pb25GZCwgNDA5NiwgMCwgMS8qIGlvbl9lbnYtPm1fZmlyc3RIZWFwICovLCAwLCAmbV9oYW5kbGUpKTsKLSAgICBBU1NFUlRfVFJVRShtX2hhbmRsZSAhPSAwKTsKLSAgICBBU1NFUlRfRVEoMCwgaW9uX2ZyZWUobV9pb25GZCwgbV9oYW5kbGUpKTsKLX0KLQotdm9pZCBGb3JtZXJseVZhbGlkSGFuZGxlOjpUZWFyRG93bigpCi17Ci0gICAgbV9oYW5kbGUgPSAwOwotfQotCi1URVNUX0YoRm9ybWVybHlWYWxpZEhhbmRsZSwgZnJlZSkKLXsKLQlBU1NFUlRfRVEoLUVJTlZBTCwgaW9uX2ZyZWUobV9pb25GZCwgbV9oYW5kbGUpKTsKLX0KLQotVEVTVF9GKEZvcm1lcmx5VmFsaWRIYW5kbGUsIG1hcCkKLXsKLSAgICBpbnQgbWFwX2ZkOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLQotICAgIEFTU0VSVF9FUSgtRUlOVkFMLCBpb25fbWFwKG1faW9uRmQsIG1faGFuZGxlLCA0MDk2LCBQUk9UX1JFQUQsIDAsIDAsICZwdHIsICZtYXBfZmQpKTsKLX0KLQotVEVTVF9GKEZvcm1lcmx5VmFsaWRIYW5kbGUsIHNoYXJlKQotewotICAgIGludCBzaGFyZV9mZDsKLQotICAgIEFTU0VSVF9FUSgtRUlOVkFMLCBpb25fc2hhcmUobV9pb25GZCwgbV9oYW5kbGUsICZzaGFyZV9mZCkpOwotfQpkaWZmIC0tZ2l0IGEvbGliaW9uL3Rlc3RzL2hlYXBfcXVlcnkuY3BwIGIvbGliaW9uL3Rlc3RzL2hlYXBfcXVlcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZDNiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpb24vdGVzdHMvaGVhcF9xdWVyeS5jcHAKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgImlvbl90ZXN0X2ZpeHR1cmUuaCIKKworY2xhc3MgSGVhcFF1ZXJ5IDogcHVibGljIElvblRlc3Qge307CisKK1RFU1RfRihIZWFwUXVlcnksIEF0bGVhc3RPbmVIZWFwKSB7CisgICAgQVNTRVJUX0dUKGlvbl9oZWFwcy5zaXplKCksIDApOworfQorCisvLyBUT0RPOiBDaGVjayBpZiB3ZSBleHBlY3Qgc29tZSBvZiB0aGUgZGVmYXVsdAorLy8gaGVhcCB0eXBlcyB0byBiZSBwcmVzZW50IG9uIGFsbCBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvbGliaW9uL3Rlc3RzL2ludmFsaWRfdmFsdWVzX3Rlc3QuY3BwIGIvbGliaW9uL3Rlc3RzL2ludmFsaWRfdmFsdWVzX3Rlc3QuY3BwCmluZGV4IDc3ZmVhMTcuLjQ4ZmNkNzIgMTAwNjQ0Ci0tLSBhL2xpYmlvbi90ZXN0cy9pbnZhbGlkX3ZhbHVlc190ZXN0LmNwcAorKysgYi9saWJpb24vdGVzdHMvaW52YWxpZF92YWx1ZXNfdGVzdC5jcHAKQEAgLTE2LDE3MSArMTYsNzEgQEAKIAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAogI2luY2x1ZGUgPGlvbi9pb24uaD4KLQogI2luY2x1ZGUgImlvbl90ZXN0X2ZpeHR1cmUuaCIKIAotY2xhc3MgSW52YWxpZFZhbHVlcyA6IHB1YmxpYyBJb25BbGxIZWFwc1Rlc3QgewotIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKLSAgICBpb25fdXNlcl9oYW5kbGVfdCBtX3ZhbGlkSGFuZGxlOwotICAgIGludCBtX3ZhbGlkU2hhcmVGZDsKLSAgICBpb25fdXNlcl9oYW5kbGVfdCBjb25zdCBtX2JhZEhhbmRsZSA9IC0xOwotfTsKK2NsYXNzIEludmFsaWRWYWx1ZXMgOiBwdWJsaWMgSW9uVGVzdCB7fTsKIAotdm9pZCBJbnZhbGlkVmFsdWVzOjpTZXRVcCgpCi17Ci0gICAgSW9uQWxsSGVhcHNUZXN0OjpTZXRVcCgpOwotICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2MobV9pb25GZCwgNDA5NiwgMCwgbV9maXJzdEhlYXAsIDAsICZtX3ZhbGlkSGFuZGxlKSkKLSAgICAgIDw8IG1faW9uRmQgPDwgIiAiIDw8IG1fZmlyc3RIZWFwOwotICAgIEFTU0VSVF9UUlVFKG1fdmFsaWRIYW5kbGUgIT0gMCk7Ci0gICAgQVNTRVJUX0VRKDAsIGlvbl9zaGFyZShtX2lvbkZkLCBtX3ZhbGlkSGFuZGxlLCAmbV92YWxpZFNoYXJlRmQpKTsKLX0KLQotdm9pZCBJbnZhbGlkVmFsdWVzOjpUZWFyRG93bigpCi17Ci0gICAgQVNTRVJUX0VRKDAsIGlvbl9mcmVlKG1faW9uRmQsIG1fdmFsaWRIYW5kbGUpKTsKLSAgICBBU1NFUlRfRVEoMCwgY2xvc2UobV92YWxpZFNoYXJlRmQpKTsKLSAgICBtX3ZhbGlkSGFuZGxlID0gMDsKLSAgICBJb25BbGxIZWFwc1Rlc3Q6OlRlYXJEb3duKCk7Ci19Ci0KLVRFU1RfRihJbnZhbGlkVmFsdWVzLCBpb25fY2xvc2UpCi17CitURVNUX0YoSW52YWxpZFZhbHVlcywgaW9uX2Nsb3NlKSB7CiAgICAgRVhQRUNUX0VRKC1FQkFERiwgaW9uX2Nsb3NlKC0xKSk7CiB9CiAKLVRFU1RfRihJbnZhbGlkVmFsdWVzLCBpb25fYWxsb2MpCi17Ci0gICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlOwotICAgIC8qIGludmFsaWQgaW9uX2ZkICovCi0gICAgaW50IHJldCA9IGlvbl9hbGxvYygwLCA0MDk2LCAwLCBtX2ZpcnN0SGVhcCwgMCwgJmhhbmRsZSk7Ci0gICAgRVhQRUNUX1RSVUUocmV0ID09IC1FSU5WQUwgfHwgcmV0ID09IC1FTk9UVFkpOwotICAgIC8qIGludmFsaWQgaW9uX2ZkICovCi0gICAgRVhQRUNUX0VRKC1FQkFERiwgaW9uX2FsbG9jKC0xLCA0MDk2LCAwLCBtX2ZpcnN0SGVhcCwgMCwgJmhhbmRsZSkpOwotICAgIC8qIG5vIGhlYXBzICovCi0gICAgRVhQRUNUX0VRKC1FTk9ERVYsIGlvbl9hbGxvYyhtX2lvbkZkLCA0MDk2LCAwLCAwLCAwLCAmaGFuZGxlKSk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgLyogemVybyBzaXplICovCi0gICAgICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fYWxsb2MobV9pb25GZCwgMCwgMCwgaGVhcE1hc2ssIDAsICZoYW5kbGUpKTsKLSAgICAgICAgLyogdG9vIGxhcmdlIHNpemUgKi8KLSAgICAgICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9hbGxvYyhtX2lvbkZkLCAtMSwgMCwgaGVhcE1hc2ssIDAsICZoYW5kbGUpKTsKLSAgICAgICAgLyogYmFkIGFsaWdubWVudCAqLwotICAgICAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2FsbG9jKG1faW9uRmQsIDQwOTYsIC0xLCBoZWFwTWFzaywgMCwgJmhhbmRsZSkpOwotICAgICAgICAvKiBOVUxMIGhhbmRsZSAqLwotICAgICAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2FsbG9jKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCAwLCBOVUxMKSk7Ci0gICAgfQotfQotCi1URVNUX0YoSW52YWxpZFZhbHVlcywgaW9uX2FsbG9jX2ZkKQoteworVEVTVF9GKEludmFsaWRWYWx1ZXMsIGlvbl9hbGxvY19mZCkgewogICAgIGludCBmZDsKLSAgICAvKiBpbnZhbGlkIGlvbl9mZCAqLwotICAgIGludCByZXQgPSBpb25fYWxsb2NfZmQoMCwgNDA5NiwgMCwgbV9maXJzdEhlYXAsIDAsICZmZCk7Ci0gICAgRVhQRUNUX1RSVUUocmV0ID09IC1FSU5WQUwgfHwgcmV0ID09IC1FTk9UVFkpOwotICAgIC8qIGludmFsaWQgaW9uX2ZkICovCi0gICAgRVhQRUNUX0VRKC1FQkFERiwgaW9uX2FsbG9jX2ZkKC0xLCA0MDk2LCAwLCBtX2ZpcnN0SGVhcCwgMCwgJmZkKSk7Ci0gICAgLyogbm8gaGVhcHMgKi8KLSAgICBFWFBFQ1RfRVEoLUVOT0RFViwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIDAsIDAsICZmZCkpOwotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIC8qIHplcm8gc2l6ZSAqLwotICAgICAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDAsIDAsIGhlYXBNYXNrLCAwLCAmZmQpKTsKLSAgICAgICAgLyogdG9vIGxhcmdlIHNpemUgKi8KLSAgICAgICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9hbGxvY19mZChtX2lvbkZkLCAtMSwgMCwgaGVhcE1hc2ssIDAsICZmZCkpOwotICAgICAgICAvKiBiYWQgYWxpZ25tZW50ICovCi0gICAgICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgLTEsIGhlYXBNYXNrLCAwLCAmZmQpKTsKLSAgICAgICAgLyogTlVMTCBoYW5kbGUgKi8KLSAgICAgICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9hbGxvY19mZChtX2lvbkZkLCA0MDk2LCAwLCBoZWFwTWFzaywgMCwgTlVMTCkpOworICAgIC8vIG5vIGhlYXBzCisgICAgRVhQRUNUX0VRKC1FTk9ERVYsIGlvbl9hbGxvY19mZChpb25mZCwgNDA5NiwgMCwgMCwgMCwgJmZkKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CisgICAgICAgIC8vIGludmFsaWQgaW9uX2ZkCisgICAgICAgIGludCByZXQgPSBpb25fYWxsb2NfZmQoMCwgNDA5NiwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJmZkKTsKKyAgICAgICAgRVhQRUNUX1RSVUUocmV0ID09IC1FSU5WQUwgfHwgcmV0ID09IC1FTk9UVFkpOworICAgICAgICAvLyBpbnZhbGlkIGlvbl9mZAorICAgICAgICBFWFBFQ1RfRVEoLUVCQURGLCBpb25fYWxsb2NfZmQoLTEsIDQwOTYsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsICZmZCkpOworICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CisgICAgICAgIC8vIHplcm8gc2l6ZQorICAgICAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCAwLCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLCAwLCAmZmQpKTsKKyAgICAgICAgLy8gdG9vIGxhcmdlIHNpemUKKyAgICAgICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9hbGxvY19mZChpb25mZCwgLTEsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsICZmZCkpOworICAgICAgICAvLyBiYWQgYWxpZ25tZW50CisgICAgICAgIC8vIFRPRE86IEN1cnJlbnQgdXNlcnNwYWNlIGFuZCBrZXJuZWwgY29kZSBjb21wbGV0ZWx5IGlnbm9yZXMgYWxpZ25tZW50LiBTbyB0aGlzCisgICAgICAgIC8vIHRlc3QgaXMgZ29pbmcgdG8gZmFpbC4gV2UgbmVlZCB0byBjb21wbGV0ZWx5IHJlbW92ZSBhbGlnbm1lbnQgZnJvbSB0aGUgQVBJLgorICAgICAgICAvLyBBbGwgbWVtb3J5IGJ5IGRlZmF1bHQgaXMgYWx3YXlzIHBhZ2UgYWxpZ25lZC4gT1IgYWN0dWFsbHkgcGFzcyB0aGUgYWxpZ25tZW50CisgICAgICAgIC8vIGRvd24gaW50byB0aGUga2VybmVsIGFuZCBtYWtlIGtlcm5lbCByZXNwZWN0IHRoZSBhbGlnbm1lbnQuCisgICAgICAgIC8vIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fYWxsb2NfZmQoaW9uZmQsIDQwOTYsIC0xLCAoMSA8PCBoZWFwLmhlYXBfaWQpLCAwLCAmZmQpKTsKKworICAgICAgICAvLyBOVUxMIGZkCisgICAgICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fYWxsb2NfZmQoaW9uZmQsIDQwOTYsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsIG51bGxwdHIpKTsKICAgICB9CiB9CiAKLVRFU1RfRihJbnZhbGlkVmFsdWVzLCBpb25fZnJlZSkKLXsKLSAgICAvKiBpbnZhbGlkIGlvbiBmZCAqLwotICAgIGludCByZXQgPSBpb25fZnJlZSgwLCBtX3ZhbGlkSGFuZGxlKTsKLSAgICBFWFBFQ1RfVFJVRShyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVOT1RUWSk7Ci0gICAgLyogaW52YWxpZCBpb24gZmQgKi8KLSAgICBFWFBFQ1RfRVEoLUVCQURGLCBpb25fZnJlZSgtMSwgbV92YWxpZEhhbmRsZSkpOwotICAgIC8qIHplcm8gaGFuZGxlICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9mcmVlKG1faW9uRmQsIDApKTsKLSAgICAvKiBiYWQgaGFuZGxlICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9mcmVlKG1faW9uRmQsIG1fYmFkSGFuZGxlKSk7CitURVNUX0YoSW52YWxpZFZhbHVlcywgaW9uX3F1ZXJ5X2hlYXBfY250KSB7CisgICAgLy8gTlVMTCBjb3VudAorICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fcXVlcnlfaGVhcF9jbnQoaW9uZmQsIG51bGxwdHIpKTsKKworICAgIGludCBoZWFwX2NvdW50OworICAgIC8vIGJhZCBmZAorICAgIEVYUEVDVF9FUSgtRUJBREYsIGlvbl9xdWVyeV9oZWFwX2NudCgtMSwgJmhlYXBfY291bnQpKTsKIH0KIAotVEVTVF9GKEludmFsaWRWYWx1ZXMsIGlvbl9tYXApCi17Ci0gICAgaW50IG1hcF9mZDsKLSAgICB1bnNpZ25lZCBjaGFyICpwdHI7CitURVNUX0YoSW52YWxpZFZhbHVlcywgaW9uX3F1ZXJ5X2dldF9oZWFwcykgeworICAgIGludCBoZWFwX2NvdW50OworICAgIEFTU0VSVF9FUSgwLCBpb25fcXVlcnlfaGVhcF9jbnQoaW9uZmQsICZoZWFwX2NvdW50KSk7CisgICAgQVNTRVJUX0dUKGhlYXBfY291bnQsIDApOwogCi0gICAgLyogaW52YWxpZCBpb24gZmQgKi8KLSAgICBpbnQgcmV0ID0gaW9uX21hcCgwLCBtX3ZhbGlkSGFuZGxlLCA0MDk2LCBQUk9UX1JFQUQsIDAsIDAsICZwdHIsICZtYXBfZmQpOwotICAgIEVYUEVDVF9UUlVFKHJldCA9PSAtRUlOVkFMIHx8IHJldCA9PSAtRU5PVFRZKTsKLSAgICAvKiBpbnZhbGlkIGlvbiBmZCAqLwotICAgIEVYUEVDVF9FUSgtRUJBREYsIGlvbl9tYXAoLTEsIG1fdmFsaWRIYW5kbGUsIDQwOTYsIFBST1RfUkVBRCwgMCwgMCwgJnB0ciwgJm1hcF9mZCkpOwotICAgIC8qIHplcm8gaGFuZGxlICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9tYXAobV9pb25GZCwgMCwgNDA5NiwgUFJPVF9SRUFELCAwLCAwLCAmcHRyLCAmbWFwX2ZkKSk7Ci0gICAgLyogYmFkIGhhbmRsZSAqLwotICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fbWFwKG1faW9uRmQsIG1fYmFkSGFuZGxlLCA0MDk2LCBQUk9UX1JFQUQsIDAsIDAsICZwdHIsICZtYXBfZmQpKTsKLSAgICAvKiB6ZXJvIGxlbmd0aCAqLwotICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fbWFwKG1faW9uRmQsIG1fdmFsaWRIYW5kbGUsIDAsIFBST1RfUkVBRCwgMCwgMCwgJnB0ciwgJm1hcF9mZCkpOwotICAgIC8qIGJhZCBwcm90ICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9tYXAobV9pb25GZCwgbV92YWxpZEhhbmRsZSwgNDA5NiwgLTEsIDAsIDAsICZwdHIsICZtYXBfZmQpKTsKLSAgICAvKiBiYWQgb2Zmc2V0ICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9tYXAobV9pb25GZCwgbV92YWxpZEhhbmRsZSwgNDA5NiwgUFJPVF9SRUFELCAwLCAtMSwgJnB0ciwgJm1hcF9mZCkpOwotICAgIC8qIE5VTEwgcHRyICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9tYXAobV9pb25GZCwgbV92YWxpZEhhbmRsZSwgNDA5NiwgUFJPVF9SRUFELCAwLCAwLCBOVUxMLCAmbWFwX2ZkKSk7Ci0gICAgLyogTlVMTCBtYXBfZmQgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX21hcChtX2lvbkZkLCBtX3ZhbGlkSGFuZGxlLCA0MDk2LCBQUk9UX1JFQUQsIDAsIDAsICZwdHIsIE5VTEwpKTsKLX0KKyAgICAvLyBudWxscHRyIGJ1ZmZlcnMsIHN0aWxsIHJldHVybnMgc3VjY2VzcyBidXQgd2l0aG91dAorICAgIC8vIHRoZSBpb25faGVhcF9kYXRhLgorICAgIEVYUEVDVF9FUSgwLCBpb25fcXVlcnlfZ2V0X2hlYXBzKGlvbmZkLCBoZWFwX2NvdW50LCBudWxscHRyKSk7CiAKLVRFU1RfRihJbnZhbGlkVmFsdWVzLCBpb25fc2hhcmUpCi17Ci0gICAgaW50IHNoYXJlX2ZkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgaW9uX2hlYXBfZGF0YVtdPiBoZWFwcyA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPHN0cnVjdCBpb25faGVhcF9kYXRhW10+KGhlYXBfY291bnQpOworICAgIC8vIGJhZCBmZAorICAgIEVYUEVDVF9FUSgtRUJBREYsIGlvbl9xdWVyeV9nZXRfaGVhcHMoLTEsIGhlYXBfY291bnQsIGhlYXBzLmdldCgpKSk7CiAKLSAgICAvKiBpbnZhbGlkIGlvbiBmZCAqLwotICAgIGludCByZXQgPSBpb25fc2hhcmUoMCwgbV92YWxpZEhhbmRsZSwgJnNoYXJlX2ZkKTsKLSAgICBFWFBFQ1RfVFJVRShyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVOT1RUWSk7Ci0gICAgLyogaW52YWxpZCBpb24gZmQgKi8KLSAgICBFWFBFQ1RfRVEoLUVCQURGLCBpb25fc2hhcmUoLTEsIG1fdmFsaWRIYW5kbGUsICZzaGFyZV9mZCkpOwotICAgIC8qIHplcm8gaGFuZGxlICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9zaGFyZShtX2lvbkZkLCAwLCAmc2hhcmVfZmQpKTsKLSAgICAvKiBiYWQgaGFuZGxlICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9zaGFyZShtX2lvbkZkLCBtX2JhZEhhbmRsZSwgJnNoYXJlX2ZkKSk7Ci0gICAgLyogTlVMTCBzaGFyZV9mZCAqLwotICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fc2hhcmUobV9pb25GZCwgbV92YWxpZEhhbmRsZSwgTlVMTCkpOwotfQotCi1URVNUX0YoSW52YWxpZFZhbHVlcywgaW9uX2ltcG9ydCkKLXsKLSAgICBpb25fdXNlcl9oYW5kbGVfdCBoYW5kbGU7Ci0KLSAgICAvKiBpbnZhbGlkIGlvbiBmZCAqLwotICAgIGludCByZXQgPSBpb25faW1wb3J0KDAsIG1fdmFsaWRTaGFyZUZkLCAmaGFuZGxlKTsKLSAgICBFWFBFQ1RfVFJVRShyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVOT1RUWSk7Ci0gICAgLyogaW52YWxpZCBpb24gZmQgKi8KLSAgICBFWFBFQ1RfRVEoLUVCQURGLCBpb25faW1wb3J0KC0xLCBtX3ZhbGlkU2hhcmVGZCwgJmhhbmRsZSkpOwotICAgIC8qIGJhZCBzaGFyZV9mZCAqLwotICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25faW1wb3J0KG1faW9uRmQsIDAsICZoYW5kbGUpKTsKLSAgICAvKiBpbnZhbGlkIHNoYXJlX2ZkICovCi0gICAgRVhQRUNUX0VRKC1FQkFERiwgaW9uX2ltcG9ydChtX2lvbkZkLCAtMSwgJmhhbmRsZSkpOwotICAgIC8qIE5VTEwgaGFuZGxlICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9pbXBvcnQobV9pb25GZCwgbV92YWxpZFNoYXJlRmQsIE5VTEwpKTsKLX0KLQotVEVTVF9GKEludmFsaWRWYWx1ZXMsIGlvbl9zeW5jX2ZkKQotewotICAgIC8qIGludmFsaWQgaW9uIGZkICovCi0gICAgaW50IHJldCA9IGlvbl9zeW5jX2ZkKDAsIG1fdmFsaWRTaGFyZUZkKTsKLSAgICBFWFBFQ1RfVFJVRShyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVOT1RUWSk7Ci0gICAgLyogaW52YWxpZCBpb24gZmQgKi8KLSAgICBFWFBFQ1RfRVEoLUVCQURGLCBpb25fc3luY19mZCgtMSwgbV92YWxpZFNoYXJlRmQpKTsKLSAgICAvKiBiYWQgc2hhcmVfZmQgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX3N5bmNfZmQobV9pb25GZCwgMCkpOwotICAgIC8qIGludmFsaWQgc2hhcmVfZmQgKi8KLSAgICBFWFBFQ1RfRVEoLUVCQURGLCBpb25fc3luY19mZChtX2lvbkZkLCAtMSkpOworICAgIC8vIGludmFsaWQgaGVhcCBkYXRhIHBvaW50ZXIKKyAgICBFWFBFQ1RfRVEoLUVGQVVMVCwgaW9uX3F1ZXJ5X2dldF9oZWFwcyhpb25mZCwgaGVhcF9jb3VudCwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oMHhkZWFkZjAwZCkpKTsKIH0KZGlmZiAtLWdpdCBhL2xpYmlvbi90ZXN0cy9pb25fNC4xMi5oIGIvbGliaW9uL3Rlc3RzL2lvbl80LjEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0NTEwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmlvbi90ZXN0cy9pb25fNC4xMi5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKgorICoqKiAgIFRoaXMgaGVhZGVyIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIGEgTGludXgga2VybmVsIGhlYWRlcgorICoqKiAgIG9mIHRoZSBzYW1lIG5hbWUsIHRvIG1ha2UgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciB1c2Vyc3BhY2UgdG8KKyAqKiogICBjYWxsIGludG8gdGhlIGtlcm5lbCBhdmFpbGFibGUgdG8gbGliYy4gIEl0IGNvbnRhaW5zIG9ubHkgY29uc3RhbnRzLAorICoqKiAgIHN0cnVjdHVyZXMsIGFuZCBtYWNyb3MgZ2VuZXJhdGVkIGZyb20gdGhlIG9yaWdpbmFsIGhlYWRlciwgYW5kIHRodXMsCisgKioqICAgY29udGFpbnMgbm8gY29weXJpZ2h0YWJsZSBpbmZvcm1hdGlvbi4KKyAqKioKKyAqKiogICBUbyBlZGl0IHRoZSBjb250ZW50IG9mIHRoaXMgaGVhZGVyLCBtb2RpZnkgdGhlIGNvcnJlc3BvbmRpbmcKKyAqKiogICBzb3VyY2UgZmlsZSAoZS5nLiB1bmRlciBleHRlcm5hbC9rZXJuZWwtaGVhZGVycy9vcmlnaW5hbC8pIHRoZW4KKyAqKiogICBydW4gYmlvbmljL2xpYmMva2VybmVsL3Rvb2xzL3VwZGF0ZV9hbGwucHkKKyAqKioKKyAqKiogICBBbnkgbWFudWFsIGNoYW5nZSBoZXJlIHdpbGwgYmUgbG9zdCB0aGUgbmV4dCB0aW1lIHRoaXMgc2NyaXB0IHdpbGwKKyAqKiogICBiZSBydW4uIFlvdSd2ZSBiZWVuIHdhcm5lZCEKKyAqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1VBUElfTElOVVhfSU9OX05FV19ICisjZGVmaW5lIF9VQVBJX0xJTlVYX0lPTl9ORVdfSAorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNkZWZpbmUgSU9OX05VTV9IRUFQX0lEUyAoc2l6ZW9mKHVuc2lnbmVkIGludCkgKiA4KQorc3RydWN0IGlvbl9uZXdfYWxsb2NhdGlvbl9kYXRhIHsKKyAgX191NjQgbGVuOworICBfX3UzMiBoZWFwX2lkX21hc2s7CisgIF9fdTMyIGZsYWdzOworICBfX3UzMiBmZDsKKyAgX191MzIgdW51c2VkOworfTsKKyNkZWZpbmUgTUFYX0hFQVBfTkFNRSAzMgorc3RydWN0IGlvbl9oZWFwX2RhdGEgeworICBjaGFyIG5hbWVbTUFYX0hFQVBfTkFNRV07CisgIF9fdTMyIHR5cGU7CisgIF9fdTMyIGhlYXBfaWQ7CisgIF9fdTMyIHJlc2VydmVkMDsKKyAgX191MzIgcmVzZXJ2ZWQxOworICBfX3UzMiByZXNlcnZlZDI7Cit9Oworc3RydWN0IGlvbl9oZWFwX3F1ZXJ5IHsKKyAgX191MzIgY250OworICBfX3UzMiByZXNlcnZlZDA7CisgIF9fdTY0IGhlYXBzOworICBfX3UzMiByZXNlcnZlZDE7CisgIF9fdTMyIHJlc2VydmVkMjsKK307CisjZGVmaW5lIElPTl9JT0NfTUFHSUMgJ0knCisjZGVmaW5lIElPTl9JT0NfTkVXX0FMTE9DIF9JT1dSKElPTl9JT0NfTUFHSUMsIDAsIHN0cnVjdCBpb25fbmV3X2FsbG9jYXRpb25fZGF0YSkKKyNkZWZpbmUgSU9OX0lPQ19IRUFQX1FVRVJZIF9JT1dSKElPTl9JT0NfTUFHSUMsIDgsIHN0cnVjdCBpb25faGVhcF9xdWVyeSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaW9uL3Rlc3RzL2lvbl90ZXN0X2ZpeHR1cmUuY3BwIGIvbGliaW9uL3Rlc3RzL2lvbl90ZXN0X2ZpeHR1cmUuY3BwCmluZGV4IGUyMGM3MzAuLjkzNWZlNWMgMTAwNjQ0Ci0tLSBhL2xpYmlvbi90ZXN0cy9pb25fdGVzdF9maXh0dXJlLmNwcAorKysgYi9saWJpb24vdGVzdHMvaW9uX3Rlc3RfZml4dHVyZS5jcHAKQEAgLTE1LDU5ICsxNSwyNiBAQAogICovCiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCiAjaW5jbHVkZSA8aW9uL2lvbi5oPgogCiAjaW5jbHVkZSAiaW9uX3Rlc3RfZml4dHVyZS5oIgogCi1Jb25UZXN0OjpJb25UZXN0KCkgOiBtX2lvbkZkKC0xKQotewotfQorSW9uVGVzdDo6SW9uVGVzdCgpIDogaW9uZmQoLTEpLCBpb25faGVhcHMoKSB7fQogCiB2b2lkIElvblRlc3Q6OlNldFVwKCkgewotICAgIG1faW9uRmQgPSBpb25fb3BlbigpOwotICAgIEFTU0VSVF9HRShtX2lvbkZkLCAwKTsKKyAgICBpb25mZCA9IGlvbl9vcGVuKCk7CisgICAgQVNTRVJUX0dFKGlvbmZkLCAwKTsKKworICAgIGludCBoZWFwX2NvdW50OworICAgIGludCByZXQgPSBpb25fcXVlcnlfaGVhcF9jbnQoaW9uZmQsICZoZWFwX2NvdW50KTsKKyAgICBBU1NFUlRfRVEocmV0LCAwKTsKKyAgICBBU1NFUlRfR1QoaGVhcF9jb3VudCwgMCk7CisKKyAgICBpb25faGVhcHMucmVzaXplKGhlYXBfY291bnQsIHt9KTsKKyAgICByZXQgPSBpb25fcXVlcnlfZ2V0X2hlYXBzKGlvbmZkLCBoZWFwX2NvdW50LCBpb25faGVhcHMuZGF0YSgpKTsKKyAgICBBU1NFUlRfRVEocmV0LCAwKTsKIH0KIAogdm9pZCBJb25UZXN0OjpUZWFyRG93bigpIHsKLSAgICBpb25fY2xvc2UobV9pb25GZCk7Ci19Ci0KLUlvbkFsbEhlYXBzVGVzdDo6SW9uQWxsSGVhcHNUZXN0KCkgOgotICAgICAgICBtX2ZpcnN0SGVhcCgwKSwKLSAgICAgICAgbV9sYXN0SGVhcCgwKSwKLSAgICAgICAgbV9hbGxIZWFwcygpCi17Ci19Ci0KLXZvaWQgSW9uQWxsSGVhcHNUZXN0OjpTZXRVcCgpIHsKLSAgICBpbnQgZmQgPSBpb25fb3BlbigpOwotICAgIEFTU0VSVF9HRShmZCwgMCk7Ci0KLSAgICBmb3IgKGludCBpID0gMTsgaSAhPSAwOyBpIDw8PSAxKSB7Ci0gICAgICAgIGlvbl91c2VyX2hhbmRsZV90IGhhbmRsZSA9IDA7Ci0gICAgICAgIGludCByZXQ7Ci0gICAgICAgIHJldCA9IGlvbl9hbGxvYyhmZCwgNDA5NiwgMCwgaSwgMCwgJmhhbmRsZSk7Ci0gICAgICAgIGlmIChyZXQgPT0gMCAmJiBoYW5kbGUgIT0gMCkgewotICAgICAgICAgICAgaW9uX2ZyZWUoZmQsIGhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoIW1fZmlyc3RIZWFwKSB7Ci0gICAgICAgICAgICAgICAgbV9maXJzdEhlYXAgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9sYXN0SGVhcCA9IGk7Ci0gICAgICAgICAgICBtX2FsbEhlYXBzLnB1c2hfYmFjayhpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFTU0VSVF9FUSgtRU5PREVWLCByZXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlvbl9jbG9zZShmZCk7Ci0KLSAgICBFWFBFQ1RfTkUoMFUsIG1fZmlyc3RIZWFwKTsKLSAgICBFWFBFQ1RfTkUoMFUsIG1fbGFzdEhlYXApOwotCi0gICAgUmVjb3JkUHJvcGVydHkoIkhlYXBzIiwgbV9hbGxIZWFwcy5zaXplKCkpOwotICAgIElvblRlc3Q6OlNldFVwKCk7Ci19Ci0KLXZvaWQgSW9uQWxsSGVhcHNUZXN0OjpUZWFyRG93bigpIHsKLSAgICBJb25UZXN0OjpUZWFyRG93bigpOworICAgIGlvbl9jbG9zZShpb25mZCk7CiB9CmRpZmYgLS1naXQgYS9saWJpb24vdGVzdHMvaW9uX3Rlc3RfZml4dHVyZS5oIGIvbGliaW9uL3Rlc3RzL2lvbl90ZXN0X2ZpeHR1cmUuaAppbmRleCA0MDk4MjE0Li40ZjI1NGI4IDEwMDY0NAotLS0gYS9saWJpb24vdGVzdHMvaW9uX3Rlc3RfZml4dHVyZS5oCisrKyBiL2xpYmlvbi90ZXN0cy9pb25fdGVzdF9maXh0dXJlLmgKQEAgLTE4LDI5ICsxOCwxOSBAQAogI2RlZmluZSBJT05fVEVTVF9GSVhUVVJFX0hfCiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJpb25fNC4xMi5oIgogCiB1c2luZyA6OnRlc3Rpbmc6OlRlc3Q7CiAKIGNsYXNzIElvblRlc3QgOiBwdWJsaWMgdmlydHVhbCBUZXN0IHsKLSBwdWJsaWM6CisgIHB1YmxpYzoKICAgICBJb25UZXN0KCk7Ci0JdmlydHVhbCB+SW9uVGVzdCgpIHt9OwotCXZpcnR1YWwgdm9pZCBTZXRVcCgpOwotCXZpcnR1YWwgdm9pZCBUZWFyRG93bigpOwotCWludCBtX2lvbkZkOwotfTsKLQotY2xhc3MgSW9uQWxsSGVhcHNUZXN0IDogcHVibGljIElvblRlc3QgewotIHB1YmxpYzoKLSAgICBJb25BbGxIZWFwc1Rlc3QoKTsKLSAgICB2aXJ0dWFsIH5Jb25BbGxIZWFwc1Rlc3QoKSB7fTsKKyAgICB2aXJ0dWFsIH5Jb25UZXN0KCl7fTsKICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKICAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKLQotICAgIHVuc2lnbmVkIGludCBtX2ZpcnN0SGVhcDsKLSAgICB1bnNpZ25lZCBpbnQgbV9sYXN0SGVhcDsKLQotICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gbV9hbGxIZWFwczsKKyAgICBpbnQgaW9uZmQ7CisgICAgc3RkOjp2ZWN0b3I8c3RydWN0IGlvbl9oZWFwX2RhdGE+IGlvbl9oZWFwczsKIH07CiAKICNlbmRpZiAvKiBJT05fVEVTVF9GSVhUVVJFX0hfICovCmRpZmYgLS1naXQgYS9saWJpb24vdGVzdHMvbWFwX3Rlc3QuY3BwIGIvbGliaW9uL3Rlc3RzL21hcF90ZXN0LmNwcAppbmRleCBjMDA2ZGM4Li5mMWI0N2I3IDEwMDY0NAotLS0gYS9saWJpb24vdGVzdHMvbWFwX3Rlc3QuY3BwCisrKyBiL2xpYmlvbi90ZXN0cy9tYXBfdGVzdC5jcHAKQEAgLTE1LDYxICsxNSwzMCBAQAogICovCiAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAogI2luY2x1ZGUgPGlvbi9pb24uaD4KLQogI2luY2x1ZGUgImlvbl90ZXN0X2ZpeHR1cmUuaCIKIAotY2xhc3MgTWFwIDogcHVibGljIElvbkFsbEhlYXBzVGVzdCB7Ci19OworY2xhc3MgTWFwIDogcHVibGljIElvblRlc3Qge307CiAKLVRFU1RfRihNYXAsIE1hcEhhbmRsZSkKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQqMTAyNCwgNjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7CitURVNUX0YoTWFwLCBNYXBGZCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOwotICAgICAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlID0gMDsKLQotICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvYyhtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgMCwgJmhhbmRsZSkpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoaGFuZGxlICE9IDApOwotCi0gICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHIgPSBOVUxMOwotICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9tYXAobV9pb25GZCwgaGFuZGxlLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCAwLCAmcHRyLCAmbWFwX2ZkKSk7Ci0gICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKLQotICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwotCi0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2ZyZWUobV9pb25GZCwgaGFuZGxlKSk7Ci0KLSAgICAgICAgICAgIG1lbXNldChwdHIsIDB4YWEsIHNpemUpOwotCi0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgc2l6ZSkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1URVNUX0YoTWFwLCBNYXBGZCkKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQqMTAyNCwgNjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKICAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKIAotICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgMCwgJm1hcF9mZCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJm1hcF9mZCkpOwogICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7CiAKLSAgICAgICAgICAgIHZvaWQgKnB0cjsKKyAgICAgICAgICAgIHZvaWQqIHB0cjsKICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQogICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwogCiAgICAgICAgICAgICBtZW1zZXQocHRyLCAweGFhLCBzaXplKTsKQEAgLTc5LDUzICs0OCw1MSBAQAogICAgIH0KIH0KIAotVEVTVF9GKE1hcCwgTWFwT2Zmc2V0KQotewotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7CitURVNUX0YoTWFwLCBNYXBPZmZzZXQpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKKyAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOwogICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CiAKLSAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCBQQUdFX1NJWkUgKiAyLCAwLCBoZWFwTWFzaywgMCwgJm1hcF9mZCkpOworICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCBnZXRwYWdlc2l6ZSgpICogMiwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJm1hcF9mZCkpOwogICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKIAotICAgICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgICAgIHB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcChOVUxMLCBQQUdFX1NJWkUgKiAyLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOworICAgICAgICB1bnNpZ25lZCBjaGFyKiBwdHI7CisgICAgICAgIHB0ciA9ICh1bnNpZ25lZCBjaGFyKiltbWFwKE5VTEwsIGdldHBhZ2VzaXplKCkgKiAyLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfZmQsIDApOwogICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7CiAKLSAgICAgICAgbWVtc2V0KHB0ciwgMCwgUEFHRV9TSVpFKTsKLSAgICAgICAgbWVtc2V0KHB0ciArIFBBR0VfU0laRSwgMHhhYSwgUEFHRV9TSVpFKTsKKyAgICAgICAgbWVtc2V0KHB0ciwgMCwgZ2V0cGFnZXNpemUoKSk7CisgICAgICAgIG1lbXNldChwdHIgKyBnZXRwYWdlc2l6ZSgpLCAweGFhLCBnZXRwYWdlc2l6ZSgpKTsKIAotICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgUEFHRV9TSVpFICogMikpOworICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgZ2V0cGFnZXNpemUoKSAqIDIpKTsKIAotICAgICAgICBwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoTlVMTCwgUEFHRV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIFBBR0VfU0laRSk7CisgICAgICAgIHB0ciA9ICh1bnNpZ25lZCBjaGFyKiltbWFwKE5VTEwsIGdldHBhZ2VzaXplKCksIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cGFnZXNpemUoKSk7CiAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQogICAgICAgICBBU1NFUlRfRVEocHRyWzBdLCAweGFhKTsKLSAgICAgICAgQVNTRVJUX0VRKHB0cltQQUdFX1NJWkUgLSAxXSwgMHhhYSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIFBBR0VfU0laRSkpOwotCisgICAgICAgIEFTU0VSVF9FUShwdHJbZ2V0cGFnZXNpemUoKSAtIDFdLCAweGFhKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIGdldHBhZ2VzaXplKCkpKTsKICAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwogICAgIH0KIH0KIAotVEVTVF9GKE1hcCwgTWFwQ2FjaGVkKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCoxMDI0LCA2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKK1RFU1RfRihNYXAsIE1hcENhY2hlZCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKICAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IElPTl9GTEFHX0NBQ0hFRDsKIAotICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgZmxhZ3MsICZtYXBfZmQpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIGZsYWdzLCAmbWFwX2ZkKSk7CiAgICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKIAotICAgICAgICAgICAgdm9pZCAqcHRyOworICAgICAgICAgICAgdm9pZCogcHRyOwogICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwogICAgICAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCiAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7CiAKICAgICAgICAgICAgIG1lbXNldChwdHIsIDB4YWEsIHNpemUpOwpAQCAtMTM1LDIzICsxMDIsMjIgQEAKICAgICB9CiB9CiAKLVRFU1RfRihNYXAsIE1hcENhY2hlZE5lZWRzU3luYykKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQqMTAyNCwgNjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7CitURVNUX0YoTWFwLCBNYXBDYWNoZWROZWVkc1N5bmMpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQgKiAxMDI0LCA2NCAqIDEwMjQsIDEwMjQgKiAxMDI0LCAyICogMTAyNCAqIDEwMjR9OworICAgIGZvciAoY29uc3QgYXV0byYgaGVhcCA6IGlvbl9oZWFwcykgewogICAgICAgICBmb3IgKHNpemVfdCBzaXplIDogYWxsb2NhdGlvblNpemVzKSB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7CisgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOwogICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7CiAgICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBJT05fRkxBR19DQUNIRUQgfCBJT05fRkxBR19DQUNIRURfTkVFRFNfU1lOQzsKIAotICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgZmxhZ3MsICZtYXBfZmQpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIGZsYWdzLCAmbWFwX2ZkKSk7CiAgICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKIAotICAgICAgICAgICAgdm9pZCAqcHRyOworICAgICAgICAgICAgdm9pZCogcHRyOwogICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwogICAgICAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCiAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7CiAKICAgICAgICAgICAgIG1lbXNldChwdHIsIDB4YWEsIHNpemUpOwpkaWZmIC0tZ2l0IGEvbGlibG9nL2xvZ2dlci5oIGIvbGlibG9nL2xvZ2dlci5oCmluZGV4IDFmNjMyYzAuLmFjY2I2ZTcgMTAwNjQ0Ci0tLSBhL2xpYmxvZy9sb2dnZXIuaAorKysgYi9saWJsb2cvbG9nZ2VyLmgKQEAgLTE3LDcgKzE3LDYgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8c3RkYXRvbWljLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL2xpc3QuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CmRpZmYgLS1naXQgYS9saWJsb2cvbG9ncHJpbnQuY3BwIGIvbGlibG9nL2xvZ3ByaW50LmNwcAppbmRleCA2YjVlYTRjLi4zYTU0NDQ1IDEwMDY0NAotLS0gYS9saWJsb2cvbG9ncHJpbnQuY3BwCisrKyBiL2xpYmxvZy9sb2dwcmludC5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNpZm5kZWYgX19NSU5HVzMyX18KICNpbmNsdWRlIDxwd2QuaD4KICNlbmRpZgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpkaWZmIC0tZ2l0IGEvbGlibG9nL3Btc2dfcmVhZGVyLmNwcCBiL2xpYmxvZy9wbXNnX3JlYWRlci5jcHAKaW5kZXggYmEyN2ZkNy4uZWFhYzk3ZiAxMDA2NDQKLS0tIGEvbGlibG9nL3Btc2dfcmVhZGVyLmNwcAorKysgYi9saWJsb2cvcG1zZ19yZWFkZXIuY3BwCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvbGlibG9nL3Btc2dfd3JpdGVyLmNwcCBiL2xpYmxvZy9wbXNnX3dyaXRlci5jcHAKaW5kZXggZTg1MTEwMC4uNDYzMmIzMiAxMDA2NDQKLS0tIGEvbGlibG9nL3Btc2dfd3JpdGVyLmNwcAorKysgYi9saWJsb2cvcG1zZ193cml0ZXIuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvbGlibG9nL3N0ZGVycl93cml0ZS5jcHAgYi9saWJsb2cvc3RkZXJyX3dyaXRlLmNwcAppbmRleCBlMzI0YTdjLi5lNzY2NzNmIDEwMDY0NAotLS0gYS9saWJsb2cvc3RkZXJyX3dyaXRlLmNwcAorKysgYi9saWJsb2cvc3RkZXJyX3dyaXRlLmNwcApAQCAtMjcsNyArMjcsNiBAQAogICovCiAKICNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpkaWZmIC0tZ2l0IGEvbGlibWVtaW5mby9saWJkbWFidWZpbmZvL2RtYWJ1ZmluZm9fdGVzdC5jcHAgYi9saWJtZW1pbmZvL2xpYmRtYWJ1ZmluZm8vZG1hYnVmaW5mb190ZXN0LmNwcAppbmRleCBlYjUzZTU3Li43YmJhNTk5IDEwMDY0NAotLS0gYS9saWJtZW1pbmZvL2xpYmRtYWJ1ZmluZm8vZG1hYnVmaW5mb190ZXN0LmNwcAorKysgYi9saWJtZW1pbmZvL2xpYmRtYWJ1ZmluZm8vZG1hYnVmaW5mb190ZXN0LmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWJ1Zi5oPgogI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgpAQCAtMjMwLDcgKzIzMSw3IEBACiAgICAgRG1hQnVmVGVzdGVyKCkgOiBpb25fZmQoaW9uX29wZW4oKSksIGlvbl9oZWFwX21hc2soZ2V0X2lvbl9oZWFwX21hc2soKSkge30KIAogICAgIH5EbWFCdWZUZXN0ZXIoKSB7Ci0gICAgICAgIGlmIChpc192YWxpZCgpKSB7CisgICAgICAgIGlmIChpb25fZmQgPj0gMCkgewogICAgICAgICAgICAgaW9uX2Nsb3NlKGlvbl9mZCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDEsMTIgKzI0MiwxNiBAQAogICAgICAgICBpbnQgZmQ7CiAgICAgICAgIGludCBlcnIgPSBpb25fYWxsb2NfZmQoaW9uX2ZkLCBzaXplLCAwLCBpb25faGVhcF9tYXNrLCAwLCAmZmQpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZV9mZHtlcnJ9OworICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWQgaW9uX2FsbG9jX2ZkLCByZXR1cm4gdmFsdWU6ICVkXG4iLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZV9mZHt9OwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGVyciA9IGlvY3RsKGZkLCBETUFfQlVGX1NFVF9OQU1FLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgaWYgKGVyciA8IDApIHJldHVybiB1bmlxdWVfZmR7LWVycm5vfTsKKyAgICAgICAgICAgIGlmIChpb2N0bChmZCwgRE1BX0JVRl9TRVRfTkFNRSwgbmFtZS5jX3N0cigpKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRmFpbGVkIGlvY3RsKERNQV9CVUZfU0VUX05BTUUpOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZV9mZHt9OworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHVuaXF1ZV9mZHtmZH07CkBAIC0zMDYsNyArMzExLDcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICB1bmlxdWVfZmQgaW9uX2ZkOworICAgIGludCBpb25fZmQ7CiAgICAgY29uc3QgaW50IGlvbl9oZWFwX21hc2s7CiB9OwogCmRpZmYgLS1naXQgYS9saWJtb2Rwcm9iZS9BbmRyb2lkLmJwIGIvbGlibW9kcHJvYmUvQW5kcm9pZC5icAppbmRleCBhMjgyNGQxLi43OGRhNDZjIDEwMDY0NAotLS0gYS9saWJtb2Rwcm9iZS9BbmRyb2lkLmJwCisrKyBiL2xpYm1vZHByb2JlL0FuZHJvaWQuYnAKQEAgLTMsNiArMyw3IEBACiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAogICAgIHNyY3M6IFsKICAgICAgICAgImxpYm1vZHByb2JlLmNwcCIsCmRpZmYgLS1naXQgYS9saWJtb2Rwcm9iZS9PV05FUlMgYi9saWJtb2Rwcm9iZS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3NzBiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYm1vZHByb2JlL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK3RvbWNoZXJyeUBnb29nbGUuY29tCitzbXVja2xlQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2xpYm1vZHByb2JlL2luY2x1ZGUvbW9kcHJvYmUvbW9kcHJvYmUuaCBiL2xpYm1vZHByb2JlL2luY2x1ZGUvbW9kcHJvYmUvbW9kcHJvYmUuaAppbmRleCAwZWM3NjZhLi5kY2I0ZmZiIDEwMDY0NAotLS0gYS9saWJtb2Rwcm9iZS9pbmNsdWRlL21vZHByb2JlL21vZHByb2JlLmgKKysrIGIvbGlibW9kcHJvYmUvaW5jbHVkZS9tb2Rwcm9iZS9tb2Rwcm9iZS5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTI1LDEyICsyNiwyMSBAQAogICAgIE1vZHByb2JlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYpOwogCiAgICAgYm9vbCBMb2FkTGlzdGVkTW9kdWxlcygpOwotICAgIGJvb2wgTG9hZFdpdGhBbGlhc2VzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVfbmFtZSwgYm9vbCBzdHJpY3QpOworICAgIGJvb2wgTG9hZFdpdGhBbGlhc2VzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVfbmFtZSwgYm9vbCBzdHJpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlcnMgPSAiIik7CisgICAgYm9vbCBSZW1vdmUoY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZV9uYW1lKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTGlzdE1vZHVsZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdHRlcm4pOworICAgIGJvb2wgR2V0QWxsRGVwZW5kZW5jaWVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGUsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcHJlX2RlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGRlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBvc3RfZGVwZW5kZW5jaWVzKTsKKyAgICB2b2lkIEVuYWJsZUJsYWNrbGlzdChib29sIGVuYWJsZSk7CisgICAgdm9pZCBFbmFibGVWZXJib3NlKGJvb2wgZW5hYmxlKTsKIAogICBwcml2YXRlOgogICAgIHN0ZDo6c3RyaW5nIE1ha2VDYW5vbmljYWwoY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZV9wYXRoKTsKLSAgICBib29sIEluc21vZFdpdGhEZXBzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVfbmFtZSk7Ci0gICAgYm9vbCBJbnNtb2QoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhfbmFtZSk7CisgICAgYm9vbCBJbnNtb2RXaXRoRGVwcyhjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXJzKTsKKyAgICBib29sIEluc21vZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aF9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW1ldGVycyk7CisgICAgYm9vbCBSbW1vZChjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlX25hbWUpOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXREZXBlbmRlbmNpZXMoY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZSk7CiAgICAgYm9vbCBNb2R1bGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZV9uYW1lKTsKIApAQCAtMzksNiArNDksNyBAQAogICAgIGJvb2wgUGFyc2VTb2Z0ZGVwQ2FsbGJhY2soY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKICAgICBib29sIFBhcnNlTG9hZENhbGxiYWNrKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncyk7CiAgICAgYm9vbCBQYXJzZU9wdGlvbnNDYWxsYmFjayhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOworICAgIGJvb2wgUGFyc2VCbGFja2xpc3RDYWxsYmFjayhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwogICAgIHZvaWQgUGFyc2VDZmcoY29uc3Qgc3RkOjpzdHJpbmcmIGNmZywgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYpPiBmKTsKIAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBtb2R1bGVfYWxpYXNlc187CkBAIC00Nyw0ICs1OCw2IEBACiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IG1vZHVsZV9wb3N0X3NvZnRkZXBfOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVfbG9hZF87CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbW9kdWxlX29wdGlvbnNfOworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtb2R1bGVfYmxhY2tsaXN0XzsKKyAgICBib29sIGJsYWNrbGlzdF9lbmFibGVkID0gZmFsc2U7CiB9OwpkaWZmIC0tZ2l0IGEvbGlibW9kcHJvYmUvbGlibW9kcHJvYmUuY3BwIGIvbGlibW9kcHJvYmUvbGlibW9kcHJvYmUuY3BwCmluZGV4IDAxY2YyZTMuLjczYWUxNWIgMTAwNjQ0Ci0tLSBhL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlLmNwcAorKysgYi9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZS5jcHAKQEAgLTE5NCw2ICsxOTQsMzEgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBNb2Rwcm9iZTo6UGFyc2VCbGFja2xpc3RDYWxsYmFjayhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKKyAgICBhdXRvIGl0ID0gYXJncy5iZWdpbigpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlID0gKml0Kys7CisKKyAgICBpZiAodHlwZSAhPSAiYmxhY2tsaXN0IikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJub24tYmxhY2tsaXN0IGxpbmUgZW5jb3VudGVyZWQgaW4gbW9kdWxlcy5ibGFja2xpc3QiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGFyZ3Muc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAibGluZXMgaW4gbW9kdWxlcy5ibGFja2xpc3QgbXVzdCBoYXZlIGV4YWN0bHkgMiBlbnRyaWVzLCBub3QgIiA8PCBhcmdzLnNpemUoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGUgPSAqaXQrKzsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW5vbmljYWxfbmFtZSA9IE1ha2VDYW5vbmljYWwobW9kdWxlKTsKKyAgICBpZiAoY2Fub25pY2FsX25hbWUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHRoaXMtPm1vZHVsZV9ibGFja2xpc3RfLmVtcGxhY2UoY2Fub25pY2FsX25hbWUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgTW9kcHJvYmU6OlBhcnNlQ2ZnKGNvbnN0IHN0ZDo6c3RyaW5nJiBjZmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Jik+IGYpIHsKICAgICBzdGQ6OnN0cmluZyBjZmdfY29udGVudHM7CkBAIC0yMzEsNiArMjU2LDIzIEBACiAKICAgICAgICAgYXV0byBvcHRpb25zX2NhbGxiYWNrID0gc3RkOjpiaW5kKCZNb2Rwcm9iZTo6UGFyc2VPcHRpb25zQ2FsbGJhY2ssIHRoaXMsIF8xKTsKICAgICAgICAgUGFyc2VDZmcoYmFzZV9wYXRoICsgIi9tb2R1bGVzLm9wdGlvbnMiLCBvcHRpb25zX2NhbGxiYWNrKTsKKworICAgICAgICBhdXRvIGJsYWNrbGlzdF9jYWxsYmFjayA9IHN0ZDo6YmluZCgmTW9kcHJvYmU6OlBhcnNlQmxhY2tsaXN0Q2FsbGJhY2ssIHRoaXMsIF8xKTsKKyAgICAgICAgUGFyc2VDZmcoYmFzZV9wYXRoICsgIi9tb2R1bGVzLmJsYWNrbGlzdCIsIGJsYWNrbGlzdF9jYWxsYmFjayk7CisgICAgfQorCisgICAgYW5kcm9pZDo6YmFzZTo6U2V0TWluaW11bUxvZ1NldmVyaXR5KGFuZHJvaWQ6OmJhc2U6OklORk8pOworfQorCit2b2lkIE1vZHByb2JlOjpFbmFibGVCbGFja2xpc3QoYm9vbCBlbmFibGUpIHsKKyAgICBibGFja2xpc3RfZW5hYmxlZCA9IGVuYWJsZTsKK30KKwordm9pZCBNb2Rwcm9iZTo6RW5hYmxlVmVyYm9zZShib29sIGVuYWJsZSkgeworICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6U2V0TWluaW11bUxvZ1NldmVyaXR5KGFuZHJvaWQ6OmJhc2U6OlZFUkJPU0UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNldE1pbmltdW1Mb2dTZXZlcml0eShhbmRyb2lkOjpiYXNlOjpJTkZPKTsKICAgICB9CiB9CiAKQEAgLTI0Miw3ICsyODQsNyBAQAogICAgIHJldHVybiBpdC0+c2Vjb25kOwogfQogCi1ib29sIE1vZHByb2JlOjpJbnNtb2RXaXRoRGVwcyhjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlX25hbWUpIHsKK2Jvb2wgTW9kcHJvYmU6Okluc21vZFdpdGhEZXBzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlcnMpIHsKICAgICBpZiAobW9kdWxlX25hbWUuZW1wdHkoKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJOZWVkIHZhbGlkIG1vZHVsZSBuYW1lLCBnaXZlbjogIiA8PCBtb2R1bGVfbmFtZTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjU2LDExICsyOTgsOCBAQAogCiAgICAgLy8gbG9hZCBtb2R1bGUgZGVwZW5kZW5jaWVzIGluIHJldmVyc2Ugb3JkZXIKICAgICBmb3IgKGF1dG8gZGVwID0gZGVwZW5kZW5jaWVzLnJiZWdpbigpOyBkZXAgIT0gZGVwZW5kZW5jaWVzLnJlbmQoKSAtIDE7ICsrZGVwKSB7Ci0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW5vbmljYWxfbmFtZSA9IE1ha2VDYW5vbmljYWwoKmRlcCk7Ci0gICAgICAgIGlmIChjYW5vbmljYWxfbmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFMb2FkV2l0aEFsaWFzZXMoY2Fub25pY2FsX25hbWUsIHRydWUpKSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTG9hZGluZyBoYXJkIGRlcCBmb3IgJyIgPDwgbW9kdWxlX25hbWUgPDwgIic6ICIgPDwgKmRlcDsKKyAgICAgICAgaWYgKCFMb2FkV2l0aEFsaWFzZXMoKmRlcCwgdHJ1ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTI2OCwxOCArMzA3LDIwIEBACiAgICAgLy8gdHJ5IHRvIGxvYWQgc29mdCBwcmUtZGVwZW5kZW5jaWVzCiAgICAgZm9yIChjb25zdCBhdXRvJiBbbW9kdWxlLCBzb2Z0ZGVwXSA6IG1vZHVsZV9wcmVfc29mdGRlcF8pIHsKICAgICAgICAgaWYgKG1vZHVsZV9uYW1lID09IG1vZHVsZSkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJMb2FkaW5nIHNvZnQgcHJlLWRlcCBmb3IgJyIgPDwgbW9kdWxlIDw8ICInOiAiIDw8IHNvZnRkZXA7CiAgICAgICAgICAgICBMb2FkV2l0aEFsaWFzZXMoc29mdGRlcCwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gbG9hZCB0YXJnZXQgbW9kdWxlIGl0c2VsZiB3aXRoIGFyZ3MKLSAgICBpZiAoIUluc21vZChkZXBlbmRlbmNpZXNbMF0pKSB7CisgICAgaWYgKCFJbnNtb2QoZGVwZW5kZW5jaWVzWzBdLCBwYXJhbWV0ZXJzKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gdHJ5IHRvIGxvYWQgc29mdCBwb3N0LWRlcGVuZGVuY2llcwogICAgIGZvciAoY29uc3QgYXV0byYgW21vZHVsZSwgc29mdGRlcF0gOiBtb2R1bGVfcG9zdF9zb2Z0ZGVwXykgewogICAgICAgICBpZiAobW9kdWxlX25hbWUgPT0gbW9kdWxlKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkxvYWRpbmcgc29mdCBwb3N0LWRlcCBmb3IgJyIgPDwgbW9kdWxlIDw8ICInOiAiIDw8IHNvZnRkZXA7CiAgICAgICAgICAgICBMb2FkV2l0aEFsaWFzZXMoc29mdGRlcCwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjg3LDI1ICszMjgsMjcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBNb2Rwcm9iZTo6TG9hZFdpdGhBbGlhc2VzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVfbmFtZSwgYm9vbCBzdHJpY3QpIHsKLSAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbW9kdWxlc190b19sb2FkID0ge21vZHVsZV9uYW1lfTsKK2Jvb2wgTW9kcHJvYmU6OkxvYWRXaXRoQWxpYXNlcyhjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlX25hbWUsIGJvb2wgc3RyaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXJzKSB7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG1vZHVsZXNfdG9fbG9hZCA9IHtNYWtlQ2Fub25pY2FsKG1vZHVsZV9uYW1lKX07CiAgICAgYm9vbCBtb2R1bGVfbG9hZGVkID0gZmFsc2U7CiAKICAgICAvLyB1c2UgYWxpYXNlcyB0byBleHBhbmQgbGlzdCBvZiBtb2R1bGVzIHRvIGxvYWQgKG11bHRpcGxlIG1vZHVsZXMKICAgICAvLyBtYXkgYWxpYXMgdGhlbXNlbHZlcyB0byB0aGUgcmVxdWVzdGVkIG5hbWUpCiAgICAgZm9yIChjb25zdCBhdXRvJiBbYWxpYXMsIGFsaWFzZWRfbW9kdWxlXSA6IG1vZHVsZV9hbGlhc2VzXykgewogICAgICAgICBpZiAoZm5tYXRjaChhbGlhcy5jX3N0cigpLCBtb2R1bGVfbmFtZS5jX3N0cigpLCAwKSAhPSAwKSBjb250aW51ZTsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGb3VuZCBhbGlhcyBmb3IgJyIgPDwgbW9kdWxlX25hbWUgPDwgIic6ICciIDw8IGFsaWFzZWRfbW9kdWxlOwogICAgICAgICBtb2R1bGVzX3RvX2xvYWQuZW1wbGFjZShhbGlhc2VkX21vZHVsZSk7CiAgICAgfQogCiAgICAgLy8gYXR0ZW1wdCB0byBsb2FkIGFsbCBtb2R1bGVzIGFsaWFzZWQgdG8gdGhpcyBuYW1lCiAgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiBtb2R1bGVzX3RvX2xvYWQpIHsKICAgICAgICAgaWYgKCFNb2R1bGVFeGlzdHMobW9kdWxlKSkgY29udGludWU7Ci0gICAgICAgIGlmIChJbnNtb2RXaXRoRGVwcyhtb2R1bGUpKSBtb2R1bGVfbG9hZGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKEluc21vZFdpdGhEZXBzKG1vZHVsZSwgcGFyYW1ldGVycykpIG1vZHVsZV9sb2FkZWQgPSB0cnVlOwogICAgIH0KIAogICAgIGlmIChzdHJpY3QgJiYgIW1vZHVsZV9sb2FkZWQpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiTG9hZFdpdGhBbGlhc2VzIGRpZCBub3QgZmluZCBhIG1vZHVsZSBmb3IgIiA8PCBtb2R1bGVfbmFtZTsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTG9hZFdpdGhBbGlhc2VzIHdhcyB1bmFibGUgdG8gbG9hZCAiIDw8IG1vZHVsZV9uYW1lOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwpAQCAtMzE5LDMgKzM2Miw2NCBAQAogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KKworYm9vbCBNb2Rwcm9iZTo6UmVtb3ZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVfbmFtZSkgeworICAgIGF1dG8gZGVwZW5kZW5jaWVzID0gR2V0RGVwZW5kZW5jaWVzKE1ha2VDYW5vbmljYWwobW9kdWxlX25hbWUpKTsKKyAgICBpZiAoZGVwZW5kZW5jaWVzLmVtcHR5KCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRW1wdHkgZGVwZW5kZW5jaWVzIGZvciBtb2R1bGUgIiA8PCBtb2R1bGVfbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIVJtbW9kKGRlcGVuZGVuY2llc1swXSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGF1dG8gZGVwID0gZGVwZW5kZW5jaWVzLmJlZ2luKCkgKyAxOyBkZXAgIT0gZGVwZW5kZW5jaWVzLmVuZCgpOyArK2RlcCkgeworICAgICAgICBSbW1vZCgqZGVwKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBNb2Rwcm9iZTo6TGlzdE1vZHVsZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdHRlcm4pIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcnY7CisgICAgZm9yIChjb25zdCBhdXRvJiBbbW9kdWxlLCBkZXBzXSA6IG1vZHVsZV9kZXBzXykgeworICAgICAgICAvLyBBdHRlbXB0IHRvIG1hdGNoIGJvdGggdGhlIGNhbm9uaWNhbCBtb2R1bGUgbmFtZSBhbmQgdGhlIG1vZHVsZSBmaWxlbmFtZS4KKyAgICAgICAgaWYgKCFmbm1hdGNoKHBhdHRlcm4uY19zdHIoKSwgbW9kdWxlLmNfc3RyKCksIDApKSB7CisgICAgICAgICAgICBydi5lbXBsYWNlX2JhY2sobW9kdWxlKTsKKyAgICAgICAgfSBlbHNlIGlmICghZm5tYXRjaChwYXR0ZXJuLmNfc3RyKCksIGJhc2VuYW1lKGRlcHNbMF0uY19zdHIoKSksIDApKSB7CisgICAgICAgICAgICBydi5lbXBsYWNlX2JhY2soZGVwc1swXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ2OworfQorCitib29sIE1vZHByb2JlOjpHZXRBbGxEZXBlbmRlbmNpZXMoY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHByZV9kZXBlbmRlbmNpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBkZXBlbmRlbmNpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwb3N0X2RlcGVuZGVuY2llcykgeworICAgIHN0ZDo6c3RyaW5nIGNhbm9uaWNhbF9uYW1lID0gTWFrZUNhbm9uaWNhbChtb2R1bGUpOworICAgIGlmIChwcmVfZGVwZW5kZW5jaWVzKSB7CisgICAgICAgIHByZV9kZXBlbmRlbmNpZXMtPmNsZWFyKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgW2l0X21vZHVsZSwgaXRfc29mdGRlcF0gOiBtb2R1bGVfcHJlX3NvZnRkZXBfKSB7CisgICAgICAgICAgICBpZiAoY2Fub25pY2FsX25hbWUgPT0gaXRfbW9kdWxlKSB7CisgICAgICAgICAgICAgICAgcHJlX2RlcGVuZGVuY2llcy0+ZW1wbGFjZV9iYWNrKGl0X3NvZnRkZXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChkZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgZGVwZW5kZW5jaWVzLT5jbGVhcigpOworICAgICAgICBhdXRvIGhhcmRfZGVwcyA9IEdldERlcGVuZGVuY2llcyhjYW5vbmljYWxfbmFtZSk7CisgICAgICAgIGlmIChoYXJkX2RlcHMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBkZXAgPSBoYXJkX2RlcHMucmJlZ2luKCk7IGRlcCAhPSBoYXJkX2RlcHMucmVuZCgpOyBkZXArKykgeworICAgICAgICAgICAgZGVwZW5kZW5jaWVzLT5lbXBsYWNlX2JhY2soKmRlcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBvc3RfZGVwZW5kZW5jaWVzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgW2l0X21vZHVsZSwgaXRfc29mdGRlcF0gOiBtb2R1bGVfcG9zdF9zb2Z0ZGVwXykgeworICAgICAgICAgICAgaWYgKGNhbm9uaWNhbF9uYW1lID09IGl0X21vZHVsZSkgeworICAgICAgICAgICAgICAgIHBvc3RfZGVwZW5kZW5jaWVzLT5lbXBsYWNlX2JhY2soaXRfc29mdGRlcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZV9leHQuY3BwIGIvbGlibW9kcHJvYmUvbGlibW9kcHJvYmVfZXh0LmNwcAppbmRleCA1ZjNhMDRkLi4yZWZjYWMyIDEwMDY0NAotLS0gYS9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZV9leHQuY3BwCisrKyBiL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlX2V4dC5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgPG1vZHByb2JlL21vZHByb2JlLmg+CiAKLWJvb2wgTW9kcHJvYmU6Okluc21vZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aF9uYW1lKSB7Citib29sIE1vZHByb2JlOjpJbnNtb2QoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlcnMpIHsKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoCiAgICAgICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihwYXRoX25hbWUuY19zdHIoKSwgT19SRE9OTFkgfCBPX05PRk9MTE9XIHwgT19DTE9FWEVDKSkpOwogICAgIGlmIChmZCA9PSAtMSkgewpAQCAtMzUsNiArMzUsOSBAQAogICAgIGlmIChvcHRpb25zX2l0ZXIgIT0gbW9kdWxlX29wdGlvbnNfLmVuZCgpKSB7CiAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zX2l0ZXItPnNlY29uZDsKICAgICB9CisgICAgaWYgKCFwYXJhbWV0ZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgKyAiICIgKyBwYXJhbWV0ZXJzOworICAgIH0KIAogICAgIExPRyhJTkZPKSA8PCAiTG9hZGluZyBtb2R1bGUgIiA8PCBwYXRoX25hbWUgPDwgIiB3aXRoIGFyZ3MgXCIiIDw8IG9wdGlvbnMgPDwgIlwiIjsKICAgICBpbnQgcmV0ID0gc3lzY2FsbChfX05SX2Zpbml0X21vZHVsZSwgZmQuZ2V0KCksIG9wdGlvbnMuY19zdHIoKSwgMCk7CkBAIC01MSwxNyArNTQsMzIgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBNb2Rwcm9iZTo6Um1tb2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZV9uYW1lKSB7CisgICAgaW50IHJldCA9IHN5c2NhbGwoX19OUl9kZWxldGVfbW9kdWxlLCBNYWtlQ2Fub25pY2FsKG1vZHVsZV9uYW1lKS5jX3N0cigpLCBPX05PTkJMT0NLKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZW1vdmUgbW9kdWxlICciIDw8IG1vZHVsZV9uYW1lIDw8ICInIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBNb2Rwcm9iZTo6TW9kdWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVfbmFtZSkgewogICAgIHN0cnVjdCBzdGF0IGZpbGVTdGF0OworICAgIGlmIChibGFja2xpc3RfZW5hYmxlZCAmJiBtb2R1bGVfYmxhY2tsaXN0Xy5jb3VudChtb2R1bGVfbmFtZSkpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJtb2R1bGUgIiA8PCBtb2R1bGVfbmFtZSA8PCAiIGlzIGJsYWNrbGlzdGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBhdXRvIGRlcHMgPSBHZXREZXBlbmRlbmNpZXMobW9kdWxlX25hbWUpOwogICAgIGlmIChkZXBzLmVtcHR5KCkpIHsKICAgICAgICAgLy8gbWlzc2luZyBkZXBzIGNhbiBoYXBwZW4gaW4gdGhlIGNhc2Ugb2YgYW4gYWxpYXMKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoc3RhdChkZXBzLmZyb250KCkuY19zdHIoKSwgJmZpbGVTdGF0KSkgeworICAgICAgICBMT0coSU5GTykgPDwgIm1vZHVsZSAiIDw8IG1vZHVsZV9uYW1lIDw8ICIgZG9lcyBub3QgZXhpc3QiOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghU19JU1JFRyhmaWxlU3RhdC5zdF9tb2RlKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIm1vZHVsZSAiIDw8IG1vZHVsZV9uYW1lIDw8ICIgaXMgbm90IGEgcmVndWxhciBmaWxlIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlX2V4dF90ZXN0LmNwcCBiL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlX2V4dF90ZXN0LmNwcAppbmRleCAwZjA3M2NiLi43ZDgxN2IxIDEwMDY0NAotLS0gYS9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZV9leHRfdGVzdC5jcHAKKysrIGIvbGlibW9kcHJvYmUvbGlibW9kcHJvYmVfZXh0X3Rlc3QuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAKICNpbmNsdWRlICJsaWJtb2Rwcm9iZV90ZXN0LmgiCiAKLWJvb2wgTW9kcHJvYmU6Okluc21vZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aF9uYW1lKSB7Citib29sIE1vZHByb2JlOjpJbnNtb2QoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcmFtZXRlcnMpIHsKICAgICBhdXRvIGRlcHMgPSBHZXREZXBlbmRlbmNpZXMoTWFrZUNhbm9uaWNhbChwYXRoX25hbWUpKTsKICAgICBpZiAoZGVwcy5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTQ3LDEyICs0NywyOSBAQAogICAgIGlmIChvcHRpb25zX2l0ZXIgIT0gbW9kdWxlX29wdGlvbnNfLmVuZCgpKSB7CiAgICAgICAgIG9wdGlvbnMgPSAiICIgKyBvcHRpb25zX2l0ZXItPnNlY29uZDsKICAgICB9CisgICAgaWYgKCFwYXJhbWV0ZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgKyAiICIgKyBwYXJhbWV0ZXJzOworICAgIH0KKwogICAgIG1vZHVsZXNfbG9hZGVkLmVtcGxhY2VfYmFjayhwYXRoX25hbWUgKyBvcHRpb25zKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBNb2Rwcm9iZTo6Um1tb2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZV9uYW1lKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbW9kdWxlc19sb2FkZWQuYmVnaW4oKTsgaXQgIT0gbW9kdWxlc19sb2FkZWQuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKCppdCA9PSBtb2R1bGVfbmFtZSkgeworICAgICAgICAgICAgbW9kdWxlc19sb2FkZWQuZXJhc2UoaXQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBib29sIE1vZHByb2JlOjpNb2R1bGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZV9uYW1lKSB7CiAgICAgYXV0byBkZXBzID0gR2V0RGVwZW5kZW5jaWVzKG1vZHVsZV9uYW1lKTsKKyAgICBpZiAoYmxhY2tsaXN0X2VuYWJsZWQgJiYgbW9kdWxlX2JsYWNrbGlzdF8uY291bnQobW9kdWxlX25hbWUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgaWYgKGRlcHMuZW1wdHkoKSkgewogICAgICAgICAvLyBtaXNzaW5nIGRlcHMgY2FuIGhhcHBlbiBpbiB0aGUgY2FzZSBvZiBhbiBhbGlhcwogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZV90ZXN0LmNwcCBiL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlX3Rlc3QuY3BwCmluZGV4IDQ4MTY1OGQuLmE3MTE2MzEgMTAwNjQ0Ci0tLSBhL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlX3Rlc3QuY3BwCisrKyBiL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlX3Rlc3QuY3BwCkBAIC01Niw2ICs1NiwxNCBAQAogICAgICAgICAgICAgIi90ZXN0MTMua28iLAogICAgIH07CiAKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXhwZWN0ZWRfYWZ0ZXJfcmVtb3ZlID0geworICAgICAgICAgICAgIi90ZXN0MTQua28iLCAiL3Rlc3QxNS5rbyIsICAgICAgICAgIi90ZXN0MS5rbyIsCisgICAgICAgICAgICAiL3Rlc3Q2LmtvIiwgICIvdGVzdDIua28iLCAgICAgICAgICAiL3Rlc3Q1LmtvIiwKKyAgICAgICAgICAgICIvdGVzdDgua28iLCAgIi90ZXN0Ny5rbyBwYXJhbTE9NCIsICIvdGVzdDkua28gcGFyYW1feD0xIHBhcmFtX3k9MiBwYXJhbV96PTMiLAorICAgICAgICAgICAgIi90ZXN0MTAua28iLCAiL3Rlc3QxMi5rbyIsICAgICAgICAgIi90ZXN0MTEua28iLAorICAgICAgICAgICAgIi90ZXN0MTMua28iLAorICAgIH07CisKICAgICBjb25zdCBzdGQ6OnN0cmluZyBtb2R1bGVzX2RlcCA9CiAgICAgICAgICAgICAidGVzdDEua286XG4iCiAgICAgICAgICAgICAidGVzdDIua286XG4iCkBAIC05MSw2ICs5OSwxMCBAQAogICAgICAgICAgICAgIm9wdGlvbnMgdGVzdDkua28gcGFyYW1feD0xIHBhcmFtX3k9MiBwYXJhbV96PTNcbiIKICAgICAgICAgICAgICJvcHRpb25zIHRlc3QxMDAua28gcGFyYW1fMT0xXG4iOwogCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbW9kdWxlc19ibGFja2xpc3QgPQorICAgICAgICAgICAgImJsYWNrbGlzdCB0ZXN0OS5rb1xuIgorICAgICAgICAgICAgImJsYWNrbGlzdCB0ZXN0My5rb1xuIjsKKwogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1vZHVsZXNfbG9hZCA9CiAgICAgICAgICAgICAidGVzdDQua29cbiIKICAgICAgICAgICAgICJ0ZXN0MS5rb1xuIgpAQCAtMTAxLDE3ICsxMTMsMjAgQEAKICAgICAgICAgICAgICJ0ZXN0MTEua29cbiI7CiAKICAgICBUZW1wb3JhcnlEaXIgZGlyOwotICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKAotICAgICAgICAgICAgbW9kdWxlc19hbGlhcywgc3RkOjpzdHJpbmcoZGlyLnBhdGgpICsgIi9tb2R1bGVzLmFsaWFzIiwgMDYwMCwgZ2V0dWlkKCksIGdldGdpZCgpKSk7CisgICAgYXV0byBkaXJfcGF0aCA9IHN0ZDo6c3RyaW5nKGRpci5wYXRoKTsKKyAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZShtb2R1bGVzX2FsaWFzLCBkaXJfcGF0aCArICIvbW9kdWxlcy5hbGlhcyIsIDA2MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKCksIGdldGdpZCgpKSk7CiAKLSAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZSgKLSAgICAgICAgICAgIG1vZHVsZXNfZGVwLCBzdGQ6OnN0cmluZyhkaXIucGF0aCkgKyAiL21vZHVsZXMuZGVwIiwgMDYwMCwgZ2V0dWlkKCksIGdldGdpZCgpKSk7Ci0gICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUoCi0gICAgICAgICAgICBtb2R1bGVzX3NvZnRkZXAsIHN0ZDo6c3RyaW5nKGRpci5wYXRoKSArICIvbW9kdWxlcy5zb2Z0ZGVwIiwgMDYwMCwgZ2V0dWlkKCksIGdldGdpZCgpKSk7Ci0gICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUoCi0gICAgICAgICAgICBtb2R1bGVzX29wdGlvbnMsIHN0ZDo6c3RyaW5nKGRpci5wYXRoKSArICIvbW9kdWxlcy5vcHRpb25zIiwgMDYwMCwgZ2V0dWlkKCksIGdldGdpZCgpKSk7Ci0gICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUoCi0gICAgICAgICAgICBtb2R1bGVzX2xvYWQsIHN0ZDo6c3RyaW5nKGRpci5wYXRoKSArICIvbW9kdWxlcy5sb2FkIiwgMDYwMCwgZ2V0dWlkKCksIGdldGdpZCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUobW9kdWxlc19kZXAsIGRpcl9wYXRoICsgIi9tb2R1bGVzLmRlcCIsIDA2MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKCksIGdldGdpZCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUobW9kdWxlc19zb2Z0ZGVwLCBkaXJfcGF0aCArICIvbW9kdWxlcy5zb2Z0ZGVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNjAwLCBnZXR1aWQoKSwgZ2V0Z2lkKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZShtb2R1bGVzX29wdGlvbnMsIGRpcl9wYXRoICsgIi9tb2R1bGVzLm9wdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA2MDAsIGdldHVpZCgpLCBnZXRnaWQoKSkpOworICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKG1vZHVsZXNfbG9hZCwgZGlyX3BhdGggKyAiL21vZHVsZXMubG9hZCIsIDA2MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKCksIGdldGdpZCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUobW9kdWxlc19ibGFja2xpc3QsIGRpcl9wYXRoICsgIi9tb2R1bGVzLmJsYWNrbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDYwMCwgZ2V0dWlkKCksIGdldGdpZCgpKSk7CiAKICAgICBmb3IgKGF1dG8gaSA9IHRlc3RfbW9kdWxlcy5iZWdpbigpOyBpICE9IHRlc3RfbW9kdWxlcy5lbmQoKTsgKytpKSB7CiAgICAgICAgICppID0gZGlyLnBhdGggKyAqaTsKQEAgLTEzMSw0ICsxNDYsMjEgQEAKICAgICB9CiAKICAgICBFWFBFQ1RfVFJVRShtb2R1bGVzX2xvYWRlZCA9PSBleHBlY3RlZF9tb2R1bGVzX2xvYWRlZCk7CisKKyAgICBFWFBFQ1RfVFJVRShtLlJlbW92ZSgidGVzdDQiKSk7CisKKyAgICBHVEVTVF9MT0dfKElORk8pIDw8ICJFeHBlY3RlZCBtb2R1bGVzIGxvYWRlZCBhZnRlciByZW1vdmluZyB0ZXN0NCAoaW4gb3JkZXIpOiI7CisgICAgZm9yIChhdXRvIGkgPSBleHBlY3RlZF9hZnRlcl9yZW1vdmUuYmVnaW4oKTsgaSAhPSBleHBlY3RlZF9hZnRlcl9yZW1vdmUuZW5kKCk7ICsraSkgeworICAgICAgICAqaSA9IGRpci5wYXRoICsgKmk7CisgICAgICAgIEdURVNUX0xPR18oSU5GTykgPDwgIlwiIiA8PCAqaSA8PCAiXCIiOworICAgIH0KKyAgICBHVEVTVF9MT0dfKElORk8pIDw8ICJBY3R1YWwgbW9kdWxlcyBsb2FkZWQgYWZ0ZXIgcmVtb3ZpbmcgdGVzdDQgKGluIG9yZGVyKToiOworICAgIGZvciAoYXV0byBpID0gbW9kdWxlc19sb2FkZWQuYmVnaW4oKTsgaSAhPSBtb2R1bGVzX2xvYWRlZC5lbmQoKTsgKytpKSB7CisgICAgICAgIEdURVNUX0xPR18oSU5GTykgPDwgIlwiIiA8PCAqaSA8PCAiXCIiOworICAgIH0KKworICAgIEVYUEVDVF9UUlVFKG1vZHVsZXNfbG9hZGVkID09IGV4cGVjdGVkX2FmdGVyX3JlbW92ZSk7CisKKyAgICBtLkVuYWJsZUJsYWNrbGlzdCh0cnVlKTsKKyAgICBFWFBFQ1RfRkFMU0UobS5Mb2FkV2l0aEFsaWFzZXMoInRlc3Q0IiwgdHJ1ZSkpOwogfQpkaWZmIC0tZ2l0IGEvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfbmFtZXNwYWNlLmNwcCBiL2xpYm5hdGl2ZWxvYWRlci9uYXRpdmVfbG9hZGVyX25hbWVzcGFjZS5jcHAKaW5kZXggNGIwMjExNi4uNGFkZDZlNiAxMDA2NDQKLS0tIGEvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfbmFtZXNwYWNlLmNwcAorKysgYi9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl9uYW1lc3BhY2UuY3BwCkBAIC02OSwxMCArNjksMTggQEAKIC8vICJkZWZhdWx0IiBhbHdheXMgZXhpc3RzLgogUmVzdWx0PE5hdGl2ZUxvYWRlck5hbWVzcGFjZT4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpHZXRQbGF0Zm9ybU5hbWVzcGFjZShib29sIGlzX2JyaWRnZWQpIHsKICAgYXV0byBucyA9IEdldEV4cG9ydGVkTmFtZXNwYWNlKGtQbGF0Zm9ybU5hbWVzcGFjZU5hbWUsIGlzX2JyaWRnZWQpOwotICBpZiAoIW5zKSB7Ci0gICAgbnMgPSBHZXRFeHBvcnRlZE5hbWVzcGFjZShrRGVmYXVsdE5hbWVzcGFjZU5hbWUsIGlzX2JyaWRnZWQpOworICBpZiAobnMpIHJldHVybiBuczsKKyAgbnMgPSBHZXRFeHBvcnRlZE5hbWVzcGFjZShrRGVmYXVsdE5hbWVzcGFjZU5hbWUsIGlzX2JyaWRnZWQpOworICBpZiAobnMpIHJldHVybiBuczsKKworICAvLyBJZiBub3RoaW5nIGlzIGZvdW5kLCByZXR1cm4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlIGNvbnN0cnVjdGVkIGZyb20gbnVsbHB0ci4KKyAgLy8gbnVsbHB0ciBhbHNvIG1lYW5zIGRlZmF1bHQgbmFtZXNwYWNlIHRvIHRoZSBsaW5rZXIuCisgIGlmICghaXNfYnJpZGdlZCkgeworICAgIHJldHVybiBOYXRpdmVMb2FkZXJOYW1lc3BhY2Uoa0RlZmF1bHROYW1lc3BhY2VOYW1lLCBzdGF0aWNfY2FzdDxhbmRyb2lkX25hbWVzcGFjZV90Kj4obnVsbHB0cikpOworICB9IGVsc2UgeworICAgIHJldHVybiBOYXRpdmVMb2FkZXJOYW1lc3BhY2Uoa0RlZmF1bHROYW1lc3BhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bmF0aXZlX2JyaWRnZV9uYW1lc3BhY2VfdCo+KG51bGxwdHIpKTsKICAgfQotICByZXR1cm4gbnM7CiB9CiAKIFJlc3VsdDxOYXRpdmVMb2FkZXJOYW1lc3BhY2U+IE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6Q3JlYXRlKApkaWZmIC0tZ2l0IGEvbGlicGFja2FnZWxpc3RwYXJzZXIvLmNsYW5nLWZvcm1hdCBiL2xpYnBhY2thZ2VsaXN0cGFyc2VyLy5jbGFuZy1mb3JtYXQKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZmQwNjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBhY2thZ2VsaXN0cGFyc2VyLy5jbGFuZy1mb3JtYXQKQEAgLTAsMCArMSBAQAorLi4vLmNsYW5nLWZvcm1hdC0yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicGFja2FnZWxpc3RwYXJzZXIvQW5kcm9pZC5icCBiL2xpYnBhY2thZ2VsaXN0cGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggYzM4NTk0YS4uMDc0MGU3ZCAxMDA2NDQKLS0tIGEvbGlicGFja2FnZWxpc3RwYXJzZXIvQW5kcm9pZC5icAorKysgYi9saWJwYWNrYWdlbGlzdHBhcnNlci9BbmRyb2lkLmJwCkBAIC0xLDEyICsxLDcgQEAKIGNjX2xpYnJhcnkgewotCiAgICAgbmFtZTogImxpYnBhY2thZ2VsaXN0cGFyc2VyIiwKICAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCi0gICAgc3JjczogWyJwYWNrYWdlbGlzdHBhcnNlci5jIl0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAorICAgIHNyY3M6IFsicGFja2FnZWxpc3RwYXJzZXIuY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGlibG9nIl0sCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKQEAgLTE1LDMgKzEwLDEzIEBACiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImludGVnZXIiXSwKICAgICB9LAogfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibGlicGFja2FnZWxpc3RwYXJzZXJfdGVzdCIsCisgICAgc3JjczogWyJwYWNrYWdlbGlzdHBhcnNlcl90ZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYnBhY2thZ2VsaXN0cGFyc2VyIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorfQpkaWZmIC0tZ2l0IGEvbGlicGFja2FnZWxpc3RwYXJzZXIvaW5jbHVkZS9wYWNrYWdlbGlzdHBhcnNlci9wYWNrYWdlbGlzdHBhcnNlci5oIGIvbGlicGFja2FnZWxpc3RwYXJzZXIvaW5jbHVkZS9wYWNrYWdlbGlzdHBhcnNlci9wYWNrYWdlbGlzdHBhcnNlci5oCmluZGV4IDNjYjZiOWEuLmU4OWNiNTQgMTAwNjQ0Ci0tLSBhL2xpYnBhY2thZ2VsaXN0cGFyc2VyL2luY2x1ZGUvcGFja2FnZWxpc3RwYXJzZXIvcGFja2FnZWxpc3RwYXJzZXIuaAorKysgYi9saWJwYWNrYWdlbGlzdHBhcnNlci9pbmNsdWRlL3BhY2thZ2VsaXN0cGFyc2VyL3BhY2thZ2VsaXN0cGFyc2VyLmgKQEAgLTEsOTQgKzEsODEgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBXcml0dGVuIGJ5IFdpbGxpYW0gUm9iZXJ0cyA8d2lsbGlhbS5jLnJvYmVydHNAaW50ZWwuY29tPgotICoKLSAqIFRoaXMgaXMgYSBwYXJzZXIgbGlicmFyeSBmb3IgcGFyc2luZyB0aGUgcGFja2FnZXMubGlzdCBmaWxlIGdlbmVyYXRlZAotICogYnkgUGFja2FnZU1hbmFnZXIgc2VydmljZS4KLSAqCi0gKiBUaGlzIHNpbXBsZSBwYXJzZXIgaXMgc2Vuc2l0aXZlIHRvIGZvcm1hdCBjaGFuZ2VzIGluCi0gKiBmcmFtZXdvcmtzL2Jhc2Uvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9TZXR0aW5ncy5qYXZhCi0gKiBBIGRlcGVuZGVuY3kgbm90ZSBoYXMgYmVlbiBhZGRlZCB0byB0aGF0IGZpbGUgdG8gY29ycmVjdAotICogdGhpcyBwYXJzZXIuCiAgKi8KIAotI2lmbmRlZiBQQUNLQUdFTElTVFBBUlNFUl9IXwotI2RlZmluZSBQQUNLQUdFTElTVFBBUlNFUl9IXworI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKIF9fQkVHSU5fREVDTFMKIAotLyoqIFRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIHBhY2thZ2VzIG9uIHRoZSBzeXN0ZW0gKi8KLSNkZWZpbmUgUEFDS0FHRVNfTElTVF9GSUxFICAiL2RhdGEvc3lzdGVtL3BhY2thZ2VzLmxpc3QiCit0eXBlZGVmIHN0cnVjdCBnaWRfbGlzdCB7CisgIC8qKiBOdW1iZXIgb2YgZ2lkcy4gKi8KKyAgc2l6ZV90IGNudDsKIAotdHlwZWRlZiBzdHJ1Y3QgcGtnX2luZm8gcGtnX2luZm87Ci10eXBlZGVmIHN0cnVjdCBnaWRfbGlzdCBnaWRfbGlzdDsKKyAgLyoqIEFycmF5IG9mIGdpZHMuICovCisgIGdpZF90KiBnaWRzOworfSBnaWRfbGlzdDsKIAotc3RydWN0IGdpZF9saXN0IHsKLSAgICBzaXplX3QgY250OwotICAgIGdpZF90ICpnaWRzOwotfTsKK3R5cGVkZWYgc3RydWN0IHBrZ19pbmZvIHsKKyAgLyoqIFBhY2thZ2UgbmFtZSBsaWtlICJjb20uYW5kcm9pZC5ibGFoIi4gKi8KKyAgY2hhciogbmFtZTsKIAotc3RydWN0IHBrZ19pbmZvIHsKLSAgICBjaGFyICpuYW1lOwotICAgIHVpZF90IHVpZDsKLSAgICBib29sIGRlYnVnZ2FibGU7Ci0gICAgY2hhciAqZGF0YV9kaXI7Ci0gICAgY2hhciAqc2VpbmZvOwotICAgIGdpZF9saXN0IGdpZHM7Ci0gICAgdm9pZCAqcHJpdmF0ZV9kYXRhOwotICAgIGJvb2wgcHJvZmlsZWFibGVfZnJvbV9zaGVsbDsKLSAgICBsb25nIHZlcnNpb25fY29kZTsKLX07CisgIC8qKiBQYWNrYWdlIHVpZCBsaWtlIDEwMDE0LiAqLworICB1aWRfdCB1aWQ7CisKKyAgLyoqIFBhY2thZ2UncyBBbmRyb2lkTWFuaWZlc3QueG1sIGRlYnVnZ2FibGUgZmxhZy4gKi8KKyAgYm9vbCBkZWJ1Z2dhYmxlOworCisgIC8qKiBQYWNrYWdlIGRhdGEgZGlyZWN0b3J5IGxpa2UgIi9kYXRhL3VzZXIvMC9jb20uYW5kcm9pZC5ibGFoIiAqLworICBjaGFyKiBkYXRhX2RpcjsKKworICAvKiogUGFja2FnZSBTRUxpbnV4IGluZm8uICovCisgIGNoYXIqIHNlaW5mbzsKKworICAvKiogUGFja2FnZSdzIGxpc3Qgb2YgZ2lkcy4gKi8KKyAgZ2lkX2xpc3QgZ2lkczsKKworICAvKiogU3BhcmUgcG9pbnRlciBmb3IgdGhlIGNhbGxlciB0byBzdGFzaCBleHRyYSBkYXRhIG9mZi4gKi8KKyAgdm9pZCogcHJpdmF0ZV9kYXRhOworCisgIC8qKiBQYWNrYWdlJ3MgQW5kcm9pZE1hbmlmZXN0LnhtbCBwcm9maWxlYWJsZSBmbGFnLiAqLworICBib29sIHByb2ZpbGVhYmxlX2Zyb21fc2hlbGw7CisKKyAgLyoqIFBhY2thZ2UncyBBbmRyb2lkTWFuaWZlc3QueG1sIHZlcnNpb24gY29kZS4gKi8KKyAgbG9uZyB2ZXJzaW9uX2NvZGU7Cit9IHBrZ19pbmZvOwogCiAvKioKLSAqIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgcGFja2FnZWxpc3RfcGFyc2UoKSByb3V0aW5lLgotICogQHBhcmFtIGluZm8KLSAqICBUaGUgcGFyc2VkIHBhY2thZ2UgaW5mb3JtYXRpb24KLSAqIEBwYXJhbSB1c2VyZGF0YQotICogIFRoZSBzdXBwbGllZCB1c2VyZGF0YSBwb2ludGVyIHRvIHBhY2thZ2VsaXN0X3BhcnNlKCkKLSAqIEByZXR1cm4KLSAqICB0cnVlIHRvIGtlZXAgcHJvY2Vzc2luZywgZmFsc2UgdG8gc3RvcC4KKyAqIFBhcnNlcyB0aGUgc3lzdGVtJ3MgZGVmYXVsdCBwYWNrYWdlIGxpc3QuCisgKiBJbnZva2VzIGBjYWxsYmFja2Agb25jZSBmb3IgZWFjaCBwYWNrYWdlLgorICogVGhlIGNhbGxiYWNrIG93bnMgdGhlIGBwa2dfaW5mbypgIGFuZCBzaG91bGQgY2FsbCBwYWNrYWdlbGlzdF9mcmVlKCkuCisgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgZmFsc2VgIHRvIGV4aXQgZWFybHkgb3IgYHRydWVgIHRvIGNvbnRpbnVlLgogICovCi10eXBlZGVmIGJvb2wgKCpwZm5fb25fcGFja2FnZSkocGtnX2luZm8gKmluZm8sIHZvaWQgKnVzZXJkYXRhKTsKK2Jvb2wgcGFja2FnZWxpc3RfcGFyc2UoYm9vbCAoKmNhbGxiYWNrKShwa2dfaW5mbyogaW5mbywgdm9pZCogdXNlcl9kYXRhKSwgdm9pZCogdXNlcl9kYXRhKTsKIAogLyoqCi0gKiBQYXJzZXMgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IFBBQ0tBR0VTX0xJU1RfRklMRSBhbmQgaW52b2tlcyB0aGUgY2FsbGJhY2sgb24KLSAqIGVhY2ggZW50cnkgZm91bmQuIE9uY2UgdGhlIGNhbGxiYWNrIGlzIGludm9rZWQsIG93bmVyc2hpcCBvZiB0aGUgcGtnX2luZm8gcG9pbnRlcgotICogaXMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayByb3V0aW5lLCB0aHVzIHRoZXkgYXJlIHJlcXVpcmVkIHRvIHBlcmZvcm0gYW55IGNsZWFudXAKLSAqIGRlc2lyZWQuCi0gKiBAcGFyYW0gY2FsbGJhY2sKLSAqICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIG9uIGVhY2ggcGFyc2VkIGxpbmUgb2YgdGhlIHBhY2thZ2VzIGxpc3QuCi0gKiBAcGFyYW0gdXNlcmRhdGEKLSAqICBBbiBvcHRpb25hbCB1c2VyZGF0YSBzdXBwbGllZCBwb2ludGVyIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgotICogQHJldHVybgotICogIHRydWUgb24gc3VjY2VzcyBmYWxzZSBvbiBmYWlsdXJlLgorICogUGFyc2VzIHRoZSBnaXZlbiBwYWNrYWdlIGxpc3QuCisgKiBJbnZva2VzIGBjYWxsYmFja2Agb25jZSBmb3IgZWFjaCBwYWNrYWdlLgorICogVGhlIGNhbGxiYWNrIG93bnMgdGhlIGBwa2dfaW5mbypgIGFuZCBzaG91bGQgY2FsbCBwYWNrYWdlbGlzdF9mcmVlKCkuCisgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgZmFsc2VgIHRvIGV4aXQgZWFybHkgb3IgYHRydWVgIHRvIGNvbnRpbnVlLgogICovCi1leHRlcm4gYm9vbCBwYWNrYWdlbGlzdF9wYXJzZShwZm5fb25fcGFja2FnZSBjYWxsYmFjaywgdm9pZCAqdXNlcmRhdGEpOworYm9vbCBwYWNrYWdlbGlzdF9wYXJzZV9maWxlKGNvbnN0IGNoYXIqIHBhdGgsIGJvb2wgKCpjYWxsYmFjaykocGtnX2luZm8qIGluZm8sIHZvaWQqIHVzZXJfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcl9kYXRhKTsKIAotLyoqCi0gKiBGcmVlcyBhIHBrZ19pbmZvIHN0cnVjdHVyZS4KLSAqIEBwYXJhbSBpbmZvCi0gKiAgVGhlIHN0cnVjdCB0byBmcmVlCi0gKi8KLWV4dGVybiB2b2lkIHBhY2thZ2VsaXN0X2ZyZWUocGtnX2luZm8gKmluZm8pOworLyoqIEZyZWVzIHRoZSBnaXZlbiBgcGtnX2luZm9gLiAqLwordm9pZCBwYWNrYWdlbGlzdF9mcmVlKHBrZ19pbmZvKiBpbmZvKTsKIAogX19FTkRfREVDTFMKLQotI2VuZGlmIC8qIFBBQ0tBR0VMSVNUUEFSU0VSX0hfICovCmRpZmYgLS1naXQgYS9saWJwYWNrYWdlbGlzdHBhcnNlci9wYWNrYWdlbGlzdHBhcnNlci5jIGIvbGlicGFja2FnZWxpc3RwYXJzZXIvcGFja2FnZWxpc3RwYXJzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjNTMzYy4uMDAwMDAwMAotLS0gYS9saWJwYWNrYWdlbGlzdHBhcnNlci9wYWNrYWdlbGlzdHBhcnNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogV3JpdHRlbiBieSBXaWxsaWFtIFJvYmVydHMgPHdpbGxpYW0uYy5yb2JlcnRzQGludGVsLmNvbT4KLSAqCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJwYWNrYWdlbGlzdHBhcnNlciIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL2xpbWl0cy5oPgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHBhY2thZ2VsaXN0cGFyc2VyL3BhY2thZ2VsaXN0cGFyc2VyLmg+Ci0KLSNkZWZpbmUgQ0xPR0UoZm10LCAuLi4pIFwKLSAgICBkbyB7XAotICAgICAgICBJRl9BTE9HRSgpIHtcCi0gICAgICAgICAgICBBTE9HRShmbXQsICMjX19WQV9BUkdTX18pO1wKLSAgICAgICAgfVwKLSAgICB9IHdoaWxlKDApCi0KLXN0YXRpYyBzaXplX3QgZ2V0X2dpZF9jbnQoY29uc3QgY2hhciAqZ2lkcykKLXsKLSAgICBzaXplX3QgY250OwotCi0gICAgaWYgKCpnaWRzID09ICdcMCcpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjbXAoZ2lkcywgIm5vbmUiKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmb3IgKGNudCA9IDE7IGdpZHNbY250XTsgZ2lkc1tjbnRdID09ICcsJyA/IGNudCsrIDogKmdpZHMrKykKLSAgICAgICAgOwotCi0gICAgcmV0dXJuIGNudDsKLX0KLQotc3RhdGljIGJvb2wgcGFyc2VfZ2lkcyhjaGFyICpnaWRzLCBnaWRfdCAqZ2lkX2xpc3QsIHNpemVfdCAqY250KQotewotICAgIGdpZF90IGdpZDsKLSAgICBjaGFyKiB0b2tlbjsKLSAgICBjaGFyICplbmRwdHI7Ci0gICAgc2l6ZV90IGNtcCA9IDA7Ci0KLSAgICB3aGlsZSAoKHRva2VuID0gc3Ryc2VwKCZnaWRzLCAiLFxyXG4iKSkpIHsKLQotICAgICAgICBpZiAoY21wID4gKmNudCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2lkID0gc3RydG91bCh0b2tlbiwgJmVuZHB0ciwgMTApOwotICAgICAgICBpZiAoKmVuZHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBpZiB1bnNpZ25lZCBsb25nIGlzIGdyZWF0ZXIgdGhhbiBzaXplIG9mIGdpZF90LAotICAgICAgICAgKiBwcmV2ZW50IGEgdHJ1bmNhdGlvbiBiYXNlZCByb2xsLW92ZXIKLSAgICAgICAgICovCi0gICAgICAgIGlmIChnaWQgPiBHSURfTUFYKSB7Ci0gICAgICAgICAgICBDTE9HRSgiQSBnaWQgaW4gZmllbGQgXCJnaWQgbGlzdFwiIGdyZWF0ZXIgdGhhbiBHSURfTUFYIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBnaWRfbGlzdFtjbXArK10gPSBnaWQ7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1leHRlcm4gYm9vbCBwYWNrYWdlbGlzdF9wYXJzZShwZm5fb25fcGFja2FnZSBjYWxsYmFjaywgdm9pZCAqdXNlcmRhdGEpCi17Ci0KLSAgICBGSUxFICpmcDsKLSAgICBjaGFyICpjdXI7Ci0gICAgY2hhciAqbmV4dDsKLSAgICBjaGFyICplbmRwdHI7Ci0gICAgdW5zaWduZWQgbG9uZyB0bXA7Ci0gICAgc3NpemVfdCBieXRlc3JlYWQ7Ci0KLSAgICBib29sIHJjID0gZmFsc2U7Ci0gICAgY2hhciAqYnVmID0gTlVMTDsKLSAgICBzaXplX3QgYnVmbGVuID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIGxpbmVubyA9IDE7Ci0gICAgY29uc3QgY2hhciAqZXJybXNnID0gTlVMTDsKLSAgICBzdHJ1Y3QgcGtnX2luZm8gKnBrZ19pbmZvID0gTlVMTDsKLQotICAgIGZwID0gZm9wZW4oUEFDS0FHRVNfTElTVF9GSUxFLCAicmUiKTsKLSAgICBpZiAoIWZwKSB7Ci0gICAgICAgIENMT0dFKCJDb3VsZCBub3Qgb3BlbjogXCIlc1wiLCBlcnJvcjogXCIlc1wiXG4iLCBQQUNLQUdFU19MSVNUX0ZJTEUsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdoaWxlICgoYnl0ZXNyZWFkID0gZ2V0bGluZSgmYnVmLCAmYnVmbGVuLCBmcCkpID4gMCkgewotCi0gICAgICAgIHBrZ19pbmZvID0gY2FsbG9jKDEsIHNpemVvZigqcGtnX2luZm8pKTsKLSAgICAgICAgaWYgKCFwa2dfaW5mbykgewotICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXh0ID0gYnVmOwotCi0gICAgICAgIGN1ciA9IHN0cnNlcCgmbmV4dCwgIiBcdFxyXG4iKTsKLSAgICAgICAgaWYgKCFjdXIpIHsKLSAgICAgICAgICAgIGVycm1zZyA9ICJDb3VsZCBub3QgZ2V0IG5leHQgdG9rZW4gZm9yIFwicGFja2FnZSBuYW1lXCIiOwotICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwa2dfaW5mby0+bmFtZSA9IHN0cmR1cChjdXIpOwotICAgICAgICBpZiAoIXBrZ19pbmZvLT5uYW1lKSB7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGN1ciA9IHN0cnNlcCgmbmV4dCwgIiBcdFxyXG4iKTsKLSAgICAgICAgaWYgKCFjdXIpIHsKLSAgICAgICAgICAgIGVycm1zZyA9ICJDb3VsZCBub3QgZ2V0IG5leHQgdG9rZW4gZm9yIGZpZWxkIFwidWlkXCIiOwotICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICB0bXAgPSBzdHJ0b3VsKGN1ciwgJmVuZHB0ciwgMTApOwotICAgICAgICBpZiAoKmVuZHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgICBlcnJtc2cgPSAiQ291bGQgbm90IGNvbnZlcnQgZmllbGQgXCJ1aWRcIiB0byBpbnRlZ2VyIHZhbHVlIjsKLSAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogaWYgdW5zaWduZWQgbG9uZyBpcyBncmVhdGVyIHRoYW4gc2l6ZSBvZiB1aWRfdCwKLSAgICAgICAgICogcHJldmVudCBhIHRydW5jYXRpb24gYmFzZWQgcm9sbC1vdmVyCi0gICAgICAgICAqLwotICAgICAgICBpZiAodG1wID4gVUlEX01BWCkgewotICAgICAgICAgICAgZXJybXNnID0gIkZpZWxkIFwidWlkXCIgZ3JlYXRlciB0aGFuIFVJRF9NQVgiOwotICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwa2dfaW5mby0+dWlkID0gKHVpZF90KSB0bXA7Ci0KLSAgICAgICAgY3VyID0gc3Ryc2VwKCZuZXh0LCAiIFx0XHJcbiIpOwotICAgICAgICBpZiAoIWN1cikgewotICAgICAgICAgICAgZXJybXNnID0gIkNvdWxkIG5vdCBnZXQgbmV4dCB0b2tlbiBmb3IgZmllbGQgXCJkZWJ1Z2dhYmxlXCIiOwotICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICB0bXAgPSBzdHJ0b3VsKGN1ciwgJmVuZHB0ciwgMTApOwotICAgICAgICBpZiAoKmVuZHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgICBlcnJtc2cgPSAiQ291bGQgbm90IGNvbnZlcnQgZmllbGQgXCJkZWJ1Z2dhYmxlXCIgdG8gaW50ZWdlciB2YWx1ZSI7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNob3VsZCBiZSBhIHZhbGlkIGJvb2xlYW4gb2YgMSBvciAwICovCi0gICAgICAgIGlmICghKHRtcCA9PSAwIHx8IHRtcCA9PSAxKSkgewotICAgICAgICAgICAgZXJybXNnID0gIkZpZWxkIFwiZGVidWdnYWJsZVwiIGlzIG5vdCAwIG9yIDEgYm9vbGVhbiB2YWx1ZSI7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBrZ19pbmZvLT5kZWJ1Z2dhYmxlID0gKGJvb2wpIHRtcDsKLQotICAgICAgICBjdXIgPSBzdHJzZXAoJm5leHQsICIgXHRcclxuIik7Ci0gICAgICAgIGlmICghY3VyKSB7Ci0gICAgICAgICAgICBlcnJtc2cgPSAiQ291bGQgbm90IGdldCBuZXh0IHRva2VuIGZvciBmaWVsZCBcImRhdGEgZGlyXCIiOwotICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwa2dfaW5mby0+ZGF0YV9kaXIgPSBzdHJkdXAoY3VyKTsKLSAgICAgICAgaWYgKCFwa2dfaW5mby0+ZGF0YV9kaXIpIHsKLSAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgY3VyID0gc3Ryc2VwKCZuZXh0LCAiIFx0XHJcbiIpOwotICAgICAgICBpZiAoIWN1cikgewotICAgICAgICAgICAgZXJybXNnID0gIkNvdWxkIG5vdCBnZXQgbmV4dCB0b2tlbiBmb3IgZmllbGQgXCJzZWluZm9cIiI7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBrZ19pbmZvLT5zZWluZm8gPSBzdHJkdXAoY3VyKTsKLSAgICAgICAgaWYgKCFwa2dfaW5mby0+c2VpbmZvKSB7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGN1ciA9IHN0cnNlcCgmbmV4dCwgIiBcdFxyXG4iKTsKLSAgICAgICAgaWYgKCFjdXIpIHsKLSAgICAgICAgICAgIGVycm1zZyA9ICJDb3VsZCBub3QgZ2V0IG5leHQgdG9rZW4gZm9yIGZpZWxkIFwiZ2lkKHMpXCIiOwotICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBQYXJzZSB0aGUgZ2lkIGxpc3QsIGNvdWxkIGJlIGluIHRoZSBmb3JtIG9mIG5vbmUsIHNpbmdsZSBnaWQgb3IgbGlzdDoKLSAgICAgICAgICogbm9uZQotICAgICAgICAgKiBnaWQKLSAgICAgICAgICogZ2lkLCBnaWQgLi4uCi0gICAgICAgICAqLwotICAgICAgICBwa2dfaW5mby0+Z2lkcy5jbnQgPSBnZXRfZ2lkX2NudChjdXIpOwotICAgICAgICBpZiAocGtnX2luZm8tPmdpZHMuY250ID4gMCkgewotCi0gICAgICAgICAgICBwa2dfaW5mby0+Z2lkcy5naWRzID0gY2FsbG9jKHBrZ19pbmZvLT5naWRzLmNudCwgc2l6ZW9mKGdpZF90KSk7Ci0gICAgICAgICAgICBpZiAoIXBrZ19pbmZvLT5naWRzLmdpZHMpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmMgPSBwYXJzZV9naWRzKGN1ciwgcGtnX2luZm8tPmdpZHMuZ2lkcywgJnBrZ19pbmZvLT5naWRzLmNudCk7Ci0gICAgICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICAgICAgZXJybXNnID0gIkNvdWxkIG5vdCBwYXJzZSBmaWVsZCBcImdpZCBsaXN0XCIiOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY3VyID0gc3Ryc2VwKCZuZXh0LCAiIFx0XHJcbiIpOwotICAgICAgICBpZiAoY3VyKSB7Ci0gICAgICAgICAgICB0bXAgPSBzdHJ0b3VsKGN1ciwgJmVuZHB0ciwgMTApOwotICAgICAgICAgICAgaWYgKCplbmRwdHIgIT0gJ1wwJykgewotICAgICAgICAgICAgICAgIGVycm1zZyA9ICJDb3VsZCBub3QgY29udmVydCBmaWVsZCBcInByb2ZpbGVhYmxlX2Zyb21fc2hlbGxcIiB0byBpbnRlZ2VyIHZhbHVlIjsKLSAgICAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogc2hvdWxkIGJlIGEgdmFsaWQgYm9vbGVhbiBvZiAxIG9yIDAgKi8KLSAgICAgICAgICAgIGlmICghKHRtcCA9PSAwIHx8IHRtcCA9PSAxKSkgewotICAgICAgICAgICAgICAgIGVycm1zZyA9ICJGaWVsZCBcInByb2ZpbGVhYmxlX2Zyb21fc2hlbGxcIiBpcyBub3QgMCBvciAxIGJvb2xlYW4gdmFsdWUiOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwa2dfaW5mby0+cHJvZmlsZWFibGVfZnJvbV9zaGVsbCA9IChib29sKXRtcDsKLSAgICAgICAgfQotICAgICAgICBjdXIgPSBzdHJzZXAoJm5leHQsICIgXHRcclxuIik7Ci0gICAgICAgIGlmIChjdXIpIHsKLSAgICAgICAgICAgIHRtcCA9IHN0cnRvdWwoY3VyLCAmZW5kcHRyLCAxMCk7Ci0gICAgICAgICAgICBpZiAoKmVuZHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgICAgICAgZXJybXNnID0gIkNvdWxkIG5vdCBjb252ZXJ0IGZpZWxkIFwidmVyc2lvbkNvZGVcIiB0byBpbnRlZ2VyIHZhbHVlIjsKLSAgICAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBrZ19pbmZvLT52ZXJzaW9uX2NvZGUgPSB0bXA7Ci0gICAgICAgIH0KLQotICAgICAgICByYyA9IGNhbGxiYWNrKHBrZ19pbmZvLCB1c2VyZGF0YSk7Ci0gICAgICAgIGlmIChyYyA9PSBmYWxzZSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFdlIGRvIG5vdCBsb2cgdGhpcyBhcyB0aGlzIGNhbiBiZSBpbnRlbnRpb25hbCBmcm9tCi0gICAgICAgICAgICAgKiBjYWxsYmFjayB0byBhYm9ydCBwcm9jZXNzaW5nLiBXZSBnbyB0byBvdXQgdG8gbm90Ci0gICAgICAgICAgICAgKiBmcmVlIHRoZSBwa2dfaW5mbwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByYyA9IHRydWU7Ci0gICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgfQotICAgICAgICBsaW5lbm8rKzsKLSAgICB9Ci0KLSAgICByYyA9IHRydWU7Ci0KLW91dDoKLSAgICBmcmVlKGJ1Zik7Ci0gICAgZmNsb3NlKGZwKTsKLSAgICByZXR1cm4gcmM7Ci0KLWVycjoKLSAgICBpZiAoZXJybXNnKSB7Ci0gICAgICAgIENMT0dFKCJFcnJvciBQYXJzaW5nIFwiJXNcIiBvbiBsaW5lOiAlbHUgZm9yIHJlYXNvbjogJXMiLAotICAgICAgICAgICAgICAgIFBBQ0tBR0VTX0xJU1RfRklMRSwgbGluZW5vLCBlcnJtc2cpOwotICAgIH0KLSAgICByYyA9IGZhbHNlOwotICAgIHBhY2thZ2VsaXN0X2ZyZWUocGtnX2luZm8pOwotICAgIGdvdG8gb3V0OwotfQotCi12b2lkIHBhY2thZ2VsaXN0X2ZyZWUocGtnX2luZm8gKmluZm8pCi17Ci0gICAgaWYgKGluZm8pIHsKLSAgICAgICAgZnJlZShpbmZvLT5uYW1lKTsKLSAgICAgICAgZnJlZShpbmZvLT5kYXRhX2Rpcik7Ci0gICAgICAgIGZyZWUoaW5mby0+c2VpbmZvKTsKLSAgICAgICAgZnJlZShpbmZvLT5naWRzLmdpZHMpOwotICAgICAgICBmcmVlKGluZm8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYnBhY2thZ2VsaXN0cGFyc2VyL3BhY2thZ2VsaXN0cGFyc2VyLmNwcCBiL2xpYnBhY2thZ2VsaXN0cGFyc2VyL3BhY2thZ2VsaXN0cGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWMzYTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGFja2FnZWxpc3RwYXJzZXIvcGFja2FnZWxpc3RwYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJwYWNrYWdlbGlzdHBhcnNlciIKKworI2luY2x1ZGUgPHBhY2thZ2VsaXN0cGFyc2VyL3BhY2thZ2VsaXN0cGFyc2VyLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvbGltaXRzLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKK3N0YXRpYyBib29sIHBhcnNlX2dpZHMoY29uc3QgY2hhciogcGF0aCwgc2l6ZV90IGxpbmVfbnVtYmVyLCBjb25zdCBjaGFyKiBnaWRzLCBwa2dfaW5mbyogaW5mbykgeworICAvLyBOb3RoaW5nIHRvIGRvPworICBpZiAoIWdpZHMgfHwgIXN0cmNtcChnaWRzLCAibm9uZSIpKSByZXR1cm4gdHJ1ZTsKKworICAvLyBIb3cgbXVjaCBzcGFjZSBkbyB3ZSBuZWVkPworICBpbmZvLT5naWRzLmNudCA9IDE7CisgIGZvciAoY29uc3QgY2hhciogcCA9IGdpZHM7ICpwOyArK3ApIHsKKyAgICBpZiAoKnAgPT0gJywnKSArK2luZm8tPmdpZHMuY250OworICB9CisKKyAgLy8gQWxsb2NhdGUgdGhlIHNwYWNlLgorICBpbmZvLT5naWRzLmdpZHMgPSBuZXcgZ2lkX3RbaW5mby0+Z2lkcy5jbnRdOworICBpZiAoIWluZm8tPmdpZHMuZ2lkcykgcmV0dXJuIGZhbHNlOworCisgIC8vIEFuZCBwYXJzZSB0aGUgaW5kaXZpZHVhbCBnaWRzLgorICBzaXplX3QgaSA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgY2hhciogZW5kOworICAgIHVuc2lnbmVkIGxvbmcgZ2lkID0gc3RydG91bChnaWRzLCAmZW5kLCAxMCk7CisgICAgaWYgKGdpZCA+IEdJRF9NQVgpIHsKKyAgICAgIEFMT0dFKCIlczolenU6IGdpZCAlbHUgPiBHSURfTUFYIiwgcGF0aCwgbGluZV9udW1iZXIsIGdpZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGkgPj0gaW5mby0+Z2lkcy5jbnQpIHJldHVybiBmYWxzZTsKKyAgICBpbmZvLT5naWRzLmdpZHNbaSsrXSA9IGdpZDsKKworICAgIGlmICgqZW5kID09ICdcMCcpIHJldHVybiB0cnVlOworICAgIGlmICgqZW5kICE9ICcsJykgcmV0dXJuIGZhbHNlOworICAgIGdpZHMgPSBlbmQgKyAxOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBwYXJzZV9saW5lKGNvbnN0IGNoYXIqIHBhdGgsIHNpemVfdCBsaW5lX251bWJlciwgY29uc3QgY2hhciogbGluZSwgcGtnX2luZm8qIGluZm8pIHsKKyAgdW5zaWduZWQgbG9uZyB1aWQ7CisgIGludCBkZWJ1Z2dhYmxlOworICBjaGFyKiBnaWRfbGlzdDsKKyAgaW50IHByb2ZpbGVhYmxlX2Zyb21fc2hlbGwgPSAwOworCisgIGludCBmaWVsZHMgPQorICAgICAgc3NjYW5mKGxpbmUsICIlbXMgJWx1ICVkICVtcyAlbXMgJW1zICVkICVsZCIsICZpbmZvLT5uYW1lLCAmdWlkLCAmZGVidWdnYWJsZSwgJmluZm8tPmRhdGFfZGlyLAorICAgICAgICAgICAgICZpbmZvLT5zZWluZm8sICZnaWRfbGlzdCwgJnByb2ZpbGVhYmxlX2Zyb21fc2hlbGwsICZpbmZvLT52ZXJzaW9uX2NvZGUpOworCisgIC8vIEhhbmRsZSB0aGUgbW9yZSBjb21wbGljYXRlZCBnaWRzIGZpZWxkIGFuZCBmcmVlIHRoZSB0ZW1wb3Jhcnkgc3RyaW5nLgorICBib29sIGdpZHNfb2theSA9IHBhcnNlX2dpZHMocGF0aCwgbGluZV9udW1iZXIsIGdpZF9saXN0LCBpbmZvKTsKKyAgZnJlZShnaWRfbGlzdCk7CisgIGlmICghZ2lkc19va2F5KSByZXR1cm4gZmFsc2U7CisKKyAgLy8gRGlkIHdlIHNlZSBlbm91Z2ggZmllbGRzIHRvIGJlIGdldHRpbmcgb24gd2l0aD8KKyAgLy8gVGhlIGZpbmFsIGZpZWxkcyBhcmUgb3B0aW9uYWwgKGFuZCBub3QgdXN1YWxseSBwcmVzZW50KS4KKyAgaWYgKGZpZWxkcyA8IDYpIHsKKyAgICBBTE9HRSgiJXM6JXp1OiB0b28gZmV3IGZpZWxkcyBpbiBsaW5lIiwgcGF0aCwgbGluZV9udW1iZXIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEV4dHJhIHZhbGlkYXRpb24uCisgIGlmICh1aWQgPiBVSURfTUFYKSB7CisgICAgQUxPR0UoIiVzOiV6dTogdWlkICVsdSA+IFVJRF9NQVgiLCBwYXRoLCBsaW5lX251bWJlciwgdWlkKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW5mby0+dWlkID0gdWlkOworCisgIC8vIEludGVnZXIgdG8gYm9vbCBjb252ZXJzaW9ucy4KKyAgaW5mby0+ZGVidWdnYWJsZSA9IGRlYnVnZ2FibGU7CisgIGluZm8tPnByb2ZpbGVhYmxlX2Zyb21fc2hlbGwgPSBwcm9maWxlYWJsZV9mcm9tX3NoZWxsOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIHBhY2thZ2VsaXN0X3BhcnNlX2ZpbGUoY29uc3QgY2hhciogcGF0aCwgYm9vbCAoKmNhbGxiYWNrKShwa2dfaW5mbyosIHZvaWQqKSwgdm9pZCogdXNlcl9kYXRhKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gZnAoZm9wZW4ocGF0aCwgInJlIiksICZmY2xvc2UpOworICBpZiAoIWZwKSB7CisgICAgQUxPR0UoImNvdWxkbid0IG9wZW4gJyVzJzogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNpemVfdCBsaW5lX251bWJlciA9IDA7CisgIGNoYXIqIGxpbmUgPSBudWxscHRyOworICBzaXplX3QgYWxsb2NhdGVkX2xlbmd0aCA9IDA7CisgIHdoaWxlIChnZXRsaW5lKCZsaW5lLCAmYWxsb2NhdGVkX2xlbmd0aCwgZnAuZ2V0KCkpID4gMCkgeworICAgICsrbGluZV9udW1iZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPHBrZ19pbmZvLCBkZWNsdHlwZSgmcGFja2FnZWxpc3RfZnJlZSk+IGluZm8oCisgICAgICAgIHN0YXRpY19jYXN0PHBrZ19pbmZvKj4oY2FsbG9jKDEsIHNpemVvZihwa2dfaW5mbykpKSwgJnBhY2thZ2VsaXN0X2ZyZWUpOworICAgIGlmICghaW5mbykgeworICAgICAgQUxPR0UoIiVzOiV6dTogY291bGRuJ3QgYWxsb2NhdGUgcGtnX2luZm8iLCBwYXRoLCBsaW5lX251bWJlcik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFwYXJzZV9saW5lKHBhdGgsIGxpbmVfbnVtYmVyLCBsaW5lLCBpbmZvLmdldCgpKSkgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFjYWxsYmFjayhpbmZvLnJlbGVhc2UoKSwgdXNlcl9kYXRhKSkgYnJlYWs7CisgIH0KKyAgZnJlZShsaW5lKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcGFja2FnZWxpc3RfcGFyc2UoYm9vbCAoKmNhbGxiYWNrKShwa2dfaW5mbyosIHZvaWQqKSwgdm9pZCogdXNlcl9kYXRhKSB7CisgIHJldHVybiBwYWNrYWdlbGlzdF9wYXJzZV9maWxlKCIvZGF0YS9zeXN0ZW0vcGFja2FnZXMubGlzdCIsIGNhbGxiYWNrLCB1c2VyX2RhdGEpOworfQorCit2b2lkIHBhY2thZ2VsaXN0X2ZyZWUocGtnX2luZm8qIGluZm8pIHsKKyAgaWYgKCFpbmZvKSByZXR1cm47CisKKyAgZnJlZShpbmZvLT5uYW1lKTsKKyAgZnJlZShpbmZvLT5kYXRhX2Rpcik7CisgIGZyZWUoaW5mby0+c2VpbmZvKTsKKyAgZGVsZXRlW10gaW5mby0+Z2lkcy5naWRzOworICBmcmVlKGluZm8pOworfQpkaWZmIC0tZ2l0IGEvbGlicGFja2FnZWxpc3RwYXJzZXIvcGFja2FnZWxpc3RwYXJzZXJfdGVzdC5jcHAgYi9saWJwYWNrYWdlbGlzdHBhcnNlci9wYWNrYWdlbGlzdHBhcnNlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNiODg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGFja2FnZWxpc3RwYXJzZXIvcGFja2FnZWxpc3RwYXJzZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8cGFja2FnZWxpc3RwYXJzZXIvcGFja2FnZWxpc3RwYXJzZXIuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCitURVNUKHBhY2thZ2VsaXN0cGFyc2VyLCBzbW9rZSkgeworICBUZW1wb3JhcnlGaWxlIHRmOworICBhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZSgKKyAgICAgIC8vIE5vIGdpZHMuCisgICAgICAiY29tLnRlc3QuYTAgMTAwMTQgMCAvZGF0YS91c2VyLzAvY29tLnRlc3QuYTAgcGxhdGZvcm06cHJpdmFwcDp0YXJnZXRTZGtWZXJzaW9uPTE5IG5vbmVcbiIKKyAgICAgIC8vIE9uZSBnaWQuCisgICAgICAiY29tLnRlc3QuYTEgMTAwMDcgMSAvZGF0YS91c2VyLzAvY29tLnRlc3QuYTEgcGxhdGZvcm06cHJpdmFwcDp0YXJnZXRTZGtWZXJzaW9uPTIxIDEwMjNcbiIKKyAgICAgIC8vIE11bHRpcGxlIGdpZHMuCisgICAgICAiY29tLnRlc3QuYTIgMTAwMTEgMCAvZGF0YS91c2VyLzAvY29tLnRlc3QuYTIgbWVkaWE6cHJpdmFwcDp0YXJnZXRTZGtWZXJzaW9uPTMwICIKKyAgICAgICIyMDAxLDEwNjUsMTAyMywzMDAzLDMwMDcsMTAyNFxuIgorICAgICAgLy8gVGhlIHR3byBuZXcgZmllbGRzIChwcm9maWxlYWJsZSBmbGFnIGFuZCB2ZXJzaW9uIGNvZGUpLgorICAgICAgImNvbS50ZXN0LmEzIDEwMDIyIDAgL2RhdGEvdXNlci8wL2NvbS50ZXN0LmEzIHNlbGFiZWw6YmxhaCBub25lIDEgMTIzXG4iLAorICAgICAgdGYucGF0aCk7CisKKyAgc3RkOjp2ZWN0b3I8cGtnX2luZm8qPiBwYWNrYWdlczsKKyAgcGFja2FnZWxpc3RfcGFyc2VfZmlsZSgKKyAgICAgIHRmLnBhdGgsCisgICAgICBbXShwa2dfaW5mbyogaW5mbywgdm9pZCogdXNlcl9kYXRhKSAtPiBib29sIHsKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnZlY3Rvcjxwa2dfaW5mbyo+Kj4odXNlcl9kYXRhKS0+cHVzaF9iYWNrKGluZm8pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0sCisgICAgICAmcGFja2FnZXMpOworCisgIEFTU0VSVF9FUSg0VSwgcGFja2FnZXMuc2l6ZSgpKTsKKworICBBU1NFUlRfU1RSRVEoImNvbS50ZXN0LmEwIiwgcGFja2FnZXNbMF0tPm5hbWUpOworICBBU1NFUlRfRVEoMTAwMTQsIHBhY2thZ2VzWzBdLT51aWQpOworICBBU1NFUlRfRkFMU0UocGFja2FnZXNbMF0tPmRlYnVnZ2FibGUpOworICBBU1NFUlRfU1RSRVEoIi9kYXRhL3VzZXIvMC9jb20udGVzdC5hMCIsIHBhY2thZ2VzWzBdLT5kYXRhX2Rpcik7CisgIEFTU0VSVF9TVFJFUSgicGxhdGZvcm06cHJpdmFwcDp0YXJnZXRTZGtWZXJzaW9uPTE5IiwgcGFja2FnZXNbMF0tPnNlaW5mbyk7CisgIEFTU0VSVF9FUSgwVSwgcGFja2FnZXNbMF0tPmdpZHMuY250KTsKKyAgQVNTRVJUX0ZBTFNFKHBhY2thZ2VzWzBdLT5wcm9maWxlYWJsZV9mcm9tX3NoZWxsKTsKKyAgQVNTRVJUX0VRKDAsIHBhY2thZ2VzWzBdLT52ZXJzaW9uX2NvZGUpOworCisgIEFTU0VSVF9TVFJFUSgiY29tLnRlc3QuYTEiLCBwYWNrYWdlc1sxXS0+bmFtZSk7CisgIEFTU0VSVF9FUSgxMDAwNywgcGFja2FnZXNbMV0tPnVpZCk7CisgIEFTU0VSVF9UUlVFKHBhY2thZ2VzWzFdLT5kZWJ1Z2dhYmxlKTsKKyAgQVNTRVJUX1NUUkVRKCIvZGF0YS91c2VyLzAvY29tLnRlc3QuYTEiLCBwYWNrYWdlc1sxXS0+ZGF0YV9kaXIpOworICBBU1NFUlRfU1RSRVEoInBsYXRmb3JtOnByaXZhcHA6dGFyZ2V0U2RrVmVyc2lvbj0yMSIsIHBhY2thZ2VzWzFdLT5zZWluZm8pOworICBBU1NFUlRfRVEoMVUsIHBhY2thZ2VzWzFdLT5naWRzLmNudCk7CisgIEFTU0VSVF9FUSgxMDIzVSwgcGFja2FnZXNbMV0tPmdpZHMuZ2lkc1swXSk7CisgIEFTU0VSVF9GQUxTRShwYWNrYWdlc1swXS0+cHJvZmlsZWFibGVfZnJvbV9zaGVsbCk7CisgIEFTU0VSVF9FUSgwLCBwYWNrYWdlc1swXS0+dmVyc2lvbl9jb2RlKTsKKworICBBU1NFUlRfU1RSRVEoImNvbS50ZXN0LmEyIiwgcGFja2FnZXNbMl0tPm5hbWUpOworICBBU1NFUlRfRVEoMTAwMTEsIHBhY2thZ2VzWzJdLT51aWQpOworICBBU1NFUlRfRkFMU0UocGFja2FnZXNbMl0tPmRlYnVnZ2FibGUpOworICBBU1NFUlRfU1RSRVEoIi9kYXRhL3VzZXIvMC9jb20udGVzdC5hMiIsIHBhY2thZ2VzWzJdLT5kYXRhX2Rpcik7CisgIEFTU0VSVF9TVFJFUSgibWVkaWE6cHJpdmFwcDp0YXJnZXRTZGtWZXJzaW9uPTMwIiwgcGFja2FnZXNbMl0tPnNlaW5mbyk7CisgIEFTU0VSVF9FUSg2VSwgcGFja2FnZXNbMl0tPmdpZHMuY250KTsKKyAgQVNTRVJUX0VRKDIwMDFVLCBwYWNrYWdlc1syXS0+Z2lkcy5naWRzWzBdKTsKKyAgQVNTRVJUX0VRKDEwMjRVLCBwYWNrYWdlc1syXS0+Z2lkcy5naWRzWzVdKTsKKyAgQVNTRVJUX0ZBTFNFKHBhY2thZ2VzWzBdLT5wcm9maWxlYWJsZV9mcm9tX3NoZWxsKTsKKyAgQVNTRVJUX0VRKDAsIHBhY2thZ2VzWzBdLT52ZXJzaW9uX2NvZGUpOworCisgIEFTU0VSVF9TVFJFUSgiY29tLnRlc3QuYTMiLCBwYWNrYWdlc1szXS0+bmFtZSk7CisgIEFTU0VSVF9FUSgxMDAyMiwgcGFja2FnZXNbM10tPnVpZCk7CisgIEFTU0VSVF9GQUxTRShwYWNrYWdlc1szXS0+ZGVidWdnYWJsZSk7CisgIEFTU0VSVF9TVFJFUSgiL2RhdGEvdXNlci8wL2NvbS50ZXN0LmEzIiwgcGFja2FnZXNbM10tPmRhdGFfZGlyKTsKKyAgQVNTRVJUX1NUUkVRKCJzZWxhYmVsOmJsYWgiLCBwYWNrYWdlc1szXS0+c2VpbmZvKTsKKyAgQVNTRVJUX0VRKDBVLCBwYWNrYWdlc1szXS0+Z2lkcy5jbnQpOworICBBU1NFUlRfVFJVRShwYWNrYWdlc1szXS0+cHJvZmlsZWFibGVfZnJvbV9zaGVsbCk7CisgIEFTU0VSVF9FUSgxMjMsIHBhY2thZ2VzWzNdLT52ZXJzaW9uX2NvZGUpOworCisgIGZvciAoYXV0byYgcGFja2FnZSA6IHBhY2thZ2VzKSBwYWNrYWdlbGlzdF9mcmVlKHBhY2thZ2UpOworfQorCitURVNUKHBhY2thZ2VsaXN0cGFyc2VyLCBlYXJseV9leGl0KSB7CisgIFRlbXBvcmFyeUZpbGUgdGY7CisgIGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKAorICAgICAgImNvbS50ZXN0LmEwIDEgMCAvIGEgbm9uZVxuIgorICAgICAgImNvbS50ZXN0LmExIDEgMCAvIGEgbm9uZVxuIgorICAgICAgImNvbS50ZXN0LmEyIDEgMCAvIGEgbm9uZVxuIiwKKyAgICAgIHRmLnBhdGgpOworCisgIHN0ZDo6dmVjdG9yPHBrZ19pbmZvKj4gcGFja2FnZXM7CisgIHBhY2thZ2VsaXN0X3BhcnNlX2ZpbGUoCisgICAgICB0Zi5wYXRoLAorICAgICAgW10ocGtnX2luZm8qIGluZm8sIHZvaWQqIHVzZXJfZGF0YSkgLT4gYm9vbCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHBrZ19pbmZvKj4qIHAgPSByZWludGVycHJldF9jYXN0PHN0ZDo6dmVjdG9yPHBrZ19pbmZvKj4qPih1c2VyX2RhdGEpOworICAgICAgICBwLT5wdXNoX2JhY2soaW5mbyk7CisgICAgICAgIHJldHVybiBwLT5zaXplKCkgPCAyOworICAgICAgfSwKKyAgICAgICZwYWNrYWdlcyk7CisKKyAgQVNTRVJUX0VRKDJVLCBwYWNrYWdlcy5zaXplKCkpOworCisgIEFTU0VSVF9TVFJFUSgiY29tLnRlc3QuYTAiLCBwYWNrYWdlc1swXS0+bmFtZSk7CisgIEFTU0VSVF9TVFJFUSgiY29tLnRlc3QuYTEiLCBwYWNrYWdlc1sxXS0+bmFtZSk7CisKKyAgZm9yIChhdXRvJiBwYWNrYWdlIDogcGFja2FnZXMpIHBhY2thZ2VsaXN0X2ZyZWUocGFja2FnZSk7Cit9CisKK1RFU1QocGFja2FnZWxpc3RwYXJzZXIsIHN5c3RlbV9wYWNrYWdlX2xpc3QpIHsKKyAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gYWN0dWFsbHkgcmVhZCB0aGUgcGFja2FnZXMubGlzdCBpbnN0YWxsZWQgb24gdGhlIGRldmljZS4KKyAgc3RkOjp2ZWN0b3I8cGtnX2luZm8qPiBwYWNrYWdlczsKKyAgcGFja2FnZWxpc3RfcGFyc2UoCisgICAgICBbXShwa2dfaW5mbyogaW5mbywgdm9pZCogdXNlcl9kYXRhKSAtPiBib29sIHsKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnZlY3Rvcjxwa2dfaW5mbyo+Kj4odXNlcl9kYXRhKS0+cHVzaF9iYWNrKGluZm8pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0sCisgICAgICAmcGFja2FnZXMpOworICAvLyBOb3QgbXVjaCB3ZSBjYW4gc2F5IGZvciBzdXJlIGFib3V0IHdoYXQgd2UgZXhwZWN0LCBvdGhlciB0aGFuIHRoYXQgdGhlcmUKKyAgLy8gYXJlIGxpa2VseSB0byBiZSBsb3RzIG9mIHBhY2thZ2VzLi4uCisgIEFTU0VSVF9HVChwYWNrYWdlcy5zaXplKCksIDEwVSk7Cit9CisKK1RFU1QocGFja2FnZWxpc3RwYXJzZXIsIHBhY2thZ2VsaXN0X2ZyZWVfbnVsbHB0cikgeworICBwYWNrYWdlbGlzdF9mcmVlKG51bGxwdHIpOworfQpkaWZmIC0tZ2l0IGEvbGlic3RhdHMvaW5jbHVkZS9zdGF0c19ldmVudF9saXN0LmggYi9saWJzdGF0cy9pbmNsdWRlL3N0YXRzX2V2ZW50X2xpc3QuaAppbmRleCA4NDVhMTk3Li5iN2FkYTBjIDEwMDY0NAotLS0gYS9saWJzdGF0cy9pbmNsdWRlL3N0YXRzX2V2ZW50X2xpc3QuaAorKysgYi9saWJzdGF0cy9pbmNsdWRlL3N0YXRzX2V2ZW50X2xpc3QuaApAQCAtMTQsOCArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBBTkRST0lEX1NUQVRTX0xPR19TVEFUU19FVkVOVF9MSVNUX0gKLSNkZWZpbmUgQU5EUk9JRF9TVEFUU19MT0dfU1RBVFNfRVZFTlRfTElTVF9ICisjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGxvZy9sb2dfZXZlbnRfbGlzdC5oPgogI2luY2x1ZGUgPHN5cy91aW8uaD4KQEAgLTEzMyw3ICsxMzIsNiBAQAogICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgfQogCi0jaWYgZGVmaW5lZChfVVNJTkdfTElCQ1hYKQogICAgIHN0YXRzX2V2ZW50X2xpc3QmIG9wZXJhdG9yPDwoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgICAgICAgIGludCByZXR2YWwgPSBhbmRyb2lkX2xvZ193cml0ZV9zdHJpbmc4X2xlbihjdHgsIHZhbHVlLmRhdGEoKSwgdmFsdWUubGVuZ3RoKCkpOwogICAgICAgICBpZiAocmV0dmFsIDwgMCkgewpAQCAtMTQxLDcgKzEzOSw2IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgIH0KLSNlbmRpZgogCiAgICAgc3RhdHNfZXZlbnRfbGlzdCYgb3BlcmF0b3I8PChmbG9hdCB2YWx1ZSkgewogICAgICAgICBpbnQgcmV0dmFsID0gYW5kcm9pZF9sb2dfd3JpdGVfZmxvYXQzMihjdHgsIHZhbHVlKTsKQEAgLTIwMyw3ICsyMDAsNiBAQAogICAgICAgICByZXR1cm4gcmV0ID49IDA7CiAgICAgfQogCi0jaWYgZGVmaW5lZChfVVNJTkdfTElCQ1hYKQogICAgIGJvb2wgQXBwZW5kU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICAgICAgICBpbnQgcmV0dmFsID0gYW5kcm9pZF9sb2dfd3JpdGVfc3RyaW5nOF9sZW4oY3R4LCB2YWx1ZS5kYXRhKCksIHZhbHVlLmxlbmd0aCgpKTsKICAgICAgICAgaWYgKHJldHZhbCA8IDApIHsKQEAgLTIxOSw3ICsyMTUsNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQotI2VuZGlmCiAKICAgICBib29sIEFwcGVuZEZsb2F0KGZsb2F0IHZhbHVlKSB7CiAgICAgICAgIGludCByZXR2YWwgPSBhbmRyb2lkX2xvZ193cml0ZV9mbG9hdDMyKGN0eCwgdmFsdWUpOwpAQCAtMjUzLDQgKzI0OCwzIEBACiB9OwogCiAjZW5kaWYKLSNlbmRpZiAgLy8gQU5EUk9JRF9TVEFUU19MT0dfU1RBVFNfRVZFTlRfTElTVF9ICmRpZmYgLS1naXQgYS9saWJ1dGlscy9Vbmljb2RlLmNwcCBiL2xpYnV0aWxzL1VuaWNvZGUuY3BwCmluZGV4IDI0YTc0NWEuLmIwOGUwNjEgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1VuaWNvZGUuY3BwCisrKyBiL2xpYnV0aWxzL1VuaWNvZGUuY3BwCkBAIC00NTIsNDggKzQ1Miw2IEBACiAgICAgKmNvZGVQb2ludCB8PSAweDNGICYgYnl0ZTsKIH0KIAotc2l6ZV90IHV0ZjhfdG9fdXRmMzJfbGVuZ3RoKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY19sZW4pCi17Ci0gICAgaWYgKHNyYyA9PSBudWxscHRyIHx8IHNyY19sZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc2l6ZV90IHJldCA9IDA7Ci0gICAgY29uc3QgY2hhciogY3VyOwotICAgIGNvbnN0IGNoYXIqIGVuZDsKLSAgICBzaXplX3QgbnVtX3RvX3NraXA7Ci0gICAgZm9yIChjdXIgPSBzcmMsIGVuZCA9IHNyYyArIHNyY19sZW4sIG51bV90b19za2lwID0gMTsKLSAgICAgICAgIGN1ciA8IGVuZDsKLSAgICAgICAgIGN1ciArPSBudW1fdG9fc2tpcCwgcmV0KyspIHsKLSAgICAgICAgY29uc3QgY2hhciBmaXJzdF9jaGFyID0gKmN1cjsKLSAgICAgICAgbnVtX3RvX3NraXAgPSAxOwotICAgICAgICBpZiAoKGZpcnN0X2NoYXIgJiAweDgwKSA9PSAwKSB7ICAvLyBBU0NJSQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBtYXNrOwotCi0gICAgICAgIGZvciAobWFzayA9IDB4NDA7IChmaXJzdF9jaGFyICYgbWFzayk7IG51bV90b19za2lwKyssIG1hc2sgPj49IDEpIHsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIHV0ZjhfdG9fdXRmMzIoY29uc3QgY2hhciogc3JjLCBzaXplX3Qgc3JjX2xlbiwgY2hhcjMyX3QqIGRzdCkKLXsKLSAgICBpZiAoc3JjID09IG51bGxwdHIgfHwgc3JjX2xlbiA9PSAwIHx8IGRzdCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyKiBjdXIgPSBzcmM7Ci0gICAgY29uc3QgY2hhciogY29uc3QgZW5kID0gc3JjICsgc3JjX2xlbjsKLSAgICBjaGFyMzJfdCogY3VyX3V0ZjMyID0gZHN0OwotICAgIHdoaWxlIChjdXIgPCBlbmQpIHsKLSAgICAgICAgc2l6ZV90IG51bV9yZWFkOwotICAgICAgICAqY3VyX3V0ZjMyKysgPSBzdGF0aWNfY2FzdDxjaGFyMzJfdD4odXRmMzJfYXRfaW50ZXJuYWwoY3VyLCAmbnVtX3JlYWQpKTsKLSAgICAgICAgY3VyICs9IG51bV9yZWFkOwotICAgIH0KLSAgICAqY3VyX3V0ZjMyID0gMDsKLX0KLQogc3RhdGljIGlubGluZSB1aW50MzJfdCB1dGY4X3RvX3V0ZjMyX2NvZGVwb2ludChjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBsZW5ndGgpCiB7CiAgICAgdWludDMyX3QgdW5pY29kZTsKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIGIvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgKaW5kZXggYTJhYWE0Ny4uZmM2NzEyZCAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgKKysrIGIvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgKQEAgLTEyOSwxOCArMTI5LDYgQEAKIHNzaXplX3QgdXRmOF9sZW5ndGgoY29uc3QgY2hhciAqc3JjKTsKIAogLyoqCi0gKiBNZWFzdXJlIHRoZSBsZW5ndGggb2YgYSBVVEYtMzIgc3RyaW5nLgotICovCi1zaXplX3QgdXRmOF90b191dGYzMl9sZW5ndGgoY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc3JjX2xlbik7Ci0KLS8qKgotICogU3RvcmVzIGEgVVRGLTMyIHN0cmluZyBjb252ZXJ0ZWQgZnJvbSAic3JjIiBpbiAiZHN0Ii4gImRzdCIgbXVzdCBiZSBsYXJnZQotICogZW5vdWdoIHRvIHN0b3JlIHRoZSBlbnRpcmUgY29udmVydGVkIHN0cmluZyBhcyBtZWFzdXJlZCBieQotICogdXRmOF90b191dGYzMl9sZW5ndGggcGx1cyBzcGFjZSBmb3IgYSBOVUwgdGVybWluYXRvci4KLSAqLwotdm9pZCB1dGY4X3RvX3V0ZjMyKGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IHNyY19sZW4sIGNoYXIzMl90KiBkc3QpOwotCi0vKioKICAqIFJldHVybnMgdGhlIFVURi0xNiBsZW5ndGggb2YgVVRGLTggc3RyaW5nICJzcmMiLiBSZXR1cm5zIC0xIGluIGNhc2UKICAqIGl0J3MgaW52YWxpZCB1dGY4LiBObyBidWZmZXIgb3Zlci1yZWFkIG9jY3VycyBiZWNhdXNlIG9mIGJvdW5kIGNoZWNrcy4gVXNpbmcgb3ZlcnJlYWRJc0ZhdGFsIHlvdQogICogY2FuIGFzayB0byBsb2cgYSBtZXNzYWdlIGFuZCBmYWlsIGluIGNhc2UgdGhlIGludmFsaWQgdXRmOCBjb3VsZCBoYXZlIGNhdXNlZCBhbiBvdmVycmlkZSBpZiBubwpkaWZmIC0tZ2l0IGEvbG9nY2F0L0FuZHJvaWQuYnAgYi9sb2djYXQvQW5kcm9pZC5icAppbmRleCA1MDMwYjE1Li5mMWIxOGIyIDEwMDY0NAotLS0gYS9sb2djYXQvQW5kcm9pZC5icAorKysgYi9sb2djYXQvQW5kcm9pZC5icApAQCAtMjQsNyArMjQsNiBAQAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGlicGNyZWNwcCIsCiAgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsibGlibG9nIl0sCmRpZmYgLS1naXQgYS9sb2djYXQvbG9nY2F0LmNwcCBiL2xvZ2NhdC9sb2djYXQuY3BwCmluZGV4IDZlMzhkOTUuLmUyNzExYWYgMTAwNjQ0Ci0tLSBhL2xvZ2NhdC9sb2djYXQuY3BwCisrKyBiL2xvZ2NhdC9sb2djYXQuY3BwCkBAIC00MSw2ICs0MSw3IEBACiAKICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHJlZ2V4PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTU2LDggKzU3LDYgQEAKICNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvc2NoZWRfcG9saWN5Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL3RocmVhZF9kZWZzLmg+CiAKLSNpbmNsdWRlIDxwY3JlY3BwLmg+Ci0KICNkZWZpbmUgREVGQVVMVF9NQVhfUk9UQVRFRF9MT0dTIDQKIAogc3RydWN0IGxvZ19kZXZpY2VfdCB7CkBAIC0xMTMsNyArMTEyLDcgQEAKICAgICBzaXplX3Qgb3V0Qnl0ZUNvdW50OwogICAgIGludCBwcmludEJpbmFyeTsKICAgICBpbnQgZGV2Q291bnQ7ICAvLyA+MSBtZWFucyBtdWx0aXBsZQotICAgIHBjcmVjcHA6OlJFKiByZWdleDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpyZWdleD4gcmVnZXg7CiAgICAgbG9nX2RldmljZV90KiBkZXZpY2VzOwogICAgIEV2ZW50VGFnTWFwKiBldmVudFRhZ01hcDsKICAgICAvLyAwIG1lYW5zICJpbmZpbml0ZSIKQEAgLTMwNyw5ICszMDYsNyBAQAogICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmRyb2lkTG9nRW50cnkmIGVudHJ5KSB7CiAgICAgaWYgKCFjb250ZXh0LT5yZWdleCkgcmV0dXJuIHRydWU7CiAKLSAgICBzdGQ6OnN0cmluZyBtZXNzYWdlU3RyaW5nKGVudHJ5Lm1lc3NhZ2UsIGVudHJ5Lm1lc3NhZ2VMZW4pOwotCi0gICAgcmV0dXJuIGNvbnRleHQtPnJlZ2V4LT5QYXJ0aWFsTWF0Y2gobWVzc2FnZVN0cmluZyk7CisgICAgcmV0dXJuIHN0ZDo6cmVnZXhfc2VhcmNoKGVudHJ5Lm1lc3NhZ2UsIGVudHJ5Lm1lc3NhZ2UgKyBlbnRyeS5tZXNzYWdlTGVuLCAqY29udGV4dC0+cmVnZXgpOwogfQogCiBzdGF0aWMgdm9pZCBwcm9jZXNzQnVmZmVyKGFuZHJvaWRfbG9nY2F0X2NvbnRleHRfaW50ZXJuYWwqIGNvbnRleHQsCkBAIC00NjAsNyArNDU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIiAgLWQgICAgICAgICAgICAgIER1bXAgdGhlIGxvZyBhbmQgdGhlbiBleGl0IChkb24ndCBibG9jaylcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgLWUgPGV4cHI+LCAtLXJlZ2V4PTxleHByPlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgT25seSBwcmludCBsaW5lcyB3aGVyZSB0aGUgbG9nIG1lc3NhZ2UgbWF0Y2hlcyA8ZXhwcj5cbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIHdoZXJlIDxleHByPiBpcyBhIFBlcmwtY29tcGF0aWJsZSByZWd1bGFyIGV4cHJlc3Npb25cbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIHdoZXJlIDxleHByPiBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvblxuIgogICAgICAgICAgICAgICAgICAgICAvLyBMZWF2ZSAtLWhlYWQgdW5kb2N1bWVudGVkIGFzIGFsaWFzIGZvciAtbQogICAgICAgICAgICAgICAgICAgICAiICAtbSA8Y291bnQ+LCAtLW1heC1jb3VudD08Y291bnQ+XG4iCiAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICBRdWl0IGFmdGVyIHByaW50aW5nIDxjb3VudD4gbGluZXMuIFRoaXMgaXMgbWVhbnQgdG8gYmVcbiIKQEAgLTg5OSw2ICs4OTYsMTEgQEAKICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAvLyBvbmx5IGxvbmcgb3B0aW9ucwogICAgICAgICAgICAgICAgIGlmIChsb25nX29wdGlvbnNbb3B0aW9uX2luZGV4XS5uYW1lID09IHBpZF9zdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2djYXRfcGFuaWMoY29udGV4dCwgSEVMUF9UUlVFLCAiT25seSBzdXBwb3J0cyBvbmUgUElEIGFyZ3VtZW50LlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAvLyBUb0RvOiBkZXRlcm1pbmUgcnVudGltZSBQSURfTUFYPwogICAgICAgICAgICAgICAgICAgICBpZiAoIWdldFNpemVUQXJnKG9wdGFyZywgJnBpZCwgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2NhdF9wYW5pYyhjb250ZXh0LCBIRUxQX1RSVUUsICIlcyAlcyBvdXQgb2YgcmFuZ2VcbiIsCkBAIC05OTUsNyArOTk3LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSAnZSc6Ci0gICAgICAgICAgICAgICAgY29udGV4dC0+cmVnZXggPSBuZXcgcGNyZWNwcDo6UkUob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5yZWdleC5yZXNldChuZXcgc3RkOjpyZWdleChvcHRhcmcpKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSAnbSc6IHsKQEAgLTE2OTYsNyArMTY5OCw2IEBACiAgICAgICAgIHNjaGVkX3lpZWxkKCk7CiAgICAgfQogCi0gICAgZGVsZXRlIGNvbnRleHQtPnJlZ2V4OwogICAgIGNvbnRleHQtPmFyZ3ZfaG9sZC5jbGVhcigpOwogICAgIGNvbnRleHQtPmFyZ3MuY2xlYXIoKTsKICAgICBjb250ZXh0LT5lbnZwX2hvbGQuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvQW5kcm9pZC5tayBiL3Jvb3RkaXIvQW5kcm9pZC5tawppbmRleCA3NmQ2ZjdlLi40NTU5MDUwIDEwMDY0NAotLS0gYS9yb290ZGlyL0FuZHJvaWQubWsKKysrIGIvcm9vdGRpci9BbmRyb2lkLm1rCkBAIC0yMzAsNyArMjMwLDcgQEAKICMgQSBzeW1saW5rIGNhbid0IG92ZXJ3cml0ZSBhIGRpcmVjdG9yeSBhbmQgdGhlIC9zeXN0ZW0vdXNyL2ljdSBkaXJlY3Rvcnkgb25jZQogIyBleGlzdGVkIHNvIHRoZSByZXF1aXJlZCBzdHJ1Y3R1cmUgbXVzdCBiZSBjcmVhdGVkIHdoYXRldmVyIHdlIGZpbmQuCiBMT0NBTF9QT1NUX0lOU1RBTExfQ01EID0gbWtkaXIgLXAgJChUQVJHRVRfT1VUKS91c3IgJiYgcm0gLXJmICQoVEFSR0VUX09VVCkvdXNyL2ljdQotTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSAmJiBsbiAtc2YgL2FwZXgvY29tLmFuZHJvaWQucnVudGltZS9ldGMvaWN1ICQoVEFSR0VUX09VVCkvdXNyL2ljdQorTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSAmJiBsbiAtc2YgL2FwZXgvY29tLmFuZHJvaWQuaTE4bi9ldGMvaWN1ICQoVEFSR0VUX09VVCkvdXNyL2ljdQogCiAjIFRPRE8oYi8xMjQxMDYzODQpOiBDbGVhbiB1cCBjb21wYXQgc3ltbGlua3MgZm9yIEFSVCBiaW5hcmllcy4KIEFSVF9CSU5BUklFUyA6PSBcCmRpZmYgLS1naXQgYS9yb290ZGlyL2luaXQuZW52aXJvbi5yYy5pbiBiL3Jvb3RkaXIvaW5pdC5lbnZpcm9uLnJjLmluCmluZGV4IDQ1NWM5YTguLjkzYjdmNDMgMTAwNjQ0Ci0tLSBhL3Jvb3RkaXIvaW5pdC5lbnZpcm9uLnJjLmluCisrKyBiL3Jvb3RkaXIvaW5pdC5lbnZpcm9uLnJjLmluCkBAIC02LDYgKzYsNyBAQAogICAgIGV4cG9ydCBBTkRST0lEX0RBVEEgL2RhdGEKICAgICBleHBvcnQgQU5EUk9JRF9TVE9SQUdFIC9zdG9yYWdlCiAgICAgZXhwb3J0IEFORFJPSURfUlVOVElNRV9ST09UIC9hcGV4L2NvbS5hbmRyb2lkLnJ1bnRpbWUKKyAgICBleHBvcnQgQU5EUk9JRF9JMThOX1JPT1QgL2FwZXgvY29tLmFuZHJvaWQuaTE4bgogICAgIGV4cG9ydCBBTkRST0lEX1RaREFUQV9ST09UIC9hcGV4L2NvbS5hbmRyb2lkLnR6ZGF0YQogICAgIGV4cG9ydCBFWFRFUk5BTF9TVE9SQUdFIC9zZGNhcmQKICAgICBleHBvcnQgQVNFQ19NT1VOVFBPSU5UIC9tbnQvYXNlYwpkaWZmIC0tZ2l0IGEvcm9vdGRpci9pbml0LnJjIGIvcm9vdGRpci9pbml0LnJjCmluZGV4IGQyMmU5YTcuLjRkMzRiNjcgMTAwNjQ0Ci0tLSBhL3Jvb3RkaXIvaW5pdC5yYworKysgYi9yb290ZGlyL2luaXQucmMKQEAgLTEyMSw2ICsxMjEsOSBAQAogICAgIG1rZGlyIC9tbnQvbWVkaWFfcncgMDc1MCByb290IG1lZGlhX3J3CiAgICAgbWtkaXIgL21udC91c2VyIDA3NTUgcm9vdCByb290CiAgICAgbWtkaXIgL21udC91c2VyLzAgMDc1NSByb290IHJvb3QKKyAgICBta2RpciAvbW50L3VzZXIvMC9zZWxmIDA3NTUgcm9vdCByb290CisgICAgbWtkaXIgL21udC91c2VyLzAvZW11bGF0ZWQgMDc1NSByb290IHJvb3QKKyAgICBta2RpciAvbW50L3VzZXIvMC9lbXVsYXRlZC8wIDA3NTUgcm9vdCByb290CiAgICAgbWtkaXIgL21udC9leHBhbmQgMDc3MSBzeXN0ZW0gc3lzdGVtCiAgICAgbWtkaXIgL21udC9hcHBmdXNlIDA3MTEgcm9vdCByb290CiAKQEAgLTM2Nyw5ICszNzAsNiBAQAogICAgICMgT25jZSBldmVyeXRoaW5nIGlzIHNldHVwLCBubyBuZWVkIHRvIG1vZGlmeSAvLgogICAgICMgVGhlIGJpbmQrcmVtb3VudCBjb21iaW5hdGlvbiBhbGxvd3MgdGhpcyB0byB3b3JrIGluIGNvbnRhaW5lcnMuCiAgICAgbW91bnQgcm9vdGZzIHJvb3RmcyAvIHJlbW91bnQgYmluZCBybyBub2RldgotICAgICMgTW91bnQgZGVmYXVsdCBzdG9yYWdlIGludG8gcm9vdCBuYW1lc3BhY2UKLSAgICBtb3VudCBub25lIC9tbnQvcnVudGltZS9kZWZhdWx0IC9zdG9yYWdlIGJpbmQgcmVjCi0gICAgbW91bnQgbm9uZSBub25lIC9zdG9yYWdlIHNsYXZlIHJlYwogCiAgICAgIyBNYWtlIHN1cmUgL3N5cy9rZXJuZWwvZGVidWcgKGlmIHByZXNlbnQpIGlzIGxhYmVsZWQgcHJvcGVybHkKICAgICAjIE5vdGUgdGhhdCB0cmFjZWZzIG1heSBiZSBtb3VudGVkIHVuZGVyIGRlYnVnLCBzbyB3ZSBuZWVkIHRvIGNyb3NzIGZpbGVzeXN0ZW1zCkBAIC00MTUsNiArNDE1LDcgQEAKICAgICBjaG1vZCAwNzAwIC9tZXRhZGF0YS92b2xkCiAgICAgbWtkaXIgL21ldGFkYXRhL3Bhc3N3b3JkX3Nsb3RzIDA3NzEgcm9vdCBzeXN0ZW0KICAgICBta2RpciAvbWV0YWRhdGEvb3RhIDA3MDAgcm9vdCBzeXN0ZW0KKyAgICBta2RpciAvbWV0YWRhdGEvb3RhL3NuYXBzaG90cyAwNzAwIHJvb3Qgc3lzdGVtCiAKICAgICBta2RpciAvbWV0YWRhdGEvYXBleCAwNzAwIHJvb3Qgc3lzdGVtCiAgICAgbWtkaXIgL21ldGFkYXRhL2FwZXgvc2Vzc2lvbnMgMDcwMCByb290IHN5c3RlbQpAQCAtNjQxLDYgKzY0MiwyMiBAQAogICAgIGNob3duIHJvb3Qgc3lzdGVtIC9kZXYvZnNja2xvZ3MvbG9nCiAgICAgY2htb2QgMDc3MCAvZGV2L2ZzY2tsb2dzL2xvZwogCisjIFN3aXRjaCBiZXR3ZWVuIHNkY2FyZGZzIGFuZCBGVVNFIGRlcGVuZGluZyBvbiBwZXJzaXN0IHByb3BlcnR5CisjIFRPRE86IE1vdmUgdGhpcyB0byBybyBwcm9wZXJ0eSBiZWZvcmUgbGF1bmNoIGJlY2F1c2UgRkRFIGRldmljZXMKKyMgaW50ZXJhY3Qgd2l0aCBwZXJzaXN0ZW50IHByb3BlcnRpZXMgZGlmZmVyZW50bHkgZHVyaW5nIGJvb3QKK29uIHp5Z290ZS1zdGFydCAmJiBwcm9wZXJ0eTpwZXJzaXN0LnN5cy5mdXNlPXRydWUKKyAgIyBNb3VudCBkZWZhdWx0IHN0b3JhZ2UgaW50byByb290IG5hbWVzcGFjZQorICBtb3VudCBub25lIC9tbnQvdXNlci8wIC9zdG9yYWdlIGJpbmQgcmVjCisgIG1vdW50IG5vbmUgbm9uZSAvc3RvcmFnZSBzbGF2ZSByZWMKK29uIHp5Z290ZS1zdGFydCAmJiBwcm9wZXJ0eTpwZXJzaXN0LnN5cy5mdXNlPWZhbHNlCisgICMgTW91bnQgZGVmYXVsdCBzdG9yYWdlIGludG8gcm9vdCBuYW1lc3BhY2UKKyAgbW91bnQgbm9uZSAvbW50L3J1bnRpbWUvZGVmYXVsdCAvc3RvcmFnZSBiaW5kIHJlYworICBtb3VudCBub25lIG5vbmUgL3N0b3JhZ2Ugc2xhdmUgcmVjCitvbiB6eWdvdGUtc3RhcnQgJiYgcHJvcGVydHk6cGVyc2lzdC5zeXMuZnVzZT0iIgorICAjIE1vdW50IGRlZmF1bHQgc3RvcmFnZSBpbnRvIHJvb3QgbmFtZXNwYWNlCisgIG1vdW50IG5vbmUgL21udC9ydW50aW1lL2RlZmF1bHQgL3N0b3JhZ2UgYmluZCByZWMKKyAgbW91bnQgbm9uZSBub25lIC9zdG9yYWdlIHNsYXZlIHJlYworCiAjIEl0IGlzIHJlY29tbWVuZGVkIHRvIHB1dCB1bm5lY2Vzc2FyeSBkYXRhLyBpbml0aWFsaXphdGlvbiBmcm9tIHBvc3QtZnMtZGF0YQogIyB0byBzdGFydC16eWdvdGUgaW4gZGV2aWNlJ3MgaW5pdC5yYyB0byB1bmJsb2NrIHp5Z290ZSBzdGFydC4KIG9uIHp5Z290ZS1zdGFydCAmJiBwcm9wZXJ0eTpyby5jcnlwdG8uc3RhdGU9dW5lbmNyeXB0ZWQKZGlmZiAtLWdpdCBhL3N0b3JhZ2VkL3N0b3JhZ2VkLmNwcCBiL3N0b3JhZ2VkL3N0b3JhZ2VkLmNwcAppbmRleCA2ODk3NjYzLi4xZDkzNGEyIDEwMDY0NAotLS0gYS9zdG9yYWdlZC9zdG9yYWdlZC5jcHAKKysrIGIvc3RvcmFnZWQvc3RvcmFnZWQuY3BwCkBAIC0xNjQsOCArMTY0LDEwIEBACiB9CiAKIHZvaWQgc3RvcmFnZWRfdDo6YWRkX3VzZXJfY2UodXNlcmlkX3QgdXNlcl9pZCkgewotICAgIGxvYWRfcHJvdG8odXNlcl9pZCk7Ci0gICAgcHJvdG9fbG9hZGVkW3VzZXJfaWRdID0gdHJ1ZTsKKyAgICBpZiAoIXByb3RvX2xvYWRlZFt1c2VyX2lkXSkgeworICAgICAgICBsb2FkX3Byb3RvKHVzZXJfaWQpOworICAgICAgICBwcm90b19sb2FkZWRbdXNlcl9pZF0gPSB0cnVlOworICAgIH0KIH0KIAogdm9pZCBzdG9yYWdlZF90OjpyZW1vdmVfdXNlcl9jZSh1c2VyaWRfdCB1c2VyX2lkKSB7CmRpZmYgLS1naXQgYS90b29sYm94L0FuZHJvaWQuYnAgYi90b29sYm94L0FuZHJvaWQuYnAKaW5kZXggMGNjNjAzYS4uNGNhNWY1YSAxMDA2NDQKLS0tIGEvdG9vbGJveC9BbmRyb2lkLmJwCisrKyBiL3Rvb2xib3gvQW5kcm9pZC5icApAQCAtMjQsNiArMjQsNyBAQAogICAgICAgICAidG9vbGJveC5jIiwKICAgICAgICAgImdldGV2ZW50LmMiLAogICAgICAgICAiZ2V0cHJvcC5jcHAiLAorICAgICAgICAibW9kcHJvYmUuY3BwIiwKICAgICAgICAgInNldHByb3AuY3BwIiwKICAgICAgICAgInN0YXJ0LmNwcCIsCiAgICAgXSwKQEAgLTMzLDExICszNCwxNSBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKICAgICBdLAotICAgIHN0YXRpY19saWJzOiBbImxpYnByb3BlcnR5aW5mb3BhcnNlciJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtb2Rwcm9iZSIsCisgICAgICAgICJsaWJwcm9wZXJ0eWluZm9wYXJzZXIiLAorICAgIF0sCiAKICAgICBzeW1saW5rczogWwogICAgICAgICAiZ2V0ZXZlbnQiLAogICAgICAgICAiZ2V0cHJvcCIsCisgICAgICAgICJtb2Rwcm9iZSIsCiAgICAgICAgICJzZXRwcm9wIiwKICAgICAgICAgInN0YXJ0IiwKICAgICAgICAgInN0b3AiLApkaWZmIC0tZ2l0IGEvdG9vbGJveC9tb2Rwcm9iZS5jcHAgYi90b29sYm94L21vZHByb2JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjVmNTRlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbGJveC9tb2Rwcm9iZS5jcHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8bW9kcHJvYmUvbW9kcHJvYmUuaD4KKworZW51bSBtb2Rwcm9iZV9tb2RlIHsKKyAgICBBZGRNb2R1bGVzTW9kZSwKKyAgICBSZW1vdmVNb2R1bGVzTW9kZSwKKyAgICBMaXN0TW9kdWxlc01vZGUsCisgICAgU2hvd0RlcGVuZGVuY2llc01vZGUsCit9OworCitzdGF0aWMgdm9pZCBwcmludF91c2FnZSh2b2lkKSB7CisgICAgc3RkOjpjZXJyIDw8ICJVc2FnZToiIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiICBtb2Rwcm9iZSBbLWFscnF2c0RiXSBbLWQgRElSXSBbTU9EVUxFXSsiIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgbW9kcHJvYmUgWy1hbHJxdnNEYl0gWy1kIERJUl0gTU9EVUxFIFtzeW1ib2w9dmFsdWVdWy4uLl0iIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiT3B0aW9uczoiIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgLWI6IEFwcGx5IGJsYWNrbGlzdCB0byBtb2R1bGUgbmFtZXMgdG9vIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICIgIC1kOiBMb2FkIG1vZHVsZXMgZnJvbSBESVIsIG9wdGlvbiBtYXkgYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiICAtRDogUHJpbnQgZGVwZW5kZW5jaWVzIGZvciBtb2R1bGVzIG9ubHksIGRvIG5vdCBsb2FkIjsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgLWg6IFByaW50IHRoaXMgaGVscCIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiICAtbDogTGlzdCBtb2R1bGVzIG1hdGNoaW5nIHBhdHRlcm4iIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgLXI6IFJlbW92ZSBNT0RVTEUgKG11bHRpcGxlIG1vZHVsZXMgbWF5IGJlIHNwZWNpZmllZCkiIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgLXE6IFF1aWV0IiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICIgIC12OiBWZXJib3NlIiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKK30KKworI2RlZmluZSBjaGVja19tb2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG1vZGUgIT0gQWRkTW9kdWxlc01vZGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvciwgbXVsdGlwbGUgbW9kZSBmbGFncyBzcGVjaWZpZWQiIDw8IHN0ZDo6ZW5kbDsgXAorICAgICAgICBwcmludF91c2FnZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK2V4dGVybiAiQyIgaW50IG1vZHByb2JlX21haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXM7CisgICAgc3RkOjpzdHJpbmcgbW9kdWxlX3BhcmFtZXRlcnM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZF9kaXJzOworICAgIG1vZHByb2JlX21vZGUgbW9kZSA9IEFkZE1vZHVsZXNNb2RlOworICAgIGJvb2wgYmxhY2tsaXN0ID0gZmFsc2U7CisgICAgYm9vbCB2ZXJib3NlID0gZmFsc2U7CisgICAgaW50IHJ2ID0gRVhJVF9TVUNDRVNTOworCisgICAgaW50IG9wdDsKKyAgICB3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiYWJkOkRobHFydiIpKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICAgICAgY2FzZSAnYSc6CisgICAgICAgICAgICAgICAgLy8gdG95Ym94IG1vZHByb2JlIHN1cHBvcnRlZCAtYSB0byBsb2FkIG11bHRpcGxlIG1vZHVsZXMsIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBpcyBzdXBwb3J0ZWQgaGVyZSBieSBkZWZhdWx0LCBpZ25vcmUgZmxhZworICAgICAgICAgICAgICAgIGNoZWNrX21vZGUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgICAgIGJsYWNrbGlzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICBtb2RfZGlycy5lbXBsYWNlX2JhY2sob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIGNoZWNrX21vZGUoKTsKKyAgICAgICAgICAgICAgICBtb2RlID0gU2hvd0RlcGVuZGVuY2llc01vZGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICBwcmludF91c2FnZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFWElUX1NVQ0NFU1M7CisgICAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgICAgICBjaGVja19tb2RlKCk7CisgICAgICAgICAgICAgICAgbW9kZSA9IExpc3RNb2R1bGVzTW9kZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3EnOgorICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgIGNoZWNrX21vZGUoKTsKKyAgICAgICAgICAgICAgICBtb2RlID0gUmVtb3ZlTW9kdWxlc01vZGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICAgICAgICB2ZXJib3NlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJVbnJlY29nbml6ZWQgb3B0aW9uOiAiIDw8IG9wdCA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBwYXJhbWV0ZXJfY291bnQgPSAwOworICAgIGZvciAob3B0ID0gb3B0aW5kOyBvcHQgPCBhcmdjOyBvcHQrKykgeworICAgICAgICBpZiAoIXN0cmNocihhcmd2W29wdF0sICc9JykpIHsKKyAgICAgICAgICAgIG1vZHVsZXMuZW1wbGFjZV9iYWNrKGFyZ3Zbb3B0XSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJfY291bnQrKzsKKyAgICAgICAgICAgIGlmIChtb2R1bGVfcGFyYW1ldGVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlX3BhcmFtZXRlcnMgPSBhcmd2W29wdF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1vZHVsZV9wYXJhbWV0ZXJzID0gbW9kdWxlX3BhcmFtZXRlcnMgKyAiICIgKyBhcmd2W29wdF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmVyYm9zZSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIm1vZGUgaXMgIiA8PCBtb2RlIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJ2ZXJib3NlIGlzICIgPDwgdmVyYm9zZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAibW9kX2RpcnMgaXM6ICIgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbihtb2RfZGlycywgIiIpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJtb2R1bGVzIGlzOiAiIDw8IGFuZHJvaWQ6OmJhc2U6OkpvaW4obW9kdWxlcywgIiIpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJtb2R1bGUgcGFyYW1ldGVycyBpczogIiA8PCBhbmRyb2lkOjpiYXNlOjpKb2luKG1vZHVsZV9wYXJhbWV0ZXJzLCAiIikKKyAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisKKyAgICBpZiAobW9kdWxlcy5lbXB0eSgpKSB7CisgICAgICAgIGlmIChtb2RlID09IExpc3RNb2R1bGVzTW9kZSkgeworICAgICAgICAgICAgLy8gZW11bGF0ZSB0b3lib3ggbW9kcHJvYmUgbGlzdCB3aXRoIG5vIHBhdHRlcm4gKGxpc3QgYWxsKQorICAgICAgICAgICAgbW9kdWxlcy5lbXBsYWNlX2JhY2soIioiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiTm8gbW9kdWxlcyBnaXZlbi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHByaW50X3VzYWdlKCk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtb2RfZGlycy5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiTm8gbW9kdWxlIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMgZ2l2ZW4uIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHByaW50X3VzYWdlKCk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGlmIChwYXJhbWV0ZXJfY291bnQgJiYgbW9kdWxlcy5zaXplKCkgPiAxKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiT25seSBvbmUgbW9kdWxlIG1heSBiZSBsb2FkZWQgd2hlbiBzcGVjaWZ5aW5nIG1vZHVsZSBwYXJhbWV0ZXJzLiIKKyAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcHJpbnRfdXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBNb2Rwcm9iZSBtKG1vZF9kaXJzKTsKKyAgICBtLkVuYWJsZVZlcmJvc2UodmVyYm9zZSk7CisgICAgaWYgKGJsYWNrbGlzdCkgeworICAgICAgICBtLkVuYWJsZUJsYWNrbGlzdCh0cnVlKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6IG1vZHVsZXMpIHsKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgICBjYXNlIEFkZE1vZHVsZXNNb2RlOgorICAgICAgICAgICAgICAgIGlmICghbS5Mb2FkV2l0aEFsaWFzZXMobW9kdWxlLCB0cnVlLCBtb2R1bGVfcGFyYW1ldGVycykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJGYWlsZWQgdG8gbG9hZCBtb2R1bGUgIiA8PCBtb2R1bGU7CisgICAgICAgICAgICAgICAgICAgIHJ2ID0gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUmVtb3ZlTW9kdWxlc01vZGU6CisgICAgICAgICAgICAgICAgaWYgKCFtLlJlbW92ZShtb2R1bGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIHJlbW92ZSBtb2R1bGUgIiA8PCBtb2R1bGU7CisgICAgICAgICAgICAgICAgICAgIHJ2ID0gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTGlzdE1vZHVsZXNNb2RlOiB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpc3QgPSBtLkxpc3RNb2R1bGVzKG1vZHVsZSk7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8IGFuZHJvaWQ6OmJhc2U6OkpvaW4obGlzdCwgIlxuIikgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTaG93RGVwZW5kZW5jaWVzTW9kZTogeworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwcmVfZGVwczsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGVwczsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcG9zdF9kZXBzOworICAgICAgICAgICAgICAgIGlmICghbS5HZXRBbGxEZXBlbmRlbmNpZXMobW9kdWxlLCAmcHJlX2RlcHMsICZkZXBzLCAmcG9zdF9kZXBzKSkgeworICAgICAgICAgICAgICAgICAgICBydiA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRGVwZW5kZW5jaWVzIGZvciAiIDw8IG1vZHVsZSA8PCAiOiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiU29mdCBwcmUtZGVwZW5kZW5jaWVzOiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBhbmRyb2lkOjpiYXNlOjpKb2luKHByZV9kZXBzLCAiXG4iKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJIYXJkIGRlcGVuZGVuY2llczoiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbihkZXBzLCAiXG4iKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJTb2Z0IHBvc3QtZGVwZW5kZW5jaWVzOiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBhbmRyb2lkOjpiYXNlOjpKb2luKHBvc3RfZGVwcywgIlxuIikgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkJhZCBtb2RlIjsKKyAgICAgICAgICAgICAgICBydiA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL3Rvb2xib3gvdG9vbHMuaCBiL3Rvb2xib3gvdG9vbHMuaAppbmRleCA5YTdlYmQyLi5iYjU3ZTY3IDEwMDY0NAotLS0gYS90b29sYm94L3Rvb2xzLmgKKysrIGIvdG9vbGJveC90b29scy5oCkBAIC0xLDUgKzEsNiBAQAogVE9PTChnZXRldmVudCkKIFRPT0woZ2V0cHJvcCkKK1RPT0wobW9kcHJvYmUpCiBUT09MKHNldHByb3ApCiBUT09MKHN0YXJ0KQogVE9PTChzdG9wKQo=